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