UNPKG

typed-patterns

Version:
114 lines 8.29 kB
"use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const dbg = __importStar(require("debug")); const util_1 = require("../../util"); const debug = dbg.debug('typed-patterns/behavioral/build.async.processor'); const custom = util_1.getPromisifyCustomSymbol(); /** * Creates asynchronous processor based on chain-of-responsibility * @param processors Chain of single-responsible processors */ function buildAsyncProcessor(processors) { function chained(context, callback, next) { let iterator = processors[Symbol.iterator](); let activeProcessor = 0; let iteratorDone = false; function cbi(callbackProcessor) { return function _callback() { if (callbackProcessor !== undefined && activeProcessor !== callbackProcessor) { debug(new Error('Late callback detected. Suppressing')); return; } else if (iterator === null) { debug(new Error('Duplicate callback detected. Suppressing')); return; } else if (!iteratorDone && arguments[0] instanceof util_1.Unexpected) { debug('Unexpected found. Simulating next()'); nexti(callbackProcessor)(); } else { iterator = null; if (typeof callback === 'function') { try { callback.apply(null, arguments); } catch (e) { debug('Unexpected during chain', e); } } else { debug('Skipped result from chain', arguments); } } }; } function nexti(callbackProcessor) { return function _next() { if (callbackProcessor !== undefined && activeProcessor !== callbackProcessor) { debug(new Error('Duplicate next call detected. Suppressing')); } else if (iterator === null) { debug(new Error('Next call detected after callback. Suppressing')); } else { const { done, value: operator } = iterator.next(); activeProcessor += 1; debug(activeProcessor); const cb_i = cbi(activeProcessor); const next_i = nexti(activeProcessor); if (!done) { util_1.nextTick(() => { try { operator(context, cb_i, next_i); } catch (e) { util_1.fail(cbi(activeProcessor), e); } }); } else { iteratorDone = true; util_1.unexpected(undefined, cbi(activeProcessor), next); } } }; } nexti()(); } if (typeof custom === 'symbol') { Object.defineProperty(chained, custom, { value: (context) => { return new Promise((resolve, reject) => { chained(context, (error, ...result) => { if (error) { reject(error); } else if (result.length === 1) { resolve(result[0]); } else if (result.length !== 0) { resolve(result); } else { resolve(); } }); }); }, configurable: false, writable: false, enumerable: false }); } return chained; } exports.buildAsyncProcessor = buildAsyncProcessor; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpZC5hc3luYy5wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvYmVoYXZpb3JhbC9jaGFpbi1vZi1yZXNwb25zaWJpbGl0eS9idWlkLmFzeW5jLnByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IscUNBQXVIO0FBR3ZILE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztBQUMzRSxNQUFNLE1BQU0sR0FBRywrQkFBd0IsRUFBRSxDQUFDO0FBRTFDOzs7R0FHRztBQUNILFNBQWdCLG1CQUFtQixDQUNqQyxVQUFnRTtJQUVoRSxTQUFTLE9BQU8sQ0FBQyxPQUFnQixFQUFFLFFBQXNDLEVBQUUsSUFBaUI7UUFDMUYsSUFBSSxRQUFRLEdBQWdFLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUMxRyxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLFNBQVMsR0FBRyxDQUFDLGlCQUEwQjtZQUNyQyxPQUFPLFNBQVMsU0FBUztnQkFDdkIsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLGlCQUFpQixFQUFFO29CQUM1RSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQyxDQUFDO29CQUN4RCxPQUFPO2lCQUNSO3FCQUFNLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtvQkFDNUIsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsQ0FBQztvQkFDN0QsT0FBTztpQkFDUjtxQkFBTSxJQUFJLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxpQkFBVSxFQUFFO29CQUM5RCxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztvQkFD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