'use strict'; 
 | 
  
 | 
var _Object$setPrototypeO; 
 | 
  
 | 
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 
 | 
  
 | 
var finished = require('./end-of-stream'); 
 | 
  
 | 
var kLastResolve = Symbol('lastResolve'); 
 | 
var kLastReject = Symbol('lastReject'); 
 | 
var kError = Symbol('error'); 
 | 
var kEnded = Symbol('ended'); 
 | 
var kLastPromise = Symbol('lastPromise'); 
 | 
var kHandlePromise = Symbol('handlePromise'); 
 | 
var kStream = Symbol('stream'); 
 | 
  
 | 
function createIterResult(value, done) { 
 | 
  return { 
 | 
    value: value, 
 | 
    done: done 
 | 
  }; 
 | 
} 
 | 
  
 | 
function readAndResolve(iter) { 
 | 
  var resolve = iter[kLastResolve]; 
 | 
  
 | 
  if (resolve !== null) { 
 | 
    var data = iter[kStream].read(); // we defer if data is null 
 | 
    // we can be expecting either 'end' or 
 | 
    // 'error' 
 | 
  
 | 
    if (data !== null) { 
 | 
      iter[kLastPromise] = null; 
 | 
      iter[kLastResolve] = null; 
 | 
      iter[kLastReject] = null; 
 | 
      resolve(createIterResult(data, false)); 
 | 
    } 
 | 
  } 
 | 
} 
 | 
  
 | 
function onReadable(iter) { 
 | 
  // we wait for the next tick, because it might 
 | 
  // emit an error with process.nextTick 
 | 
  process.nextTick(readAndResolve, iter); 
 | 
} 
 | 
  
 | 
function wrapForNext(lastPromise, iter) { 
 | 
  return function (resolve, reject) { 
 | 
    lastPromise.then(function () { 
 | 
      if (iter[kEnded]) { 
 | 
        resolve(createIterResult(undefined, true)); 
 | 
        return; 
 | 
      } 
 | 
  
 | 
      iter[kHandlePromise](resolve, reject); 
 | 
    }, reject); 
 | 
  }; 
 | 
} 
 | 
  
 | 
var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); 
 | 
var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { 
 | 
  get stream() { 
 | 
    return this[kStream]; 
 | 
  }, 
 | 
  
 | 
  next: function next() { 
 | 
    var _this = this; 
 | 
  
 | 
    // if we have detected an error in the meanwhile 
 | 
    // reject straight away 
 | 
    var error = this[kError]; 
 | 
  
 | 
    if (error !== null) { 
 | 
      return Promise.reject(error); 
 | 
    } 
 | 
  
 | 
    if (this[kEnded]) { 
 | 
      return Promise.resolve(createIterResult(undefined, true)); 
 | 
    } 
 | 
  
 | 
    if (this[kStream].destroyed) { 
 | 
      // We need to defer via nextTick because if .destroy(err) is 
 | 
      // called, the error will be emitted via nextTick, and 
 | 
      // we cannot guarantee that there is no error lingering around 
 | 
      // waiting to be emitted. 
 | 
      return new Promise(function (resolve, reject) { 
 | 
        process.nextTick(function () { 
 | 
          if (_this[kError]) { 
 | 
            reject(_this[kError]); 
 | 
          } else { 
 | 
            resolve(createIterResult(undefined, true)); 
 | 
          } 
 | 
        }); 
 | 
      }); 
 | 
    } // if we have multiple next() calls 
 | 
    // we will wait for the previous Promise to finish 
 | 
    // this logic is optimized to support for await loops, 
 | 
    // where next() is only called once at a time 
 | 
  
 | 
  
 | 
    var lastPromise = this[kLastPromise]; 
 | 
    var promise; 
 | 
  
 | 
    if (lastPromise) { 
 | 
      promise = new Promise(wrapForNext(lastPromise, this)); 
 | 
    } else { 
 | 
      // fast path needed to support multiple this.push() 
 | 
      // without triggering the next() queue 
 | 
      var data = this[kStream].read(); 
 | 
  
 | 
      if (data !== null) { 
 | 
        return Promise.resolve(createIterResult(data, false)); 
 | 
      } 
 | 
  
 | 
      promise = new Promise(this[kHandlePromise]); 
 | 
    } 
 | 
  
 | 
    this[kLastPromise] = promise; 
 | 
    return promise; 
 | 
  } 
 | 
}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { 
 | 
  return this; 
 | 
}), _defineProperty(_Object$setPrototypeO, "return", function _return() { 
 | 
  var _this2 = this; 
 | 
  
 | 
  // destroy(err, cb) is a private API 
 | 
  // we can guarantee we have that here, because we control the 
 | 
  // Readable class this is attached to 
 | 
  return new Promise(function (resolve, reject) { 
 | 
    _this2[kStream].destroy(null, function (err) { 
 | 
      if (err) { 
 | 
        reject(err); 
 | 
        return; 
 | 
      } 
 | 
  
 | 
      resolve(createIterResult(undefined, true)); 
 | 
    }); 
 | 
  }); 
 | 
}), _Object$setPrototypeO), AsyncIteratorPrototype); 
 | 
  
 | 
