maximize-iterator
Version:
Maximize the parallel calls of an iterator supporting asyncIterator interface
72 lines • 2.67 kB
JavaScript
;
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; }