UNPKG

@synerty/vortexjs

Version:

Custom observable data serialisation and routing based on Angular 2+

111 lines 15.5 kB
import { Payload } from "../Payload"; import { assert, dateStr } from "../UtilMisc"; import { VortexService } from "../VortexService"; import { NgLifeCycleEvents } from "../../util/NgLifeCycleEvents"; import { VortexStatusService } from "../VortexStatusService"; import { Inject, Injectable } from "@angular/core"; import { PayloadEnvelope } from "../PayloadEnvelope"; import * as i0 from "@angular/core"; export class TupleActionProcessorNameService { name; additionalFilt; constructor(name, additionalFilt = {}) { this.name = name; this.additionalFilt = additionalFilt; } } export class TupleActionProcessorService extends NgLifeCycleEvents { tupleActionProcessorName; vortexService; vortexStatusService; _tupleProcessorsByTupleName = {}; defaultDelegate = null; constructor(tupleActionProcessorName, vortexService, vortexStatusService) { super(); this.tupleActionProcessorName = tupleActionProcessorName; this.vortexService = vortexService; this.vortexStatusService = vortexStatusService; let filt = Object.assign({ name: tupleActionProcessorName.name, key: "tupleActionProcessorName", }, tupleActionProcessorName.additionalFilt); vortexService .createEndpointObservable(this, filt) .subscribe((payloadEnvelope) => { payloadEnvelope .decodePayload() .then((payload) => this._process(payload)) .catch((e) => console.log(`${dateStr()} TupleActionProcessorService:Error decoding payload ${e}`)); }); } /** Add Tuple Action Processor Delegate * *@param tupleName: The tuple name to process actions for. *@param delegate: The processor to use for processing this tuple name. * */ setDelegate(tupleName, delegate) { assert(tupleName in this._tupleProcessorsByTupleName, `TupleActionProcessor:${this.tupleActionProcessorName.name}, ` + `Tuple name ${tupleName} is already registered`); this._tupleProcessorsByTupleName[tupleName] = delegate; } /** Set Default Tuple Action Processor Delegate * *@param delegate: The processor to use for processing unhandled TupleActions. * */ setDefaultDelegate(delegate) { this.defaultDelegate = delegate; } /** Process the Payload / Tuple Action * */ _process(payload) { assert(payload.tuples.length === 1, `TupleActionProcessor:${this.tupleActionProcessorName.name}` + `Expected 1 tuples, received ${payload.tuples.length}`); let tupleAction = payload.tuples[0]; let tupleName = tupleAction._tupleName(); let delegate = null; let processor = this._tupleProcessorsByTupleName[tupleName]; if (processor != null) { delegate = processor; } else if (this.defaultDelegate != null) { delegate = this.defaultDelegate; } else { console.log(`${dateStr()} ERROR No delegate registered for ${tupleName}`); return; // throw new Error(`No delegate registered for ${tupleName}`); } let promise = delegate.processTupleAction(tupleAction); promise.then((tuples) => this.callback(tuples, payload.filt, tupleName)); promise.catch((err) => this.errback(err, payload.filt, tupleName)); } callback(tuples, replyFilt, tupleName) { let payload = new Payload(replyFilt, tuples); this.vortexService.sendPayload(payload); } errback(err, replyFilt, tupleName) { this.vortexStatusService.logError(`TupleActionProcessor:${this.tupleActionProcessorName.name}` + ` Failed to process TupleActon, ${err}`); let payloadEnvelope = new PayloadEnvelope(replyFilt); payloadEnvelope.result = err; this.vortexService.sendPayloadEnvelope(payloadEnvelope); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TupleActionProcessorService, deps: [{ token: TupleActionProcessorNameService }, { token: VortexService }, { token: VortexStatusService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TupleActionProcessorService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TupleActionProcessorService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [TupleActionProcessorNameService] }] }, { type: undefined, decorators: [{ type: Inject, args: [VortexService] }] }, { type: undefined, decorators: [{ type: Inject, args: [VortexStatusService] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHVwbGVBY3Rpb25Qcm9jZXNzb3JTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3ZvcnRleC9hY3Rpb24tc2VydmljZS9UdXBsZUFjdGlvblByb2Nlc3NvclNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQUVyRCxNQUFNLE9BQU8sK0JBQStCO0lBQ3JCO0lBQXFCO0lBQXhDLFlBQW1CLElBQVksRUFBUyxpQkFBc0IsRUFBRTtRQUE3QyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVMsbUJBQWMsR0FBZCxjQUFjLENBQVU7SUFBRyxDQUFDO0NBQ3ZFO0FBR0QsTUFBTSxPQUFPLDJCQUE0QixTQUFRLGlCQUFpQjtJQU1sRDtJQUN1QjtJQUNNO0lBUGpDLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztJQUNqQyxlQUFlLEdBQTJDLElBQUksQ0FBQztJQUV2RSxZQUVZLHdCQUF3QixFQUNELGFBQWEsRUFDUCxtQkFBbUI7UUFFeEQsS0FBSyxFQUFFLENBQUM7UUFKQSw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQUE7UUFDRCxrQkFBYSxHQUFiLGFBQWEsQ0FBQTtRQUNQLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBQTtRQUl4RCxJQUFJLElB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QyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU8sT0FBTyxDQUFDLEdBQVcsRUFBRSxTQUFhLEVBQUUsU0FBaUI7UUFDekQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FDN0Isd0JBQXdCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUU7WUFDeEQsa0NBQWtDLEdBQUcsRUFBRSxDQUM5QyxDQUFDO1FBRUYsSUFBSSxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsZUFBZSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFFN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM1RCxDQUFDO3dHQTVHUSwyQkFBMkIsa0JBS3hCLCtCQUErQixhQUUvQixhQUFhLGFBQ2IsbUJBQW1COzRHQVJ0QiwyQkFBMkI7OzRGQUEzQiwyQkFBMkI7a0JBRHZDLFVBQVU7OzBCQU1GLE1BQU07MkJBQUMsK0JBQStCOzswQkFFdEMsTUFBTTsyQkFBQyxhQUFhOzswQkFDcEIsTUFBTTsyQkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQYXlsb2FkIH0gZnJvbSBcIi4uL1BheWxvYWRcIjtcbmltcG9ydCB7IFR1cGxlQWN0aW9uUHJvY2Vzc29yRGVsZWdhdGVBQkMgfSBmcm9tIFwiLi9UdXBsZUFjdGlvblByb2Nlc3NvckRlbGVnYXRlXCI7XG5pbXBvcnQgeyBhc3NlcnQsIGRhdGVTdHIgfSBmcm9tIFwiLi4vVXRpbE1pc2NcIjtcbmltcG9ydCB7IFZvcnRleFNlcnZpY2UgfSBmcm9tIFwiLi4vVm9ydGV4U2VydmljZVwiO1xuaW1wb3J0IHsgTmdMaWZlQ3ljbGVFdmVudHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9OZ0xpZmVDeWNsZUV2ZW50c1wiO1xuaW1wb3J0IHsgVm9ydGV4U3RhdHVzU2VydmljZSB9IGZyb20gXCIuLi9Wb3J0ZXhTdGF0dXNTZXJ2aWNlXCI7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgUGF5bG9hZEVudmVsb3BlIH0gZnJvbSBcIi4uL1BheWxvYWRFbnZlbG9wZVwiO1xuXG5leHBvcnQgY2xhc3MgVHVwbGVBY3Rpb25Qcm9jZXNzb3JOYW1lU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIGFkZGl0aW9uYWxGaWx0OiBhbnkgPSB7fSkge31cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFR1cGxlQWN0aW9uUHJvY2Vzc29yU2VydmljZSBleHRlbmRzIE5nTGlmZUN5Y2xlRXZlbnRzIHtcbiAgICBwcml2YXRlIF90dXBsZVByb2Nlc3NvcnNCeVR1cGxlTmFtZSA9IHt9O1xuICAgIHByaXZhdGUgZGVmYXVsdERlbGVnYXRlOiBudWxsIHwgVHVwbGVBY3Rpb25Qcm9jZXNzb3JEZWxlZ2F0ZUFCQyA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChUdXBsZUFjdGlvblByb2Nlc3Nvck5hbWVTZXJ2aWNlKVxuICAgICAgICBwcml2YXRlIHR1cGxlQWN0aW9uUHJvY2Vzc29yTmFtZSxcbiAgICAgICAgQEluamVjdChWb3J0ZXhTZXJ2aWNlKSBwcml2YXRlIHZvcnRleFNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoVm9ydGV4U3RhdHVzU2VydmljZSkgcHJpdmF0ZSB2b3J0ZXhTdGF0dXNTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgbGV0IGZpbHQgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IHR1cGxlQWN0aW9uUHJvY2Vzc29yTmFtZS5uYW1lLFxuICAgICAgICAgICAgICAgIGtleTogXCJ0dXBsZUFjdGlvblByb2Nlc3Nvck5hbWVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0dXBsZUFjdGlvblByb2Nlc3Nvck5hbWUuYWRkaXRpb25hbEZpbHRcbiAgICAgICAgKTtcblxuICAgICAgICB2b3J0ZXhTZXJ2aWNlXG4gICAgICAgICAgICAuY3JlYXRlRW5kcG9pbnRPYnNlcnZhYmxlKHRoaXMsIGZpbHQpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChwYXlsb2FkRW52ZWxvcGU6IFBheWxvYWRFbnZlbG9wZSkgPT4ge1xuICAgICAgICAgICAgICAgIHBheWxvYWRFbnZlbG9wZVxuICAgICAgICAgICAgICAgICAgICAuZGVjb2RlUGF5bG9hZCgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChwYXlsb2FkOiBQYXlsb2FkKSA9PiB0aGlzLl9wcm9jZXNzKHBheWxvYWQpKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtkYXRlU3RyKCl9IFR1cGxlQWN0aW9uUHJvY2Vzc29yU2VydmljZTpFcnJvciBkZWNvZGluZyBwYXlsb2FkICR7ZX1gXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQWRkIFR1cGxlIEFjdGlvbiBQcm9jZXNzb3IgRGVsZWdhdGVcbiAgICAgKlxuICAgICAqQHBhcmFtIHR1cGxlTmFtZTogVGhlIHR1cGxlIG5hbWUgdG8gcHJvY2VzcyBhY3Rpb25zIGZvci5cbiAgICAgKkBwYXJhbSBkZWxlZ2F0ZTogVGhlIHByb2Nlc3NvciB0byB1c2UgZm9yIHByb2Nlc3NpbmcgdGhpcyB0dXBsZSBuYW1lLlxuICAgICAqXG4gICAgICovXG4gICAgc2V0RGVsZWdhdGUodHVwbGVOYW1lOiBzdHJpbmcsIGRlbGVnYXRlOiBUdXBsZUFjdGlvblByb2Nlc3NvckRlbGVnYXRlQUJDKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICAgIHR1cGxlTmFtZSBpbiB0aGlzLl90dXBsZVByb2Nlc3NvcnNCeVR1cGxlTmFtZSxcbiAgICAgICAgICAgIGBUdXBsZUFjdGlvblByb2Nlc3Nvcjoke3RoaXMudHVwbGVBY3Rpb25Qcm9jZXNzb3JOYW1lLm5hbWV9LCBgICtcbiAgICAgICAgICAgICAgICBgVHVwbGUgbmFtZSAke3R1cGxlTmFtZX0gaXMgYWxyZWFkeSByZWdpc3RlcmVkYFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX3R1cGxlUHJvY2Vzc29yc0J5VHVwbGVOYW1lW3R1cGxlTmFtZV0gPSBkZWxlZ2F0ZTtcbiAgICB9XG5cbiAgICAvKiogU2V0IERlZmF1bHQgVHVwbGUgQWN0aW9uIFByb2Nlc3NvciBEZWxlZ2F0ZVxuICAgICAqXG4gICAgICpAcGFyYW0gZGVsZWdhdGU6IFRoZSBwcm9jZXNzb3IgdG8gdXNlIGZvciBwcm9jZXNzaW5nIHVuaGFuZGxlZCBUdXBsZUFjdGlvbnMuXG4gICAgICpcbiAgICAgKi9cbiAgICBzZXREZWZhdWx0RGVsZWdhdGUoZGVsZWdhdGU6IFR1cGxlQWN0aW9uUHJvY2Vzc29yRGVsZWdhdGVBQkMpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0RGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICB9XG5cbiAgICAvKiogUHJvY2VzcyB0aGUgUGF5bG9hZCAvIFR1cGxlIEFjdGlvblxuICAgICAqXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcHJvY2VzcyhwYXlsb2FkOiBQYXlsb2FkKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICAgIHBheWxvYWQudHVwbGVzLmxlbmd0aCA9PT0gMSxcbiAgICAgICAgICAgIGBUdXBsZUFjdGlvblByb2Nlc3Nvcjoke3RoaXMudHVwbGVBY3Rpb25Qcm9jZXNzb3JOYW1lLm5hbWV9YCArXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIDEgdHVwbGVzLCByZWNlaXZlZCAke3BheWxvYWQudHVwbGVzLmxlbmd0aH1gXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHR1cGxlQWN0aW9uID0gcGF5bG9hZC50dXBsZXNbMF07XG5cbiAgICAgICAgbGV0IHR1cGxlTmFtZSA9IHR1cGxlQWN0aW9uLl90dXBsZU5hbWUoKTtcblxuICAgICAgICBsZXQgZGVsZWdhdGUgPSBudWxsO1xuICAgICAgICBsZXQgcHJvY2Vzc29yID0gdGhpcy5fdHVwbGVQcm9jZXNzb3JzQnlUdXBsZU5hbWVbdHVwbGVOYW1lXTtcbiAgICAgICAgaWYgKHByb2Nlc3NvciAhPSBudWxsKSB7XG4gICAgICAgICAgICBkZWxlZ2F0ZSA9IHByb2Nlc3NvcjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRlZmF1bHREZWxlZ2F0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkZWxlZ2F0ZSA9IHRoaXMuZGVmYXVsdERlbGVnYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7ZGF0ZVN0cigpfSBFUlJPUiBObyBkZWxlZ2F0ZSByZWdpc3RlcmVkIGZvciAke3R1cGxlTmFtZX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcihgTm8gZGVsZWdhdGUgcmVnaXN0ZXJlZCBmb3IgJHt0dXBsZU5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJvbWlzZSA9IGRlbGVnYXRlLnByb2Nlc3NUdXBsZUFjdGlvbih0dXBsZUFjdGlvbik7XG4gICAgICAgIHByb21pc2UudGhlbigodHVwbGVzKSA9PlxuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0dXBsZXMsIHBheWxvYWQuZmlsdCwgdHVwbGVOYW1lKVxuICAgICAgICApO1xuICAgICAgICBwcm9taXNlLmNhdGNoKChlcnIpID0+IHRoaXMuZXJyYmFjayhlcnIsIHBheWxvYWQuZmlsdCwgdHVwbGVOYW1lKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxsYmFjayh0dXBsZXMsIHJlcGx5RmlsdDoge30sIHR1cGxlTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBwYXlsb2FkID0gbmV3IFBheWxvYWQocmVwbHlGaWx0LCB0dXBsZXMpO1xuXG4gICAgICAgIHRoaXMudm9ydGV4U2VydmljZS5zZW5kUGF5bG9hZChwYXlsb2FkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVycmJhY2soZXJyOiBzdHJpbmcsIHJlcGx5RmlsdDoge30sIHR1cGxlTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudm9ydGV4U3RhdHVzU2VydmljZS5sb2dFcnJvcihcbiAgICAgICAgICAgIGBUdXBsZUFjdGlvblByb2Nlc3Nvcjoke3RoaXMudHVwbGVBY3Rpb25Qcm9jZXNzb3JOYW1lLm5hbWV9YCArXG4gICAgICAgICAgICAgICAgYCBGYWlsZWQgdG8gcHJvY2VzcyBUdXBsZUFjdG9uLCAke2Vycn1gXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHBheWxvYWRFbnZlbG9wZSA9IG5ldyBQYXlsb2FkRW52ZWxvcGUocmVwbHlGaWx0KTtcbiAgICAgICAgcGF5bG9hZEVudmVsb3BlLnJlc3VsdCA9IGVycjtcblxuICAgICAgICB0aGlzLnZvcnRleFNlcnZpY2Uuc2VuZFBheWxvYWRFbnZlbG9wZShwYXlsb2FkRW52ZWxvcGUpO1xuICAgIH1cbn1cbiJdfQ==