tools/node-hermes/nodelib/internal/streams/from.js (194 lines of code) (raw):
'use strict';
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
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 _primordials = primordials,
PromisePrototypeThen = _primordials.PromisePrototypeThen,
SymbolAsyncIterator = _primordials.SymbolAsyncIterator,
SymbolIterator = _primordials.SymbolIterator;
var _require = require('buffer'),
Buffer = _require.Buffer;
var _require$codes = require('internal/errors').codes,
ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES;
function from(Readable, iterable, opts) {
var iterator;
if (typeof iterable === 'string' || iterable instanceof Buffer) {
return new Readable(_objectSpread(_objectSpread({
objectMode: true
}, opts), {}, {
read: function read() {
this.push(iterable);
this.push(null);
}
}));
}
var isAsync = false;
if (iterable && iterable[SymbolAsyncIterator]) {
isAsync = true;
iterator = iterable[SymbolAsyncIterator]();
} else if (iterable && iterable[SymbolIterator]) {
isAsync = false;
iterator = iterable[SymbolIterator]();
} else {
throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable);
}
var readable = new Readable(_objectSpread({
objectMode: true,
highWaterMark: 1
}, opts)); // Flag to protect against _read
// being called before last iteration completion.
var reading = false;
readable._read = function () {
if (!reading) {
reading = true;
next();
}
};
readable._destroy = function (error, cb) {
PromisePrototypeThen(close(error), function () {
return process.nextTick(cb, error);
}, // nextTick is here in case cb throws
function (e) {
return process.nextTick(cb, e || error);
});
};
function close(_x) {
return _close.apply(this, arguments);
}
function _close() {
_close = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(error) {
var hadError, hasThrow, _yield$iterator$throw, value, done, _yield$iterator$retur, _value;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
hadError = error !== undefined && error !== null;
hasThrow = typeof iterator["throw"] === 'function';
if (!(hadError && hasThrow)) {
_context.next = 12;
break;
}
_context.next = 5;
return iterator["throw"](error);
case 5:
_yield$iterator$throw = _context.sent;
value = _yield$iterator$throw.value;
done = _yield$iterator$throw.done;
_context.next = 10;
return value;
case 10:
if (!done) {
_context.next = 12;
break;
}
return _context.abrupt("return");
case 12:
if (!(typeof iterator["return"] === 'function')) {
_context.next = 19;
break;
}
_context.next = 15;
return iterator["return"]();
case 15:
_yield$iterator$retur = _context.sent;
_value = _yield$iterator$retur.value;
_context.next = 19;
return _value;
case 19:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return _close.apply(this, arguments);
}
function next() {
return _next2.apply(this, arguments);
}
function _next2() {
_next2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
var _ref, value, done, res;
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
if (!isAsync) {
_context2.next = 7;
break;
}
_context2.next = 4;
return iterator.next();
case 4:
_context2.t0 = _context2.sent;
_context2.next = 8;
break;
case 7:
_context2.t0 = iterator.next();
case 8:
_ref = _context2.t0;
value = _ref.value;
done = _ref.done;
if (!done) {
_context2.next = 15;
break;
}
readable.push(null);
_context2.next = 33;
break;
case 15:
if (!(value && typeof value.then === 'function')) {
_context2.next = 21;
break;
}
_context2.next = 18;
return value;
case 18:
_context2.t1 = _context2.sent;
_context2.next = 22;
break;
case 21:
_context2.t1 = value;
case 22:
res = _context2.t1;
if (!(res === null)) {
_context2.next = 28;
break;
}
reading = false;
throw new ERR_STREAM_NULL_VALUES();
case 28:
if (!readable.push(res)) {
_context2.next = 32;
break;
}
return _context2.abrupt("continue", 39);
case 32:
reading = false;
case 33:
_context2.next = 38;
break;
case 35:
_context2.prev = 35;
_context2.t2 = _context2["catch"](0);
readable.destroy(_context2.t2);
case 38:
return _context2.abrupt("break", 41);
case 39:
_context2.next = 0;
break;
case 41:
case "end":
return _context2.stop();
}
}
}, _callee2, null, [[0, 35]]);
}));
return _next2.apply(this, arguments);
}
return readable;
}
module.exports = from;