UNPKG

maximize-iterator

Version:

Maximize the parallel calls of an iterator supporting asyncIterator interface

72 lines 2.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return createProcessor; } }); var _asynccompat = /*#__PURE__*/ _interop_require_default(require("async-compat")); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var isError = function(err) { return err && err.stack !== undefined && err.message !== undefined; }; function processDone(err, options, callback) { options.err = options.err || err; options.done = true; if (!options.done || options.counter > 0) return false; callback(options.err, options.done); return true; } function processResult(err, keep, options, callback) { options.counter--; if (err && _asynccompat.default.defaultValue(options.error(err), false) || !err && !_asynccompat.default.defaultValue(keep, true)) { options.err = options.err || err; options.done = true; } if (!options.done || options.counter > 0) return false; callback(options.err, options.done); return true; } function createProcessor(next, options, callback) { var flushing = false; function callDefer(err, keep) { var shouldContinue = !processResult(err, keep, options, callback); if (flushing) return; if (shouldContinue) flush(); } function flush() { flushing = true; while(options.counter < options.concurrency){ if (options.done || !options.canProcess()) break; if (options.total >= options.limit) { processDone(null, options, callback); flushing = false; return; } options.total++; options.counter++; next(function(err, result) { if (err || result.done) { return callDefer(err, false); } _asynccompat.default.asyncFunction(options.each, options.callbacks, result.value, function(err, keep) { return callDefer(err, keep); }); }); } flushing = false; } return function processor(doneOrError) { var error = doneOrError; if (doneOrError && processDone(isError(error) ? error : null, options, callback)) return; flush(); }; } /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }