"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const log = require("./log"); const events = require("events"); class LastChainItem { begin() { } send(message) { log.info(`Last chain item, final result ${JSON.stringify(message)}`); } } let lastChainItem = new LastChainItem(); class AChainItem extends events.EventEmitter { constructor(label) { super(); this.label = label; this.next = lastChainItem; } toString() { return `<${this.label}>`; } registerNext(next) { this.next = next; } send(message) { this.emit('yourturn', message); } } exports.AChainItem = AChainItem; class AAsyncBaseChainItem extends AChainItem { constructor(label) { super(label); } begin() { if (this.next != null) { this.next.begin(); } this.addListener('yourturn', (message) => { log.info(`Calling ${this.toString()}`); this.func(message, this.next.send); }); } } exports.AAsyncBaseChainItem = AAsyncBaseChainItem; class ABaseChainItem extends AChainItem { constructor(label) { super(label); } begin() { if (this.next != null) { this.next.begin(); } this.addListener('yourturn', (message) => { log.info(`Calling ${this.toString()}`); let result = this.func(message); this.next.send(result); }); } } exports.ABaseChainItem = ABaseChainItem; class ChainItem extends ABaseChainItem { toString() { let funcName = (this.chainItemFunc.name === "") ? "lambda" : this.chainItemFunc.name; return `<${funcName}, ${this.label}>`; } registerFunc(func) { this.chainItemFunc = func; } func(message) { return this.chainItemFunc(message); } } exports.ChainItem = ChainItem; //# sourceMappingURL=callchain.js.map