UNPKG

@synerty/vortexjs

Version:

Custom observable data serialisation and routing based on Angular 2+

106 lines 13.9 kB
import { Jsonable, SerialiseUtil } from "./exports"; import { assert } from "./UtilMisc"; import "./UtilArray"; import { PayloadDelegateInMainWeb } from "./payload/PayloadDelegateInMainWeb"; import { Payload } from "./Payload"; // ---------------------------------------------------------------------------- // Payload class /** * * This class is serialised and transferred over the vortex to the server. */ export class PayloadEnvelope extends Jsonable { static workerDelegate = new PayloadDelegateInMainWeb(); static vortexUuidKey = "__vortexUuid__"; static vortexNameKey = "__vortexName__"; filt; data; result = null; date = null; /** * Payload Envelope * This class is serialised and tranferred over the vortex to the server. * @param filt The filter that the server handler is listening for * @param data: The encoded payload to go into this envelope * different location @depreciated * @param date The date for this envelope, it should match the payload. */ constructor(filt = {}, data = null, date = null) { super(); this.__rst = SerialiseUtil.T_RAPUI_PAYLOAD_ENVELOPE; this.filt = filt; this.data = data; this.date = date == null ? new Date() : this.date; } static setWorkerDelegate(delegate) { PayloadEnvelope.workerDelegate = delegate; } get encodedPayload() { if (!this.data?.length) { return null; } if (typeof this.data !== "string") { throw new Error("PayloadEnvelope: encodedPayload is not an array"); } // noinspection UnnecessaryLocalVariableJS const str = this.data; return str; } set encodedPayload(val) { if (!val?.length || typeof val !== "string") { throw new Error("PayloadEnvelope: val is not null or string"); } this.data = val; } // ------------------------------------------- // Envelope method isEmpty() { // Ignore the connection start vortexUuid value // It's sent as the first response when we connect. for (let property in this.filt) { if (property === PayloadEnvelope.vortexUuidKey) continue; // Anything else, return false return false; } return ((this.encodedPayload == null || this.encodedPayload.length === 0) && this.result == null); } async decodePayload() { if (this.encodedPayload == null) { throw new Error("PayloadEnvelope: decodePayload, data is null"); } return await Payload.fromEncodedPayload(this.encodedPayload); } // ------------------------------------------- // JSON Related method _fromJson(jsonStr) { return Promise.resolve(JSON.parse(jsonStr)) // .then((jsonDict) => { assert(jsonDict[Jsonable.JSON_CLASS_TYPE] === this.__rst); return this.fromJsonDict(jsonDict); }); } _toJson() { return Promise.resolve(this.toJsonDict()) // .then((jsonDict) => JSON.stringify(jsonDict)); } static fromVortexMsg(vortexStr) { // Websockets do not require base64 encoding if (vortexStr[0] === "{") { // noinspection UnnecessaryLocalVariableJS const jsonStr = vortexStr; return new PayloadEnvelope()._fromJson(jsonStr); } // noinspection UnnecessaryLocalVariableJS const result = PayloadEnvelope.workerDelegate .decodeEnvelope(vortexStr) .then((jsonStr) => new PayloadEnvelope()._fromJson(jsonStr)); return result; } toVortexMsg() { return this._toJson() // .then((jsonStr) => PayloadEnvelope.workerDelegate.encodeEnvelope(jsonStr)); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF5bG9hZEVudmVsb3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZvcnRleC9QYXlsb2FkRW52ZWxvcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLCtFQUErRTtBQUMvRSxnQkFBZ0I7QUFFaEI7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsUUFBUTtJQUNqQyxNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksd0JBQXdCLEVBQUUsQ0FBQztJQUUvRCxNQUFNLENBQVUsYUFBYSxHQUFHLGdCQUFnQixDQUFDO0lBQ2pELE1BQU0sQ0FBVSxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7SUFFakQsSUFBSSxDQUFLO0lBQ1QsSUFBSSxDQUFzQjtJQUMxQixNQUFNLEdBQXVCLElBQUksQ0FBQztJQUNsQyxJQUFJLEdBQWdCLElBQUksQ0FBQztJQUV6Qjs7Ozs7OztPQU9HO0lBQ0gsWUFDSSxPQUFXLEVBQUUsRUFDYixPQUE0QixJQUFJLEVBQ2hDLE9BQW9CLElBQUk7UUFFeEIsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQztRQUVwRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUVqQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMs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Y0FBYzthQUN4QyxjQUFjLENBQUMsU0FBUyxDQUFDO2FBQ3pCLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNqRSxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsV0FBVztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7YUFDbkIsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDZCxlQUFlLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FDekQsQ0FBQztJQUNWLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKc29uYWJsZSwgU2VyaWFsaXNlVXRpbCB9IGZyb20gXCIuL2V4cG9ydHNcIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuL1V0aWxNaXNjXCI7XG5pbXBvcnQgXCIuL1V0aWxBcnJheVwiO1xuaW1wb3J0IHsgUGF5bG9hZERlbGVnYXRlQUJDIH0gZnJvbSBcIi4vcGF5bG9hZC9QYXlsb2FkRGVsZWdhdGVBQkNcIjtcbmltcG9ydCB7IFBheWxvYWREZWxlZ2F0ZUluTWFpbldlYiB9IGZyb20gXCIuL3BheWxvYWQvUGF5bG9hZERlbGVnYXRlSW5NYWluV2ViXCI7XG5pbXBvcnQgeyBQYXlsb2FkIH0gZnJvbSBcIi4vUGF5bG9hZFwiO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQYXlsb2FkIGNsYXNzXG5cbi8qKlxuICpcbiAqIFRoaXMgY2xhc3MgaXMgc2VyaWFsaXNlZCBhbmQgdHJhbnNmZXJyZWQgb3ZlciB0aGUgdm9ydGV4IHRvIHRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXlsb2FkRW52ZWxvcGUgZXh0ZW5kcyBKc29uYWJsZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgd29ya2VyRGVsZWdhdGUgPSBuZXcgUGF5bG9hZERlbGVnYXRlSW5NYWluV2ViKCk7XG5cbiAgICBzdGF0aWMgcmVhZG9ubHkgdm9ydGV4VXVpZEtleSA9IFwiX192b3J0ZXhVdWlkX19cIjtcbiAgICBzdGF0aWMgcmVhZG9ubHkgdm9ydGV4TmFtZUtleSA9IFwiX192b3J0ZXhOYW1lX19cIjtcblxuICAgIGZpbHQ6IHt9O1xuICAgIGRhdGE6IGFueSB8IHN0cmluZyB8IG51bGw7XG4gICAgcmVzdWx0OiBzdHJpbmcgfCB7fSB8IG51bGwgPSBudWxsO1xuICAgIGRhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFBheWxvYWQgRW52ZWxvcGVcbiAgICAgKiBUaGlzIGNsYXNzIGlzIHNlcmlhbGlzZWQgYW5kIHRyYW5mZXJyZWQgb3ZlciB0aGUgdm9ydGV4IHRvIHRoZSBzZXJ2ZXIuXG4gICAgICogQHBhcmFtIGZpbHQgVGhlIGZpbHRlciB0aGF0IHRoZSBzZXJ2ZXIgaGFuZGxlciBpcyBsaXN0ZW5pbmcgZm9yXG4gICAgICogQHBhcmFtIGRhdGE6IFRoZSBlbmNvZGVkIHBheWxvYWQgdG8gZ28gaW50byB0aGlzIGVudmVsb3BlXG4gICAgICogZGlmZmVyZW50IGxvY2F0aW9uIEBkZXByZWNpYXRlZFxuICAgICAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIGZvciB0aGlzIGVudmVsb3BlLCBpdCBzaG91bGQgbWF0Y2ggdGhlIHBheWxvYWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGZpbHQ6IHt9ID0ge30sXG4gICAgICAgIGRhdGE6IGFueSB8IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgICAgICBkYXRlOiBEYXRlIHwgbnVsbCA9IG51bGxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLl9fcnN0ID0gU2VyaWFsaXNlVXRpbC5UX1JBUFVJX1BBWUxPQURfRU5WRUxPUEU7XG5cbiAgICAgICAgdGhpcy5maWx0ID0gZmlsdDtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcblxuICAgICAgICB0aGlzLmRhdGUgPSBkYXRlID09IG51bGwgPyBuZXcgRGF0ZSgpIDogdGhpcy5kYXRlO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXRXb3JrZXJEZWxlZ2F0ZShkZWxlZ2F0ZTogUGF5bG9hZERlbGVnYXRlQUJDKSB7XG4gICAgICAgIFBheWxvYWRFbnZlbG9wZS53b3JrZXJEZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgIH1cblxuICAgIGdldCBlbmNvZGVkUGF5bG9hZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGE/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF5bG9hZEVudmVsb3BlOiBlbmNvZGVkUGF5bG9hZCBpcyBub3QgYW4gYXJyYXlcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub2luc3BlY3Rpb24gVW5uZWNlc3NhcnlMb2NhbFZhcmlhYmxlSlNcbiAgICAgICAgY29uc3Qgc3RyOiBhbnkgPSB0aGlzLmRhdGE7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgc2V0IGVuY29kZWRQYXlsb2FkKHZhbDogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAoIXZhbD8ubGVuZ3RoIHx8IHR5cGVvZiB2YWwgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBheWxvYWRFbnZlbG9wZTogdmFsIGlzIG5vdCBudWxsIG9yIHN0cmluZ1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YSA9IHZhbDtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gRW52ZWxvcGUgbWV0aG9kXG5cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGNvbm5lY3Rpb24gc3RhcnQgdm9ydGV4VXVpZCB2YWx1ZVxuICAgICAgICAvLyBJdCdzIHNlbnQgYXMgdGhlIGZpcnN0IHJlc3BvbnNlIHdoZW4gd2UgY29ubmVjdC5cbiAgICAgICAgZm9yIChsZXQgcHJvcGVydHkgaW4gdGhpcy5maWx0KSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHkgPT09IFBheWxvYWRFbnZlbG9wZS52b3J0ZXhVdWlkS2V5KSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIEFueXRoaW5nIGVsc2UsIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0aGlzLmVuY29kZWRQYXlsb2FkID09IG51bGwgfHwgdGhpcy5lbmNvZGVkUGF5bG9hZC5sZW5ndGggPT09IDApICYmXG4gICAgICAgICAgICB0aGlzLnJlc3VsdCA9PSBudWxsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVjb2RlUGF5bG9hZCgpOiBQcm9taXNlPFBheWxvYWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZW5jb2RlZFBheWxvYWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF5bG9hZEVudmVsb3BlOiBkZWNvZGVQYXlsb2FkLCBkYXRhIGlzIG51bGxcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IFBheWxvYWQuZnJvbUVuY29kZWRQYXlsb2FkKHRoaXMuZW5jb2RlZFBheWxvYWQpO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBKU09OIFJlbGF0ZWQgbWV0aG9kXG5cbiAgICBwcml2YXRlIF9mcm9tSnNvbihqc29uU3RyOiBzdHJpbmcpOiBQcm9taXNlPFBheWxvYWRFbnZlbG9wZT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKEpTT04ucGFyc2UoanNvblN0cikpIC8vXG4gICAgICAgICAgICAudGhlbigoanNvbkRpY3QpID0+IHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoanNvbkRpY3RbSnNvbmFibGUuSlNPTl9DTEFTU19UWVBFXSA9PT0gdGhpcy5fX3JzdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnJvbUpzb25EaWN0KGpzb25EaWN0KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RvSnNvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMudG9Kc29uRGljdCgpKSAvL1xuICAgICAgICAgICAgLnRoZW4oKGpzb25EaWN0KSA9PiBKU09OLnN0cmluZ2lmeShqc29uRGljdCkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tVm9ydGV4TXNnKHZvcnRleFN0cjogc3RyaW5nKTogUHJvbWlzZTxQYXlsb2FkRW52ZWxvcGU+IHtcbiAgICAgICAgLy8gV2Vic29ja2V0cyBkbyBub3QgcmVxdWlyZSBiYXNlNjQgZW5jb2RpbmdcbiAgICAgICAgaWYgKHZvcnRleFN0clswXSA9PT0gXCJ7XCIpIHtcbiAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBVbm5lY2Vzc2FyeUxvY2FsVmFyaWFibGVKU1xuICAgICAgICAgICAgY29uc3QganNvblN0ciA9IHZvcnRleFN0cjtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGF5bG9hZEVudmVsb3BlKCkuX2Zyb21Kc29uKGpzb25TdHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIFVubmVjZXNzYXJ5TG9jYWxWYXJpYWJsZUpTXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFBheWxvYWRFbnZlbG9wZS53b3JrZXJEZWxlZ2F0ZVxuICAgICAgICAgICAgLmRlY29kZUVudmVsb3BlKHZvcnRleFN0cilcbiAgICAgICAgICAgIC50aGVuKChqc29uU3RyKSA9PiBuZXcgUGF5bG9hZEVudmVsb3BlKCkuX2Zyb21Kc29uKGpzb25TdHIpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b1ZvcnRleE1zZygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG9Kc29uKCkgLy9cbiAgICAgICAgICAgIC50aGVuKChqc29uU3RyKSA9PlxuICAgICAgICAgICAgICAgIFBheWxvYWRFbnZlbG9wZS53b3JrZXJEZWxlZ2F0ZS5lbmNvZGVFbnZlbG9wZShqc29uU3RyKVxuICAgICAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=