typed-patterns
Version:
Basic design patterns
114 lines • 8.29 kB
JavaScript
;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpZC5hc3luYy5wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvYmVoYXZpb3JhbC9jaGFpbi1vZi1yZXNwb25zaWJpbGl0eS9idWlkLmFzeW5jLnByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IscUNBQXVIO0FBR3ZILE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztBQUMzRSxNQUFNLE1BQU0sR0FBRywrQkFBd0IsRUFBRSxDQUFDO0FBRTFDOzs7R0FHRztBQUNILFNBQWdCLG1CQUFtQixDQUNqQyxVQUFnRTtJQUVoRSxTQUFTLE9BQU8sQ0FBQyxPQUFnQixFQUFFLFFBQXNDLEVBQUUsSUFBaUI7UUFDMUYsSUFBSSxRQUFRLEdBQWdFLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUMxRyxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLFNBQVMsR0FBRyxDQUFDLGlCQUEwQjtZQUNyQyxPQUFPLFNBQVMsU0FBUztnQkFDdkIsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLGlCQUFpQixFQUFFO29CQUM1RSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQyxDQUFDO29CQUN4RCxPQUFPO2lCQUNSO3FCQUFNLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtvQkFDNUIsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsQ0FBQztvQkFDN0QsT0FBTztpQkFDUjtxQkFBTSxJQUFJLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxpQkFBVSxFQUFFO29CQUM5RCxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztvQkFDN0MsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztpQkFDNUI7cUJBQU07b0JBQ0wsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDaEIsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7d0JBQ2xDLElBQUk7NEJBQ0QsUUFBcUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO3lCQUMvQzt3QkFBQyxPQUFPLENBQUMsRUFBRTs0QkFDVixLQUFLLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7eUJBQ3JDO3FCQUNGO3lCQUFNO3dCQUNMLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxTQUFTLENBQUMsQ0FBQztxQkFDL0M7aUJBQ0Y7WUFDSCxDQUFDLENBQUM7UUFDSixDQUFDO1FBQ0QsU0FBUyxLQUFLLENBQUMsaUJBQTBCO1lBQ3ZDLE9BQU8sU0FBUyxLQUFLO2dCQUNuQixJQUFJLGlCQUFpQixLQUFLLFNBQVMsSUFBSSxlQUFlLEtBQUssaUJBQWlCLEVBQUU7b0JBQzVFLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLENBQUM7aUJBQy9EO3FCQUFNLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtvQkFDNUIsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUMsQ0FBQztpQkFDcEU7cUJBQU07b0JBQ0wsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNsRCxlQUFlLElBQUksQ0FBQyxDQUFDO29CQUNyQixLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3ZCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDbEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUN0QyxJQUFJLENBQUMsSUFBSSxFQUFFO3dCQUNULGVBQVEsQ0FBQyxHQUFHLEVBQUU7NEJBQ1osSUFBSTtnQ0FDRixRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQzs2QkFDakM7NEJBQUMsT0FBTyxDQUFDLEVBQUU7Z0NBQ1YsV0FBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs2QkFDL0I7d0JBQ0gsQ0FBQyxDQUFDLENBQUM7cUJBQ0o7eUJBQU07d0JBQ0wsWUFBWSxHQUFHLElBQUksQ0FBQzt3QkFDcEIsaUJBQVUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO3FCQUNuRDtpQkFDRjtZQUNILENBQUMsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1FBQzlCLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRTtZQUNyQyxLQUFLLEVBQUUsQ0FBQyxPQUFnQixFQUFtQixFQUFFO2dCQUMzQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUNyQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUU7d0JBQ3BDLElBQUksS0FBSyxFQUFFOzRCQUNULE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDZjs2QkFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFOzRCQUM5QixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3BCOzZCQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7NEJBQzlCLE9BQU8sQ0FBQyxNQUFnQixDQUFDLENBQUM7eUJBQzNCOzZCQUFNOzRCQUNMLE9BQU8sRUFBRSxDQUFDO3lCQUNYO29CQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLEtBQUs7U0FDbEIsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxPQUFPLE9BQXdELENBQUM7QUFDbEUsQ0FBQztBQXZGRCxrREF1RkMifQ==