@synerty/vortexjs
Version:
Custom observable data serialisation and routing based on Angular 2+
106 lines • 13.2 kB
JavaScript
import { payloadIO } from "./PayloadIO";
import { assert, dateStr, dictKeysFromObject } from "./UtilMisc";
import "./UtilArray";
import { Subject } from "rxjs";
export class PayloadEndpoint {
_filt;
_lastPayloadDate;
_processLatestOnly;
constructor(component, filter, processLatestOnly = false) {
let self = this;
self._filt = filter;
self._lastPayloadDate = null;
self._processLatestOnly = processLatestOnly === true;
assert(self._filt != null, "Payload filter is null");
if (self._filt.key == null) {
let e = new Error(`There is no 'key' in the payload filt \
, There must be one for routing - ${JSON.stringify(self._filt)}`);
console.log(e);
throw e;
}
payloadIO.add(self);
// Add auto tear downs for angular scopes
let subscription = component.onDestroyEvent.subscribe(() => {
this.shutdown();
subscription.unsubscribe();
});
this._observable = new Subject();
}
_observable;
get observable() {
return this._observable;
}
/**
* Process Payload
* Check if the payload is meant for us then process it.
*
* @return null, or if the function is overloaded, you could return STOP_PROCESSING
* from PayloadIO, which will tell it to stop processing further endpoints.
*/
process(payloadEnvelope) {
if (!this.checkFilt(this._filt, payloadEnvelope.filt))
return null;
if (!this.checkDate(payloadEnvelope))
return null;
try {
this._observable.next(payloadEnvelope);
}
catch (e) {
// NOTE: Observables automatically remove observers when the raise exceptions.
console.log(`${dateStr()} ERROR: PayloadEndpoint.process, observable has been removed
${e.toString()}
${JSON.stringify(payloadEnvelope.filt)}`);
}
return null;
}
shutdown() {
let self = this;
payloadIO.remove(self);
if (this._observable["observers"] != null) {
for (let observer of this._observable["observers"]) {
observer["unsubscribe"]();
}
}
}
checkFilt(leftFilt, rightFilt) {
for (let key of dictKeysFromObject(leftFilt, true)) {
if (!rightFilt.hasOwnProperty(key))
return false;
let left = leftFilt[key];
let right = rightFilt[key];
// Handle the case of null !== undefined
if (left == null && right == null)
return true;
if (typeof left !== typeof right)
return false;
// Handle special case for Arrays using our equals method in ArrayUtil
if (left instanceof Array) {
if (left.sort().equals(right.sort()))
continue;
else
return false;
}
// Handle special case for Arrays using our equals method in ArrayUtil
if (left instanceof Object) {
if (this.checkFilt(left, right))
continue;
else
return false;
}
if (left !== right)
return false;
}
return true;
}
checkDate(payload) {
if (this._processLatestOnly) {
if (this._lastPayloadDate == null ||
this._lastPayloadDate < payload.date)
this._lastPayloadDate = payload.date;
else
return false;
}
return true;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF5bG9hZEVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZvcnRleC9QYXlsb2FkRW5kcG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNqRSxPQUFPLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzNDLE1BQU0sT0FBTyxlQUFlO0lBQ2hCLEtBQUssQ0FBa0I7SUFDdkIsZ0JBQWdCLENBQWM7SUFDOUIsa0JBQWtCLENBQVU7SUFFcEMsWUFDSSxTQUE0QixFQUM1QixNQUFvQixFQUNwQixvQkFBNkIsS0FBSztRQUVsQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFFaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDcEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsaUJBQWlCLEtBQUssSUFBSSxDQUFDO1FBRXJELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBRXJELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO29EQUNzQixJQUFJLENBQUMsU0FBUyxDQUM5QyxJQUFJLENBQUMsS0FBSyxDQUNiLEVBQUUsQ0FBQyxDQUFDO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLE1BQU0sQ0FBQyxDQUFDO1NBQ1g7UUFFRCxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBCLHlDQUF5QztRQUN6QyxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDdkQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxPQUFPLEVBQW1CLENBQUM7SUFDdEQsQ0FBQztJQUVPLFdBQVcsQ0FBMkI7SUFFOUMsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsZUFBZ0M7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFbEQsSUFBSTtZQUNBLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzFDO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUiw4RUFBOEU7WUFDOUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sRUFBRTtjQUN0QixDQUFDLENBQUMsUUFBUSxFQUFFO2NBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzdDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ3ZDLEtBQUssSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDaEQsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7YUFDN0I7U0FDSjtJQUNMLENBQUM7SUFFTyxTQUFTLENBQUMsUUFBUSxFQUFFLFNBQVM7UUFDakMsS0FBSyxJQUFJLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBRWpELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFM0Isd0NBQXdDO1lBQ3hDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUUvQyxJQUFJLE9BQU8sSUFBSSxLQUFLLE9BQU8sS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUUvQyxzRUFBc0U7WUFDdEUsSUFBSSxJQUFJLFlBQVksS0FBSyxFQUFFO2dCQUN2QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUFFLFNBQVM7O29CQUMxQyxPQUFPLEtBQUssQ0FBQzthQUNyQjtZQUVELHNFQUFzRTtZQUN0RSxJQUFJLElBQUksWUFBWSxNQUFNLEVBQUU7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO29CQUFFLFNBQVM7O29CQUNyQyxPQUFPLEtBQUssQ0FBQzthQUNyQjtZQUVELElBQUksSUFBSSxLQUFLLEtBQUs7Z0JBQUUsT0FBTyxLQUFLLENBQUM7U0FDcEM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sU0FBUyxDQUFDLE9BQU87UUFDckIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDekIsSUFDSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSTtnQkFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxJQUFJO2dCQUVwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQzs7Z0JBQ3BDLE9BQU8sS0FBSyxDQUFDO1NBQ3JCO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGF5bG9hZElPIH0gZnJvbSBcIi4vUGF5bG9hZElPXCI7XG5pbXBvcnQgeyBJUGF5bG9hZEZpbHQgfSBmcm9tIFwiLi9QYXlsb2FkXCI7XG5pbXBvcnQgeyBhc3NlcnQsIGRhdGVTdHIsIGRpY3RLZXlzRnJvbU9iamVjdCB9IGZyb20gXCIuL1V0aWxNaXNjXCI7XG5pbXBvcnQgXCIuL1V0aWxBcnJheVwiO1xuaW1wb3J0IHsgTmdMaWZlQ3ljbGVFdmVudHMgfSBmcm9tIFwiLi4vdXRpbC9OZ0xpZmVDeWNsZUV2ZW50c1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBQYXlsb2FkRW52ZWxvcGUgfSBmcm9tIFwiLi9QYXlsb2FkRW52ZWxvcGVcIjtcblxuZXhwb3J0IGNsYXNzIFBheWxvYWRFbmRwb2ludCB7XG4gICAgcHJpdmF0ZSBfZmlsdDogeyBrZXk6IHN0cmluZyB9O1xuICAgIHByaXZhdGUgX2xhc3RQYXlsb2FkRGF0ZTogRGF0ZSB8IG51bGw7XG4gICAgcHJpdmF0ZSBfcHJvY2Vzc0xhdGVzdE9ubHk6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29tcG9uZW50OiBOZ0xpZmVDeWNsZUV2ZW50cyxcbiAgICAgICAgZmlsdGVyOiBJUGF5bG9hZEZpbHQsXG4gICAgICAgIHByb2Nlc3NMYXRlc3RPbmx5OiBib29sZWFuID0gZmFsc2VcbiAgICApIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHNlbGYuX2ZpbHQgPSBmaWx0ZXI7XG4gICAgICAgIHNlbGYuX2xhc3RQYXlsb2FkRGF0ZSA9IG51bGw7XG4gICAgICAgIHNlbGYuX3Byb2Nlc3NMYXRlc3RPbmx5ID0gcHJvY2Vzc0xhdGVzdE9ubHkgPT09IHRydWU7XG5cbiAgICAgICAgYXNzZXJ0KHNlbGYuX2ZpbHQgIT0gbnVsbCwgXCJQYXlsb2FkIGZpbHRlciBpcyBudWxsXCIpO1xuXG4gICAgICAgIGlmIChzZWxmLl9maWx0LmtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgZSA9IG5ldyBFcnJvcihgVGhlcmUgaXMgbm8gJ2tleScgaW4gdGhlIHBheWxvYWQgZmlsdCBcXFxuICAgICAgICAgICAgICAgICwgVGhlcmUgbXVzdCBiZSBvbmUgZm9yIHJvdXRpbmcgLSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWx0XG4gICAgICAgICAgICAgICAgKX1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWRJTy5hZGQoc2VsZik7XG5cbiAgICAgICAgLy8gQWRkIGF1dG8gdGVhciBkb3ducyBmb3IgYW5ndWxhciBzY29wZXNcbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IGNvbXBvbmVudC5vbkRlc3Ryb3lFdmVudC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaHV0ZG93bigpO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX29ic2VydmFibGUgPSBuZXcgU3ViamVjdDxQYXlsb2FkRW52ZWxvcGU+KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb2JzZXJ2YWJsZTogU3ViamVjdDxQYXlsb2FkRW52ZWxvcGU+O1xuXG4gICAgZ2V0IG9ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxQYXlsb2FkRW52ZWxvcGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29ic2VydmFibGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBQYXlsb2FkXG4gICAgICogQ2hlY2sgaWYgdGhlIHBheWxvYWQgaXMgbWVhbnQgZm9yIHVzIHRoZW4gcHJvY2VzcyBpdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gbnVsbCwgb3IgaWYgdGhlIGZ1bmN0aW9uIGlzIG92ZXJsb2FkZWQsIHlvdSBjb3VsZCByZXR1cm4gU1RPUF9QUk9DRVNTSU5HXG4gICAgICogZnJvbSBQYXlsb2FkSU8sIHdoaWNoIHdpbGwgdGVsbCBpdCB0byBzdG9wIHByb2Nlc3NpbmcgZnVydGhlciBlbmRwb2ludHMuXG4gICAgICovXG4gICAgcHJvY2VzcyhwYXlsb2FkRW52ZWxvcGU6IFBheWxvYWRFbnZlbG9wZSk6IG51bGwgfCBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tGaWx0KHRoaXMuX2ZpbHQsIHBheWxvYWRFbnZlbG9wZS5maWx0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrRGF0ZShwYXlsb2FkRW52ZWxvcGUpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fb2JzZXJ2YWJsZS5uZXh0KHBheWxvYWRFbnZlbG9wZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IE9ic2VydmFibGVzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlIG9ic2VydmVycyB3aGVuIHRoZSByYWlzZSBleGNlcHRpb25zLlxuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7ZGF0ZVN0cigpfSBFUlJPUjogUGF5bG9hZEVuZHBvaW50LnByb2Nlc3MsIG9ic2VydmFibGUgaGFzIGJlZW4gcmVtb3ZlZFxuICAgICAgICAgICAgJHtlLnRvU3RyaW5nKCl9XG4gICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KHBheWxvYWRFbnZlbG9wZS5maWx0KX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHNodXRkb3duKCkge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIHBheWxvYWRJTy5yZW1vdmUoc2VsZik7XG4gICAgICAgIGlmICh0aGlzLl9vYnNlcnZhYmxlW1wib2JzZXJ2ZXJzXCJdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG9ic2VydmVyIG9mIHRoaXMuX29ic2VydmFibGVbXCJvYnNlcnZlcnNcIl0pIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlcltcInVuc3Vic2NyaWJlXCJdKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrRmlsdChsZWZ0RmlsdCwgcmlnaHRGaWx0KTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBkaWN0S2V5c0Zyb21PYmplY3QobGVmdEZpbHQsIHRydWUpKSB7XG4gICAgICAgICAgICBpZiAoIXJpZ2h0RmlsdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIGxldCBsZWZ0ID0gbGVmdEZpbHRba2V5XTtcbiAgICAgICAgICAgIGxldCByaWdodCA9IHJpZ2h0RmlsdFtrZXldO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugb2YgbnVsbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAobGVmdCA9PSBudWxsICYmIHJpZ2h0ID09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxlZnQgIT09IHR5cGVvZiByaWdodCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBBcnJheXMgdXNpbmcgb3VyIGVxdWFscyBtZXRob2QgaW4gQXJyYXlVdGlsXG4gICAgICAgICAgICBpZiAobGVmdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnQuc29ydCgpLmVxdWFscyhyaWdodC5zb3J0KCkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZSBmb3IgQXJyYXlzIHVzaW5nIG91ciBlcXVhbHMgbWV0aG9kIGluIEFycmF5VXRpbFxuICAgICAgICAgICAgaWYgKGxlZnQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja0ZpbHQobGVmdCwgcmlnaHQpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxlZnQgIT09IHJpZ2h0KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrRGF0ZShwYXlsb2FkKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9wcm9jZXNzTGF0ZXN0T25seSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RQYXlsb2FkRGF0ZSA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFBheWxvYWREYXRlIDwgcGF5bG9hZC5kYXRlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFBheWxvYWREYXRlID0gcGF5bG9hZC5kYXRlO1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iXX0=