var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { 
 | 
  var _Object$create; 
 | 
  
 | 
  var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { 
 | 
    value: stream, 
 | 
    writable: true 
 | 
  }), _defineProperty(_Object$create, kLastResolve, { 
 | 
    value: null, 
 | 
    writable: true 
 | 
  }), _defineProperty(_Object$create, kLastReject, { 
 | 
    value: null, 
 | 
    writable: true 
 | 
  }), _defineProperty(_Object$create, kError, { 
 | 
    value: null, 
 | 
    writable: true 
 | 
  }), _defineProperty(_Object$create, kEnded, { 
 | 
    value: stream._readableState.endEmitted, 
 | 
    writable: true 
 | 
  }), _defineProperty(_Object$create, kHandlePromise, { 
 | 
    value: function value(resolve, reject) { 
 | 
      var data = iterator[kStream].read(); 
 | 
  
 | 
      if (data) { 
 | 
        iterator[kLastPromise] = null; 
 | 
        iterator[kLastResolve] = null; 
 | 
        iterator[kLastReject] = null; 
 | 
        resolve(createIterResult(data, false)); 
 | 
      } else { 
 | 
        iterator[kLastResolve] = resolve; 
 | 
        iterator[kLastReject] = reject; 
 | 
      } 
 | 
    }, 
 | 
    writable: true 
 | 
  }), _Object$create)); 
 | 
  iterator[kLastPromise] = null; 
 | 
  finished(stream, function (err) { 
 | 
    if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { 
 | 
      var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise 
 | 
      // returned by next() and store the error 
 | 
  
 | 
      if (reject !== null) { 
 | 
        iterator[kLastPromise] = null; 
 | 
        iterator[kLastResolve] = null; 
 | 
        iterator[kLastReject] = null; 
 | 
        reject(err); 
 | 
      } 
 | 
  
 | 
      iterator[kError] = err; 
 | 
      return; 
 | 
    } 
 | 
  
 | 
    var resolve = iterator[kLastResolve]; 
 | 
  
 | 
    if (resolve !== null) { 
 | 
      iterator[kLastPromise] = null; 
 | 
      iterator[kLastResolve] = null; 
 | 
      iterator[kLastReject] = null; 
 | 
      resolve(createIterResult(undefined, true)); 
 | 
    } 
 | 
  
 | 
    iterator[kEnded] = true; 
 | 
  }); 
 | 
  stream.on('readable', onReadable.bind(null, iterator)); 
 | 
  return iterator; 
 | 
}; 
 | 
  
 | 
module.exports = createReadableStreamAsyncIterator; 
 |