@synerty/vortexjs
Version:
Custom observable data serialisation and routing based on Angular 2+
111 lines • 15.5 kB
JavaScript
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==