{"version":3,"file":"synerty-vortexjs.mjs","sources":["../../src/vortex/UtilMisc.ts","../../src/vortex/UtilArray.ts","../../src/vortex/payload/PayloadDelegateABC.ts","../../src/vortex/payload/PayloadDelegateInMainWeb.ts","../../src/vortex/SerialiseUtil.ts","../../src/vortex/UtilString.ts","../../src/vortex/Jsonable.ts","../../src/vortex/Tuple.ts","../../src/vortex/PayloadEnvelope.ts","../../src/vortex/Payload.ts","../../src/vortex/PayloadIO.ts","../../src/vortex/PayloadEndpoint.ts","../../src/vortex/PayloadFilterKeys.ts","../../src/vortex/VortexClientABC.ts","../../src/vortex/TupleLoader.ts","../../src/vortex/VortexStatusService.ts","../../src/vortex/VortexClientHttp.ts","../../src/vortex/VortexClientWebsocket.ts","../../src/vortex/VortexService.ts","../../src/util/NgLifeCycleEvents.ts","../../src/vortex/PayloadResponse.ts","../../src/vortex/storage-factory/TupleStorageFactoryService.ts","../../src/vortex/storage/TupleStorageServiceABC.ts","../../src/vortex/storage-api/sql-api-abc.ts","../../src/vortex/storage-api/cap-sql-api.ts","../../src/vortex/storage-api/web-sql-api.ts","../../src/vortex/storage-api/sql-api-factory.ts","../../src/vortex/storage/TupleOfflineStorageNameService.ts","../../src/vortex/storage/TupleOfflineStorageService.ts","../../src/vortex/TupleSelector.ts","../../src/vortex/observable-service/TupleDataOfflineObserverService.ts","../../src/vortex/observable-service/TupleDataObserverService.ts","../../src/vortex/TupleAction.ts","../../src/vortex/action-service/TupleActionPushService.ts","../../src/vortex/action-service/TupleActionPushOfflineSingletonService.ts","../../src/vortex/action-service/TupleActionPushOfflineService.ts","../../src/vortex/action-service/TupleActionProcessorService.ts","../../src/vortex/action-service/TupleActionProcessorDelegate.ts","../../src/vortex/UtilSort.ts","../../src/vortex/payload/PayloadDelegateWeb.ts","../../src/vortex/storage-api/indexeddb-api.ts","../../src/vortex/storage/TupleStorageIndexedDbService.ts","../../src/vortex/storage/TupleStorageNullService.ts","../../src/vortex/action-storage/TupleActionStorageServiceABC.ts","../../src/vortex/action-storage/TupleActionStorageIndexedDbService.ts","../../src/vortex/storage/TupleStorageWebSqlService.ts","../../src/vortex/action-storage/tuple-action-storage-sql.service.ts","../../src/vortex/storage-factory/TupleStorageFactoryServiceWeb.ts","../../src/vortex/data-loader/TupleDataLoaderTuples.ts","../../src/vortex/data-loader/TupleDataLoader.ts","../../src/vortex/data-loader/TupleDataLoaderDelegate.ts","../../src/vortex/data-loader/TupleDataLoaderTupleABC.ts","../../synerty-vortexjs.ts"],"sourcesContent":["/**\n * Created by Jarrod Chesney / Synerty on 22/11/16.\n */\n// ----------------------------------------------------------------------------\n/**\n * Keys from Object\n *\n * Extract an array of keys from a json object.\n * This will not include keys starting with an underscore.\n *\n * @param obj: The object to get the keys from.\n * @param includeUnderscore: Should keys with underscores be included?\n * @return A list of keys from the object.\n */\nexport function dictKeysFromObject(\n    obj: {},\n    includeUnderscore = false\n): string[] {\n    let keys = []\n    for (let k in obj) {\n        if ((!k.startsWith(\"_\") || includeUnderscore)\n            && obj.hasOwnProperty(k) && typeof k !== \"function\") {\n            keys.push(k)\n        }\n    }\n    return keys\n}\n\n// ----------------------------------------------------------------------------\n\nexport class AssertException {\n    message: string\n    \n    constructor(message: string) {\n        let self = this\n        self.message = message\n    }\n    \n    toString(): string {\n        let self = this\n        return \"AssertException: \" + self.message\n    }\n}\n\n/**\n * A simple assert statement\n * @param exp : The boolean to assert\n * @param message : The message to log when the assertion fails.\n */\nexport function assert(\n    exp: boolean,\n    message: string | null = null\n): null {\n    if (exp)\n        return\n    \n    console.trace()\n    throw new AssertException(message)\n}\n\n// ----------------------------------------------------------------------------\n\n/**\n * Create url encoded arguments\n *\n * @param filter : The object containing the key:value pairs to convert into a url\n *\n */\nexport function getFiltStr(filter: {}): string {\n    let filtStr = \"\"\n    \n    for (let key in filter) {\n        if (!filter.hasOwnProperty(key))\n            continue\n        \n        filtStr += (filtStr.length ? \"&\" : \"?\") + key + \"=\" + filter[key]\n    }\n    \n    return filtStr\n}\n\n// ----------------------------------------------------------------------------\n\n/**\n * Date String\n *\n * @return A date and time formatted to a string for log messages.\n */\nexport function dateStr(): string {\n    let d = new Date()\n    return d.toTimeString()\n        .split(\" \")[0] + \".\" + d.getUTCMilliseconds() + \": \"\n}\n\n// ----------------------------------------------------------------------------\n\n/**\n * Bind a function\n * @param obj : The object to bind the function for.\n * @param method : The method to bind onto to the object.\n *\n * @return A callable function that will call the method correctly bound to \"this\"\n */\nexport function bind(\n    obj: any,\n    method: any\n): any {\n    return function () {\n        return method.apply(obj, arguments)\n    }\n}\n\n// ----------------------------------------------------------------------------\n\n/**\n * Bind a function\n * @param err : The err object to convert to a string.\n *\n * @return A callable function that will call the method correctly bound to \"this\"\n */\nexport function errToStr(err: any): string {\n    \n    if (err.message != null)\n        return err.message\n    \n    try {\n        let jsonStr = JSON.stringify(err)\n        if (jsonStr != \"{}\")\n            return jsonStr\n        \n    }\n    catch (ignore) {\n    }\n    \n    return err.toString()\n}\n\n// ----------------------------------------------------------------------------\n\ninterface ignoreDictType {\n    [name: string]: any\n}\n\n/** Deep Clone\n * @param data: Deep Clone an entire JSON data structure\n * @param ignoreFieldNames: An array of field names not to copy.\n *\n * @return A clone of the data\n */\n\nexport function deepCopy(\n    data,\n    ignoreFieldNames: string[] | null = null\n) {\n    const dict: ignoreDictType = {}\n    if (ignoreFieldNames != null\n        && Object.prototype.toString.call(ignoreFieldNames)\n            .slice(8, -1) == \"Array\") {\n        for (const fieldName of ignoreFieldNames)\n            dict[fieldName] = true\n    }\n    return _deepCopy(data, dict)\n    \n}\n\nfunction _deepCopy(\n    data,\n    ignoreFieldNames: ignoreDictType\n) {\n    \n    // If the data is null or undefined then we return undefined\n    if (data === null || data === undefined)\n        return undefined\n    \n    // Get the data type and store it\n    const dataType = Object.prototype.toString.call(data)\n        .slice(8, -1)\n    \n    // DATE\n    if (dataType == \"Date\") {\n        const clonedDate = new Date()\n        clonedDate.setTime(data.getTime())\n        return clonedDate\n    }\n    \n    // OBJECT\n    if (dataType == \"Object\") {\n        let copiedObject = {}\n        \n        for (const key of Object.keys(data)) {\n            if (ignoreFieldNames != null && ignoreFieldNames[key] === true)\n                continue\n            copiedObject[key] = _deepCopy(data[key], ignoreFieldNames)\n        }\n        \n        return copiedObject\n    }\n    \n    // ARRAY\n    if (dataType == \"Array\") {\n        let copiedArray = []\n        \n        for (const item of data)\n            copiedArray.push(_deepCopy(item, ignoreFieldNames))\n        \n        return copiedArray\n    }\n    \n    return data\n}\n\n// ----------------------------------------------------------------------------\n\n/* Add a imports for these requires */\n","// Declare the TypeScript for Declaration Merging\n// https://www.typescriptlang.org/docs/handbook/declaration-merging.html\n\ninterface Array<T> {\n    diff(a: Array<T>): Array<T>;\n    intersect(a: Array<T>): Array<T>;\n    remove(a: Array<T> | T): Array<T>;\n    add(a: Array<T> | T): Array<T>;\n    equals(array: Array<T> | null): boolean;\n    bubbleSort(compFunc: (\n        left: T,\n        right: T\n    ) => number): Array<T>;\n    indexOf(item: T): number;\n}\n\n// Start the javascript type patching\n\nif (Array.prototype.diff == null) {\n    Array.prototype.diff = function (a: Array<any>): Array<any> {\n        return this.filter(function (i: any) {\n            return !(a.indexOf(i) > -1)\n        })\n    }\n}\n\nif (Array.prototype.intersect == null) {\n    Array.prototype.intersect = function (a: Array<any>): Array<any> {\n        return this.filter(function (i) {\n            return (a.indexOf(i) > -1)\n        })\n    }\n}\n\nif (Array.prototype.remove == null) {\n    Array.prototype.remove = function (objectOrArray: Array<any> | any): Array<any> {\n        if (objectOrArray == null)\n            return this\n        \n        if (objectOrArray instanceof Array) {\n            return this.diff(objectOrArray)\n            \n        }\n        else {\n            let index = this.indexOf(objectOrArray)\n            if (index !== -1)\n                this.splice(index, 1)\n            return this\n        }\n    }\n}\n\nif (Array.prototype.add == null) {\n    Array.prototype.add = function (objectOrArray: Array<any> | any): Array<any> {\n        if (objectOrArray == null)\n            return this\n        \n        // If for some reasons they are trying to add us to our self, throw an exception.\n        if (objectOrArray === this)\n            throw new Error(\"Array.add, I was passed myself, i can't add my self to myself.\")\n        \n        if (objectOrArray instanceof Array) {\n            for (let i = 0; i < objectOrArray.length; ++i)\n                this.push(objectOrArray[i])\n            return this\n        }\n        \n        this.push(objectOrArray)\n        return this\n    }\n}\n\nif (Array.prototype.equals == null) {\n    Array.prototype.equals = function (array: Array<any> | null): boolean {\n        // if the other array is a false value, return\n        if (array == null)\n            return false\n        \n        // compare object instances\n        if (this === array)\n            return true\n        \n        // compare lengths - can save a lot of time\n        if (this.length !== array.length)\n            return false\n        \n        for (let i = 0; i < this.length; i++) {\n            // Check if we have nested arrays\n            if (this[i] instanceof Array && array[i] instanceof Array) {\n                // recurse into the nested arrays\n                if (!this[i].compare(array[i]))\n                    return false\n                \n            }\n            else if (this[i] !== array[i]) {\n                // Warning - two different object instances will never be equal: {x:20} !=\n                // {x:20}\n                return false\n                \n            }\n        }\n        return true\n    }\n}\n\nif (Array.prototype.bubbleSort == null) {\n    Array.prototype.bubbleSort = function (compFunc: (\n        left: any,\n        right: any\n    ) => number): Array<any> {\n        let self = this\n        \n        function merge(\n            left,\n            right\n        ) {\n            let result = []\n            \n            while (left.length && right.length) {\n                if (compFunc(left[0], right[0]) <= 0) {\n                    result.push(left.shift())\n                }\n                else {\n                    result.push(right.shift())\n                }\n            }\n            \n            while (left.length)\n                result.push(left.shift())\n            \n            while (right.length)\n                result.push(right.shift())\n            \n            return result\n        }\n        \n        if (self.length < 2)\n            return self.slice(0, self.length)\n        \n        let middle = parseInt((self.length / 2).toString())\n        let left = self.slice(0, middle)\n        let right = self.slice(middle, self.length)\n        \n        return merge(left.bubbleSort(compFunc), right.bubbleSort(compFunc))\n    }\n}\n\n// ============================================================================\n// Array.indexOf prptotype function\n// Add if this browser (STUPID IE) doesn't support it\n\nif (Array.prototype.indexOf == null) {\n    Array.prototype.indexOf = function (item: any): number {\n        let len = this.length >>> 0\n        \n        let from = Number(arguments[1]) || 0\n        from = (from < 0) ? Math.ceil(from) : Math.floor(from)\n        if (from < 0)\n            from += len\n        \n        for (; from < len; from++) {\n            if (from in this && this[from] === item)\n                return from\n        }\n        return -1\n    }\n}\n","// ----------------------------------------------------------------------------\n// Typescript date - date fooler\nexport function now(): any {\n    return new Date()\n}\n\nexport function logLong(\n    message: string,\n    start: any,\n    payload: any | null = null\n) {\n    let duration = now() - start\n    let desc = \"\"\n    \n    // You get 5ms to do what you need before i call the performance cops.\n    if (duration < 10)\n        return\n    \n    if (payload != null) {\n        desc = \", \" + JSON.stringify(payload.filt)\n    }\n    \n    // console.log(`${message}, took ${duration}${desc}`);\n}\n\n// ----------------------------------------------------------------------------\nexport abstract class PayloadDelegateABC {\n    \n    abstract deflateAndEncode(payloadJson: string): Promise<string> ;\n    \n    abstract encodeEnvelope(payloadJson: string): Promise<string> ;\n    \n    abstract decodeAndInflate(vortexStr: string): Promise<string> ;\n    \n    abstract decodeEnvelope(vortexStr: string): Promise<string> ;\n    \n}\n","import * as pako from \"pako\";\nimport * as base64 from \"base-64\";\nimport { PayloadDelegateABC } from \"./PayloadDelegateABC\";\n\nfunction btoa(data) {\n    try {\n        return window[\"btoa\"](data);\n    } catch (e) {\n        return base64.encode(data);\n    }\n}\n\nfunction atob(data) {\n    try {\n        return window[\"atob\"](data);\n    } catch (e) {\n        return base64.decode(data);\n    }\n}\n\nexport class PayloadDelegateInMainWeb extends PayloadDelegateABC {\n    deflateAndEncode(payloadJson: string): Promise<string> {\n        return new Promise<string>((resolve, reject) => {\n            const compressedData: Uint8Array = pako.deflate(payloadJson);\n            const compressedDataStr = new Uint8Array(compressedData).reduce(\n                (acc: string, curr: number, i: number) =>\n                    acc + String.fromCharCode(curr),\n                \"\",\n            );\n            const encodedData = btoa(compressedDataStr);\n            resolve(encodedData);\n        });\n    }\n\n    encodeEnvelope(payloadEnvelopeJson: string): Promise<string> {\n        return new Promise<string>((resolve, reject) => {\n            const vortexMsg = btoa(payloadEnvelopeJson);\n            resolve(vortexMsg);\n        });\n    }\n\n    decodeAndInflate(vortexStr: string): Promise<string> {\n        return new Promise<string>((resolve, reject) => {\n            const compressedData = Uint8Array.from(\n                atob(vortexStr),\n                (v: string) => v.charCodeAt(0),\n            );\n            const payloadJson = pako.inflate(compressedData, { to: \"string\" });\n            resolve(payloadJson);\n        });\n    }\n\n    decodeEnvelope(vortexStr: string): Promise<string> {\n        return new Promise<string>((resolve, reject) => {\n            let payloadJson = atob(vortexStr);\n            resolve(payloadJson);\n        });\n    }\n}\n","/*\n * ###############################################################################\n * Common Serialisation functions\n * ###############################################################################\n */\n\nimport {dictKeysFromObject} from \"./UtilMisc\";\nimport * as base64 from \"base-64\";\n\nexport class SerialiseUtil {\n    public static readonly T_RAPUI_TUPLE = \"rt\";\n    public static readonly T_RAPUI_PAYLOAD = \"rp\";\n    public static readonly T_RAPUI_PAYLOAD_ENVELOPE = \"rpe\";\n    public static readonly T_GENERIC_CLASS = \"gen\"; // NOT SUPPORTED\n    public static readonly T_FLOAT = \"float\";\n    public static readonly T_INT = \"int\";\n    public static readonly T_STR = \"str\";\n    public static readonly T_BYTES = \"bytes\";\n    public static readonly T_BOOL = \"bool\";\n    public static readonly T_DATETIME = \"datetime\";\n    public static readonly T_DICT = \"dict\";\n    public static readonly T_LIST = \"list\";\n    public static readonly V_NULL = \"null\";\n    public static readonly V_TRUE = \"1\";\n    public static readonly V_FALSE = \"0\";\n    public static readonly ISO8601_PY = \"%Y-%m-%d %H:%M:%S.%f%z\";\n    public static readonly ISO8601 = \"YYYY-MM-DD HH:mm:ss.SSSSSSZZ\";\n\n    // Rapui Serialised Type -  Shortened for memory constraints.\n    protected __rst: string;\n\n    toStr(obj: any): string {\n        let self = this;\n\n        if (obj[\"toISOString\"] != null)\n            // instanceof Date or moment\n            return obj.toISOString().replace(\"Z\", \"000+0000\").replace(\"T\", \" \");\n\n        if (typeof obj.constructor === \"boolean\")\n            return obj ? SerialiseUtil.V_TRUE : SerialiseUtil.V_FALSE;\n\n        if (typeof obj.constructor === \"string\") return obj;\n\n        return obj.toString();\n    }\n\n    fromStr(val: string, typeName: string): any {\n        let self = this;\n\n        if (typeName === SerialiseUtil.T_STR) return val;\n\n        if (typeName === SerialiseUtil.T_BYTES)\n            return base64.decode(encodeURI(val));\n\n        if (typeName === SerialiseUtil.T_BOOL)\n            return val === SerialiseUtil.V_TRUE;\n\n        if (\n            typeName === SerialiseUtil.T_FLOAT ||\n            typeName === SerialiseUtil.T_INT\n        )\n            return parseFloat(val);\n\n        if (typeName === SerialiseUtil.T_DATETIME) return new Date(val);\n\n        alert(\"fromStr - UNKNOWN TYPE\");\n    }\n\n    toRapuiType(value: any): string {\n        let self = this;\n\n        if (value == null) return SerialiseUtil.V_NULL;\n\n        if (value.__rst === SerialiseUtil.T_RAPUI_TUPLE)\n            return SerialiseUtil.T_RAPUI_TUPLE;\n\n        if (value.__rst === SerialiseUtil.T_RAPUI_PAYLOAD)\n            return SerialiseUtil.T_RAPUI_PAYLOAD;\n\n        if (value.__rst === SerialiseUtil.T_RAPUI_PAYLOAD_ENVELOPE)\n            return SerialiseUtil.T_RAPUI_PAYLOAD_ENVELOPE;\n\n        if (value instanceof Date) return SerialiseUtil.T_DATETIME;\n\n        if (value.constructor === Number) return SerialiseUtil.T_FLOAT;\n\n        if (value.constructor === String) return SerialiseUtil.T_STR;\n\n        if (value.constructor === Boolean) return SerialiseUtil.T_BOOL;\n\n        if (value.constructor === Array) return SerialiseUtil.T_LIST;\n\n        if (value.constructor === Object) return SerialiseUtil.T_DICT;\n\n        alert(\"toRapuiType - UNKNOWN TYPE\");\n    }\n\n    rapuiEquals(\n        obj1: any,\n        obj2: any,\n        obj1FieldNames: string[],\n        obj2FieldNames: string[],\n    ): boolean {\n        let self = this;\n\n        let fieldNames1: string[] = obj1FieldNames;\n        fieldNames1.sort();\n\n        let fieldNames2: string[] = obj2FieldNames;\n        fieldNames2.sort();\n\n        if (!fieldNames1.equals(fieldNames2)) return false;\n\n        // Create the <items> base element\n        for (\n            let fieldIndex = 0;\n            fieldIndex < fieldNames1.length;\n            ++fieldIndex\n        ) {\n            let name = fieldNames1[fieldIndex];\n            let field1 = obj1[name];\n            let field2 = obj2[name];\n\n            if (field1 === undefined && field2 === undefined) continue;\n            else if (field1 === undefined || field2 === undefined) return false;\n\n            let type1 = self.toRapuiType(field1);\n            let type2 = self.toRapuiType(field2);\n\n            if (type1 !== type2) return false;\n\n            if (\n                type1 === SerialiseUtil.T_RAPUI_TUPLE ||\n                type1 === SerialiseUtil.T_RAPUI_PAYLOAD ||\n                type1 === SerialiseUtil.T_RAPUI_PAYLOAD_ENVELOPE\n            ) {\n                if (!field1.equals(field2)) return false;\n            } else if (type1 === SerialiseUtil.T_LIST) {\n                let indexes = [];\n                for (let index = 0; index < field1.length; index++) {\n                    indexes.push(index);\n                }\n\n                let isEqual = self.rapuiEquals(\n                    field1,\n                    field2,\n                    indexes,\n                    indexes,\n                );\n                if (!isEqual) return false;\n            } else if (type1 === SerialiseUtil.T_DICT) {\n                let isEqual = self.rapuiEquals(\n                    field1,\n                    field2,\n                    dictKeysFromObject(field1),\n                    dictKeysFromObject(field2),\n                );\n                if (!isEqual) return false;\n            } else if (type1 === SerialiseUtil.T_DATETIME) {\n                if (field1.getTime() !== field2.getTime()) return false;\n            } else {\n                if (field1 !== field2) return false;\n            }\n        }\n        return true;\n    }\n}\n","// Declare the TypeScript for Declaration Merging\n// https://www.typescriptlang.org/docs/handbook/declaration-merging.html\n\ninterface String {\n    replaceAll(\n        stringToFind: string,\n        stringToReplace: string\n    ): string;\n    format(...args: any[]): string;\n    startsWith(str: string): boolean;\n    endsWith(str: string): boolean;\n    isPrintable(): boolean;\n}\n\nif (String.prototype.replaceAll == null) {\n    String.prototype.replaceAll = function (\n        stringToFind: string,\n        stringToReplace: string\n    ): string {\n        let temp = this\n        while (temp.indexOf(stringToFind) !== -1)\n            temp = temp.replace(stringToFind, stringToReplace)\n        return temp\n    }\n}\n\nif (String.prototype.format == null) {\n    String.prototype.format = function () {\n        let args = arguments\n        return this.replace(/{(\\d+)}/g, function (\n            match,\n            num\n        ) {\n            return typeof args[num] !== \"undefined\" ? args[num] : match\n        })\n    }\n}\n\nif (String.prototype.trim == null) {\n    String.prototype.trim = function () {\n        return String(this)\n            .replace(/^\\s+|\\s+$/g, \"\")\n    }\n}\n\nif (String.prototype.startsWith == null) {\n    // see below for better implementation!\n    String.prototype.startsWith = function (str: string): boolean {\n        return this.slice(0, str.length) === str\n    }\n}\n\nif (String.prototype.endsWith == null) {\n    String.prototype.endsWith = function (pattern: string): boolean {\n        let d = this.length - pattern.length\n        return d >= 0 && this.lastIndexOf(pattern) === d\n    }\n}\n\nif (String.prototype.isPrintable == null) {\n    String.prototype.isPrintable = function (): boolean {\n        let re = /^[\\x20-\\x7e]*$/\n        return re.test(this)\n    }\n}\n","import { SerialiseUtil } from \"./exports\";\nimport { deepCopy } from \"./UtilMisc\";\nimport \"./UtilString\";\nimport { PayloadEnvelope } from \"./PayloadEnvelope\";\nimport { Payload } from \"./Payload\";\n\nconst JSONABLE_TYPES = {};\n\nexport function addJsonableType(jsonableType: string) {\n    return function (_Class: any) {\n        JSONABLE_TYPES[jsonableType] = _Class;\n        return _Class;\n    };\n}\n\n/**\n * ############################################################################### #\n * JSON Serialisation functions\n * ###############################################################################\n */\nexport class Jsonable extends SerialiseUtil {\n    public _tupleType: string;\n    protected _rawJonableFields = null;\n\n    public static readonly JSON_CLASS_TYPE = \"_ct\";\n    // private static readonly JSON_CLASS = \"_c\";\n    private static readonly JSON_TUPLE_TYPE = \"_c\";\n    private static readonly JSON_FIELD_TYPE = \"_ft\";\n    private static readonly JSON_FIELD_DATA = \"_fd\";\n\n    constructor() {\n        super();\n        /*\n         * Jsonable This class gives simple objects suport for serialising to/from json.\n         * It handles Number, String, Array and Date. It doesn't handle more complex\n         * structures (hence why Payloads have their own functions to do this)\n         */\n        let self: Jsonable = this;\n\n        self.__rst = SerialiseUtil.T_GENERIC_CLASS;\n    }\n\n    private _isRawJsonableField(name: string): boolean {\n        if (name == null || name.length == 0) {\n            return false;\n        }\n        if (this._rawJonableFields == null) {\n            return false;\n        }\n        return this._rawJonableFields.indexOf(name) != -1;\n    }\n\n    _fieldNames() {\n        let self = this;\n\n        let keys = [];\n        for (let k in self) {\n            if (!k.startsWith(\"_\") && self.hasOwnProperty(k)) {\n                keys.push(k);\n            }\n        }\n        return keys;\n    }\n\n    equals(other) {\n        let self = this;\n\n        return self.rapuiEquals(\n            self,\n            other,\n            self._fieldNames(),\n            other._fieldNames(),\n        );\n    }\n\n    toRestfulJsonDict() {\n        return this._tupleToJsonDict(true);\n    }\n\n    toJsonDict() {\n        return this._tupleToJsonDict(false);\n    }\n\n    private _tupleToJsonDict(useShortNames: boolean) {\n        let self = this;\n\n        let jsonDict = {};\n        if (!useShortNames) {\n            jsonDict[Jsonable.JSON_CLASS_TYPE] = self.__rst;\n        }\n\n        if (!useShortNames && self._tupleType != null) {\n            jsonDict[Jsonable.JSON_TUPLE_TYPE] = self._tupleType;\n        }\n\n        /* This is in the PY version\n         else\n         jsonDict[JSON_CLASS] = className(self)\n         */\n\n        let fieldNames = self._fieldNames();\n        // fieldNames.sort(); // Why?\n\n        // Create the <items> base element\n        for (let i = 0; i < fieldNames.length; ++i) {\n            let name = fieldNames[i];\n            self.toJsonField(self[name], jsonDict, name, useShortNames);\n        }\n\n        return jsonDict;\n    }\n\n    fromJsonDict(jsonDict: {}): any {\n        /*\n         * From Json Returns and instance of this object populated with data from the\n         * json dict\n         *\n         */\n        for (const name of Object.keys(jsonDict)) {\n            if (name.startsWith(\"_\")) {\n                continue;\n            }\n\n            if (this._isRawJsonableField(name)) {\n                this[name] = jsonDict[name];\n            } else {\n                this[name] = this.fromJsonField(jsonDict[name]);\n            }\n        }\n\n        // This is only required for unit tests new Tuple().fromJsonDict(..)\n        if (jsonDict[Jsonable.JSON_CLASS_TYPE] == SerialiseUtil.T_RAPUI_TUPLE) {\n            this._tupleType = jsonDict[Jsonable.JSON_TUPLE_TYPE];\n        }\n\n        return this;\n    }\n\n    toJsonField(\n        value: any,\n        jsonDict: {} | null = null,\n        name: string | null = null,\n        useShortNames: boolean = false,\n    ): any {\n        let self = this;\n\n        let convertedValue = null;\n        let valueType =\n            value == null ? SerialiseUtil.V_NULL : self.toRapuiType(value);\n\n        if (this._isRawJsonableField(name)) {\n            convertedValue = deepCopy(value);\n        } else if (\n            valueType === SerialiseUtil.T_RAPUI_TUPLE ||\n            valueType === SerialiseUtil.T_RAPUI_PAYLOAD ||\n            valueType === SerialiseUtil.T_RAPUI_PAYLOAD_ENVELOPE\n        ) {\n            if (useShortNames) {\n                convertedValue = value.toRestfulJsonDict();\n            } else {\n                convertedValue = value.toJsonDict();\n            }\n        } else if (valueType === SerialiseUtil.T_DICT) {\n            // Treat these like dicts\n            convertedValue = {};\n            for (const keyName of Object.keys(value)) {\n                if (useShortNames) {\n                    self.toJsonField(\n                        value[keyName],\n                        convertedValue,\n                        keyName,\n                        true,\n                    );\n                } else {\n                    self.toJsonField(value[keyName], convertedValue, keyName);\n                }\n            }\n        } else if (valueType === SerialiseUtil.T_LIST) {\n            convertedValue = [];\n            // List\n            for (let i = 0; i < value.length; ++i) {\n                let element;\n                if (useShortNames) {\n                    element = self.toJsonField(value[i], null, null, true);\n                } else {\n                    element = self.toJsonField(value[i]);\n                }\n                convertedValue.push(element);\n            }\n        } else if (\n            valueType === SerialiseUtil.T_FLOAT ||\n            valueType === SerialiseUtil.T_INT ||\n            valueType === SerialiseUtil.T_BOOL ||\n            valueType === SerialiseUtil.T_STR\n        ) {\n            convertedValue = value;\n        } else if (valueType === SerialiseUtil.V_NULL) {\n            convertedValue = null;\n        } else {\n            convertedValue = self.toStr(value);\n        }\n\n        // Non standard values need a dict to store their value type attributes\n        // Create a sub dict that contains the value and type\n        let jsonStandardTypes = [\n            SerialiseUtil.T_FLOAT,\n            SerialiseUtil.T_STR,\n            SerialiseUtil.T_INT,\n            SerialiseUtil.V_NULL,\n            SerialiseUtil.T_BOOL,\n            SerialiseUtil.T_LIST,\n            SerialiseUtil.T_DICT,\n        ];\n\n        if (\n            jsonStandardTypes.indexOf(valueType) === -1 &&\n            !(value instanceof Jsonable)\n        ) {\n            let typedData = {};\n            typedData[Jsonable.JSON_FIELD_TYPE] = valueType;\n            typedData[Jsonable.JSON_FIELD_DATA] = convertedValue;\n            convertedValue = typedData;\n        }\n\n        /* Now assign the value and it's value type if applicable */\n        if (name != null && jsonDict != null) {\n            jsonDict[name] = convertedValue;\n        }\n\n        return convertedValue;\n    }\n\n    // ----------------------------------------------------------------------------\n    fromJsonField(value: any, valueType: string = null) {\n        let self = this;\n        if (valueType === SerialiseUtil.V_NULL || value == null) {\n            return null;\n        }\n\n        if (valueType === SerialiseUtil.T_INT) {\n            return value;\n        }\n\n        if (value[Jsonable.JSON_CLASS_TYPE] != null) {\n            valueType = value[Jsonable.JSON_CLASS_TYPE];\n        }\n\n        // JSON handles these types natively,\n        // if there is no type then these are the right types\n        if (valueType == null) {\n            valueType = self.toRapuiType(value);\n            if (\n                [\n                    SerialiseUtil.T_BOOL,\n                    SerialiseUtil.T_FLOAT,\n                    SerialiseUtil.T_INT,\n                    SerialiseUtil.T_STR,\n                ].indexOf(valueType) !== -1\n            ) {\n                return value;\n            }\n        }\n\n        if (value[Jsonable.JSON_FIELD_TYPE] != null) {\n            return self.fromJsonField(\n                value[Jsonable.JSON_FIELD_DATA],\n                value[Jsonable.JSON_FIELD_TYPE],\n            );\n        }\n\n        // Tuple\n        if (valueType === SerialiseUtil.T_RAPUI_TUPLE) {\n            let Tuple = JSONABLE_TYPES[SerialiseUtil.T_RAPUI_TUPLE];\n            let tupleType = value[Jsonable.JSON_TUPLE_TYPE];\n            let newTuple = Tuple.create(tupleType);\n\n            return newTuple.fromJsonDict(value);\n        }\n\n        // Handle the case of payloads within payloads\n        if (valueType === SerialiseUtil.T_RAPUI_PAYLOAD) {\n            return new Payload().fromJsonDict(value);\n        }\n\n        // Payload Endpoint\n        if (valueType === SerialiseUtil.T_RAPUI_PAYLOAD_ENVELOPE) {\n            return new PayloadEnvelope().fromJsonDict(value);\n        }\n\n        /* SKIP T_GENERIC_CLASS */\n        if (valueType === SerialiseUtil.T_DICT) {\n            let restoredDict = {};\n            for (const subName of Object.keys(value)) {\n                restoredDict[subName] = self.fromJsonField(value[subName]);\n            }\n\n            return restoredDict;\n        }\n\n        if (valueType === SerialiseUtil.T_LIST) {\n            let restoredList = [];\n            for (let i = 0; i < value.length; ++i) {\n                restoredList.push(self.fromJsonField(value[i]));\n            }\n\n            return restoredList;\n        }\n\n        // Handle single value\n        return self.fromStr(value, valueType);\n    }\n}\n","import deepEqual from \"deep-equal\";\nimport { dictKeysFromObject } from \"./UtilMisc\";\nimport { addJsonableType, Jsonable, SerialiseUtil } from \"./exports\";\n\nexport interface TupleChangeI {\n    fieldName: string;\n    oldValue: any;\n    newValue: any;\n}\n\n/** Tuples implementation details.\n *\n * We're not going to have fully fledged tuples in the browser. As far as the\n * browser is concerned, it will recieve tuples which will have all the fields\n * and then it will create tuples to send back, populating the fields it needs.\n *\n * There should be some checks when it gets back to the server to ensure the\n * populated fields exist in the tuples when it deserialises it.\n *\n */\n@addJsonableType(SerialiseUtil.T_RAPUI_TUPLE)\nexport class Tuple extends Jsonable {\n    // Change Tracking Enabled - Shortened for memory conservation\n    private _ct: boolean = false;\n\n    // Change Tracking Reference State - Shortened for memory conservation\n    private _ctrs: Tuple | null = null;\n\n    constructor(tupleType: string | null = null) {\n        super();\n        let self = this;\n        self.__rst = SerialiseUtil.T_RAPUI_TUPLE;\n        self._tupleType = tupleType;\n    }\n\n    static create(tupleType: string) {\n        if (TUPLE_TYPES[tupleType] == null) {\n            return new Tuple(tupleType);\n        } else {\n            // Tuples set their own types, don't pass anything to the constructor\n            return new TUPLE_TYPES[tupleType]();\n        }\n    }\n\n    _tupleName(): string {\n        return this._tupleType;\n    }\n\n    // ---------------\n    // Start change detection code\n\n    _setChangeTracking(on: boolean = true) {\n        this._ctrs = new Tuple();\n        this._ctrs.fromJsonDict(this.toJsonDict());\n        this._ct = on;\n    }\n\n    _detectedChanges(reset: boolean = true): TupleChangeI[] {\n        let changes = [];\n        for (let key of dictKeysFromObject(this)) {\n            let old_ = this._ctrs[key];\n            let new_ = this[key];\n            if (deepEqual(old_, new_)) {\n                continue;\n            }\n\n            changes.push({\n                fieldName: key,\n                oldValue: old_,\n                newValue: new_,\n            });\n        }\n\n        if (reset) {\n            this._setChangeTracking(true);\n        }\n\n        return changes;\n    }\n}\n\ninterface ITuple {\n    new (name: string | null): Tuple;\n}\n\nexport let TUPLE_TYPES = {};\n\nexport function addTupleType(_Class: Function) {\n    let inst = new (<any>_Class)();\n    TUPLE_TYPES[inst._tupleType] = _Class;\n}\n","import { Jsonable, SerialiseUtil } from \"./exports\";\nimport { assert } from \"./UtilMisc\";\nimport \"./UtilArray\";\nimport { PayloadDelegateABC } from \"./payload/PayloadDelegateABC\";\nimport { PayloadDelegateInMainWeb } from \"./payload/PayloadDelegateInMainWeb\";\nimport { Payload } from \"./Payload\";\n\n// ----------------------------------------------------------------------------\n// Payload class\n\n/**\n *\n * This class is serialised and transferred over the vortex to the server.\n */\nexport class PayloadEnvelope extends Jsonable {\n    private static workerDelegate = new PayloadDelegateInMainWeb();\n\n    static readonly vortexUuidKey = \"__vortexUuid__\";\n    static readonly vortexNameKey = \"__vortexName__\";\n\n    filt: {};\n    data: any | string | null;\n    result: string | {} | null = null;\n    date: Date | null = null;\n\n    /**\n     * Payload Envelope\n     * This class is serialised and tranferred over the vortex to the server.\n     * @param filt The filter that the server handler is listening for\n     * @param data: The encoded payload to go into this envelope\n     * different location @depreciated\n     * @param date The date for this envelope, it should match the payload.\n     */\n    constructor(\n        filt: {} = {},\n        data: any | string | null = null,\n        date: Date | null = null\n    ) {\n        super();\n\n        this.__rst = SerialiseUtil.T_RAPUI_PAYLOAD_ENVELOPE;\n\n        this.filt = filt;\n        this.data = data;\n\n        this.date = date == null ? new Date() : this.date;\n    }\n\n    static setWorkerDelegate(delegate: PayloadDelegateABC) {\n        PayloadEnvelope.workerDelegate = delegate;\n    }\n\n    get encodedPayload(): string | null {\n        if (!this.data?.length) {\n            return null;\n        }\n\n        if (typeof this.data !== \"string\") {\n            throw new Error(\"PayloadEnvelope: encodedPayload is not an array\");\n        }\n\n        // noinspection UnnecessaryLocalVariableJS\n        const str: any = this.data;\n        return str;\n    }\n\n    set encodedPayload(val: string | null) {\n        if (!val?.length || typeof val !== \"string\") {\n            throw new Error(\"PayloadEnvelope: val is not null or string\");\n        }\n\n        this.data = val;\n    }\n\n    // -------------------------------------------\n    // Envelope method\n\n    isEmpty() {\n        // Ignore the connection start vortexUuid value\n        // It's sent as the first response when we connect.\n        for (let property in this.filt) {\n            if (property === PayloadEnvelope.vortexUuidKey) continue;\n            // Anything else, return false\n            return false;\n        }\n\n        return (\n            (this.encodedPayload == null || this.encodedPayload.length === 0) &&\n            this.result == null\n        );\n    }\n\n    async decodePayload(): Promise<Payload> {\n        if (this.encodedPayload == null) {\n            throw new Error(\"PayloadEnvelope: decodePayload, data is null\");\n        }\n        return await Payload.fromEncodedPayload(this.encodedPayload);\n    }\n\n    // -------------------------------------------\n    // JSON Related method\n\n    private _fromJson(jsonStr: string): Promise<PayloadEnvelope> {\n        return Promise.resolve(JSON.parse(jsonStr)) //\n            .then((jsonDict) => {\n                assert(jsonDict[Jsonable.JSON_CLASS_TYPE] === this.__rst);\n                return this.fromJsonDict(jsonDict);\n            });\n    }\n\n    private _toJson(): Promise<string> {\n        return Promise.resolve(this.toJsonDict()) //\n            .then((jsonDict) => JSON.stringify(jsonDict));\n    }\n\n    static fromVortexMsg(vortexStr: string): Promise<PayloadEnvelope> {\n        // Websockets do not require base64 encoding\n        if (vortexStr[0] === \"{\") {\n            // noinspection UnnecessaryLocalVariableJS\n            const jsonStr = vortexStr;\n            return new PayloadEnvelope()._fromJson(jsonStr);\n        }\n\n        // noinspection UnnecessaryLocalVariableJS\n        const result = PayloadEnvelope.workerDelegate\n            .decodeEnvelope(vortexStr)\n            .then((jsonStr) => new PayloadEnvelope()._fromJson(jsonStr));\n        return result;\n    }\n\n    toVortexMsg(): Promise<string> {\n        return this._toJson() //\n            .then((jsonStr) =>\n                PayloadEnvelope.workerDelegate.encodeEnvelope(jsonStr)\n            );\n    }\n}\n","import { assert } from \"./UtilMisc\";\nimport \"./UtilArray\";\nimport { PayloadDelegateInMainWeb } from \"./payload/PayloadDelegateInMainWeb\";\nimport { PayloadDelegateABC } from \"./payload/PayloadDelegateABC\";\nimport { PayloadEnvelope } from \"./PayloadEnvelope\";\nimport { Jsonable, SerialiseUtil, Tuple } from \"./exports\";\n\n// ----------------------------------------------------------------------------\n// Types\n\n/**\n * IPayloadFilt\n * This interface defines the structure for a valid payload filter.\n */\nexport interface IPayloadFilt {\n    key: string;\n\n    [more: string]: any;\n}\n\n// ----------------------------------------------------------------------------\n// Payload class\n\n/**\n *\n * This class is serialised and transferred over the vortex to the server.\n */\nexport class Payload extends Jsonable {\n    private static workerDelegate = new PayloadDelegateInMainWeb();\n\n    filt: {};\n    tuples: Array<Tuple | any>;\n    date: Date | null = null;\n\n    /**\n     * Payload\n     * This class is serialised and tranferred over the vortex to the server.\n     * @param filt The filter that the server handler is listening for\n     * @param tuples: The tuples to init the Payload with\n     * different location @depreciated\n     * @param date The date for this envelope, it should match the payload.\n     */\n    constructor(\n        filt: {} = {},\n        tuples: Array<Tuple | any> = [],\n        date: Date | null = null,\n    ) {\n        super();\n\n        this.__rst = SerialiseUtil.T_RAPUI_PAYLOAD;\n\n        this.filt = filt;\n        this.tuples = tuples;\n        this.date = date == null ? new Date() : this.date;\n    }\n\n    static setWorkerDelegate(delegate: PayloadDelegateABC) {\n        Payload.workerDelegate = delegate;\n    }\n\n    // -------------------------------------------\n    // JSON Related method\n\n    private _fromJson(jsonStr: string): Promise<Payload> {\n        return Promise.resolve(JSON.parse(jsonStr)).then((jsonDict) => {\n            assert(jsonDict[Jsonable.JSON_CLASS_TYPE] === this.__rst);\n            return this.fromJsonDict(jsonDict);\n        });\n    }\n\n    private async _toJson(): Promise<string> {\n        const jsonDict = await this.toJsonDict();\n        return await JSON.stringify(jsonDict);\n    }\n\n    static async fromEncodedPayload(\n        encodedPayloadStr: string,\n    ): Promise<Payload> {\n        const jsonStr =\n            await Payload.workerDelegate.decodeAndInflate(encodedPayloadStr);\n        return await new Payload()._fromJson(jsonStr);\n    }\n\n    async toEncodedPayload(): Promise<string> {\n        const jsonStr = await this._toJson();\n        return await Payload.workerDelegate.deflateAndEncode(jsonStr);\n    }\n\n    async makePayloadEnvelope(): Promise<any> {\n        const encodedThis = await this.toEncodedPayload();\n        return new PayloadEnvelope(this.filt, encodedThis, this.date);\n    }\n}\n","import { PayloadEndpoint } from \"./PayloadEndpoint\"\nimport { PayloadEnvelope } from \"./PayloadEnvelope\"\n\nexport let STOP_PROCESSING = \"STOP_PROCESSING\"\n\nexport class PayloadIO {\n    private _endpoints: PayloadEndpoint[]\n    \n    constructor() {\n        let self = this\n        self._endpoints = []\n    }\n    \n    add(endpoint) {\n        let self = this\n        self._endpoints.add(endpoint)\n    }\n    \n    remove(endpoint) {\n        let self = this\n        self._endpoints.remove(endpoint)\n    }\n    \n    process(payloadEnvelope: PayloadEnvelope) {\n        let self = this\n        // Make a copy of the endpoints array, it may change endpoints\n        // can remove them selves during iteration.\n        let endpoints = self._endpoints.slice(0)\n        for (let i = 0; i < endpoints.length; ++i) {\n            if (endpoints[i].process(payloadEnvelope) === STOP_PROCESSING)\n                break\n        }\n    }\n    \n}\n\nexport let payloadIO = new PayloadIO()\n","import { payloadIO } from \"./PayloadIO\";\nimport { IPayloadFilt } from \"./Payload\";\nimport { assert, dateStr, dictKeysFromObject } from \"./UtilMisc\";\nimport \"./UtilArray\";\nimport { NgLifeCycleEvents } from \"../util/NgLifeCycleEvents\";\nimport { Observable, Subject } from \"rxjs\";\nimport { PayloadEnvelope } from \"./PayloadEnvelope\";\n\nexport class PayloadEndpoint {\n    private _filt: { key: string };\n    private _lastPayloadDate: Date | null;\n    private _processLatestOnly: boolean;\n\n    constructor(\n        component: NgLifeCycleEvents,\n        filter: IPayloadFilt,\n        processLatestOnly: boolean = false\n    ) {\n        let self = this;\n\n        self._filt = filter;\n        self._lastPayloadDate = null;\n        self._processLatestOnly = processLatestOnly === true;\n\n        assert(self._filt != null, \"Payload filter is null\");\n\n        if (self._filt.key == null) {\n            let e = new Error(`There is no 'key' in the payload filt \\\n                , There must be one for routing - ${JSON.stringify(\n                    self._filt\n                )}`);\n            console.log(e);\n            throw e;\n        }\n\n        payloadIO.add(self);\n\n        // Add auto tear downs for angular scopes\n        let subscription = component.onDestroyEvent.subscribe(() => {\n            this.shutdown();\n            subscription.unsubscribe();\n        });\n\n        this._observable = new Subject<PayloadEnvelope>();\n    }\n\n    private _observable: Subject<PayloadEnvelope>;\n\n    get observable(): Observable<PayloadEnvelope> {\n        return this._observable;\n    }\n\n    /**\n     * Process Payload\n     * Check if the payload is meant for us then process it.\n     *\n     * @return null, or if the function is overloaded, you could return STOP_PROCESSING\n     * from PayloadIO, which will tell it to stop processing further endpoints.\n     */\n    process(payloadEnvelope: PayloadEnvelope): null | string {\n        if (!this.checkFilt(this._filt, payloadEnvelope.filt)) return null;\n\n        if (!this.checkDate(payloadEnvelope)) return null;\n\n        try {\n            this._observable.next(payloadEnvelope);\n        } catch (e) {\n            // NOTE: Observables automatically remove observers when the raise exceptions.\n            console.log(`${dateStr()} ERROR: PayloadEndpoint.process, observable has been removed\n            ${e.toString()}\n            ${JSON.stringify(payloadEnvelope.filt)}`);\n        }\n\n        return null;\n    }\n\n    shutdown() {\n        let self = this;\n        payloadIO.remove(self);\n        if (this._observable[\"observers\"] != null) {\n            for (let observer of this._observable[\"observers\"]) {\n                observer[\"unsubscribe\"]();\n            }\n        }\n    }\n\n    private checkFilt(leftFilt, rightFilt): boolean {\n        for (let key of dictKeysFromObject(leftFilt, true)) {\n            if (!rightFilt.hasOwnProperty(key)) return false;\n\n            let left = leftFilt[key];\n            let right = rightFilt[key];\n\n            // Handle the case of null !== undefined\n            if (left == null && right == null) return true;\n\n            if (typeof left !== typeof right) return false;\n\n            // Handle special case for Arrays using our equals method in ArrayUtil\n            if (left instanceof Array) {\n                if (left.sort().equals(right.sort())) continue;\n                else return false;\n            }\n\n            // Handle special case for Arrays using our equals method in ArrayUtil\n            if (left instanceof Object) {\n                if (this.checkFilt(left, right)) continue;\n                else return false;\n            }\n\n            if (left !== right) return false;\n        }\n\n        return true;\n    }\n\n    private checkDate(payload): boolean {\n        if (this._processLatestOnly) {\n            if (\n                this._lastPayloadDate == null ||\n                this._lastPayloadDate < payload.date\n            )\n                this._lastPayloadDate = payload.date;\n            else return false;\n        }\n\n        return true;\n    }\n}\n","/**\n * The file defines some commonly used filter keys\n */\n\nexport let rapuiServerEcho = \"rapuiServerEcho\"\nexport let rapuiClientEcho = \"rapuiClientEcho\"\nexport let rapuiVortexUuid = \"rapuiVortexUuid\"\n\nexport let plIdKey = \"id\"\nexport let plDeleteKey = \"delete\"\n\n","import { Payload } from \"./Payload\";\nimport { dateStr } from \"./UtilMisc\";\nimport { rapuiClientEcho } from \"./PayloadFilterKeys\";\nimport { payloadIO } from \"./PayloadIO\";\nimport { VortexStatusService } from \"./VortexStatusService\";\nimport { PayloadEnvelope } from \"./PayloadEnvelope\";\nimport { Network } from \"@capacitor/network\";\n\n/**\n * Server response timeout in milliseconds\n * @type {number}\n */\nexport let SERVER_RESPONSE_TIMEOUT_SECONDS = 20.0;\n\nexport enum VortexClientStateE {\n    Idle,\n    Connecting,\n    Online,\n    Closing,\n    Closed,\n    Shutdown,\n}\n\nexport abstract class VortexClientABC {\n    readonly HEART_BEAT_PERIOD_SECONDS = 10.0;\n    readonly HEART_BEAT_TIMEOUT_SECONDS = 180.0;\n    readonly RECONNECT_BACKOFF_SECONDS = 10.0;\n\n    private beatTimer: any | null = null;\n    private readonly _uuid: string;\n    private readonly _name: string;\n    protected readonly _url: string;\n    protected _vortexState: VortexClientStateE = VortexClientStateE.Idle;\n\n    private serverVortexUuid: string | null = null;\n    private serverVortexName: string | null = null;\n\n    private processingNetworkStateChange = false;\n\n    /**\n     * RapUI VortexService, This class is responsible for sending and receiving payloads to/from\n     * the server.\n     */\n    protected constructor(\n        protected vortexStatusService: VortexStatusService,\n        url: string,\n        vortexClientName: string\n    ) {\n        this._uuid = VortexClientABC.makeUuid();\n        this._name = vortexClientName;\n        this._url = url;\n\n        // If the user switches network types, then reset the abort timer\n        Network.addListener(\"networkStatusChange\", (status) => {\n            // We only want to do something if we DISconnect\n            if (status.connected) {\n                return;\n            }\n\n            // If we're already doing something, then do nothing\n            if (this.processingNetworkStateChange) {\n                return;\n            }\n\n            this.processingNetworkStateChange = true;\n            this.shutdown()\n                .catch((e) =>\n                    console.log(\n                        `ERROR: VortexClientABC - Network State Change failed - ${e}`\n                    )\n                )\n                .then(() => (this.processingNetworkStateChange = false));\n        });\n    }\n\n    static makeUuid() {\n        function func(c) {\n            let r = (Math.random() * 16) | 0,\n                v = c === \"x\" ? r : (r & 0x3) | 0x8;\n            return v.toString(16);\n        }\n\n        return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, func);\n    }\n\n    get url(): string {\n        return this._url;\n    }\n\n    get uuid(): string {\n        return this._uuid;\n    }\n\n    get name(): string {\n        return this._name;\n    }\n\n    get isClosed(): boolean {\n        return this._vortexState === VortexClientStateE.Closed;\n    }\n\n    get isClosing(): boolean {\n        return this._vortexState === VortexClientStateE.Closing;\n    }\n\n    get isOnline(): boolean {\n        return this._vortexState === VortexClientStateE.Online;\n    }\n\n    get isShutdown(): boolean {\n        return this._vortexState === VortexClientStateE.Shutdown;\n    }\n\n    async close(): Promise<void> {\n        this._vortexState = VortexClientStateE.Closing;\n\n        this.vortexStatusService.logInfo(\n            `VortexClientABC shutting down vortex`\n        );\n        this.clearBeatTimer();\n        await this.shutdown();\n        this._vortexState = VortexClientStateE.Shutdown;\n    }\n\n    protected setOnline() {\n        this._vortexState = VortexClientStateE.Online;\n        this.vortexStatusService.setOnline(true);\n        this.restartTimer();\n    }\n\n    protected setClosing() {\n        this._vortexState = VortexClientStateE.Closing;\n        this.vortexStatusService.setOnline(false);\n    }\n\n    protected setClosed() {\n        this._vortexState = VortexClientStateE.Closed;\n        this.vortexStatusService.setOnline(false);\n\n        if (!this.isShutdown) this.restartTimer();\n    }\n\n    protected abstract shutdown(): Promise<void>;\n\n    reconnect(): Promise<void> {\n        this._vortexState = VortexClientStateE.Idle;\n        this.send(new PayloadEnvelope());\n        this.restartTimer();\n        return Promise.resolve();\n    }\n\n    protected beat(): void {\n        // We may still get a beat before the connection closes\n        if (!this.isOnline) return;\n\n        this.restartTimer();\n    }\n\n    protected restartTimer() {\n        this.clearBeatTimer();\n\n        // If we're online, then use the heartbeat timeout\n        // If we're not online, then use the reconnect backoff\n        const timerSeconds = this.isOnline\n            ? this.HEART_BEAT_TIMEOUT_SECONDS\n            : this.RECONNECT_BACKOFF_SECONDS;\n\n        this.beatTimer = setTimeout(() => {\n            if (this.isShutdown) return;\n\n            this.dead();\n            this.reconnect()\n                .then(() => {\n                    this.restartTimer();\n                })\n                .catch((e) => {\n                    this.vortexStatusService.logError(`restartTimer ${e}`);\n                });\n        }, timerSeconds * 1000);\n    }\n\n    protected clearBeatTimer() {\n        if (this.beatTimer != null) {\n            clearTimeout(this.beatTimer);\n            this.beatTimer = null;\n        }\n    }\n\n    private dead(): void {\n        this.vortexStatusService.setOnline(false);\n        this.vortexStatusService.logInfo(\n            `VortexService server heartbeats have timed out : ${this._url}`\n        );\n    }\n\n    protected abstract sendVortexMsg(vortexMsgs: string[]): void;\n\n    send(payloadEnvelope: PayloadEnvelope | PayloadEnvelope[]): Promise<void> {\n        if (this.isShutdown) {\n            let msg =\n                dateStr() +\n                \"VortexService is closed, Probably due to a login page reload\";\n            console.log(msg);\n            throw new Error(\"An attempt was made to reconnect a closed vortex\");\n        }\n\n        let payloadEnvelopes: PayloadEnvelope[] = [];\n        if (payloadEnvelope instanceof Array)\n            payloadEnvelopes = payloadEnvelope;\n        else payloadEnvelopes = [payloadEnvelope];\n\n        for (let p of payloadEnvelopes) {\n            // Empty payloadEnvelopes are like heart beats, don't check them\n            if (!p.isEmpty() && p.filt[\"key\"] == null) {\n                throw new Error(\n                    \"There is no 'key' in the payloadEnvelopes filt\" +\n                        \", There must be one for routing\"\n                );\n            }\n        }\n\n        let vortexMsgs: string[] = [];\n        let promises = [];\n\n        for (let payloadEnvelope of payloadEnvelopes) {\n            promises.push(\n                payloadEnvelope\n                    .toVortexMsg()\n                    .then((vortexMsg) => vortexMsgs.push(vortexMsg))\n            );\n        }\n\n        return Promise.all(promises)\n            .then(() => this.sendVortexMsg(vortexMsgs))\n            .catch((e) => {\n                let msg = `ERROR VortexClientABC: ${e.toString()}`;\n                console.log(msg);\n                throw new Error(msg);\n            });\n    }\n\n    /**\n     * Receive\n     * This should only be called only from VortexConnection\n     * @param payloadEnvelope {Payload}\n     */\n    protected receive(payloadEnvelope: PayloadEnvelope): void {\n        this.beat();\n        if (payloadEnvelope.filt.hasOwnProperty(rapuiClientEcho)) {\n            delete payloadEnvelope[rapuiClientEcho];\n            this.send(payloadEnvelope);\n        }\n\n        if (payloadEnvelope.isEmpty()) {\n            if (payloadEnvelope.filt[PayloadEnvelope.vortexUuidKey] != null)\n                this.serverVortexUuid =\n                    payloadEnvelope.filt[PayloadEnvelope.vortexUuidKey];\n\n            if (payloadEnvelope.filt[PayloadEnvelope.vortexNameKey] != null)\n                this.serverVortexName =\n                    payloadEnvelope.filt[PayloadEnvelope.vortexNameKey];\n\n            return;\n        }\n\n        // console.log(dateStr() + \"Received payloadEnvelope with filt : \" + JSON.stringify(payloadEnvelope.filt));\n\n        // TODO, Tell the payloadIO the vortexUuid\n        payloadIO.process(payloadEnvelope);\n    }\n}\n","import { Observable, Subject } from \"rxjs\";\nimport { IPayloadFilt, Payload } from \"./Payload\";\nimport { PayloadEndpoint } from \"./PayloadEndpoint\";\nimport { EventEmitter } from \"@angular/core\";\nimport { NgLifeCycleEvents } from \"../util/NgLifeCycleEvents\";\nimport {\n    SERVER_RESPONSE_TIMEOUT_SECONDS,\n    VortexClientABC,\n} from \"./VortexClientABC\";\nimport { Tuple } from \"./exports\";\nimport { plDeleteKey } from \"./PayloadFilterKeys\";\nimport { bind, dateStr } from \"./UtilMisc\";\nimport deepEqual from \"deep-equal\";\nimport { PayloadEnvelope } from \"./PayloadEnvelope\";\nimport { VortexStatusService } from \"./VortexStatusService\";\nimport { first, takeUntil } from \"rxjs/operators\";\n\n// ------------------\n// Some private structures\n\nexport enum TupleLoaderEventEnum {\n    Load,\n    Save,\n    Delete,\n}\n\ninterface IPromiseCallbacks {\n    type: TupleLoaderEventEnum;\n    resolve: any;\n    reject: any;\n}\n\n/**\n * Filter Update callable.\n *\n * This will be called to return a payload filter.\n * If the payload filter is null, TupleLoader will remove it's reference to old data\n * and wait.\n *\n * If the payload filter is not null and differs from the last payload filter, the\n * TupleLoader will send a request to the server..\n *\n */\nexport interface IFilterUpdateCallable {\n    (): IPayloadFilt | null;\n}\n\n/**\n * TupleLoader for Angular2 + Synerty Vortex\n *\n * @param: vortex The vortex instance to send via.\n *\n * @param: component The component to register our events on.\n *\n * @param: filterUpdateCallable A IFilterUpdateCallable callable that returns null\n * or an IPayloadFilter\n *\n * Manual changes can be triggerd as follows.\n * * \"load()\"\n * * \"save()\"\n * * \"del()\"\n */\nexport class TupleLoader {\n    event: EventEmitter<TupleLoaderEventEnum> =\n        new EventEmitter<TupleLoaderEventEnum>();\n    private filterUpdateCallable: IFilterUpdateCallable;\n    private lastPayloadFilt: IPayloadFilt | null = null;\n    private lastTuples: any[] | Tuple[] | null = null;\n    private timer: any | number | null = null;\n    private lastPromise: IPromiseCallbacks | null = null;\n    private endpoint: PayloadEndpoint | null = null;\n\n    constructor(\n        private vortex: VortexClientABC,\n        private vortexStatusService: VortexStatusService,\n        private component: NgLifeCycleEvents,\n        filterUpdateCallable: IFilterUpdateCallable | IPayloadFilt\n    ) {\n        if (filterUpdateCallable instanceof Function) {\n            this.filterUpdateCallable = filterUpdateCallable;\n        } else {\n            this.filterUpdateCallable = () => {\n                return filterUpdateCallable;\n            };\n        }\n\n        // Regiseter for the angular docheck\n        this.component.doCheckEvent\n            .pipe(takeUntil(this.component.onDestroyEvent))\n            .subscribe(() => this.filterChangeCheck());\n\n        // Create the observable object\n        this._observable = new Subject();\n\n        // Remove all observers when the component is destroyed.\n        this.component.onDestroyEvent\n            .pipe(first())\n            .subscribe(() => this._observable.complete());\n    }\n\n    private _observable: Subject<Tuple[] | any[]>;\n\n    /**\n     * @property: The tuple observable to subscribe to.\n     */\n    get observable(): Observable<Tuple[] | any[]> {\n        return this._observable;\n    }\n\n    filterChangeCheck(): void {\n        if (!this.vortexStatusService.snapshot.isOnline) {\n            return;\n        }\n\n        // Create a copy\n        let newFilter = Object.assign({}, this.filterUpdateCallable());\n\n        if (newFilter == null) {\n            if (this.endpoint != null) {\n                this.endpoint.shutdown();\n                this.endpoint = null;\n            }\n\n            this.lastTuples = null;\n            this.lastPayloadFilt = null;\n            return;\n        }\n\n        if (\n            this.lastPayloadFilt != null &&\n            deepEqual(newFilter, this.lastPayloadFilt, { strict: true })\n        ) {\n            return;\n        }\n\n        this.lastPayloadFilt = newFilter;\n        this.endpoint = new PayloadEndpoint(\n            this.component,\n            this.lastPayloadFilt,\n            true\n        );\n        this.endpoint.observable.subscribe(\n            (payloadEnvelope: PayloadEnvelope) => {\n                this.processPayloadEnvelope(payloadEnvelope);\n            }\n        );\n\n        this.vortex.send(new PayloadEnvelope(this.lastPayloadFilt));\n    }\n\n    /**\n     * Load Loads the data from a server\n     *\n     * @returns: Promise<Payload>, which is called when the load succeeds or fails.\n     *\n     */\n    load() {\n        return this.saveOrLoad(TupleLoaderEventEnum.Load);\n    }\n\n    /**\n     * Save\n     *\n     * Collects the data from the form, into the tuple and sends it through the\n     * vortex.\n     *\n     * @param: tuples The tuples to save, if tuples is null, the last loaded tuples will\n     * be used.\n     *\n     * @returns: Promise, which is called when the save succeeds or fails.\n     *\n     */\n    save(tuples: Tuple[] | any[] | null = null): Promise<Payload> {\n        return this.saveOrLoad(TupleLoaderEventEnum.Save, tuples);\n    }\n\n    /**\n     * Delete\n     *\n     * Sends the tuples to the server for it to delete them.\n     *\n     * @returns :Promise, which is called when the save succeeds or fails.\n     *\n     */\n    del(tuples: any[] | Tuple[] | null = null): Promise<Payload> {\n        let promise = this.saveOrLoad(TupleLoaderEventEnum.Delete, tuples);\n\n        return promise;\n    }\n\n    private saveOrLoad(\n        type: TupleLoaderEventEnum,\n        tuples: any[] | Tuple[] | null = null\n    ): Promise<Payload> {\n        // I'm not sure if the promise is set straight away, so at least null out\n        // the last one.\n        this.lastPromise = null;\n\n        // Initialise the promise\n        let promise = new Promise<Payload>(\n            (resolve, reject) =>\n                (this.lastPromise = {\n                    type: type,\n                    resolve: resolve,\n                    reject: reject,\n                })\n        );\n\n        // Check if there is already a load or save in progress\n        if (this.setupTimer() !== true) {\n            setTimeout(() => {\n                this.lastPromise.reject(\n                    \"Another save or load is still in progress.\"\n                );\n                this.lastPromise = null;\n            }, 0);\n            return promise;\n        }\n\n        if (type === TupleLoaderEventEnum.Load) {\n            // Force a filter update and reload\n            this.lastPayloadFilt = null;\n            this.filterChangeCheck();\n\n            // If there was no filter update, fail\n            if (this.lastPayloadFilt == null) {\n                this.lastPromise.reject(\n                    \"There is no payload filter provided, load failed\"\n                );\n                this.lastPromise = null;\n                return promise;\n            }\n        } else if (type === TupleLoaderEventEnum.Save) {\n            if (tuples != null) {\n                this.lastTuples = tuples;\n            }\n\n            // Check if we have tuples to save.\n            if (this.lastTuples == null) {\n                this.lastPromise.reject(\n                    \"No tuples to save. \" +\n                        \" Provide one to with the save(tuples) call or load some first \" +\n                        \" with the filterUpdateCallable\"\n                );\n                this.lastPromise = null;\n                return promise;\n            }\n\n            // Save the tuples\n            new Payload(this.lastPayloadFilt, this.lastTuples)\n                .makePayloadEnvelope()\n                .then((pe: PayloadEnvelope) => this.vortex.send(pe))\n                .catch((e) => `TupleLoader, failed to save tuples ${e}`);\n        } else if (type === TupleLoaderEventEnum.Delete) {\n            // Check if we have tuples to save.\n            if (tuples == null || tuples.length == null) {\n                this.lastPromise.reject(\n                    \"No tuples to delete. \" +\n                        \" Provide one or more with the del(tuples) call\"\n                );\n                this.lastPromise = null;\n                return promise;\n            }\n\n            // Set the delete key. The server will delete objects with this set.\n            let filt = Object.assign({}, this.lastPayloadFilt);\n            filt[plDeleteKey] = true;\n\n            // Save the tuples\n            new Payload(filt, tuples)\n                .makePayloadEnvelope()\n                .then((pe: PayloadEnvelope) => this.vortex.send(pe))\n                .catch((e) => `TupleLoader, failed to delete tuples ${e}`);\n        } else {\n            throw new Error(`Type ${type} is not implemented.`);\n        }\n\n        // Return the promise\n        return promise;\n    }\n\n    private processPayloadEnvelope(payloadEnvelope: PayloadEnvelope) {\n        if (this.timer) {\n            clearTimeout(this.timer);\n            this.timer = null;\n        }\n\n        // No result, means this was a load\n        if (payloadEnvelope.result == null) {\n            try {\n                this.event.emit(TupleLoaderEventEnum.Load);\n            } catch (e) {\n                console.log(`${dateStr()} TupleLoader - Load event emit error`);\n                console.error(e);\n            }\n\n            // Result, means this was a save\n        } else if (payloadEnvelope.result === true) {\n            try {\n                if (payloadEnvelope.filt.hasOwnProperty(plDeleteKey)) {\n                    this.event.emit(TupleLoaderEventEnum.Delete);\n                } else {\n                    this.event.emit(TupleLoaderEventEnum.Save);\n                }\n            } catch (e) {\n                console.log(\n                    `${dateStr()} TupleLoader - Save/Delete event emit error`\n                );\n                console.error(e);\n            }\n\n            // Else, treat this as a failure\n        } else {\n            if (this.lastPromise) {\n                this.lastPromise.reject(payloadEnvelope.result.toString());\n                this.lastPromise = null;\n            }\n\n            this.vortexStatusService.logError(\n                payloadEnvelope.result.toString()\n            );\n\n            return;\n        }\n\n        if (this.lastPromise) {\n            this.lastPromise.resolve(payloadEnvelope);\n            this.lastPromise = null;\n        }\n\n        payloadEnvelope\n            .decodePayload()\n            .then((payload: Payload) => {\n                this.lastTuples = payload.tuples;\n                this._observable.next(payload.tuples);\n            })\n            .catch((e) =>\n                console.log(\n                    `${dateStr()} TupleLoader failed to decode payload ${e}`\n                )\n            );\n    }\n\n    private resetTimer(): void {\n        this.operationTimeout(false);\n    }\n\n    private setupTimer(): boolean {\n        let self = this;\n        if (self.timer != null) {\n            this.vortexStatusService.logWarning(\n                \"We're already processing a request, Action failed\"\n            );\n            return false;\n        }\n\n        self.timer = setTimeout(\n            bind(self, self.operationTimeout),\n            SERVER_RESPONSE_TIMEOUT_SECONDS * 1000\n        );\n        return true;\n    }\n\n    private operationTimeout(showBaloon: boolean = true): void {\n        this.timer = null;\n\n        let msg: string = \"The server failed to respond, operaton timed out\";\n\n        if (this.lastPromise) {\n            msg = `${this.lastPromise.type} Failed, Response Timed out`;\n            this.lastPromise.reject(msg);\n            this.lastPromise = null;\n        }\n\n        showBaloon && this.vortexStatusService.logError(msg);\n    }\n}\n","import { Inject, Injectable, NgZone } from \"@angular/core\";\nimport { Subject } from \"rxjs\";\nimport { bind, dateStr } from \"./UtilMisc\";\n\n// Node compatibility\nconst logDebug = console.debug\n    ? bind(console, console.debug)\n    : bind(console, console.log);\nconst logInfo = bind(console, console.log);\nconst logError = console.error\n    ? bind(console, console.error)\n    : bind(console, console.log);\nconst logWarning = console.warn\n    ? bind(console, console.warn)\n    : bind(console, console.log);\n\nexport interface VortexStatusServiceSnapshot {\n    isOnline: boolean;\n    queuedActionCount: number;\n}\n\n@Injectable()\nexport class VortexStatusService {\n    readonly isOnline: Subject<boolean> = new Subject<boolean>();\n    readonly httpSessionLoggedOut: Subject<void> = new Subject<void>();\n    readonly debug: Subject<string> = new Subject<string>();\n    readonly info: Subject<string> = new Subject<string>();\n    readonly warning: Subject<string> = new Subject<string>();\n    readonly errors: Subject<string> = new Subject<string>();\n    readonly connectionInfo: Subject<string> = new Subject<string>();\n    readonly connectionError: Subject<string> = new Subject<string>();\n\n    private wasOnline: boolean = false;\n\n    constructor(@Inject(NgZone) private zone: NgZone) {}\n\n    get snapshot(): VortexStatusServiceSnapshot {\n        return {\n            isOnline: this.wasOnline,\n            queuedActionCount: this.lastQueuedTupleActions,\n        };\n    }\n\n    setOnline(online: boolean) {\n        if (online === this.wasOnline) return;\n\n        logDebug(dateStr() + \"Vortex Status - online: \" + online);\n\n        this.wasOnline = online;\n        this.zone.run(() => {\n            this.isOnline.next(online);\n        });\n    }\n\n    setHttpSessionLoggedOut() {\n        logDebug(dateStr() + \"Vortex Status - Http Service is Logged Out\");\n\n        this.zone.run(() => {\n            this.httpSessionLoggedOut.next();\n        });\n    }\n\n    queuedActionCount: Subject<number> = new Subject<number>();\n    lastQueuedTupleActions: number = 0;\n\n    incrementQueuedActionCount() {\n        this.setQueuedActionCount(this.lastQueuedTupleActions + 1);\n    }\n\n    decrementQueuedActionCount() {\n        this.setQueuedActionCount(this.lastQueuedTupleActions - 1);\n    }\n\n    setQueuedActionCount(count: number) {\n        if (count === this.lastQueuedTupleActions) return;\n\n        this.lastQueuedTupleActions = count;\n        this.zone.run(() => {\n            this.queuedActionCount.next(count);\n        });\n    }\n\n    logDebug(message: string) {\n        logDebug(dateStr() + \"Vortex Status - debug: \" + message);\n        this.zone.run(() => {\n            this.debug.next(message);\n        });\n    }\n\n    logInfo(message: string) {\n        logInfo(dateStr() + \"Vortex Status - info: \" + message);\n        this.zone.run(() => {\n            this.info.next(message);\n        });\n    }\n\n    logWarning(message: string) {\n        logWarning(dateStr() + \"Vortex Status - warning: \" + message);\n        this.zone.run(() => {\n            this.warning.next(message);\n        });\n    }\n\n    logError(message: string) {\n        logError(dateStr() + \"Vortex Status - error: \" + message);\n        this.zone.run(() => {\n            this.errors.next(message);\n        });\n    }\n\n    logConnectionInfo(message: string) {\n        logInfo(dateStr() + \"Vortex Connection Status - info: \" + message);\n        this.zone.run(() => {\n            this.connectionInfo.next(message);\n        });\n    }\n\n    logConnectionError(message: string) {\n        logError(dateStr() + \"Vortex Connection Status - error: \" + message);\n        this.zone.run(() => {\n            this.connectionError.next(message);\n        });\n    }\n}\n","import { bind, dateStr, getFiltStr } from \"./UtilMisc\";\nimport { VortexClientABC } from \"./VortexClientABC\";\nimport { VortexStatusService } from \"./VortexStatusService\";\nimport { PayloadEnvelope } from \"./PayloadEnvelope\";\n\ninterface ReceivePayloadCallable {\n    (Payload): void;\n}\n\ninterface VortexBeatCallable {\n    (): void;\n}\n\nexport class VortexClientHttp extends VortexClientABC {\n    /**\n     * RapUI VortexService, This class is responsible for sending and receiving payloads to/from\n     * the server.\n     */\n    private lastConn: _VortexClientHttpConnection | null = null;\n\n    constructor(\n        vortexStatusService: VortexStatusService,\n        url: string,\n        vortexClientName: string\n    ) {\n        super(vortexStatusService, url, vortexClientName);\n    }\n\n    protected shutdown(): Promise<void> {\n        if (this.lastConn) {\n            this.lastConn.shutdown();\n            this.lastConn = null;\n        }\n        return Promise.resolve();\n    }\n\n    setClosedByConnection() {\n        this.setClosed();\n    }\n\n    protected sendVortexMsg(vortexMsgs: string[]): void {\n        this.lastConn = new _VortexClientHttpConnection(\n            this,\n            this.vortexStatusService,\n            (payload) => this.receive(payload),\n            () => this.beat()\n        );\n        this.lastConn.send(vortexMsgs);\n        // console.log(dateStr() + \"Sent payload with filt : \" + JSON.stringify(payload.filt));\n    }\n}\n\n// ############################################################################\nclass _VortexClientHttpConnection {\n    private static readonly RECONNECT_SIZE_LIMIT = 20 * 1024 * 1024; // 20 megabytes\n\n    private _vortex: VortexClientHttp;\n    private _http: XMLHttpRequest;\n    private _updateTimer: any;\n    private _responseParseIndex: number;\n    private _closing: boolean;\n    private _aborting: boolean;\n\n    constructor(\n        private vortex: VortexClientHttp,\n        private vortexStatusService: VortexStatusService,\n        private receiveCallback: ReceivePayloadCallable,\n        private vortexBeatCallback: VortexBeatCallable\n    ) {\n        let self = this;\n\n        let randArg = Math.random() + \".\" + new Date().getTime();\n        let args = {\n            vortexUuid: vortex.uuid,\n            vortexName: vortex.name,\n            __randArg__: randArg,\n        };\n\n        self._http = new XMLHttpRequest();\n        self._http.open(\"POST\", self.vortex.url + getFiltStr(args), true);\n\n        self._updateTimer = null;\n\n        // Good events\n        self._http.onloadstart = function (e) {\n            self._received();\n\n            // Force a 50-millisecond timer, as some browsers don't call \"onprogress\"\n            // very often.\n            self._updateTimer = setInterval(function () {\n                self._received();\n            }, 50);\n        };\n\n        self._http.onprogress = function (e) {\n            self._received();\n        };\n\n        self._http.onload = function (e) {\n            if (self._updateTimer) clearInterval(self._updateTimer);\n            self._received();\n        };\n\n        // Bad events\n        self._http.onabort = bind(self, self._error);\n        self._http.onerror = bind(self, self._error);\n        self._http.ontimeout = bind(self, self._error);\n\n        self._responseParseIndex = 0;\n        self._closing = false;\n        self._aborting = false;\n    }\n\n    shutdown(): void {\n        this._closing = true;\n        if (this._http) this._http.abort();\n    }\n\n    send(vortexMsgs: string[]) {\n        let data = \"\";\n\n        for (let vortexMsg of vortexMsgs) {\n            // Serialise the payload\n            data += vortexMsg + \".\";\n        }\n\n        // console.log(\"sending payload\");\n        // console.log(xmlStr);\n        this._http.send(data);\n    }\n\n    private _received() {\n        let self = this;\n        /*\n         * Received\n         *\n         * Called when progress is made on receiving data from the vortex server.\n         *\n         * This means that it needs to be able to handle : * partial payloads (in\n         * which case it does nothing) * multiple payloads (in which case, it breaks\n         * them up, parses them and sends them to vortex individually)\n         */\n\n        if (self._aborting) return;\n\n        // If we receive something that is not valid vortex data, then reload the page\n        // This typically occurs when we're receving HTML because we're not logged in.\n        if (/^</.test(self._http.responseText)) {\n            self.vortex.setClosedByConnection();\n            self._closing = true;\n            self._aborting = true;\n            self._http.abort();\n\n            location.reload();\n            return;\n        }\n\n        // Split out the payloads of data, they are delimited by a '.'\n        let data = self._http.responseText.substr(self._responseParseIndex);\n        let payloadSeparatorIndex = data.indexOf(\".\");\n\n        while (payloadSeparatorIndex !== -1) {\n            self._responseParseIndex += payloadSeparatorIndex + 1;\n\n            // Get the b64encoded string\n            let vortexStr = data.substr(0, payloadSeparatorIndex);\n\n            if (vortexStr.length === 0) {\n                self.vortexBeatCallback();\n            } else {\n                // Create payload object from it\n                // Send to vortex\n                PayloadEnvelope.fromVortexMsg(vortexStr)\n                    .then((pe: PayloadEnvelope) => self.receiveCallback(pe))\n                    .catch((e) =>\n                        console.log(\n                            `${dateStr()} An error occured deserialising ${e}`\n                        )\n                    );\n            }\n\n            data = self._http.responseText.substr(self._responseParseIndex);\n            payloadSeparatorIndex = data.indexOf(\".\");\n        }\n\n        // In the event that the browser is buffering all this data, we should\n        // reconnect to allow the browser to cleanup.\n        if (\n            self._http.responseText.length >=\n                _VortexClientHttpConnection.RECONNECT_SIZE_LIMIT &&\n            !self._closing\n        ) {\n            self._closing = true;\n            self.vortex.reconnect();\n        }\n    }\n\n    private _error(e) {\n        let self = this;\n        if (self._updateTimer) clearInterval(self._updateTimer);\n\n        if (self._aborting || this._closing) return;\n\n        let msg = \"\";\n\n        if (e.type === \"abort\") {\n            msg = \"Request was aborted and not by VortexJS\";\n        } else {\n            try {\n                msg = e.toString();\n            } catch (e) {}\n        }\n\n        this.vortexStatusService.setOnline(false);\n        this.vortexStatusService.logError(msg);\n        // console.log(\"VortexConnection, connection errored out: \" + msg);\n    }\n}\n","import { VortexClientABC, VortexClientStateE } from \"./VortexClientABC\";\nimport { VortexStatusService } from \"./VortexStatusService\";\nimport { dateStr, getFiltStr } from \"./UtilMisc\";\nimport { PayloadEnvelope } from \"./PayloadEnvelope\";\n\n// https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n\ndeclare const WebSocket: any;\ndeclare const MozWebSocket: any;\n\nexport class VortexClientWebsocket extends VortexClientABC {\n    private Socket = WebSocket || MozWebSocket;\n    private socket: WebSocket | null = null;\n\n    private lastReconnectDate: number = Date.parse(\"01-Jan-2017\");\n\n    private unsentBuffer: string[] = [];\n\n    // Make note of when we're reconnecting,\n    // otherwise closing the last websocket causes a reconnection\n    // call which then closes the current socket being open (in  a loop)\n    private reconnectingInProgress: boolean = false;\n\n    private _data: string = \"\";\n    private _vortexMsgsQueue: string[] = [];\n\n    constructor(\n        vortexStatusService: VortexStatusService,\n        url: string,\n        vortexClientName: string,\n    ) {\n        super(vortexStatusService, url, vortexClientName);\n    }\n\n    get isReady(): boolean {\n        return (\n            this.socket != null && this.socket.readyState === this.Socket.OPEN\n        );\n    }\n\n    // OVERRIDE Send\n    send(payloadEnvelope: PayloadEnvelope | PayloadEnvelope[]): Promise<void> {\n        if (!this.isReady) {\n            throw new Error(\"Websocked vortex is not online.\");\n        }\n\n        return super.send(payloadEnvelope);\n    }\n\n    // OVERRIDE reconnect\n    async reconnect(): Promise<void> {\n        this.vortexStatusService.logDebug(\n            \"VortexClientWebsocket.reconnect called\",\n        );\n\n        if (this.reconnectingInProgress === true) {\n            this.vortexStatusService.logDebug(\n                \"VortexClientWebsocket.reconnect returning #1\",\n            );\n            return;\n        }\n        this.clearBeatTimer();\n        this._vortexState = VortexClientStateE.Idle;\n        this.reconnectingInProgress = true;\n        try {\n            await this.createSocket();\n        } catch (e) {\n            console.error(`${dateStr()} Failed to connect websocket ${e}`);\n        }\n        this.reconnectingInProgress = false;\n        this.restartTimer();\n\n        this.vortexStatusService.logDebug(\n            \"VortexClientWebsocket.reconnect returning #2\",\n        );\n    }\n\n    protected sendVortexMsg(vortexMsgs: string[]): void {\n        this.unsentBuffer.add(vortexMsgs);\n\n        this.sendMessages();\n    }\n\n    private sendMessages() {\n        while (this.unsentBuffer.length !== 0) {\n            if (!this.isReady) return;\n\n            let vortexMsg = this.unsentBuffer.shift();\n            this.socket.send(vortexMsg + \".\");\n        }\n    }\n\n    private _processData(): void {\n        if (this._data) {\n            let indexOfDot: number = this._data.indexOf(\".\");\n            while (indexOfDot !== -1) {\n                const vortexMsg = this._data.slice(0, indexOfDot);\n                this._data = this._data.slice(indexOfDot + 1);\n\n                if (vortexMsg.length !== 0) {\n                    this._vortexMsgsQueue.push(vortexMsg);\n                }\n\n                indexOfDot = this._data.indexOf(\".\");\n            }\n        }\n\n        while (this._vortexMsgsQueue.length !== 0) {\n            this._processVortexMsgs() //\n                .catch((e) => console.log(`ERROR VortexClientWebsocket: ${e}`));\n        }\n    }\n\n    private async _processVortexMsgs() {\n        while (this._vortexMsgsQueue.length !== 0) {\n            const vortexMsg = this._vortexMsgsQueue.shift();\n\n            try {\n                const payloadEnvelope =\n                    await PayloadEnvelope.fromVortexMsg(vortexMsg);\n\n                this._deliverPayload(payloadEnvelope);\n            } catch (e) {\n                console.log(\n                    dateStr() +\n                        `ERROR: processing vortexMsg\\n${e}\\n${vortexMsg}`,\n                );\n            }\n        }\n    }\n\n    private _deliverPayload(payloadEnvelope: PayloadEnvelope) {\n        this.receive(payloadEnvelope);\n    }\n\n    protected async shutdown(): Promise<void> {\n        this.vortexStatusService.logDebug(\n            \"VortexClientWebsocket.shutdown called\",\n        );\n        await this.closeWebsocket();\n        this.vortexStatusService.logDebug(\n            \"VortexClientWebsocket.shutdown\" + \" returned\",\n        );\n    }\n\n    private async closeWebsocket(): Promise<void> {\n        this.vortexStatusService.logDebug(\n            \"VortexClientWebsocket.closeWebsocket called\",\n        );\n        // If we're open then close\n        if (this.socket && this.socket.readyState === this.Socket.OPEN) {\n            await new Promise<void>((resolve, reject) => {\n                this.vortexStatusService.logDebug(\"Websocket close starting\");\n                this.setClosing();\n                this.socket.addEventListener(\"close\", () => {\n                    this.vortexStatusService.logInfo(\n                        \"Websocket close complete\",\n                    );\n                    this.setClosed();\n                    resolve();\n                });\n                this.socket.close();\n            });\n        }\n\n        this.socket = null;\n\n        this.vortexStatusService.logDebug(\n            \"VortexClientWebsocket.closeWebsocket returning\",\n        );\n    }\n\n    private async createSocket(): Promise<void> {\n        this.vortexStatusService.logDebug(\n            \"VortexClientWebsocket.createSocket called\",\n        );\n        // If we're already connecting, then do nothing\n        if (this.socket && this.socket.readyState === this.Socket.CONNECTING) {\n            if (!this.isShutdown) {\n                this.vortexStatusService.logDebug(\n                    \"VortexClientWebsocket.createSocket\" + \" returning #1\",\n                );\n                return;\n            }\n            try {\n                console.log(\n                    \"Aborting WebSocket connection attempt,\" +\n                        \" this is probably because of Vortex reconnection\",\n                );\n                this.socket.close();\n            } catch (e) {\n                // pass\n            }\n        }\n\n        this.vortexStatusService.logDebug(\n            \"VortexClientWebsocket.createSocket Closing old websocket\",\n        );\n        await this.closeWebsocket();\n\n        // Don't continually reconnect\n        let reconnectDiffMs = Date.now() - this.lastReconnectDate;\n        if (reconnectDiffMs < this.RECONNECT_BACKOFF_SECONDS * 1000) {\n            this.vortexStatusService.logDebug(\n                \"VortexClientWebsocket.createSocket returning #2 - backoff\" +\n                    \" timeout\",\n            );\n            setTimeout(\n                () => this.createSocket(),\n                this.RECONNECT_BACKOFF_SECONDS * 1000 - reconnectDiffMs + 10,\n            );\n            return;\n        }\n\n        this.lastReconnectDate = Date.now();\n\n        // Prepare the args to send\n        const args = {\n            vortexUuid: this.uuid,\n            vortexName: this.name,\n        };\n\n        this.vortexStatusService.logConnectionInfo(\n            `${dateStr()} WebSocket, connecting to ${this.url}`,\n        );\n\n        await new Promise<void>((resolve, reject) => {\n            // Construct + open the socket\n            let promiseCalled = false;\n\n            this.vortexStatusService.logDebug(\n                \"VortexClientWebsocket.createSocket Creating socket\",\n            );\n            this.socket = new this.Socket(this.url + getFiltStr(args), []);\n\n            this.socket.binaryType = \"arraybuffer\";\n\n            this.socket.addEventListener(\"message\", (event) => {\n                this.onMessage(event, () => {\n                    this.vortexStatusService.logDebug(\n                        \"VortexClientWebsocket.createSocket calling resolve\" +\n                            \" from message\",\n                    );\n                    resolve();\n                    promiseCalled = true;\n                });\n            });\n            this.socket.addEventListener(\"close\", (event) => {\n                this.vortexStatusService.logDebug(\n                    \"VortexClientWebsocket.createSocket addEventListener close\",\n                );\n                this.onClose(event);\n                if (!promiseCalled) {\n                    this.vortexStatusService.logDebug(\n                        \"VortexClientWebsocket.createSocket calling reject\" +\n                            \" from close\",\n                    );\n                    promiseCalled = true;\n                    reject();\n                }\n            });\n            this.socket.addEventListener(\"error\", (event) => {\n                this.vortexStatusService.logDebug(\n                    `VortexClientWebsocket.createSocket addEventListener error: ${event}`,\n                );\n                this.onError(event, () => {\n                    this.vortexStatusService.logDebug(\n                        \"VortexClientWebsocket.createSocket calling reject\" +\n                            \" from error\",\n                    );\n                    reject();\n                    promiseCalled = true;\n                });\n            });\n            this.socket.addEventListener(\"open\", (event) => {\n                this.vortexStatusService.logDebug(\n                    \"VortexClientWebsocket.createSocket addEventListener open\",\n                );\n                this.onOpen(event);\n            });\n        });\n\n        this.vortexStatusService.logDebug(\n            \"VortexClientWebsocket.createSocket returning #3\",\n        );\n    }\n\n    private onMessage(event, promiseResolver) {\n        if (!this.isOnline) {\n            this.setOnline();\n            promiseResolver();\n        }\n\n        this.beat();\n\n        if (event.data.length == null) {\n            this.vortexStatusService.logConnectionError(\n                \"WebSocket, We've received a websocket binary message,\" +\n                    \" we expect a unicode\",\n            );\n            return;\n        }\n\n        // If the server sends us a '.', that's a heart beat, return it.\n        if (event.data === \".\") {\n            this.socket != null && this.socket.send(\".\");\n            return;\n        }\n\n        if (event.data[0] !== \"{\") {\n            this._data += event.data;\n        } else {\n            // It starts with {, ensure it ends with }\n            if (event.data[event.data.length - 1] !== \"}\") {\n                console.log(\n                    dateStr() +\n                        \" ERROR, Payload should end with },\" +\n                        \" but it doesn't: \" +\n                        event.data,\n                );\n                return;\n            }\n            this._vortexMsgsQueue.push(event.data);\n        }\n\n        this._processData();\n    }\n\n    private onOpen(event) {\n        super\n            .send(new PayloadEnvelope())\n            .catch((e) =>\n                console.log(`ERROR VortexClientWebsocket onOpen Send: ${e}`),\n            );\n        this.vortexStatusService.logConnectionInfo(\"WebSocket, connecting\");\n    }\n\n    private onClose(event) {\n        this.vortexStatusService.logConnectionInfo(\"WebSocket, closed\");\n        if (!(this.socket && this.socket.readyState === this.Socket.OPEN)) {\n            this.setClosed();\n        }\n        // The base class will reconnect\n    }\n\n    private onError(event, reject) {\n        reject(event.error?.toString() || \"Websocket failed to connect\");\n        // onClose will get called as well\n\n        // Check if the server is still up, if it is we've been logged out\n        this.testIfOnlineAndLoggedOut()\n            .then(() => console.log(\"Server is unreachable\"))\n            .catch(() => {\n                this.vortexStatusService.logConnectionError(\n                    \"Vortex Websocket doesn't connect but server is online,\" +\n                        \" Marking vortex as logged out\",\n                );\n                this.vortexStatusService.setHttpSessionLoggedOut();\n                return;\n            });\n    }\n\n    private testIfOnlineAndLoggedOut(): Promise<void> {\n        return new Promise<void>((resolve, reject) => {\n            const httpUrl = \"http\" + this._url.substring(2);\n            let xmlHttp = new XMLHttpRequest();\n            xmlHttp.timeout = 2000;\n            xmlHttp.responseType = \"document\";\n            xmlHttp.onload = function (event) {\n                reject();\n            };\n            xmlHttp.onerror = function (event) {\n                resolve();\n            };\n            xmlHttp.open(\"GET\", httpUrl, true); // true for asynchronous\n            xmlHttp.send(null);\n        });\n    }\n}\n","import { IPayloadFilt, Payload } from \"./Payload\";\nimport { Inject, Injectable } from \"@angular/core\";\nimport { Tuple } from \"./exports\";\nimport { Observable } from \"rxjs\";\nimport { PayloadEndpoint } from \"./PayloadEndpoint\";\nimport { IFilterUpdateCallable, TupleLoader } from \"./TupleLoader\";\nimport { VortexStatusService } from \"./VortexStatusService\";\nimport { VortexClientABC } from \"./VortexClientABC\";\nimport { VortexClientHttp } from \"./VortexClientHttp\";\nimport { VortexClientWebsocket } from \"./VortexClientWebsocket\";\nimport { PayloadEnvelope } from \"./PayloadEnvelope\";\nimport { NgLifeCycleEvents } from \"../util/NgLifeCycleEvents\";\nimport { dateStr } from \"./UtilMisc\";\n\n@Injectable()\nexport class VortexService {\n    private vortex: VortexClientABC;\n    private static vortexUrl: string | null = \"/vortex\";\n    private static vortexClientName: string = \"\";\n\n    constructor(@Inject(VortexStatusService) private vortexStatusService) {\n        this.reconnect() //\n            .catch((e) =>\n                console.log(\n                    `${dateStr()} VortexService constructor reconnect failed`\n                )\n            );\n    }\n\n    /**\n     * Set Vortex URL\n     *\n     * This method should not be used except in rare cases, such as an ios or android app.\n     *\n     * @param url: The new URL for the vortex to use.\n     */\n    static setVortexUrl(url: string | null) {\n        VortexService.vortexUrl = url;\n    }\n\n    /**\n     * Set Vortex Name\n     *\n     * @param vortexClientName: The vortexClientName to tell the server that we are.\n     */\n    static setVortexClientName(vortexClientName: string) {\n        VortexService.vortexClientName = vortexClientName;\n    }\n\n    async reconnect() {\n        if (VortexService.vortexUrl == null) {\n            this.vortexStatusService.setOnline(false);\n            return;\n        }\n\n        if (VortexService.vortexClientName == \"\") {\n            throw new Error(\"VortexService.setVortexClientName() not set yet\");\n        }\n\n        if (this.vortex != null) await this.vortex.close();\n\n        if (VortexService.vortexUrl.toLowerCase().startsWith(\"ws\")) {\n            this.vortex = new VortexClientWebsocket(\n                this.vortexStatusService,\n                VortexService.vortexUrl,\n                VortexService.vortexClientName\n            );\n        } else {\n            this.vortex = new VortexClientHttp(\n                this.vortexStatusService,\n                VortexService.vortexUrl,\n                VortexService.vortexClientName\n            );\n        }\n\n        await this.vortex.reconnect();\n    }\n\n    sendTuple(filt: IPayloadFilt | string, tuples: any[] | Tuple[]): void {\n        if (typeof filt === \"string\") {\n            filt = { key: filt };\n        }\n        this.sendPayload(new Payload(filt, tuples));\n    }\n\n    sendFilt(filt): void {\n        this.sendPayload(new Payload(filt));\n    }\n\n    /** Send Payload\n     *\n     * @param {Payload[] | Payload} payload\n     * @returns {Promise<void>}\n     */\n    sendPayload(payload: Payload[] | Payload): Promise<void> {\n        if (this.vortex == null) {\n            throw new Error(\"The vortex is not initialised yet.\");\n        }\n\n        let payloads: Payload[] = [];\n        if (payload instanceof Array) payloads = payload;\n        else payloads = [payload];\n\n        let promises: Promise<void>[] = [];\n        for (let payload of payloads) {\n            promises.push(\n                payload\n                    .makePayloadEnvelope()\n                    .then((payloadEnvelope: PayloadEnvelope) => {\n                        this.vortex.send(payloadEnvelope);\n                    })\n            );\n        }\n        let ret: any = Promise.all(promises);\n        return ret;\n    }\n\n    /** Send Payload Envelope(s)\n     *\n     * @param {PayloadEnvelope[] | PayloadEnvelope} payloadEnvelope\n     * @returns {Promise<void>}\n     */\n    sendPayloadEnvelope(\n        payloadEnvelope: PayloadEnvelope[] | PayloadEnvelope\n    ): Promise<void> {\n        if (this.vortex == null) {\n            throw new Error(\"The vortex is not initialised yet.\");\n        }\n        return this.vortex.send(payloadEnvelope);\n    }\n\n    createEndpointObservable(\n        component: NgLifeCycleEvents,\n        filter: IPayloadFilt,\n        processLatestOnly: boolean = false\n    ): Observable<PayloadEnvelope> {\n        let endpoint = new PayloadEndpoint(\n            component,\n            filter,\n            processLatestOnly\n        );\n\n        return this.createEndpoint(component, filter, processLatestOnly)\n            .observable;\n    }\n\n    createEndpoint(\n        component: NgLifeCycleEvents,\n        filter: IPayloadFilt,\n        processLatestOnly: boolean = false\n    ): PayloadEndpoint {\n        return new PayloadEndpoint(component, filter, processLatestOnly);\n    }\n\n    createTupleLoader(\n        component: NgLifeCycleEvents,\n        filterUpdateCallable: IFilterUpdateCallable | IPayloadFilt\n    ) {\n        return new TupleLoader(\n            this.vortex,\n            this.vortexStatusService,\n            component,\n            filterUpdateCallable\n        );\n    }\n}\n","import {\n    AfterViewInit,\n    Component,\n    DoCheck,\n    OnDestroy,\n    OnInit,\n} from \"@angular/core\";\nimport { Observable, Subject } from \"rxjs\";\n\n@Component({\n    template: \"\",\n})\nexport class NgLifeCycleEvents\n    implements OnInit, AfterViewInit, OnDestroy, DoCheck\n{\n    onInitEvent: Subject<void> = new Subject<void>();\n    afterViewInitEvent: Subject<void> = new Subject<void>();\n    onDestroyEvent: Subject<void> = new Subject<void>();\n    doCheckEvent: Subject<void> = new Subject<void>();\n\n    ngOnInit() {\n        this.onInitEvent.next();\n    }\n\n    ngAfterViewInit() {\n        this.afterViewInitEvent.next();\n    }\n\n    ngDoCheck(): void {\n        this.doCheckEvent.next();\n    }\n\n    ngOnDestroy() {\n        this.onDestroyEvent.next();\n\n        if (this.onDestroyEvent[\"observers\"] != null) {\n            for (let observer of this.onDestroyEvent[\"observers\"]) {\n                observer[\"unsubscribe\"]();\n            }\n        }\n\n        if (this.doCheckEvent[\"observers\"] != null) {\n            for (let observer of this.doCheckEvent[\"observers\"]) {\n                observer[\"unsubscribe\"]();\n            }\n        }\n\n        if (this.onInitEvent[\"observers\"] != null) {\n            for (let observer of this.onInitEvent[\"observers\"]) {\n                observer[\"unsubscribe\"]();\n            }\n        }\n\n        if (this.afterViewInitEvent[\"observers\"] != null) {\n            for (let observer of this.afterViewInitEvent[\"observers\"]) {\n                observer[\"unsubscribe\"]();\n            }\n        }\n    }\n}\n\nexport interface NgOnDestroyEventI {\n    onDestroyEvent: Subject<void> | Observable<void>;\n}\n","import {VortexClientABC} from \"./VortexClientABC\";\nimport {IPayloadFilt} from \"./Payload\";\nimport {dateStr} from \"./UtilMisc\";\nimport {VortexService} from \"./VortexService\";\nimport {NgLifeCycleEvents} from \"../util/NgLifeCycleEvents\";\nimport {PayloadEnvelope} from \"./PayloadEnvelope\";\nimport {takeUntil} from \"rxjs/operators\";\n\n/** Payload Response\n *\n *    This class is used to catch responses from a sent payload.\n *    If the remote end is going to send back a payload, with the same filt,\n *    this class catches this then either resolves or rejects the promise.\n *\n *    If the response is not received within the timeout, the errback is called.\n *\n *    ** The PayloadResponse in VortexJS Sends the Payload **\n *\n *    Here is some example usage.\n *\n *    ::\n *\n *        payload = Payload(filt={\"rapuiServerEcho\":True})\n *        responsePromise = PayloadResponse(vortexService, payload)\n *          .then((payload) => console.log(`Received payload ${payload}`))\n *          .catch((err) => console.log(err));\n *\n */\nexport class PayloadResponse {\n    public static readonly RESPONSE_TIMEOUT_SECONDS = 30.0;\n    private static messageIdKey = \"PayloadResponse.messageId\";\n\n    readonly PROCESSING = \"Processing\";\n    // NO_ENDPOINT = \"No Endpoint\"\n    readonly FAILED = \"Failed\";\n    readonly SEND_FAILED = \"Send Failed\";\n    readonly SUCCESS = \"Success\";\n    readonly TIMED_OUT = \"Timed Out\";\n\n    private _messageId: string = VortexClientABC.makeUuid();\n    private _status: string = this.PROCESSING;\n\n    private _lcEmitter: NgLifeCycleEvents = new NgLifeCycleEvents();\n\n    private promise: Promise<PayloadEnvelope>;\n\n    /** Constructor\n     * @param vortexService\n     * @param payloadEnvelope The PayloadEnvelope to send.\n     * @param timeoutSeconds The timeout to wait for a response - in seconds;\n     * @param resultCheck Should the result of the payload response be checked.\n     */\n    constructor(\n        vortexService: VortexService,\n        private payloadEnvelope: PayloadEnvelope,\n        private timeoutSeconds: number = PayloadResponse.RESPONSE_TIMEOUT_SECONDS,\n        private resultCheck: boolean = true,\n    ) {\n        this.promise = new Promise<PayloadEnvelope>((resolve, reject) => {\n            // Start the timer\n            let timer = null;\n\n            // Create the endpoint\n            this.payloadEnvelope.filt[PayloadResponse.messageIdKey] =\n                this._messageId;\n            let endpoint = vortexService.createEndpoint(\n                this._lcEmitter,\n                <IPayloadFilt>this.payloadEnvelope.filt,\n            );\n\n            let finish = (status) => {\n                this._status = status;\n                this._lcEmitter.onDestroyEvent.next();\n\n                if (timer != null) {\n                    clearTimeout(timer);\n                    timer = null;\n                }\n            };\n\n            let callFail = (status: string, msgArg = \"\") => {\n                let filtStr = JSON.stringify(this.payloadEnvelope.filt);\n                let msg = `${dateStr()} PayloadEndpoint ${status} Failed : ${msgArg}\\n${filtStr}`;\n                console.log(msg);\n\n                finish(status);\n                reject(msgArg);\n            };\n\n            // Subscribe\n            endpoint.observable\n                .pipe(takeUntil(this._lcEmitter.onDestroyEvent))\n                .subscribe((payloadEnvelope: PayloadEnvelope) => {\n                    let r = payloadEnvelope.result; // success is null or true\n                    if (this.resultCheck && !(r == null || r === true)) {\n                        callFail(this.FAILED, r.toString());\n                    } else {\n                        finish(this.SUCCESS);\n                        resolve(payloadEnvelope);\n                    }\n                });\n\n            vortexService\n                .sendPayloadEnvelope(this.payloadEnvelope)\n                .then(() => {\n                    timer = setTimeout(\n                        () => callFail(this.TIMED_OUT),\n                        timeoutSeconds * 1000,\n                    );\n                })\n                .catch((err) => {\n                    callFail(this.SEND_FAILED, err);\n                });\n        });\n    }\n\n    /**\n     * Attaches callbacks for the resolution and/or rejection of the Promise.\n     * @param onfulfilled The callback to execute when the Promise is resolved.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of which ever callback is executed.\n     */\n    then(onfulfilled, onrejected = null): Promise<PayloadEnvelope> {\n        return this.promise.then(onfulfilled, onrejected);\n    }\n\n    /**\n     * Attaches a callback for only the rejection of the Promise.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of the callback.\n     */\n    catch(onrejected): Promise<PayloadEnvelope> {\n        return this.promise.catch(onrejected);\n    }\n\n    /** Is Response Payload\n     *\n     * The PayloadResponse tags the payloads, so it expects a unique message back.\n     *\n     * @returns True if this payload has been tagged by a PayloadResponse class\n     */\n    static isResponsePayloadEnvelope(payloadEnvelope: PayloadEnvelope) {\n        return payloadEnvelope.filt.hasOwnProperty(\n            PayloadResponse.messageIdKey,\n        );\n    }\n\n    get status() {\n        return this._status;\n    }\n}\n","import { TupleStorageServiceABC } from \"../storage/TupleStorageServiceABC\";\nimport { TupleOfflineStorageNameService } from \"../storage/TupleOfflineStorageNameService\";\nimport { TupleActionStorageServiceABC } from \"../action-storage/TupleActionStorageServiceABC\";\n\nexport abstract class TupleStorageFactoryService {\n    abstract create(\n        name: TupleOfflineStorageNameService\n    ): TupleStorageServiceABC;\n\n    abstract createActionStorage(): TupleActionStorageServiceABC;\n}\n","import { Tuple } from \"../Tuple\";\nimport { TupleSelector } from \"../TupleSelector\";\nimport { TupleOfflineStorageNameService } from \"./TupleOfflineStorageNameService\";\nimport { Payload } from \"../Payload\";\nimport { dateStr } from \"../UtilMisc\";\nimport { now } from \"../payload/PayloadDelegateABC\";\n\nexport interface TransactionDoWorkCallable {\n    (TupleStorageTransaction): void;\n}\n\nexport interface TupleStorageBatchSaveArguments {\n    tupleSelector: TupleSelector;\n    vortexMsg: string;\n}\n\nexport abstract class TupleStorageServiceABC {\n    protected dbName: string;\n\n    protected constructor(protected name: TupleOfflineStorageNameService) {\n        this.dbName = name.name;\n    }\n\n    abstract open(): Promise<void>;\n\n    abstract isOpen(): Promise<boolean>;\n\n    abstract close(): Promise<void>;\n\n    abstract truncateStorage(): Promise<void>;\n\n    async loadTuples(tupleSelector: TupleSelector): Promise<Tuple[]> {\n        const startTime = now();\n        const vortexMsg: string = await this.loadTuplesEncoded(tupleSelector);\n        if (vortexMsg == null) return [];\n        const payload = await Payload.fromEncodedPayload(vortexMsg);\n        const timeTaken = now() - startTime;\n        console.log(`${dateStr()} Storage: loadTuples took ${timeTaken}ms `);\n        return payload.tuples;\n    }\n\n    abstract loadTuplesEncoded(\n        tupleSelector: TupleSelector\n    ): Promise<string | null>;\n\n    async saveTuples(\n        tupleSelector: TupleSelector,\n        tuples: Tuple[]\n    ): Promise<void> {\n        const startTime = now();\n        const vortexMsg: string = await new Payload({}, tuples) //\n            .toEncodedPayload();\n        await this.saveTuplesEncoded(tupleSelector, vortexMsg);\n        const timeTaken = now() - startTime;\n        console.log(`${dateStr()} Storage: saveTuples took ${timeTaken}ms `);\n    }\n\n    abstract saveTuplesEncoded(\n        tupleSelector: TupleSelector,\n        vortexMsg: string\n    ): Promise<void>;\n\n    abstract batchSaveTuplesEncoded(\n        data: TupleStorageBatchSaveArguments[]\n    ): Promise<void>;\n\n    abstract deleteTuples(tupleSelector: TupleSelector): Promise<void>;\n\n    abstract deleteOldTuples(deleteDataBeforeDate: Date): Promise<void>;\n}\n","import { assert } from \"../UtilMisc\";\n\nexport interface SqlExecuteData {\n    sql: string;\n    bindParams?: any[];\n}\n\nexport function random(): number {\n    const min = 0;\n    const max = 150;\n    return Math.floor(Math.random() * (max - min + 1) + min);\n}\nexport abstract class SqlApiABC {\n    protected db: any;\n    protected schemaInstalled: boolean = false;\n    private openInProgressPromise: Promise<void> | null = null;\n\n    protected constructor(\n        protected dbName: string,\n        protected dbSchema: string[]\n    ) {}\n\n    async open(): Promise<void> {\n        if (this.openInProgressPromise != null)\n            return this.openInProgressPromise;\n\n        this.openInProgressPromise = this._openDb()\n            .then(() => (this.openInProgressPromise = null))\n            .catch((e) => {\n                this.openInProgressPromise = null;\n                throw e;\n            });\n\n        return this.openInProgressPromise;\n    }\n\n    abstract isOpen(): Promise<boolean>;\n\n    abstract close(): Promise<void>;\n\n    async execute(executeData: SqlExecuteData[]): Promise<void> {\n        await this.transaction(executeData, false);\n    }\n\n    async query(executeData: SqlExecuteData): Promise<any[]> {\n        // noinspection UnnecessaryLocalVariableJS\n        const data: any = await this.transaction([executeData], true);\n        return data;\n    }\n\n    protected abstract _openDb(): Promise<void>;\n\n    protected abstract transaction(\n        executeData: SqlExecuteData[],\n        isQuery: boolean\n    ): Promise<any[] | null>;\n\n    protected async installSchema(): Promise<void> {\n        if (this.schemaInstalled) {\n            return;\n        }\n        assert(this.dbSchema.length === 1, \"We only accept one SQL statement\");\n        // Open Transaction promise;\n        await this.execute([{ sql: this.dbSchema[0] }]);\n        this.schemaInstalled = true;\n    }\n}\n","import { Inject } from \"@angular/core\";\nimport { Capacitor } from \"@capacitor/core\";\nimport { Device } from \"@capacitor/device\";\n\nimport {\n    CapacitorSQLite,\n    capSQLiteSet,\n    SQLiteConnection,\n} from \"@capacitor-community/sqlite\";\nimport { random, SqlApiABC, SqlExecuteData } from \"./sql-api-abc\";\nimport { assert, dateStr } from \"../UtilMisc\";\nimport { SQLiteDBConnection } from \"@capacitor-community/sqlite\";\n\nexport class CapSqlApi extends SqlApiABC {\n    private _CapacitorSQLite: any | null = null;\n    private _sqliteConnection: SQLiteConnection | null = null;\n\n    constructor(@Inject(\"\") dbName: string, @Inject([]) dbSchema: string[]) {\n        super(dbName, dbSchema);\n    }\n\n    private get capDbConn(): SQLiteDBConnection {\n        return this.db;\n    }\n\n    private set capDbConn(val: SQLiteDBConnection) {\n        this.db = val;\n    }\n\n    async isOpen(): Promise<boolean> {\n        return this.db != null;\n    }\n\n    async close(): Promise<void> {\n        await this._sqliteConnection.closeAllConnections();\n        this.db = null;\n        this._CapacitorSQLite = null;\n    }\n\n    protected async _openDb(): Promise<void> {\n        if (await this.isOpen()) {\n            return;\n        }\n\n        // Wait for the platform to initialise\n        const info = await Device.getInfo();\n\n        // Get the plugin\n        console.log(`${dateStr()} *** platform ${info.platform}`);\n        this._CapacitorSQLite = CapacitorSQLite;\n\n        if (Capacitor.getPlatform() === \"android\") {\n            try {\n                await this._CapacitorSQLite.requestPermissions();\n            } catch (e) {\n                throw new Error(\"This app can't work without Database access.\");\n            }\n        }\n\n        this._sqliteConnection = new SQLiteConnection(this._CapacitorSQLite);\n        this.capDbConn = await this._sqliteConnection.createConnection(\n            this.dbName,\n            false,\n            \"no-encryption\",\n            1,\n            false\n        );\n        await this.capDbConn.open();\n        await this.installSchema();\n    }\n\n    async transaction(\n        executeData: SqlExecuteData[],\n        isQuery: boolean\n    ): Promise<any[] | null> {\n        if (!(await this.isOpen())) await this.open();\n\n        let retries = 5;\n        while (true) {\n            try {\n                return await this._transactionInner(executeData, isQuery);\n            } catch (e) {\n                if (\n                    retries >= 0\n                    /* &&\n                     (CapSqlApi.checkRetryMessage(e) ||\n                     CapSqlApi.isLockedMsg(e)) */\n                ) {\n                    retries--;\n                    await new Promise<void>((r) =>\n                        setTimeout(() => r(), 100 + random())\n                    );\n                    continue;\n                }\n\n                throw new Error(e);\n            }\n        }\n    }\n\n    private async _transactionInner(\n        executeData: SqlExecuteData[],\n        isQuery: boolean\n    ): Promise<any[] | null> {\n        if (isQuery) return await this._transactionInnerQuery(executeData);\n\n        await this._transactionInnerExecute(executeData);\n    }\n\n    private async _transactionInnerQuery(\n        executeData: SqlExecuteData[]\n    ): Promise<any[] | null> {\n        assert(\n            executeData.length === 1,\n            \"We expect executeData.length === 1 for a query\"\n        );\n\n        const data = (\n            await this.capDbConn.query(\n                executeData[0].sql,\n                executeData[0].bindParams\n            )\n        )?.values;\n\n        return data?.length ? data : null;\n    }\n\n    private async _transactionInnerExecute(\n        executeData: SqlExecuteData[]\n    ): Promise<void> {\n        const capData: Array<capSQLiteSet> = [];\n        const sqlOnlyList: string[] = [];\n        for (const data of executeData) {\n            if (!data.bindParams?.length /* null or 0 */) {\n                sqlOnlyList.push(data.sql);\n            } else {\n                capData.push({\n                    statement: data.sql,\n                    values: data.bindParams,\n                });\n            }\n        }\n\n        for (const sql of sqlOnlyList) {\n            // Just execute it, usually if we want a transaction we're\n            // only inserting lots of data.\n            const result = await this.capDbConn.run(sql);\n            if (result.changes.changes === -1)\n                throw new Error(\"An error occurred in the SQL\");\n        }\n\n        if (capData.length) {\n            const result = await this.capDbConn.executeSet(capData);\n            if (result.changes.changes === -1)\n                throw new Error(\"An error occurred in the SQL\");\n        }\n    }\n\n    // private static checkRetryMessage(message: string): boolean {\n    //     if (message.indexOf(RETRY_NO_SPACE) !== -1) return true;\n    //\n    //     return message.indexOf(RETRY_DISK_ERROR) !== -1;\n    // }\n    //\n    // private static isLockedMsg(err: any): boolean {\n    //     const msg = err.toString();\n    //\n    //     const hasNsSqlError =\n    //         msg.indexOf(\"SQLITE.ALL - Database Error5\") !== -1;\n    //\n    //     // unable to begin transaction (5 database is locked)\n    //     const hasCapSqlError = msg.indexOf(\"5 database is locked\") !== -1;\n    //\n    //     if (hasNsSqlError || hasCapSqlError) return true;\n    //\n    //     console.log(`WebSQL: Found error message that isn't a lock : ${msg}`);\n    //     return false;\n    // }\n}\n","import { Inject } from \"@angular/core\";\nimport { random, SqlApiABC, SqlExecuteData } from \"./sql-api-abc\";\nimport { dateStr } from \"../UtilMisc\";\n\ndeclare let openDatabase: any;\n\nconst RETRY_NO_SPACE = \"there was not enough remaining storage space\";\nconst RETRY_DISK_ERROR = \"unable to begin transaction (3850 disk I/O error)\";\n\nexport class WebSqlApi extends SqlApiABC {\n    constructor(@Inject(\"\") dbName: string, @Inject([]) dbSchema: string[]) {\n        super(dbName, dbSchema);\n    }\n\n    async isOpen(): Promise<boolean> {\n        return this.db != null;\n    }\n\n    async close(): Promise<void> {\n        this.db = null;\n    }\n\n    protected async _openDb(): Promise<void> {\n        let retries = 5;\n        while (true) {\n            try {\n                return await this._openWrapped();\n            } catch (err) {\n                err = err.message ? err.message : err;\n                if (retries >= 0 && WebSqlApi.checkRetryMessage(err)) {\n                    retries--;\n                    await new Promise<void>((r) =>\n                        setTimeout(() => r(), 100 + random())\n                    );\n                    continue;\n                }\n\n                throw new Error(err);\n            }\n        }\n    }\n\n    private async _openWrapped(): Promise<void> {\n        if (await this.isOpen()) {\n            return;\n        }\n\n        this.db = openDatabase(this.dbName, \"1\", this.dbName, 4 * 1024 * 1024);\n\n        await this.installSchema();\n    }\n\n    protected async transaction(\n        executeData: SqlExecuteData[],\n        isQuery: boolean\n    ): Promise<any[] | null> {\n        if (!(await this.isOpen())) await this.open();\n\n        let retries = 5;\n        while (true) {\n            try {\n                return await this._transactionInner(executeData, isQuery);\n            } catch (e) {\n                if (\n                    retries >= 0 &&\n                    (WebSqlApi.checkRetryMessage(e) || WebSqlApi.isLockedMsg(e))\n                ) {\n                    retries--;\n                    await new Promise<void>((r) =>\n                        setTimeout(() => r(), 100 + random())\n                    );\n                    continue;\n                }\n\n                throw new Error(e);\n            }\n        }\n    }\n\n    private async _transactionInner(\n        executeData: SqlExecuteData[],\n        isQuery: boolean\n    ): Promise<any[] | null> {\n        executeData = [...executeData];\n        const data: any[] = [];\n        await new Promise<void>((resolve, reject) => {\n            this.db.transaction((t) => {\n                const execSql = () => {\n                    const ed = executeData.pop();\n                    if (ed == null) {\n                        resolve();\n                        return;\n                    }\n                    t.executeSql(\n                        ed.sql,\n                        ed.bindParams,\n                        (transaction, results) => {\n                            /*\n                             * results:(SQLResultSet) {\n                             *      insertId:0,\n                             *      rows:(SQLResultSetRowList){\n                             *          length:0\n                             *      },\n                             *      rowsAffected:0\n                             *  }\n                             */\n                            if (isQuery) {\n                                // ALL GOOD, Return the rows\n                                for (let i = 0; i < results.rows.length; ++i) {\n                                    data.push(results.rows.item(i));\n                                }\n                            }\n\n                            if (executeData.length === 0) {\n                                resolve();\n                            } else {\n                                execSql();\n                            }\n                        },\n                        (tx, err) => {\n                            err = err == null ? tx : err; // Sometimes tx is the err\n                            reject(err.message ? err.message : err);\n                        }\n                    );\n                };\n                execSql();\n            });\n        });\n\n        return isQuery ? data : null;\n    }\n\n    private static checkRetryMessage(message: string): boolean {\n        if (message.indexOf(RETRY_NO_SPACE) !== -1) return true;\n\n        return message.indexOf(RETRY_DISK_ERROR) !== -1;\n    }\n\n    private static isLockedMsg(err: any): boolean {\n        const msg = err.toString();\n\n        const hasNsSqlError =\n            msg.indexOf(\"SQLITE.ALL - Database Error5\") !== -1;\n\n        // unable to begin transaction (5 database is locked)\n        const hasWebSqlError = msg.indexOf(\"5 database is locked\") !== -1;\n\n        if (hasNsSqlError || hasWebSqlError) return true;\n\n        console.log(\n            `${dateStr()} WebSQL: Found error message that isn't a lock : ${msg}`\n        );\n        return false;\n    }\n}\n","import { Injectable } from \"@angular/core\";\nimport { Capacitor } from \"@capacitor/core\";\nimport { SqlApiABC } from \"./sql-api-abc\";\nimport { CapSqlApi } from \"./cap-sql-api\";\nimport { WebSqlApi } from \"./web-sql-api\";\n\ndeclare let openDatabase: any;\n\n@Injectable()\nexport class SqlFactoryService {\n    /** Has Storage Limitations\n     *\n     * Returns true if this SQL storage has a small limitation on storage.\n     *\n     * This was implemented to return true on iOS mobile devices, as they have a\n     * 50mb storage limit.\n     *\n     */\n    hasStorageLimitations(): boolean {\n        // iOS safari supports up to a 50mb limit, MAX.\n        // In this case, IndexedDB should be used.\n        // https://stackoverflow.com/questions/9038625/detect-if-device-is-ios\n        // noinspection UnnecessaryLocalVariableJS\n        const iOS =\n            /iPad|iPhone|iPod/.test(navigator.userAgent) && !window[\"MSStream\"];\n\n        if (Capacitor.isNative) return false;\n\n        // Other conditions\n        return iOS;\n    }\n\n    isSupported(): boolean {\n        try {\n            return Capacitor.isNative || openDatabase != null;\n        } catch (e) {\n            return false;\n        }\n    }\n\n    createApi(dbName: string, dbSchema: string[]): SqlApiABC {\n        if (Capacitor.isNativePlatform())\n            return new CapSqlApi(dbName, dbSchema);\n        return new WebSqlApi(dbName, dbSchema);\n    }\n\n    get storageName(): string {\n        if (Capacitor.isNativePlatform()) return \"CapSql\";\n        return \"WebSql\";\n    }\n}\n","export class TupleOfflineStorageNameService {\n    constructor(public name: string) {\n    }\n}\n","import { TupleSelector } from \"../TupleSelector\";\nimport { Tuple } from \"../exports\";\nimport { Inject, Injectable } from \"@angular/core\";\nimport { TupleStorageFactoryService } from \"../storage-factory/TupleStorageFactoryService\";\nimport {\n    TupleStorageBatchSaveArguments,\n    TupleStorageServiceABC,\n} from \"./TupleStorageServiceABC\";\nimport { TupleOfflineStorageNameService } from \"./TupleOfflineStorageNameService\";\n\n@Injectable()\nexport class TupleOfflineStorageService {\n    private storage: TupleStorageServiceABC;\n\n    constructor(\n        @Inject(TupleStorageFactoryService) private storageFactory,\n        @Inject(TupleOfflineStorageNameService)\n        private tupleOfflineStorageServiceName\n    ) {\n        this.storage = storageFactory.create(tupleOfflineStorageServiceName);\n    }\n\n    async loadTuples(tupleSelector: TupleSelector): Promise<Tuple[]> {\n        return await this.storage.loadTuples(tupleSelector);\n    }\n\n    async loadTuplesEncoded(\n        tupleSelector: TupleSelector\n    ): Promise<string | null> {\n        return await this.storage.loadTuplesEncoded(tupleSelector);\n    }\n\n    async saveTuples(\n        tupleSelector: TupleSelector,\n        tuples: Tuple[]\n    ): Promise<void> {\n        await this.storage.saveTuples(tupleSelector, tuples);\n    }\n\n    async batchSaveTuplesEncoded(\n        data: TupleStorageBatchSaveArguments[]\n    ): Promise<void> {\n        await this.storage.batchSaveTuplesEncoded(data);\n    }\n\n    async saveTuplesEncoded(\n        tupleSelector: TupleSelector,\n        vortexMsg: string\n    ): Promise<void> {\n        await this.storage.saveTuplesEncoded(tupleSelector, vortexMsg);\n    }\n\n    async deleteTuples(tupleSelector: TupleSelector): Promise<void> {\n        await this.storage.deleteTuples(tupleSelector);\n    }\n\n    async deleteOldTuples(deleteDataBeforeDate: Date): Promise<void> {\n        await this.storage.deleteOldTuples(deleteDataBeforeDate);\n    }\n\n    async truncateStorage(): Promise<void> {\n        return await this.storage.truncateStorage();\n    }\n}\n","import { addTupleType, Tuple } from \"./exports\"\nimport  stringify from \"json-stable-stringify\"\n\n// export interface TupleSelectorJsonI {\n//     name: string;\n//     selector: { [name: string]: any };\n// }\n\n@addTupleType\nexport class TupleSelector extends Tuple {\n    constructor(\n        public name: string,\n        public selector: any\n    ) {\n        super(\"vortex.TupleSelector\")\n    }\n    \n    toOrderedJsonStr(): string {\n        const fieldJsonDict = this.toJsonField(this.selector)\n        return stringify({\n            \"name\": this.name,\n            \"selector\": fieldJsonDict\n        })\n    }\n    \n    static fromJsonStr(jsonStr: string): TupleSelector {\n        const data = JSON.parse(jsonStr)\n        const newTs = new TupleSelector(data.name, {})\n        newTs.selector = newTs.fromJsonField(data.selector)\n        return newTs\n    }\n}\n","import { Inject, Injectable } from \"@angular/core\";\nimport { BehaviorSubject, firstValueFrom, Observable, Subject } from \"rxjs\";\nimport { filter, takeUntil } from \"rxjs/operators\";\nimport { VortexService } from \"../VortexService\";\nimport { Tuple } from \"../exports\";\nimport { TupleSelector } from \"../TupleSelector\";\nimport { IPayloadFilt, Payload } from \"../Payload\";\nimport { PayloadEndpoint } from \"../PayloadEndpoint\";\nimport { NgLifeCycleEvents } from \"../../util/NgLifeCycleEvents\";\nimport { dateStr, dictKeysFromObject } from \"../UtilMisc\";\nimport { VortexStatusService } from \"../VortexStatusService\";\nimport { PayloadResponse } from \"../PayloadResponse\";\nimport { PayloadEnvelope } from \"../PayloadEnvelope\";\nimport { TupleOfflineStorageService } from \"../storage/TupleOfflineStorageService\";\n\nexport class TupleDataObservableNameService {\n    constructor(\n        public name: string,\n        public additionalFilt: any = {},\n    ) {}\n\n    equals(other: TupleDataObservableNameService): boolean {\n        if (other == null) return false;\n        if (this.name != other.name) return false;\n        return (\n            JSON.stringify(this.additionalFilt) ==\n            JSON.stringify(other.additionalFilt)\n        );\n    }\n\n    toString(): string {\n        return `${this.name}:${JSON.stringify(this.additionalFilt)}`;\n    }\n}\n\nexport class CachedSubscribedData {\n    subject$: BehaviorSubject<Tuple[]> = new BehaviorSubject<Tuple[] | null>(\n        null,\n    );\n\n    get observable(): Observable<Tuple[]> {\n        return this.subject$.pipe(filter((v) => v != null));\n    }\n\n    /** Last Server Payload Date\n     * If the server has responded with a payload, this is the date in the payload\n     * @type {Date | null}\n     */\n    lastServerPayloadDate: Date | null = null;\n    lastServerAskDate: Date | null = null;\n\n    cacheEnabled = true;\n    storageEnabled = true;\n    askServerEnabled = true;\n\n    constructor(public tupleSelector: TupleSelector) {\n        this.touch();\n    }\n\n    // The date the cache is scheduled to be torn down.\n    // This will be X time after we notice that it has no subscribers\n    private tearDownDate: number | null = null;\n    private TEARDOWN_WAIT = 30 * 1000; // 30 seconds, in milliseconds\n\n    markForTearDown(): void {\n        if (this.tearDownDate == null) this.tearDownDate = Date.now();\n    }\n\n    resetTearDown(): void {\n        this.tearDownDate = null;\n        this.touch();\n    }\n\n    isReadyForTearDown(): boolean {\n        return (\n            this.tearDownDate != null &&\n            this.tearDownDate + this.TEARDOWN_WAIT <= Date.now()\n        );\n    }\n\n    get tuples(): Tuple[] | null {\n        return this.subject$.getValue();\n    }\n\n    set tuples(tuples: Tuple[]) {\n        this.touch();\n        this.subject$.next(tuples);\n    }\n\n    /** Last Touched\n     *\n     * The last date that this cache was touched (subscribed or updated)\n     * @type {Date | null}\n     */\n    private FLUSH_WAIT = 120 * 1000; // 2 minutes, in milliseconds\n    private _lastTouched: number | null = null;\n\n    touch(): void {\n        this._lastTouched = Date.now();\n    }\n\n    isReadyForFlush(): boolean {\n        return (\n            this._lastTouched != null &&\n            this._lastTouched + this.FLUSH_WAIT <= Date.now()\n        );\n    }\n\n    flush(): void {\n        this.lastServerAskDate = null;\n        this.lastServerPayloadDate = null;\n        this.subject$.next(null);\n    }\n}\n\n@Injectable()\nexport class TupleDataOfflineObserverService extends NgLifeCycleEvents {\n    private endpoint: PayloadEndpoint;\n    private filt: IPayloadFilt;\n    private cacheByTupleSelector: {\n        [tupleSelector: string]: CachedSubscribedData;\n    } = {};\n\n    constructor(\n        @Inject(VortexService) private vortexService,\n        @Inject(VortexStatusService) private vortexStatusService,\n        @Inject(TupleDataObservableNameService) private tupleDataObservableName,\n        @Inject(TupleOfflineStorageService) private tupleOfflineStorageService,\n    ) {\n        super();\n\n        this.filt = Object.assign(\n            {\n                name: tupleDataObservableName.name,\n                key: \"tupleDataObservable\",\n            },\n            tupleDataObservableName.additionalFilt,\n        );\n\n        this.endpoint = new PayloadEndpoint(this, this.filt);\n        this.endpoint.observable.subscribe(\n            (payloadEnvelope: PayloadEnvelope) => {\n                payloadEnvelope\n                    .decodePayload()\n                    .then((payload: Payload) => {\n                        this.receivePayload(\n                            payloadEnvelope,\n                            payload,\n                            payloadEnvelope.encodedPayload,\n                        );\n                    })\n                    .catch((e) => {\n                        console.log(\n                            `${dateStr()} TupleDataOfflineObserverService:Error decoding payload ${e}`,\n                        );\n                    });\n            },\n        );\n\n        vortexStatusService.isOnline\n            .pipe(\n                takeUntil(this.onDestroyEvent),\n                filter((online) => online === true),\n            )\n            .subscribe((online) => this.vortexOnlineChanged());\n\n        // Cleanup dead subscribers every 30 seconds.\n        let cleanupTimer = setInterval(() => this.cleanupDeadCaches(), 2000);\n        this.onDestroyEvent.subscribe(() => clearInterval(cleanupTimer));\n    }\n\n    _nameService(): TupleDataObservableNameService {\n        return this.tupleDataObservableName;\n    }\n\n    pollForTuples(\n        tupleSelector: TupleSelector,\n        useCache: boolean = true,\n    ): Promise<Tuple[]> {\n        // --- If the data exists in the cache, then return it\n        let tsStr = tupleSelector.toOrderedJsonStr();\n\n        if (useCache && this.cacheByTupleSelector.hasOwnProperty(tsStr)) {\n            let cachedData = this.cacheByTupleSelector[tsStr];\n            cachedData.resetTearDown();\n\n            if (\n                cachedData.cacheEnabled &&\n                cachedData.lastServerPayloadDate != null\n            ) {\n                return Promise.resolve(cachedData.tuples);\n            }\n        }\n\n        // --- Else, we want the data from the server\n        // The PayloadEndpoint for this observable should also pickup and process\n        // the response. So that will take care of the cache update and notify of\n        // subscribers.\n\n        let startFilt = Object.assign(\n            { subscribe: false, useCache: useCache },\n            this.filt,\n            {\n                tupleSelector: tupleSelector,\n            },\n        );\n\n        // Optionally typed, No need to worry about the fact that we convert this\n        // and then TypeScript doesn't recognise that data type change\n        let promise: any = new Payload(startFilt).makePayloadEnvelope();\n\n        promise = promise.then((payloadEnvelope: PayloadEnvelope) => {\n            return new PayloadResponse(this.vortexService, payloadEnvelope);\n        });\n\n        promise = promise.then((payloadEnvelope: PayloadEnvelope) => {\n            return payloadEnvelope.decodePayload();\n        });\n\n        promise = promise.then((payload: Payload) => payload.tuples);\n\n        return promise;\n    }\n\n    /** Flush Cache\n     *\n     * The Data Offine Observer can be used to offline cache data by observing a large\n     * amounts of data, more data then the user would normally look at.\n     *\n     * If it's being used like this then the cache should be flushed during the process\n     * to ensure it's not all being kept in memory.\n     *\n     * @param {TupleSelector} tupleSelector The tuple selector to flush the cache for\n     */\n    flushCache(tupleSelector: TupleSelector): void {\n        let tsStr = tupleSelector.toOrderedJsonStr();\n        if (this.cacheByTupleSelector.hasOwnProperty(tsStr)) {\n            let cachedData = this.cacheByTupleSelector[tsStr];\n            cachedData.flush();\n        }\n        this.cleanupDeadCaches();\n    }\n\n    /** Promise from to Tuple Selector\n     *\n     * See the subscribeToTupleSelector method for more details.\n     * The promise will fire on the first emit of data.\n     *\n     * Do not use this when there will be no data present,\n     * or it may cause a memory leak.\n     *\n     * @param {TupleSelector} tupleSelector\n     * @param {boolean} disableCache\n     * @param {boolean} disableStorage\n     * @param {boolean} disableAskServer Use this to store and observe data completely\n     *      within the angular app.\n     * @returns {Subject<Tuple[]>}\n     */\n    promiseFromTupleSelector(\n        tupleSelector: TupleSelector,\n        disableCache: boolean = false,\n        disableStorage: boolean = false,\n        disableAskServer: boolean = false,\n    ): Promise<Tuple[]> {\n        return firstValueFrom(\n            this.subscribeToTupleSelector(\n                tupleSelector,\n                disableCache,\n                disableStorage,\n                disableAskServer,\n            ),\n        );\n    }\n\n    /** Subscribe to Tuple Selector\n     *\n     * Get an observable that will be fired when any new data updates are available\n     * Data is loaded from the local db cache, while it waits for the server to respond.\n     * * either from the server, or if they are locally updated with updateOfflineState()\n     *\n     * @param {TupleSelector} tupleSelector\n     * @param {boolean} disableCache\n     * @param {boolean} disableStorage\n     * @param {boolean} disableAskServer Use this to store and observe data completely\n     *      within the angular app.\n     * @returns {Subject<Tuple[]>}\n     */\n    subscribeToTupleSelector(\n        tupleSelector: TupleSelector,\n        disableCache: boolean = false,\n        disableStorage: boolean = false,\n        disableAskServer: boolean = false,\n    ): Observable<Tuple[]> {\n        let tsStr = tupleSelector.toOrderedJsonStr();\n        let cachedData: CachedSubscribedData | null = null;\n\n        // If the cache exists, use it\n        if (this.cacheByTupleSelector.hasOwnProperty(tsStr)) {\n            cachedData = this.cacheByTupleSelector[tsStr];\n            // Maybe disable cache\n            cachedData.cacheEnabled = cachedData.cacheEnabled && !disableCache;\n            // Maybe disable storage\n            cachedData.storageEnabled =\n                cachedData.storageEnabled && !disableStorage;\n            // Maybe disable ask server\n            cachedData.askServerEnabled =\n                cachedData.askServerEnabled && !disableAskServer;\n\n            // If the cache is enabled, and we have tuple data, then notify\n            if (cachedData.cacheEnabled && cachedData.tuples != null) {\n                return cachedData.observable;\n            }\n\n            // ELSE, Create the cache\n        } else {\n            cachedData = new CachedSubscribedData(tupleSelector);\n            cachedData.cacheEnabled = !disableCache;\n            cachedData.storageEnabled = !disableStorage;\n            cachedData.askServerEnabled = !disableAskServer;\n\n            this.cacheByTupleSelector[tsStr] = cachedData;\n        }\n\n        // If asking the server is enabled and we have not asked the server, then ask\n        if (\n            cachedData.askServerEnabled &&\n            cachedData.lastServerAskDate == null\n        ) {\n            this.tellServerWeWantData([tupleSelector], disableCache);\n        }\n\n        // If the tuples are null (because it's new or been flushed),\n        // Then ask the local DB again for it.\n        if (cachedData.storageEnabled && cachedData.tuples == null) {\n            this.tupleOfflineStorageService\n                .loadTuplesEncoded(tupleSelector)\n                .then((vortexMsgOrNull: string | null) => {\n                    // There is no data, return\n                    if (vortexMsgOrNull == null) {\n                        // Only return if we're expecting data from the server\n                        if (cachedData.askServerEnabled) {\n                            return;\n                        }\n                        // Otherwise return an empty array\n                        this.notifyObservers(cachedData, tupleSelector, []);\n                        return;\n                    }\n\n                    return Payload.fromEncodedPayload(vortexMsgOrNull).then(\n                        (payload: Payload) => {\n                            // If the server has responded before we loaded the data, then just\n                            // ignore the cached data.\n                            if (cachedData.lastServerPayloadDate != null)\n                                return;\n\n                            // Update the tuples, and notify if them\n                            cachedData.tuples = payload.tuples;\n                            this.notifyObservers(\n                                cachedData,\n                                tupleSelector,\n                                payload.tuples,\n                            );\n                        },\n                    );\n                })\n                .catch((err) => {\n                    this.vortexStatusService.logError(\n                        `loadTuples failed : ${err}`,\n                    );\n                    throw new Error(err);\n                });\n        }\n\n        cachedData.resetTearDown();\n        return cachedData.observable;\n    }\n\n    /** Update Offline State\n     *\n     * This method updates the offline stored data, which will be used until the next\n     * update from the server comes along.\n     * @param tupleSelector The tuple selector to update tuples for\n     * @param tuples The new data to store\n     */\n    async updateOfflineState(\n        tupleSelector: TupleSelector,\n        tuples: Tuple[],\n    ): Promise<void> {\n        let tsStr = tupleSelector.toOrderedJsonStr();\n\n        let cachedData: CachedSubscribedData | null = null;\n\n        // Make note of the last server update date\n        let lastServerDate: Date | null = null;\n\n        if (this.cacheByTupleSelector.hasOwnProperty(tsStr)) {\n            cachedData = this.cacheByTupleSelector[tsStr];\n            lastServerDate = cachedData.lastServerPayloadDate;\n        }\n\n        // AND store the data locally\n        await this.storeDataLocally(tupleSelector, tuples);\n        if (cachedData == null) {\n            return;\n        }\n        if (lastServerDate != cachedData.lastServerPayloadDate) return;\n        cachedData.tuples = tuples;\n        this.notifyObservers(cachedData, tupleSelector, tuples);\n    }\n\n    private cleanupDeadCaches(): void {\n        for (let key of dictKeysFromObject(this.cacheByTupleSelector)) {\n            let cachedData = this.cacheByTupleSelector[key];\n\n            // If no activity has occured on the cache, then flush it\n            if (cachedData.isReadyForFlush()) {\n                console.log(`${dateStr()} Flushing cache due to expiry ${key}`);\n                cachedData.flush();\n            }\n\n            // Tear down happens 30s after the last subscriber unsubscribes\n            // If there are subscribers, then reset the teardown clock\n            if (cachedData.subject$.observers.length !== 0) {\n                cachedData.resetTearDown();\n\n                // Tear down the cahce, including telling the server we're no longer\n                // observing the data\n            } else if (cachedData.isReadyForTearDown()) {\n                console.log(`${dateStr()} Tearing down cache ${key}`);\n                cachedData.flush();\n                delete this.cacheByTupleSelector[key];\n                this.tellServerWeWantData(\n                    [cachedData.tupleSelector],\n                    null,\n                    true,\n                );\n\n                // if there are no subscribers, then mark it for tear down (30s time)\n            } else {\n                cachedData.markForTearDown();\n            }\n        }\n    }\n\n    private vortexOnlineChanged(): void {\n        this.cleanupDeadCaches();\n        let tupleSelectors: TupleSelector[] = [];\n        for (let key of dictKeysFromObject(this.cacheByTupleSelector)) {\n            let cache = this.cacheByTupleSelector[key];\n            if (cache.askServerEnabled)\n                tupleSelectors.push(TupleSelector.fromJsonStr(key));\n        }\n        this.tellServerWeWantData(tupleSelectors);\n    }\n\n    private receivePayload(\n        payloadEnvelope: PayloadEnvelope,\n        payload: Payload,\n        encodedPayload: string,\n    ): void {\n        const tupleSelector = payloadEnvelope.filt[\"tupleSelector\"];\n        const tsStr = tupleSelector.toOrderedJsonStr();\n\n        if (!this.cacheByTupleSelector.hasOwnProperty(tsStr)) return;\n\n        const cachedData = this.cacheByTupleSelector[tsStr];\n\n        const lastDate = cachedData.lastServerPayloadDate;\n\n        if (payloadEnvelope.date == null) {\n            throw new Error(\"payload.date can not be null\");\n        }\n        const thisDate = new Date(payloadEnvelope.date);\n\n        // If the data is old, then disregard it.\n        if (\n            lastDate != null &&\n            // Newer dates have higher numbers\n            // If this date is less than the last date\n            thisDate.getTime() < lastDate.getTime()\n        ) {\n            return;\n        }\n\n        cachedData.lastServerPayloadDate = thisDate;\n        cachedData.tuples = payload.tuples;\n\n        this.notifyObserversAndStore(\n            cachedData,\n            tupleSelector,\n            payload.tuples,\n            encodedPayload,\n        );\n    }\n\n    private tellServerWeWantData(\n        tupleSelectors: TupleSelector[],\n        disableCache: boolean | null = false,\n        unsubscribe: boolean = false,\n    ): void {\n        if (!this.vortexStatusService.snapshot.isOnline) return;\n\n        let startFilt = Object.assign({ subscribe: true }, this.filt);\n\n        let payloads: Payload[] = [];\n        for (let tupleSelector of tupleSelectors) {\n            let tsStr = tupleSelector.toOrderedJsonStr();\n\n            if (this.cacheByTupleSelector.hasOwnProperty(tsStr))\n                this.cacheByTupleSelector[tsStr].lastServerAskDate = new Date();\n\n            let filt = Object.assign({}, startFilt, {\n                tupleSelector: tupleSelector,\n                unsubscribe: unsubscribe,\n            });\n\n            if (disableCache != null) filt[\"disableCache\"] = disableCache;\n\n            payloads.push(new Payload(filt));\n        }\n        this.vortexService.sendPayload(payloads);\n    }\n\n    private notifyObservers(\n        cachedData: CachedSubscribedData,\n        tupleSelector: TupleSelector,\n        tuples: Tuple[],\n    ): void {\n        // Notify Observers\n        try {\n            cachedData.tuples = tuples;\n        } catch (e) {\n            // NOTE: Observables automatically remove observers when the raise exceptions.\n            console.log(`${dateStr()} ERROR: TupleDataObserverService.notifyObservers, observable has been removed\n            ${e.toString()}\n            ${tupleSelector.toOrderedJsonStr()}`);\n        }\n    }\n\n    private notifyObserversAndStore(\n        cachedData: CachedSubscribedData,\n        tupleSelector: TupleSelector,\n        tuples: Tuple[],\n        encodedPayload: string | null = null,\n    ): void {\n        this.notifyObservers(cachedData, tupleSelector, tuples);\n\n        // AND store the data locally\n        if (cachedData.storageEnabled)\n            this.storeDataLocally(tupleSelector, tuples, encodedPayload);\n    }\n\n    private storeDataLocally(\n        tupleSelector: TupleSelector,\n        tuples: Tuple[],\n        encodedPayload: string | null = null,\n    ): Promise<void> {\n        let errFunc = (err: string) => {\n            this.vortexStatusService.logError(`saveTuples failed : ${err}`);\n            throw new Error(err);\n        };\n\n        if (encodedPayload == null) {\n            return this.tupleOfflineStorageService\n                .saveTuples(tupleSelector, tuples)\n                .catch(errFunc);\n        }\n\n        return this.tupleOfflineStorageService\n            .saveTuplesEncoded(tupleSelector, encodedPayload)\n            .catch(errFunc);\n    }\n}\n","import { Inject, Injectable } from \"@angular/core\"\nimport { Observable, Subject } from \"rxjs\"\nimport { Tuple } from \"../exports\"\nimport { TupleSelector } from \"../TupleSelector\"\nimport { TupleDataObservableNameService, TupleDataOfflineObserverService } from \"./TupleDataOfflineObserverService\"\n\nexport { TupleDataObservableNameService } from \"./TupleDataOfflineObserverService\"\n\n@Injectable()\nexport class TupleDataObserverService {\n    constructor(\n        @Inject(TupleDataOfflineObserverService) private delegate,\n        @Inject(TupleDataObservableNameService) private tupleDataObservableName,\n    ) {\n        let delegateName = delegate._nameService()\n        if (!this.tupleDataObservableName.equals(delegateName)) {\n            throw new Error(\"ERROR: The TupleDataObserverService was injected\"\n                + \" with the wrong TupleDataOfflineObserverService name service\"\n                + ` ${delegateName} VS ${this.tupleDataObservableName}`\n                + \" ensure TupleDataOfflineObserverService is provided first.\"\n            )\n        }\n    }\n    \n    pollForTuples(\n        tupleSelector: TupleSelector,\n        useCache: boolean = true\n    ): Promise<Tuple[]> {\n        return this.delegate.pollForTuples(tupleSelector, useCache)\n    }\n    \n    /** Subscribe to Tuple Selector\n     *\n     * Get an observable that will be fired when any new data updates are available\n     * * either from the server, or if they are locally updated with updateOfflineState()\n     *\n     * @param {TupleSelector} tupleSelector\n     * @param {boolean} disableCache\n     * @param {boolean} disableAskServer, Use this to store and observe data completely\n     *      within the angular app.\n     * @returns {Subject<Tuple[]>}\n     */\n    subscribeToTupleSelector(\n        tupleSelector: TupleSelector,\n        disableCache: boolean = false,\n        disableAskServer: boolean = false\n    ): Observable<Tuple[]> {\n        return this.delegate.subscribeToTupleSelector(\n            tupleSelector, disableCache, true, disableAskServer)\n    }\n}\n\n","import { addTupleType, Tuple, TupleChangeI } from \"./exports\"\nimport { TupleSelector } from \"./TupleSelector\"\n\n/** Tuple Action Base Class\n *\n *  A tuple action, represents an action the user or software wishes to perform.\n *  Actions have a specific destination they must reach. (as apposed to Observers)\n *\n *  @property key An optional key for this action\n *  @property data Some optional data for this action\n *\n * */\nexport class TupleActionABC extends Tuple {\n    uuid: string = (Date.now() + Math.random()).toString()\n    dateTime = new Date()\n    \n    constructor(tupleName: string) {\n        super(tupleName)\n        \n    }\n    \n}\n\n/** Tuple Generic Action\n *\n *  This is a generic action, to be used when the implementor doesn't want to implement\n *  concrete classes for each action type.\n *\n *  @property key An optional key for this action\n *  @property data Some optional data for this action\n *\n * */\n@addTupleType\nexport class TupleGenericAction extends TupleActionABC {\n    key: string | null = null\n    data: any = null\n    \n    constructor() {\n        super(\"vortex.TupleGenericAction\")\n        \n    }\n    \n}\n\n/** Tuple Update Action\n *\n *  This is an action representing an update to a Tuple.\n *  It's original intention is to be used to store offline updates, which can then be\n *  later applied when it's online.\n *\n *  @property key An optional key for this action\n *  @property data Some optional data for this action\n *\n * */\n@addTupleType\nexport class TupleUpdateAction extends TupleActionABC {\n    tupleSelector: TupleSelector = new TupleSelector(null, {})\n    tupleChanges: TupleChangeI[] = []\n    data: any = null\n    \n    constructor() {\n        super(\"vortex.TupleUpdateAction\")\n        \n    }\n    \n}\n","import { forwardRef, Inject, Injectable } from \"@angular/core\"\nimport { VortexStatusService } from \"../VortexStatusService\"\nimport { TupleActionABC } from \"../TupleAction\"\nimport { Tuple } from \"../exports\"\nimport { VortexService } from \"../VortexService\"\nimport { PayloadResponse } from \"../PayloadResponse\"\nimport { Payload } from \"../Payload\"\nimport { PayloadEnvelope } from \"../PayloadEnvelope\"\n\nexport class TupleActionPushNameService {\n    constructor(\n        public name: string,\n        public additionalFilt: any = {}\n    ) {\n    }\n}\n\n@Injectable()\nexport class TupleActionPushService {\n    constructor(\n        @Inject(forwardRef(() => TupleActionPushNameService)) public tupleActionProcessorName,\n        @Inject(forwardRef(() => VortexService)) public vortexService,\n        @Inject(forwardRef(() => VortexStatusService)) public vortexStatus,\n    ) {\n    }\n    \n    /** Push Action\n     *\n     * This pushes the action, either locally or to the server, depending on the\n     * implementation.\n     *\n     * If pushed locally, the promise will resolve when the action has been saved.\n     * If pushed directly to the server, the promise will resolve when the server has\n     * responded.\n     */\n    pushAction(tupleAction: TupleActionABC): Promise<Tuple[]> {\n        if (!this.vortexStatus.snapshot.isOnline)\n            return Promise.reject(\"Vortex is offline\")\n        \n        let promise: any = this.makePayload(tupleAction)\n            .makePayloadEnvelope()\n        \n        promise = promise.then((payloadEnvelope: PayloadEnvelope) => {\n            return new PayloadResponse(this.vortexService, payloadEnvelope)\n        })\n        \n        promise = promise.then((payloadEnvelope: PayloadEnvelope) => {\n            return payloadEnvelope.decodePayload()\n        })\n        \n        promise = promise.then((payload: Payload) => payload.tuples)\n        \n        return promise\n    }\n    \n    /** Make Payload\n     *\n     * This make the payload that we send to the server.\n     *\n     */\n    protected makePayload(tupleAction: TupleActionABC): Payload {\n        if (tupleAction == null) {\n            throw new Error(\"pushAction: tupleAction is null\")\n        }\n        \n        let payload = new Payload()\n        \n        payload.filt = Object.assign({\n            key: \"tupleActionProcessorName\",\n            name: this.tupleActionProcessorName.name\n        }, this.tupleActionProcessorName.additionalFilt)\n        \n        payload.tuples = [tupleAction]\n        \n        return payload\n    }\n}\n","import { Inject, Injectable } from \"@angular/core\"\nimport { VortexStatusService } from \"../VortexStatusService\"\nimport { TupleActionABC } from \"../TupleAction\"\nimport { Payload } from \"../Payload\"\nimport { VortexService } from \"../VortexService\"\nimport { errToStr } from \"../UtilMisc\"\nimport { PayloadResponse } from \"../PayloadResponse\"\nimport { TupleStorageFactoryService } from \"../storage-factory/TupleStorageFactoryService\"\nimport { TupleActionStorageServiceABC } from \"../action-storage/TupleActionStorageServiceABC\"\nimport { PayloadEnvelope } from \"../PayloadEnvelope\"\nimport { filter } from \"rxjs/operators\"\n\n@Injectable()\nexport class TupleActionPushOfflineSingletonService {\n    private storage: TupleActionStorageServiceABC\n    private sendingTuple = false\n    private lastSendFailTime: null | number = null\n    \n    private SEND_FAIL_RETRY_TIMEOUT = 5000// milliseconds\n    private SERVER_PROCESSING_TIMEOUT = 5000// milliseconds\n    private SEND_FAIL_RETRY_BACKOFF = 5000 // milliseconds\n    \n    constructor(\n        @Inject(VortexService) private vortexService,\n        @Inject(VortexStatusService) private vortexStatus,\n        @Inject(TupleStorageFactoryService) private factoryService,\n    ) {\n        this.storage = factoryService.createActionStorage()\n        \n        // This is a global service, there is no point unsubscribing it\n        this.vortexStatus.isOnline\n            .pipe(filter(online => online === true))\n            .subscribe(online => this.sendNextAction())\n        \n        this.storage.countActions()\n            .then(count => {\n                this.vortexStatus.setQueuedActionCount(count)\n            })\n            .catch(err => {\n                let errStr = errToStr(err)\n                let msg = `Failed to count actions : ${errStr}`\n                this.vortexStatus.logError(msg)\n            })\n            .then(() => this.sendNextAction())\n    }\n    \n    queueAction(\n        scope: string,\n        tupleAction: TupleActionABC,\n        payload: Payload\n    ): Promise<void> {\n        return this.storage\n            .storeAction(scope, tupleAction, payload)\n            .then(() => {\n                this.vortexStatus.incrementQueuedActionCount()\n                this.sendNextAction()\n            })\n            .catch((err) => {\n                let errStr = errToStr(err)\n                let msg = `Failed to store action : ${errStr}`\n                console.log(msg)\n                throw new Error(msg)\n            })\n    }\n    \n    private sendNextAction() {\n        if (this.sendingTuple)\n            return\n        \n        if (!this.vortexStatus.snapshot.isOnline)\n            return\n        \n        // Don't continually retry, if we have a last send fail, ensure we wait\n        // {SEND_FAIL_RETRY_BACKOFF} before sending again.\n        if (this.lastSendFailTime != null) {\n            let reconnectDiffMs = Date.now() - this.lastSendFailTime\n            \n            if (reconnectDiffMs < this.SEND_FAIL_RETRY_BACKOFF) {\n                // +10ms to ensure we're just out of the backoff time.\n                setTimeout(() => this.sendNextAction(),\n                    this.SEND_FAIL_RETRY_BACKOFF - reconnectDiffMs + 10)\n                return\n                \n            }\n            else {\n                this.lastSendFailTime = null\n                \n            }\n        }\n        \n        this.sendingTuple = true\n        \n        // Get the next tuple from the persistent queue\n        this.storage.loadNextAction()\n            \n            // If this was successful?\n            .then((sendPayload: Payload) => {\n                // Is the end the end of the queue?\n                if (sendPayload == null) {\n                    this.sendingTuple = false\n                    return\n                }\n                return sendPayload.makePayloadEnvelope()\n                    .then((sendPayloadEnvelope: PayloadEnvelope) => {\n                        \n                        let uuid = (<TupleActionABC>sendPayload.tuples[0]).uuid\n                        let scope = sendPayload.filt[\"name\"]\n                        \n                        return new PayloadResponse(this.vortexService,\n                            sendPayloadEnvelope,\n                            PayloadResponse.RESPONSE_TIMEOUT_SECONDS, // Timeout\n                            false // don't check result, only reject if it times out\n                        ).then(responsePayload => {\n                            // If we received a payload, but it has an error message\n                            // Log an error, it's out of our hands, move on.\n                            let r = responsePayload.result // success is null or true\n                            if (!(r == null || r === true)) {\n                                this.vortexStatus.logError(\n                                    \"Server failed to process Action: \" + responsePayload.result.toString())\n                            }\n                            \n                            this.storage.deleteAction(scope, uuid)\n                                .then(() => {\n                                    this.vortexStatus.decrementQueuedActionCount()\n                                })\n                            this.sendingTuple = false\n                            this.sendNextAction()\n                        })\n                    })\n                \n            })\n            \n            // Or catch and handle any of the errors from either loading or sending\n            .catch(err => {\n                this.lastSendFailTime = Date.now()\n                \n                let errStr = errToStr(err)\n                console.error(\n                    `Failed to send TupleAction : ${errStr}\\nRetrying in ${this.SEND_FAIL_RETRY_TIMEOUT/1000} seconds`\n                )\n                this.sendingTuple = false\n                setTimeout(() => this.sendNextAction(), this.SEND_FAIL_RETRY_TIMEOUT)\n                return null // Handle the error\n            })\n    }\n}\n\n","import { Inject, Injectable } from \"@angular/core\"\nimport { VortexStatusService } from \"../VortexStatusService\"\nimport { TupleActionABC } from \"../TupleAction\"\nimport { Tuple } from \"../exports\"\nimport { TupleActionPushNameService, TupleActionPushService } from \"./TupleActionPushService\"\nimport { VortexService } from \"../VortexService\"\nimport { TupleActionPushOfflineSingletonService } from \"./TupleActionPushOfflineSingletonService\"\n\n@Injectable()\nexport class TupleActionPushOfflineService extends TupleActionPushService {\n    constructor(\n        @Inject(TupleActionPushNameService) public tupleActionName,\n        @Inject(VortexService) public vortexService,\n        @Inject(VortexStatusService) public vortexStatus,\n        @Inject(TupleActionPushOfflineSingletonService) public singleton,\n    ) {\n        super(tupleActionName, vortexService, vortexStatus)\n    }\n    \n    pushAction(tupleAction: TupleActionABC): Promise<Tuple[]> {\n        let payload = this.makePayload(tupleAction)\n        return this.singleton\n            .queueAction(this.tupleActionProcessorName.name, tupleAction, payload)\n            .then(() => [])\n    }\n}\n\n","import { Payload } from \"../Payload\";\nimport { TupleActionProcessorDelegateABC } from \"./TupleActionProcessorDelegate\";\nimport { assert, dateStr } from \"../UtilMisc\";\nimport { VortexService } from \"../VortexService\";\nimport { NgLifeCycleEvents } from \"../../util/NgLifeCycleEvents\";\nimport { VortexStatusService } from \"../VortexStatusService\";\nimport { Inject, Injectable } from \"@angular/core\";\nimport { PayloadEnvelope } from \"../PayloadEnvelope\";\n\nexport class TupleActionProcessorNameService {\n    constructor(public name: string, public additionalFilt: any = {}) {}\n}\n\n@Injectable()\nexport class TupleActionProcessorService extends NgLifeCycleEvents {\n    private _tupleProcessorsByTupleName = {};\n    private defaultDelegate: null | TupleActionProcessorDelegateABC = null;\n\n    constructor(\n        @Inject(TupleActionProcessorNameService)\n        private tupleActionProcessorName,\n        @Inject(VortexService) private vortexService,\n        @Inject(VortexStatusService) private vortexStatusService\n    ) {\n        super();\n\n        let filt = Object.assign(\n            {\n                name: tupleActionProcessorName.name,\n                key: \"tupleActionProcessorName\",\n            },\n            tupleActionProcessorName.additionalFilt\n        );\n\n        vortexService\n            .createEndpointObservable(this, filt)\n            .subscribe((payloadEnvelope: PayloadEnvelope) => {\n                payloadEnvelope\n                    .decodePayload()\n                    .then((payload: Payload) => this._process(payload))\n                    .catch((e) =>\n                        console.log(\n                            `${dateStr()} TupleActionProcessorService:Error decoding payload ${e}`\n                        )\n                    );\n            });\n    }\n\n    /** Add Tuple Action Processor Delegate\n     *\n     *@param tupleName: The tuple name to process actions for.\n     *@param delegate: The processor to use for processing this tuple name.\n     *\n     */\n    setDelegate(tupleName: string, delegate: TupleActionProcessorDelegateABC) {\n        assert(\n            tupleName in this._tupleProcessorsByTupleName,\n            `TupleActionProcessor:${this.tupleActionProcessorName.name}, ` +\n                `Tuple name ${tupleName} is already registered`\n        );\n\n        this._tupleProcessorsByTupleName[tupleName] = delegate;\n    }\n\n    /** Set Default Tuple Action Processor Delegate\n     *\n     *@param delegate: The processor to use for processing unhandled TupleActions.\n     *\n     */\n    setDefaultDelegate(delegate: TupleActionProcessorDelegateABC) {\n        this.defaultDelegate = delegate;\n    }\n\n    /** Process the Payload / Tuple Action\n     *\n     */\n    private _process(payload: Payload) {\n        assert(\n            payload.tuples.length === 1,\n            `TupleActionProcessor:${this.tupleActionProcessorName.name}` +\n                `Expected 1 tuples, received ${payload.tuples.length}`\n        );\n\n        let tupleAction = payload.tuples[0];\n\n        let tupleName = tupleAction._tupleName();\n\n        let delegate = null;\n        let processor = this._tupleProcessorsByTupleName[tupleName];\n        if (processor != null) {\n            delegate = processor;\n        } else if (this.defaultDelegate != null) {\n            delegate = this.defaultDelegate;\n        } else {\n            console.log(`${dateStr()} ERROR No delegate registered for ${tupleName}`);\n            return;\n            // throw new Error(`No delegate registered for ${tupleName}`);\n        }\n\n        let promise = delegate.processTupleAction(tupleAction);\n        promise.then((tuples) =>\n            this.callback(tuples, payload.filt, tupleName)\n        );\n        promise.catch((err) => this.errback(err, payload.filt, tupleName));\n    }\n\n    private callback(tuples, replyFilt: {}, tupleName: string) {\n        let payload = new Payload(replyFilt, tuples);\n\n        this.vortexService.sendPayload(payload);\n    }\n\n    private errback(err: string, replyFilt: {}, tupleName: string) {\n        this.vortexStatusService.logError(\n            `TupleActionProcessor:${this.tupleActionProcessorName.name}` +\n                ` Failed to process TupleActon, ${err}`\n        );\n\n        let payloadEnvelope = new PayloadEnvelope(replyFilt);\n        payloadEnvelope.result = err;\n\n        this.vortexService.sendPayloadEnvelope(payloadEnvelope);\n    }\n}\n","import { TupleActionABC } from \"../TupleAction\"\nimport { Tuple } from \"../exports\"\n\nexport abstract class TupleActionProcessorDelegateABC {\n    \n    abstract processTupleAction(tupleAction: TupleActionABC): Promise<Tuple[]> ;\n}\n\n","function parseCurrency(value) {\n    return Number(value.replace(/[^0-9\\.\\-]+/g, \"\"))\n}\n\nfunction parseDate(date) {\n    if (date.toString()\n        .match(/^\\d{4}-\\d{2}-\\d{2}$/g)) {\n        date += \" 00:00:00\"\n    }\n    \n    return Date.parse(date)\n}\n\nfunction compareText(\n    a,\n    b\n) {\n    const x = a.toLowerCase()\n    const y = b.toLowerCase()\n    \n    return x > y ? 1 : x < y ? -1 : 0\n}\n\nfunction compareNumeric(\n    a,\n    b\n) {\n    return a - b\n}\n\nfunction compareCurrency(\n    a,\n    b\n) {\n    return parseCurrency(a) - parseCurrency(b)\n}\n\nfunction compareDate(\n    a,\n    b\n) {\n    return parseDate(a) - parseDate(b)\n}\n\nfunction getKey(\n    object: any,\n    key\n): any {\n    if (key == null)\n        return key\n    \n    if (typeof key === \"function\")\n        return key(object)\n    \n    return object[key]\n}\n\nexport interface SortKeyCallableI {\n    (object: any): any;\n}\n\nexport function sortText(\n    collection: any[],\n    key: SortKeyCallableI | string | null = null\n): any[] {\n    return collection.sort((\n        a,\n        b\n    ) => compareText(getKey(a, key), getKey(b, key)))\n}\n\nexport function sortNumeric(\n    collection: any[],\n    key: SortKeyCallableI | string | null = null\n): any[] {\n    return collection.sort((\n        a,\n        b\n    ) => compareNumeric(getKey(a, key), getKey(b, key)))\n}\n\nexport function sortCurrency(\n    collection: any[],\n    key: SortKeyCallableI | string | null = null\n): any[] {\n    return collection.sort((\n        a,\n        b\n    ) => compareCurrency(getKey(a, key), getKey(b, key)))\n}\n\nexport function sortDate(\n    collection: any[],\n    key: SortKeyCallableI | string | null = null\n): any[] {\n    return collection.sort((\n        a,\n        b\n    ) => compareDate(getKey(a, key), getKey(b, key)))\n}\n","import {PayloadDelegateABC} from \"./PayloadDelegateABC\";\nimport {PayloadDelegateInMainWeb} from \"./PayloadDelegateInMainWeb\";\n\nimport PromiseWorker from \"webworker-promise\";\n\nclass WorkerRotator {\n    private nextIndex = 0;\n    private workers: PromiseWorker[] = [];\n\n    constructor(createWorker, private readonly count: number) {\n        while (this.workers.length < count) {\n            this.workers.push(new PromiseWorker(createWorker()));\n        }\n    }\n\n    get nextWorker(): PromiseWorker {\n        // Rotate to next worker\n        this.nextIndex += 1;\n        if (this.nextIndex === this.count) {\n            this.nextIndex = 0;\n        }\n\n        return this.workers[this.nextIndex];\n    }\n}\n\nexport class PayloadDelegateWeb extends PayloadDelegateABC {\n    // Payload\n    private encodePayloadWorker: WorkerRotator;\n    private decodePayloadWorker: WorkerRotator;\n\n    // PayloadEnvelope\n    private encodePayloadEnvelopeWorker: WorkerRotator;\n    private decodePayloadEnvelopeWorker: WorkerRotator;\n\n    readonly ENCODE_WORKER_COUNT = 1;\n    readonly DECODE_WORKER_COUNT = 3;\n\n    private inMainDelegate = new PayloadDelegateInMainWeb();\n\n    constructor(encodePayloadWorkerCreator: Function, decodePayloadWorkerCreator: Function, encodePayloadEnvelopeWorkerCreator: Function, decodePayloadEnvelopeWorkerCreator: Function) {\n        super();\n        // ---------------∂\n        // Payload\n        this.encodePayloadWorker = new WorkerRotator(\n            encodePayloadWorkerCreator,\n            this.ENCODE_WORKER_COUNT\n        );\n\n        this.decodePayloadWorker = new WorkerRotator(\n            decodePayloadWorkerCreator,\n            this.DECODE_WORKER_COUNT\n        );\n\n        // ---------------\n        // PayloadEnvelope Envelope\n        this.encodePayloadEnvelopeWorker = new WorkerRotator(\n            () =>\n                encodePayloadEnvelopeWorkerCreator,\n            this.ENCODE_WORKER_COUNT\n        );\n\n        this.decodePayloadEnvelopeWorker = new WorkerRotator(\n            () =>\n                decodePayloadEnvelopeWorkerCreator,\n            this.DECODE_WORKER_COUNT\n        );\n    }\n\n    deflateAndEncode(payloadJson: string): Promise<string> {\n        // Don't send small messages to the worker\n        if (payloadJson.length < 10 * 1024)\n            return this.inMainDelegate.deflateAndEncode(payloadJson);\n\n        return this.encodePayloadWorker.nextWorker.postMessage(payloadJson);\n    }\n\n    encodeEnvelope(payloadJson: string): Promise<string> {\n        // Don't send small messages to the worker\n        if (payloadJson.length < 5 * 1024)\n            return this.inMainDelegate.encodeEnvelope(payloadJson);\n\n        return this.encodePayloadEnvelopeWorker.nextWorker.postMessage(\n            payloadJson\n        );\n    }\n\n    decodeAndInflate(encodedPayload: string): Promise<string> {\n        // Don't send small messages to the worker\n        if (encodedPayload.length < 5 * 1024)\n            return this.inMainDelegate.decodeAndInflate(encodedPayload);\n\n        return this.decodePayloadWorker.nextWorker.postMessage(encodedPayload);\n    }\n\n    decodeEnvelope(vortexStr: string): Promise<string> {\n        // Don't send small messages to the worker\n        if (vortexStr.length < 5 * 1024)\n            return this.inMainDelegate.decodeEnvelope(vortexStr);\n\n        return this.decodePayloadEnvelopeWorker.nextWorker.postMessage(\n            vortexStr\n        );\n    }\n}\n","import { dateStr } from \"../UtilMisc\"\n\n// ----------------------------------------------------------------------------\n\ndeclare let window: any\n\nexport let indexedDB: any = window.indexedDB || window.mozIndexedDB\n    || window.webkitIndexedDB || window.msIndexedDB\n\nexport let IDBTransaction: any = window.IDBTransaction\n    || window.webkitIDBTransaction || window.msIDBTransaction\n\nexport let IDBKeyRange: any = window.IDBKeyRange\n    || window.webkitIDBKeyRange || window.msIDBKeyRange\n\nexport function supportsIndexedDb(): boolean {\n    return !!indexedDB\n}\n\n// ----------------------------------------------------------------------------\n\nexport class IDBException {\n    constructor(public message: string) {\n    }\n    \n    toString() {\n        return \"IndexedDB : IDBException: \" + this.message\n    }\n}\n\nexport function addIndexedDbHandlers(\n    request,\n    stacktraceFunctor\n) {\n    request.onerror = (request) => {\n        console.log(dateStr() + \"IndexedDB : ERROR \" + request.target.error)\n        this.balloonMsg.showError(\"IndexedDB : ERROR \" + request.target.error)\n        stacktraceFunctor()\n    }\n    \n    request.onabort = (request) => {\n        console.log(dateStr() + \"IndexedDB : ABORT \" + request.target.error)\n        this.balloonMsg.showError(\"IndexedDB : ABORT \" + request.target.error)\n        stacktraceFunctor()\n    }\n    \n    request.onblock = (request) => {\n        console.log(dateStr() + \"IndexedDB : BLOCKED \" + request.target.error)\n        this.balloonMsg.showError(\"IndexedDB : BLOCKED \" + request.target.error)\n        stacktraceFunctor()\n    }\n    \n}\n","import { Inject, Injectable } from \"@angular/core\";\nimport { dateStr } from \"../UtilMisc\";\nimport {\n    TupleStorageBatchSaveArguments,\n    TupleStorageServiceABC,\n} from \"./TupleStorageServiceABC\";\nimport { TupleOfflineStorageNameService } from \"./TupleOfflineStorageNameService\";\nimport { TupleSelector } from \"../TupleSelector\";\nimport {\n    addIndexedDbHandlers,\n    IDBException,\n    indexedDB,\n} from \"../storage-api/indexeddb-api\";\n\n// ----------------------------------------------------------------------------\n\nconst noSpaceMsgs = [\n    \"there was not enough remaining storage space\",\n    \"QuotaExceededError\",\n];\nconst noSpaceRetryMs = 5 * 1000;\n\nconst indexDbNotOpenMsg = \"IndexedDB peek_plugin_diagram_grids is not open\";\n\nfunction now(): any {\n    return new Date();\n}\n\nconst TUPLE_STORE = \"tuples\";\n\ninterface DataStructI {\n    tupleSelector: string;\n    dateTime: Date;\n    payload: string;\n}\n\n/** Tuple Storage IndexedDB\n *\n * This class handles storing and retrieving tuples to/from indexed db.\n *\n */\n@Injectable()\nexport class TupleStorageIndexedDbService extends TupleStorageServiceABC {\n    db: any;\n    private openInProgressPromise: Promise<void> | null = null;\n\n    constructor(@Inject(TupleOfflineStorageNameService) public name) {\n        super(name);\n    }\n\n    // ----------------------------------------------------------------------------\n    // Open the indexed db database\n    open(): Promise<void> {\n        if (this.openInProgressPromise != null)\n            return this.openInProgressPromise;\n\n        this.openInProgressPromise = new Promise<void>((resolve, reject) => {\n            // DISP Store\n\n            let request = indexedDB.open(this.dbName, 1);\n            addIndexedDbHandlers(request, () => {\n                let msg =\n                    `${dateStr()} IndexedDB : \"${this.dbName}\" ` +\n                    `Failed to open IndexedDB database`;\n                this.openInProgressPromise = null;\n                reject(msg);\n                throw new IDBException(msg);\n            });\n\n            request.onsuccess = (event) => {\n                console.log(\n                    `${dateStr()} IndexedDB : \"${\n                        this.dbName\n                    }\" Success opening DB`\n                );\n                if (this.db == null) {\n                    this.db = event.target.result;\n                    this.openInProgressPromise = null;\n                    resolve();\n                }\n            };\n\n            request.onupgradeneeded = (event) => {\n                console.log(\n                    `${dateStr()} IndexedDB : \"${this.dbName}\" Upgrading`\n                );\n                let db = event.target.result;\n\n                // SCHEMA for database points\n                // Schema Version 1\n                db.createObjectStore(TUPLE_STORE, { keyPath: \"tupleSelector\" });\n\n                console.log(\n                    `${dateStr()} IndexedDB : \"${this.dbName}\" Upgrade Success`\n                );\n            };\n        });\n        return this.openInProgressPromise;\n    }\n\n    // ----------------------------------------------------------------------------\n    // Check if the DB is open\n    async isOpen(): Promise<boolean> {\n        return this.db != null;\n    }\n\n    async close(): Promise<void> {\n        if (!(await this.isOpen())) {\n            throw new Error(`IndexedDB \"${this.dbName}\" is not open`);\n        }\n        this.db.close();\n        this.db = null;\n    }\n\n    async truncateStorage(): Promise<void> {\n        if (!(await this.isOpen())) await this.open();\n        let startTime = now();\n\n        await new Promise<void>((resolve, reject) => {\n            let response = indexedDB.deleteDatabase(this.dbName);\n\n            addIndexedDbHandlers(response, () => {\n                reject(\n                    `${dateStr()} IndexedDB: truncateStorage \"truncateStorage\" error`\n                );\n                throw new IDBException(\"deleteDatabase error\");\n            });\n\n            response.oncomplete = () => {\n                let timeTaken = now() - startTime;\n                console.log(\n                    `${dateStr()} IndexedDB: truncateStorage` +\n                        ` took ${timeTaken}ms (in thread)`\n                );\n                resolve();\n            };\n        });\n    }\n\n    private objectStoreTx(forWrite: boolean) {\n        // Get the Read Only case out the way, it's easy\n        const mode = forWrite ? \"readwrite\" : \"readonly\";\n        const tx = this.db.transaction(TUPLE_STORE, mode);\n        return tx.objectStore(TUPLE_STORE);\n    }\n\n    // ----------------------------------------------------------------------------\n    // Load the display items from the cache\n\n    // ----------------------------------------------------------------------------\n    // Load the display items from the cache\n    async loadTuplesEncoded(\n        tupleSelector: TupleSelector\n    ): Promise<string | null> {\n        if (!(await this.isOpen())) await this.open();\n        let startTime: any = now();\n\n        return await new Promise<string | null>((resolve, reject) => {\n            const request = this.objectStoreTx(false) //\n                .get(tupleSelector.toOrderedJsonStr());\n\n            addIndexedDbHandlers(request, () => {\n                let msg = `${dateStr()} IndexedDB: Index open cursor`;\n                reject(msg);\n                throw new IDBException(msg);\n            });\n\n            request.onsuccess = () => {\n                let timeTaken = now() - startTime;\n                console.log(\n                    `${dateStr()} IndexedDB: loadTuples took ${timeTaken}ms (in thread)`\n                );\n\n                // Called for each matching record\n                let data: DataStructI | null = request.result;\n                if (data == null) {\n                    resolve(null);\n                    return;\n                }\n\n                resolve(data.payload);\n            };\n        });\n    }\n\n    async batchSaveTuplesEncoded(\n        data: TupleStorageBatchSaveArguments[]\n    ): Promise<void> {\n        if (!(await this.isOpen())) await this.open();\n        // The payload is a convenient way to serialise and compress the data\n\n        const items: DataStructI[] = [];\n        const nowDate = new Date();\n\n        for (const data_ of data) {\n            {\n                items.push({\n                    tupleSelector: data_.tupleSelector.toOrderedJsonStr(),\n                    dateTime: nowDate,\n                    payload: data_.vortexMsg,\n                });\n            }\n        }\n\n        const startTime = now();\n\n        while (true) {\n            try {\n                // Run the inserts\n                const store = this.objectStoreTx(true);\n                const promises = [];\n\n                for (const item of items) {\n                    promises.push(\n                        new Promise<void>((res2, rej2) => {\n                            const response = store.put(item);\n\n                            addIndexedDbHandlers(response, () => {\n                                rej2(\n                                    `${dateStr()} IndexedDB: saveTuplesEncoded \"put\" error`\n                                );\n                                throw new IDBException(\"Put error\");\n                            });\n\n                            response.onsuccess = () => {\n                                const timeTaken = now() - startTime;\n                                console.log(\n                                    `${dateStr()} IndexedDB: saveTuplesEncoded` +\n                                        ` took ${timeTaken}ms (in thread)` +\n                                        ` Inserted/updated ${item.payload?.length} of encoding`\n                                );\n                                res2();\n                            };\n                        })\n                    );\n                }\n\n                await Promise.all(promises);\n                return;\n            } catch (e) {\n                if (this.isNoSpaceMessage(e)) {\n                    console.log(\n                        `${dateStr()} IndexedDB: ${this.name.name}` +\n                            \" saveTuplesEncoded\" +\n                            \" Waiting for space quote extension\"\n                    );\n                    await new Promise<void>((r) =>\n                        setTimeout(() => r(), noSpaceRetryMs)\n                    );\n                    continue;\n                }\n                throw new Error(e);\n            }\n        }\n    }\n\n    // ----------------------------------------------------------------------------\n    // Add disply items to the cache\n\n    async saveTuplesEncoded(\n        tupleSelector: TupleSelector,\n        vortexMsg: string\n    ): Promise<void> {\n        await this.batchSaveTuplesEncoded([\n            { tupleSelector: tupleSelector, vortexMsg: vortexMsg },\n        ]);\n    }\n\n    async deleteTuples(tupleSelector: TupleSelector): Promise<void> {\n        if (!(await this.isOpen())) await this.open();\n        // The payload is a convenient way to serialise and compress the data\n        const tupleSelectorStr = tupleSelector.toOrderedJsonStr();\n\n        const startTime = now();\n\n        await new Promise<void>((resolve, reject) => {\n            // Run the inserts\n            const response = this.objectStoreTx(true) //\n                .delete(tupleSelectorStr);\n\n            addIndexedDbHandlers(response, () => {\n                reject(`${dateStr()} IndexedDB: deleteTuples \"delete\" error`);\n                throw new IDBException(\"Put error\");\n            });\n\n            response.onsuccess = () => {\n                let timeTaken = now() - startTime;\n                console.log(\n                    `${dateStr()} IndexedDB: deleteTuples` +\n                        ` took ${timeTaken}ms (in thread)`\n                );\n                resolve();\n            };\n        });\n    }\n\n    async deleteOldTuples(deleteDataBeforeDate: Date): Promise<void> {\n        if (!(await this.isOpen())) await this.open();\n        console.log(\n            `${dateStr()} WARNING: deleteOldTuple not implemented for IndexedDB`\n        );\n        return Promise.resolve();\n    }\n\n    // noinspection JSMethodCanBeStatic\n    private isNoSpaceMessage(message: string): boolean {\n        for (const msg of noSpaceMsgs) {\n            if (message.indexOf(msg) !== -1) return true;\n        }\n        return false;\n    }\n\n    // noinspection JSMethodCanBeStatic\n    private isNotOpenMessage(message: string): boolean {\n        return message.indexOf(indexDbNotOpenMsg) !== -1;\n    }\n}\n","import { TupleSelector } from \"../TupleSelector\";\nimport { Inject, Injectable } from \"@angular/core\";\nimport {\n    TupleStorageBatchSaveArguments,\n    TupleStorageServiceABC,\n} from \"./TupleStorageServiceABC\";\nimport { TupleOfflineStorageNameService } from \"./TupleOfflineStorageNameService\";\n\n// ----------------------------------------------------------------------------\n\n@Injectable()\nexport class TupleStorageNullService extends TupleStorageServiceABC {\n    constructor(@Inject(TupleOfflineStorageNameService) public name) {\n        super(name);\n    }\n\n    open(): Promise<void> {\n        return Promise.resolve();\n    }\n\n    async isOpen(): Promise<boolean> {\n        return true; // sure\n    }\n\n    async close(): Promise<void> {}\n\n    truncateStorage(): Promise<void> {\n        return Promise.resolve();\n    }\n\n    loadTuplesEncoded(tupleSelector: TupleSelector): Promise<string | null> {\n        console.log(\n            `TupleStorageNullService.tupleSelector ${tupleSelector.toOrderedJsonStr()}`\n        );\n        return Promise.resolve(null);\n    }\n\n    saveTuplesEncoded(\n        tupleSelector: TupleSelector,\n        vortexMsg: string\n    ): Promise<void> {\n        console.log(\n            `TupleStorageNullService.saveTuples ${tupleSelector.toOrderedJsonStr()}`\n        );\n        return Promise.resolve();\n    }\n    batchSaveTuplesEncoded(\n        data: TupleStorageBatchSaveArguments[]\n    ): Promise<void> {\n        console.log(\n            `TupleStorageNullService.batchSaveTuplesEncoded Not Implemented`\n        );\n        return Promise.resolve();\n    }\n\n    deleteTuples(tupleSelector: TupleSelector): Promise<void> {\n        console.log(\n            `TupleStorageNullService.deleteTuples ${tupleSelector.toOrderedJsonStr()}`\n        );\n        return Promise.resolve();\n    }\n\n    deleteOldTuples(deleteDataBeforeDate: Date): Promise<void> {\n        console.log(\n            `TupleStorageNullService.deleteOldTuples ${deleteDataBeforeDate}`\n        );\n        return Promise.resolve();\n    }\n}\n","import { Payload } from \"../Payload\"\nimport { TupleActionABC } from \"../TupleAction\"\n\nexport abstract class TupleActionStorageServiceABC {\n    \n    abstract storeAction(\n        scope: string,\n        tupleAction: TupleActionABC,\n        payload: Payload\n    ): Promise<void> ;\n    \n    abstract loadNextAction(): Promise<Payload | null> ;\n    \n    abstract countActions(): Promise<number> ;\n    \n    abstract deleteAction(\n        scope: string,\n        actionUuid: string\n    ): Promise<void> ;\n}\n","import { Injectable } from \"@angular/core\";\nimport { dateStr } from \"../UtilMisc\";\nimport { Payload } from \"../Payload\";\nimport { TupleActionStorageServiceABC } from \"./TupleActionStorageServiceABC\";\nimport {\n    addIndexedDbHandlers,\n    IDBException,\n    indexedDB,\n} from \"../storage-api/indexeddb-api\";\nimport { TupleActionABC } from \"../TupleAction\";\n\n// ----------------------------------------------------------------------------\n\nfunction now(): any {\n    return new Date();\n}\n\nconst DB_NAME = \"tupleActions\";\nconst ACTION_STORE = \"tupleActions\";\nconst ACTION_KEY_PATH = \"scopeUuid\";\n\ninterface TupleActionStorageStructI {\n    scope: string;\n    scopeUuid: string;\n    encodedPayload: string;\n}\n\n/** Tuple Storage IndexedDB\n *\n * This class handles storing and retrieving tuples to/from indexed db.\n *\n */\n@Injectable()\nexport class TupleActionStorageIndexedDbService extends TupleActionStorageServiceABC {\n    private db: any;\n    private openInProgressPromise: Promise<void> | null = null;\n    private readonly RETRIES = 5;\n    private readonly RETRY_DELAY_MS = 100;\n\n    constructor() {\n        super();\n    }\n\n    async storeAction(\n        scope: string,\n        tupleAction: TupleActionABC,\n        payload: Payload,\n    ): Promise<void> {\n        await this.open();\n        let startTime = now();\n\n        const vortexMsg = await payload.toEncodedPayload();\n\n        const item: TupleActionStorageStructI = {\n            scope: scope,\n            scopeUuid: `${scope}|${tupleAction.uuid}`,\n            encodedPayload: vortexMsg,\n        };\n\n        let timeTaken = now() - startTime;\n        console.log(`${dateStr()} IndexedDB: toVortexMsg took ${timeTaken}ms `);\n\n        startTime = now();\n\n        await new Promise<void>(async (resolve, reject) => {\n            try {\n                const tx = await this.transaction(true);\n                let store = tx.objectStore(ACTION_STORE);\n                let response = store.put(item);\n\n                addIndexedDbHandlers(response, () => {\n                    tx.abort();\n                    reject(`${dateStr()} IndexedDB: saveTuples \"put\" error`);\n                    throw new IDBException(\"Put error\");\n                });\n\n                response.onsuccess = () => {\n                    tx.oncomplete = () => {\n                        let timeTaken = now() - startTime;\n                        console.log(\n                            `${dateStr()} IndexedDB: storeAction` +\n                                ` took ${timeTaken}ms (in thread)`,\n                        );\n                        resolve();\n                    };\n\n                    tx.onerror = () => {\n                        reject(\n                            `${dateStr()} IndexedDB: Transaction failed to commit`,\n                        );\n                    };\n                };\n            } catch (e) {\n                reject(`${dateStr()} IndexedDB: Transaction failed: ${e}`);\n            }\n        });\n    }\n\n    async loadNextAction(): Promise<Payload | null> {\n        await this.open();\n        const encodedPayload = await new Promise<string>(\n            async (resolve, reject) => {\n                try {\n                    const tx = await this.transaction(false); // Changed to readonly\n                    const store = tx.objectStore(ACTION_STORE);\n                    const response = store.openCursor();\n\n                    addIndexedDbHandlers(response, () => {\n                        tx.abort();\n                        reject(\n                            `${dateStr()} IndexedDB: loadNextAction cursor error`,\n                        );\n                        throw new IDBException(\"Cursor error\");\n                    });\n\n                    response.onsuccess = (ev) => {\n                        const cursor = response.result || ev.target.result;\n                        if (!cursor) {\n                            resolve(null);\n                            return;\n                        }\n                        resolve(cursor.value.encodedPayload);\n                        tx.abort();\n                    };\n\n                    tx.onerror = () => {\n                        reject(`${dateStr()} IndexedDB: Transaction failed`);\n                    };\n                } catch (e) {\n                    reject(`${dateStr()} IndexedDB: Transaction failed: ${e}`);\n                }\n            },\n        );\n\n        if (encodedPayload == null) return null;\n        return await Payload.fromEncodedPayload(encodedPayload);\n    }\n\n    async countActions(): Promise<number> {\n        await this.open();\n        return new Promise<number>(async (resolve, reject) => {\n            try {\n                const tx = await this.transaction(false);\n                const response = tx.objectStore(ACTION_STORE).count();\n\n                addIndexedDbHandlers(response, () => {\n                    tx.abort();\n                    reject(`${dateStr()} IndexedDB: countActions error`);\n                    throw new IDBException(\"Count error\");\n                });\n\n                response.onsuccess = () => {\n                    resolve(response.result);\n                };\n\n                tx.onerror = () => {\n                    reject(`${dateStr()} IndexedDB: Transaction failed`);\n                };\n            } catch (e) {\n                reject(`${dateStr()} IndexedDB: Transaction failed: ${e}`);\n            }\n        });\n    }\n\n    async deleteAction(scope: string, actionUuid: string): Promise<void> {\n        await this.open();\n        const scopeUuid = `${scope}|${actionUuid}`;\n\n        await new Promise<void>(async (resolve, reject) => {\n            try {\n                const tx = await this.transaction(true);\n                const response = tx.objectStore(ACTION_STORE).delete(scopeUuid);\n\n                addIndexedDbHandlers(response, () => {\n                    tx.abort();\n                    reject(`${dateStr()} IndexedDB: deleteAction error`);\n                    throw new IDBException(\"Delete error\");\n                });\n\n                response.onsuccess = () => {\n                    tx.oncomplete = () => resolve();\n                    tx.onerror = () => {\n                        reject(\n                            `${dateStr()} IndexedDB: Transaction failed to commit`,\n                        );\n                    };\n                };\n            } catch (e) {\n                reject(`${dateStr()} IndexedDB: Transaction failed: ${e}`);\n            }\n        });\n    }\n\n    // ----------------------------------------------------------------------------\n    // Open the indexed db database\n    open(): Promise<void> {\n        if (this.isOpen()) return Promise.resolve();\n\n        if (this.openInProgressPromise != null)\n            return this.openInProgressPromise;\n\n        this.openInProgressPromise = new Promise<void>((resolve, reject) => {\n            let request = indexedDB.open(DB_NAME, 1);\n\n            addIndexedDbHandlers(request, () => {\n                let msg = `${dateStr()} IndexedDB : \"${DB_NAME}\" Failed to open IndexedDB database`;\n                this.openInProgressPromise = null;\n                reject(msg);\n                throw new IDBException(msg);\n            });\n\n            request.onsuccess = (event) => {\n                console.log(\n                    `${dateStr()} IndexedDB : \"${DB_NAME}\" Success opening DB`,\n                );\n                if (this.db == null) {\n                    this.db = event.target.result;\n                    this.openInProgressPromise = null;\n                    resolve();\n                }\n            };\n\n            request.onupgradeneeded = (event) => {\n                console.log(`${dateStr()} IndexedDB : \"${DB_NAME}\" Upgrading`);\n                let db = event.target.result;\n\n                // SCHEMA for database points\n                // Schema Version 1\n                db.createObjectStore(ACTION_STORE, {\n                    keyPath: ACTION_KEY_PATH,\n                });\n\n                console.log(\n                    `${dateStr()} IndexedDB : \"${DB_NAME}\" Upgrade Success`,\n                );\n            };\n        });\n        return this.openInProgressPromise;\n    }\n\n    // ----------------------------------------------------------------------------\n    // Check if the DB is open\n    isOpen(): boolean {\n        return this.db != null;\n    }\n\n    close(): void {\n        if (!this.isOpen()) {\n            throw new Error(`IndexedDB \"${DB_NAME}\" is not open`);\n        }\n        this.db.close();\n        this.db = null;\n    }\n\n    private async delay(ms: number): Promise<void> {\n        return new Promise((resolve) => setTimeout(resolve, ms));\n    }\n\n    private async transaction(forWrite: boolean): Promise<any> {\n        let retries = this.RETRIES;\n        while (true) {\n            try {\n                // Get the Read Only case out the way, it's easy\n                return this.db.transaction(\n                    ACTION_STORE,\n                    forWrite ? \"readwrite\" : \"readonly\",\n                );\n            } catch (e) {\n                retries -= 1;\n                if (!retries) {\n                    const msg = `ERROR: Failed to create transaction after ${this.RETRIES} attempts: ${e.toString()}`;\n                    console.log(msg);\n                    throw new Error(msg);\n                }\n\n                if (e.toString().indexOf(\"The database is closing\") !== -1) {\n                    try {\n                        this.close();\n                        // Add delay before reopening to allow cleanup\n                        await this.delay(this.RETRY_DELAY_MS);\n                        await this.open();\n                        console.log(\n                            `${dateStr()} IndexedDB: Reopened database after closure`,\n                        );\n                    } catch (reopenError) {\n                        console.error(\n                            `${dateStr()} IndexedDB: Failed to reopen database:`,\n                            reopenError,\n                        );\n                        throw reopenError;\n                    }\n                }\n            }\n        }\n    }\n}\n","import { TupleSelector } from \"../TupleSelector\";\nimport { Inject, Injectable } from \"@angular/core\";\nimport {\n    TupleStorageBatchSaveArguments,\n    TupleStorageServiceABC,\n} from \"./TupleStorageServiceABC\";\nimport { TupleOfflineStorageNameService } from \"./TupleOfflineStorageNameService\";\nimport { SqlFactoryService } from \"../storage-api/sql-api-factory\";\nimport { SqlApiABC, SqlExecuteData } from \"../storage-api/sql-api-abc\";\n\n// ----------------------------------------------------------------------------\nconst createTable = `CREATE TABLE IF NOT EXISTS tuples\n     (\n        tupleSelector TEXT,\n        dateTime REAL,\n        payload TEXT,\n        PRIMARY KEY (tupleSelector)\n     )`;\n\nconst dropTable = `DROP TABLE IF NOT EXISTS tuples`;\n\nconst deleteBySelectorSql = `DELETE\n                 FROM tuples\n                 WHERE tupleSelector = ?`;\n\nconst deleteByDateSql = `DELETE\n                 FROM tuples\n                 WHERE dateTime < ?`;\n\nconst insertSql = `INSERT OR REPLACE INTO tuples\n                 (tupleSelector, dateTime, payload)\n                 VALUES (?, ?, ?)`;\n\nconst selectSql = `SELECT tupleSelector, dateTime, payload\n                 FROM tuples\n                 WHERE tupleSelector = ?`;\n\n@Injectable()\nexport class TupleStorageWebSqlService extends TupleStorageServiceABC {\n    private webSql: SqlApiABC;\n\n    constructor(\n        @Inject(SqlFactoryService) private webSqlFactory: SqlFactoryService,\n        @Inject(TupleOfflineStorageNameService) public name\n    ) {\n        super(name);\n        this.webSql = webSqlFactory.createApi(this.dbName, [createTable]);\n    }\n\n    open(): Promise<void> {\n        return this.webSql.open();\n    }\n\n    async isOpen(): Promise<boolean> {\n        return await this.webSql.isOpen();\n    }\n\n    async close(): Promise<void> {\n        await this.webSql.close();\n    }\n\n    async truncateStorage(): Promise<void> {\n        await this.webSql.execute([{ sql: dropTable }]);\n        await this.webSql.execute([{ sql: createTable }]);\n    }\n\n    async loadTuplesEncoded(\n        tupleSelector: TupleSelector\n    ): Promise<string | null> {\n        const bindParams = [tupleSelector.toOrderedJsonStr()];\n\n        const rows: any[] = await this.webSql.query({\n            sql: selectSql,\n            bindParams: bindParams,\n        });\n        if (!rows?.length) {\n            return null;\n        }\n        return rows[0].payload;\n    }\n\n    async saveTuplesEncoded(\n        tupleSelector: TupleSelector,\n        vortexMsg: string,\n        retries = 0\n    ): Promise<void> {\n        // The payload is a convenient way to serialise and compress the data\n        const tupleSelectorStr = tupleSelector.toOrderedJsonStr();\n        const bindParams = [tupleSelectorStr, Date.now(), vortexMsg];\n\n        await this.webSql.execute([{ sql: insertSql, bindParams: bindParams }]);\n    }\n\n    async batchSaveTuplesEncoded(\n        data: TupleStorageBatchSaveArguments[]\n    ): Promise<void> {\n        const txData: SqlExecuteData[] = [];\n        for (const data_ of data) {\n            txData.push({\n                sql: insertSql,\n                bindParams: [\n                    data_.tupleSelector.toOrderedJsonStr(),\n                    Date.now(),\n                    data_.vortexMsg,\n                ],\n            });\n        }\n\n        await this.webSql.execute(txData);\n        return Promise.resolve(undefined);\n    }\n\n    async deleteTuples(\n        tupleSelector: TupleSelector,\n        retries = 0\n    ): Promise<void> {\n        const tupleSelectorStr = tupleSelector.toOrderedJsonStr();\n\n        await this.webSql.execute([\n            {\n                sql: deleteBySelectorSql,\n                bindParams: [tupleSelectorStr],\n            },\n        ]);\n    }\n\n    async deleteOldTuples(\n        deleteDataBeforeDate: Date,\n        retries = 0\n    ): Promise<void> {\n        await this.webSql.execute([\n            {\n                sql: deleteByDateSql,\n                bindParams: [deleteDataBeforeDate.getTime()],\n            },\n        ]);\n    }\n}\n","import { Inject, Injectable } from \"@angular/core\";\nimport { TupleActionABC } from \"../TupleAction\";\nimport { Payload } from \"../Payload\";\nimport { TupleActionStorageServiceABC } from \"./TupleActionStorageServiceABC\";\nimport { SqlApiABC } from \"../storage-api/sql-api-abc\";\nimport { SqlFactoryService } from \"../storage-api/sql-api-factory\";\n\nconst DATABASE_NAME = \"tupleActions\";\n\nconst tableName = \"tupleActions\";\nconst databaseSchema = [\n    `CREATE TABLE IF NOT EXISTS ${tableName}\n     (\n        id INTEGER PRIMARY KEY AUTOINCREMENT,\n        scope TEXT,\n        uuid REAL,\n        payload TEXT,\n        UNIQUE (scope, uuid)\n     )`,\n];\n\n@Injectable()\nexport class TupleActionStorageSqlService extends TupleActionStorageServiceABC {\n    private webSql: SqlApiABC;\n\n    constructor(\n        @Inject(SqlFactoryService) private webSqlFactory: SqlFactoryService\n    ) {\n        super();\n\n        this.webSql = webSqlFactory.createApi(DATABASE_NAME, databaseSchema);\n    }\n\n    async storeAction(\n        scope: string,\n        tupleAction: TupleActionABC,\n        payload: Payload\n    ): Promise<void> {\n        const encodedPayload: string = await payload.toEncodedPayload();\n        const sql = `INSERT INTO ${tableName}\n                    (scope, uuid, payload)\n                    VALUES (?, ?, ?)`;\n        const bindParams = [scope, tupleAction.uuid, encodedPayload];\n\n        await this.webSql.execute([{ sql: sql, bindParams: bindParams }]);\n    }\n\n    async loadNextAction(): Promise<Payload | null> {\n        const sql = `SELECT payload\n                    FROM ${tableName}\n                    ORDER BY id\n                    LIMIT 1`;\n        const bindParams = [];\n\n        const rows: any[] = await this.webSql.query({\n            sql: sql,\n            bindParams: bindParams,\n        });\n\n        if (!rows?.length) {\n            return null;\n        }\n\n        const row1 = rows[0];\n        return await Payload.fromEncodedPayload(row1.payload);\n    }\n\n    async countActions(): Promise<number> {\n        const sql = `SELECT count(payload) as count\n                    FROM ${tableName}`;\n        const bindParams = [];\n\n        const rows: any[] = await this.webSql.query({\n            sql: sql,\n            bindParams: bindParams,\n        });\n\n        return rows == null ? 0 : rows[0].count;\n    }\n\n    async deleteAction(scope: string, actionUuid: string): Promise<void> {\n        const sql = `DELETE FROM ${tableName}\n                    WHERE scope=? AND uuid=?`;\n        const bindParams = [scope, actionUuid];\n\n        await this.webSql.execute([{ sql: sql, bindParams: bindParams }]);\n    }\n}\n","import { Inject, Injectable } from \"@angular/core\";\nimport { TupleStorageServiceABC } from \"../storage/TupleStorageServiceABC\";\nimport { TupleOfflineStorageNameService } from \"../storage/TupleOfflineStorageNameService\";\nimport { TupleStorageIndexedDbService } from \"../storage/TupleStorageIndexedDbService\";\nimport { TupleStorageNullService } from \"../storage/TupleStorageNullService\";\nimport { TupleStorageFactoryService } from \"./TupleStorageFactoryService\";\nimport { TupleActionStorageServiceABC } from \"../action-storage/TupleActionStorageServiceABC\";\nimport { TupleActionStorageIndexedDbService } from \"../action-storage/TupleActionStorageIndexedDbService\";\nimport { supportsIndexedDb } from \"../storage-api/indexeddb-api\";\nimport { SqlFactoryService } from \"../storage-api/sql-api-factory\";\nimport { TupleStorageWebSqlService } from \"../storage/TupleStorageWebSqlService\";\nimport { TupleActionStorageSqlService } from \"../action-storage/tuple-action-storage-sql.service\";\nimport { dateStr } from \"../UtilMisc\";\n\n@Injectable()\nexport class TupleStorageFactoryServiceWeb extends TupleStorageFactoryService {\n    constructor(@Inject(SqlFactoryService) private sqlFactory) {\n        super();\n    }\n\n    create(name: TupleOfflineStorageNameService): TupleStorageServiceABC {\n        // Prefer Web SQL\n        if (\n            this.sqlFactory.isSupported() &&\n            !this.sqlFactory.hasStorageLimitations()\n        ) {\n            console.log(\n                `${dateStr()} TupleStorageFactoryService: Choosing ` +\n                    this.sqlFactory.storageName +\n                    \" Storage\"\n            );\n            return new TupleStorageWebSqlService(this.sqlFactory, name);\n        }\n\n        // Fallback to Indexed DB, It gives mega space on mobile iOS\n        if (supportsIndexedDb()) {\n            console.log(\n                `${dateStr()} TupleStorageFactoryService: Choosing IndexedDB Storage`\n            );\n            return new TupleStorageIndexedDbService(name);\n        }\n\n        // Otherwise, the null service just silently does nothing.\n        console.log(\n            `${dateStr()} TupleStorageFactoryService: Choosing Null Storage`\n        );\n        return new TupleStorageNullService(name);\n    }\n\n    createActionStorage(): TupleActionStorageServiceABC {\n        // Prefer Web SQL\n        if (\n            this.sqlFactory.isSupported() &&\n            !this.sqlFactory.hasStorageLimitations()\n        ) {\n            console.log(\n                `${dateStr()} TupleStorageFactoryService: Choosing ` +\n                    this.sqlFactory.storageName +\n                    \" Storage\"\n            );\n            return new TupleActionStorageSqlService(this.sqlFactory);\n        }\n\n        // Fallback to Indexed DB, It gives mega space on mobile iOS\n        if (supportsIndexedDb()) {\n            console.log(\n                `${dateStr()} TupleStorageFactoryService: Choosing IndexedDB Storage`\n            );\n            return new TupleActionStorageIndexedDbService();\n        }\n\n        // Otheriwse, raise an exception.\n        console.log(\n            `${dateStr()} TupleStorageFactoryService: Choosing Null Storage`\n        );\n        throw new Error(\n            \"Failed to choose a suitable storage backend for\" +\n                \" offline TupleActions\"\n        );\n\n        // Maybe we could have an in memory tuple action cache, but it wouldn't be the\n        // same.\n    }\n}\n","import { TupleDataLoaderTupleABC } from \"./TupleDataLoaderTupleABC\";\nimport { Tuple } from \"../Tuple\";\nimport { TupleActionABC } from \"../TupleAction\";\nimport { TupleSelector } from \"../TupleSelector\";\n\nexport enum _DataLoaderActionType {\n    Store = \"store\",\n    Create = \"create\",\n    Load = \"load\",\n    Delete = \"delete\",\n}\n\nexport class _DataLoaderTupleAction extends TupleActionABC {\n    static readonly tupleType = \"vortex._DataLoaderTupleAction\";\n\n    userUuid: string;\n    delegateUuid: string;\n    dataTuple: Tuple;\n    action: string;\n    tupleDataSelector: TupleSelector;\n\n    constructor() {\n        super(_DataLoaderTupleAction.tupleType);\n    }\n}\n\nexport class _DataLoaderTupleActionResponseTuple<\n    TupleType extends TupleDataLoaderTupleABC,\n> extends Tuple {\n    static readonly tupleType = \"vortex._DataLoaderTupleActionResponseTuple\";\n\n    tupleData: TupleType | null;\n    tupleDataSelector: TupleSelector | null;\n\n    constructor() {\n        super(_DataLoaderTupleActionResponseTuple.tupleType);\n    }\n}\n\nexport class _LockDataTupleAction extends TupleActionABC {\n    static readonly tupleType = \"vortex._LockDataTupleAction\";\n\n    lock: boolean;\n    userUuid: string;\n    delegateUuid: string;\n    tupleDataSelector: TupleSelector;\n    liveUpdateDataTuple: TupleDataLoaderTupleABC;\n\n    constructor() {\n        super(_LockDataTupleAction.tupleType);\n    }\n}\n\nexport class _DataLockStatusTuple<\n    TupleType extends TupleDataLoaderTupleABC,\n> extends Tuple {\n    static readonly tupleType = \"vortex._DataLockStatusTuple\";\n\n    locked: boolean;\n    deleted: boolean;\n    lockedByUserUuid: string;\n    lockAutoExpireDate: Date;\n    liveUpdateDataFromDelegateUuid: string;\n    liveUpdateDataTuple: TupleType;\n\n    constructor() {\n        super(_DataLockStatusTuple.tupleType);\n    }\n}\n","import { TupleActionPushService } from \"../action-service/TupleActionPushService\";\nimport { TupleDataObserverService } from \"../observable-service/TupleDataObserverService\";\nimport { TupleDataLoaderDelegate } from \"./TupleDataLoaderDelegate\";\nimport { Tuple } from \"../Tuple\";\nimport { TupleSelector } from \"../TupleSelector\";\nimport { distinctUntilChanged, skip, takeUntil } from \"rxjs/operators\";\nimport { dateStr } from \"../UtilMisc\";\nimport {\n    NgLifeCycleEvents,\n    NgOnDestroyEventI,\n} from \"../../util/NgLifeCycleEvents\";\nimport { TupleDataLoaderTupleABC } from \"./TupleDataLoaderTupleABC\";\nimport {\n    _DataLoaderActionType,\n    _DataLoaderTupleAction,\n    _DataLoaderTupleActionResponseTuple,\n    _DataLockStatusTuple,\n    _LockDataTupleAction,\n} from \"./TupleDataLoaderTuples\";\n\ntype DelegateByUuidT = { [delegateUuid: string]: TupleDataLoaderDelegate<any> };\ntype DelegateByUuidByTupleTypeT = { [tupleType: string]: DelegateByUuidT };\n\n/*\n * The `TupleDataLoader` class manages the observable and action push service for\n * the data loaders. Delegates for each form need to be registered with the data\n * loader using the `setDelegate` method.\n *\n * The `TupleDataLoader` can be instantiated in a `Component` or `Service` and\n * takes in an `EventEmitter<string>` event which notifies when to unsubscribe\n * to the subscriptions' setup by the loader\n * */\nexport class TupleDataLoader {\n    private delegateByUuidByTupleType: DelegateByUuidByTupleTypeT = {};\n\n    constructor(\n        private ngLifeCycleEvents: NgLifeCycleEvents,\n        private readonly action: TupleActionPushService,\n        private readonly observer: TupleDataObserverService,\n    ) {}\n\n    private delegateByUuid(\n        tupleType: string,\n        create = false,\n    ): DelegateByUuidT | null {\n        if (this.delegateByUuidByTupleType[tupleType] != null) {\n            return this.delegateByUuidByTupleType[tupleType];\n        }\n        if (!create) {\n            return null;\n        }\n        const newDict: DelegateByUuidT = {};\n        this.delegateByUuidByTupleType[tupleType] = newDict;\n        return newDict;\n    }\n\n    /*\n     * The `setDelegate` method registers a data `tuple` to be handled by the\n     * `delegate`.\n     * */\n    removeDelegate<T extends TupleDataLoaderTupleABC>(\n        tuple: string | Tuple,\n        delegate: TupleDataLoaderDelegate<T>,\n    ) {\n        const tupleType = tuple instanceof Tuple ? tuple._tupleType : tuple;\n\n        if ((this.delegateByUuid(tupleType) || {})[delegate.uuid] == null) {\n            throw new Error(\n                `removeDelegate: Delegate with UUID ${delegate.uuid}` +\n                    ` and tuple type ${tupleType}` +\n                    ` does not exist`,\n            );\n        }\n\n        delete this.delegateByUuidByTupleType[tupleType][delegate.uuid];\n    }\n\n    /*\n     * The `setDelegate` method registers a data `tuple` to be handled by the\n     * `delegate`.\n     * */\n    addDelegate<T extends TupleDataLoaderTupleABC>(\n        tuple: string | Tuple,\n        delegate: TupleDataLoaderDelegate<T>,\n        destroyEvent: NgOnDestroyEventI,\n    ) {\n        const tupleType = tuple instanceof Tuple ? tuple._tupleType : tuple;\n        if ((this.delegateByUuid(tupleType) || {})[delegate.uuid] != null) {\n            throw new Error(\n                `addDelegate: Delegate with UUID ${delegate.uuid}` +\n                    ` and tuple type ${tupleType}` +\n                    ` already exists`,\n            );\n        }\n\n        this.delegateByUuid(tupleType, true)[delegate.uuid] = delegate;\n        delegate[\"setDataLoader\"](this);\n        delegate[\"registeredName\"] = tupleType;\n\n        destroyEvent.onDestroyEvent.subscribe(() =>\n            this.removeDelegate(tuple, delegate),\n        );\n\n        const distinctSelector$ = delegate.selector$.pipe(\n            distinctUntilChanged(\n                (s1, s2) => s1?.toOrderedJsonStr() === s2?.toOrderedJsonStr(),\n            ),\n        );\n        distinctSelector$\n            .pipe(takeUntil(this.ngLifeCycleEvents.onDestroyEvent))\n            .subscribe((selector) => {\n                if (selector == null) {\n                    return;\n                }\n\n                if (tupleType != selector.name) {\n                    console.log(\n                        \"TupleDataLoader: distinctSelector$ Selector and\" +\n                            \" data missmatch\" +\n                            ` tupleType=${tupleType}` +\n                            ` vs selector.name=${selector.name}`,\n                    );\n                    return;\n                }\n\n                console.log(\n                    \"TupleDataLoader: distinctSelector$ Observed selector$\" +\n                        \" change\" +\n                        ` refreshing ${selector.toOrderedJsonStr()}`,\n                );\n\n                const selectorChangePipe = distinctSelector$.pipe(skip(1));\n\n                this.observer\n                    .subscribeToTupleSelector(selector)\n                    .pipe(\n                        takeUntil(this.ngLifeCycleEvents.onDestroyEvent),\n                        takeUntil(selectorChangePipe),\n                    )\n                    .subscribe((tuples: T[]) => {\n                        if (tuples.length > 0) {\n                            console.log(\n                                \"TupleDataLoader:\" +\n                                    \" distinctSelector$ tupleObserver,\" +\n                                    \" TupleDataLoaderTupleABC received from server,\" +\n                                    ` selector: ${selector.toOrderedJsonStr()}`,\n                            );\n                            delegate[\"processDataUpdate\"](tuples[0]);\n                        }\n                    });\n\n                // The locking tuple selector uses the _DataLockStatusTuple and\n                // the tuple selector for the form.\n                this.observer\n                    .subscribeToTupleSelector(\n                        new TupleSelector(_DataLockStatusTuple.tupleType, {\n                            dataTupleSelector: selector,\n                        }),\n                    )\n                    .pipe(\n                        takeUntil(this.ngLifeCycleEvents.onDestroyEvent),\n                        takeUntil(selectorChangePipe),\n                    )\n                    .subscribe((tuples: _DataLockStatusTuple<any>[]) => {\n                        if (tuples.length > 0) {\n                            console.log(\n                                \"TupleDataLoader:\" +\n                                    \" distinctSelector$ tupleObserver,\" +\n                                    \" _DataLockStatusTuple received from server,\" +\n                                    ` selector: ${selector.toOrderedJsonStr()}`,\n                            );\n                            delegate[\"processLockStatus\"](tuples[0]);\n                        }\n                    });\n            });\n    }\n\n    /*\n     * The `store` method will save the data by calling the `writeData` method\n     * of the registered delegate in the backend code. It will also release any\n     * locks on this form and discard the live value.\n     * */\n    async create<T extends TupleDataLoaderTupleABC>(\n        delegate: TupleDataLoaderDelegate<T>,\n    ): Promise<void> {\n        const data = delegate.data;\n        const tupleType = data._tupleName();\n        if ((this.delegateByUuid(tupleType) || {})[delegate.uuid] == null) {\n            console.log(\n                `${dateStr()} CREATE Delegate with UUID ${delegate.uuid}` +\n                    ` not registered for tupleType ${tupleType}`,\n            );\n            return;\n        }\n\n        if (data == null) {\n            return;\n        }\n\n        const action = new _DataLoaderTupleAction();\n        action.userUuid = delegate[\"userUuid$\"].getValue();\n        action.delegateUuid = delegate.uuid;\n        action.dataTuple = data;\n        action.action = _DataLoaderActionType.Create;\n\n        // noinspection JSUnusedLocalSymbols\n        const response = this.convertResponse(\n            await this.action.pushAction(action),\n        );\n\n        delegate.selector$.next(response.tupleDataSelector);\n    }\n\n    /*\n     * The `store` method will save the data by calling the `writeData` method\n     * of the registered delegate in the backend code. It will also release any\n     * locks on this form and discard the live value.\n     * */\n    async store<T extends TupleDataLoaderTupleABC>(\n        delegate: TupleDataLoaderDelegate<T>,\n    ): Promise<void> {\n        const data = delegate.data;\n        const selector = delegate.selector;\n        const tupleType = selector.name;\n        if ((this.delegateByUuid(tupleType) || {})[delegate.uuid] == null) {\n            console.log(\n                `${dateStr()} STORE Delegate with UUID ${delegate.uuid}` +\n                    ` not registered for tupleType ${tupleType}`,\n            );\n            return;\n        }\n\n        if (data == null || selector == null) {\n            return;\n        }\n\n        const action = new _DataLoaderTupleAction();\n        action.userUuid = delegate[\"userUuid$\"].getValue();\n        action.delegateUuid = delegate.uuid;\n        action.dataTuple = data;\n        action.action = _DataLoaderActionType.Store;\n        action.tupleDataSelector = selector;\n\n        // noinspection JSUnusedLocalSymbols\n        const response = this.convertResponse(\n            await this.action.pushAction(action),\n        );\n\n        // If there is a TupleSelector update, apply it.\n        if (response.tupleDataSelector != null) {\n            delegate.selector$.next(response.tupleDataSelector);\n        }\n    }\n\n    /*\n     * The `load` method will load the data using the `readData` method of the\n     * registered delegate in the backend. It will discard any live values and\n     * also release the locks.\n     * */\n    async load<T extends TupleDataLoaderTupleABC>(\n        delegate: TupleDataLoaderDelegate<T>,\n    ): Promise<void> {\n        const selector = delegate.selector;\n        const tupleType = selector.name;\n        if ((this.delegateByUuid(tupleType) || {})[delegate.uuid] == null) {\n            console.log(\n                `${dateStr()} LOAD  Delegate with UUID ${delegate.uuid}` +\n                    ` not registered for tupleType ${tupleType}`,\n            );\n            return;\n        }\n        if (selector == null) {\n            throw new Error(\"TupleSelector not set to load data\");\n        }\n\n        const action = new _DataLoaderTupleAction();\n        // This does not matter for revert\n        action.userUuid = delegate[\"userUuid$\"].getValue();\n        action.delegateUuid = delegate.uuid;\n        action.dataTuple = delegate.data;\n        action.action = _DataLoaderActionType.Load;\n        action.tupleDataSelector = selector;\n\n        // noinspection JSUnusedLocalSymbols\n        const response = this.convertResponse(\n            await this.action.pushAction(action),\n        );\n    }\n\n    /*\n     * The `delete` method will call `deleteData` method of the registered\n     * delegate in the backend code\n     * */\n    async delete<T extends TupleDataLoaderTupleABC>(\n        delegate: TupleDataLoaderDelegate<T>,\n    ): Promise<void> {\n        const data = delegate.data;\n        const selector = delegate.selector;\n        const tupleType = selector.name;\n        if ((this.delegateByUuid(tupleType) || {})[delegate.uuid] == null) {\n            console.log(\n                `${dateStr()} DELETE Delegate with UUID ${delegate.uuid}` +\n                    ` not registered for tupleType ${tupleType}`,\n            );\n            return;\n        }\n\n        if (selector == null) {\n            throw new Error(\"TupleSelector not set to delete data\");\n        }\n\n        const action = new _DataLoaderTupleAction();\n        // This does not matter for delete\n        action.userUuid = delegate[\"userUuid$\"].getValue();\n        action.delegateUuid = delegate.uuid;\n        action.dataTuple = delegate.data;\n        action.action = _DataLoaderActionType.Delete;\n        action.tupleDataSelector = selector;\n\n        // noinspection JSUnusedLocalSymbols\n        const response = this.convertResponse(\n            await this.action.pushAction(action),\n        );\n    }\n\n    /*\n     * The `lock` method will acquire a lock on the data or throw an exception\n     * if the lock is already held by someone else on the current tuple selector\n     * */\n    async lock<T extends TupleDataLoaderTupleABC>(\n        delegate: TupleDataLoaderDelegate<T>,\n    ): Promise<void> {\n        const selector = delegate.selector;\n        const tupleType = selector.name;\n        if ((this.delegateByUuid(tupleType) || {})[delegate.uuid] == null) {\n            console.log(\n                `${dateStr()} LOCK Delegate with UUID ${delegate.uuid}` +\n                    ` not registered for tupleType ${tupleType}`,\n            );\n            return;\n        }\n\n        if (selector == null) {\n            throw new Error(\"TupleSelector not set to lock form for\");\n        }\n\n        const action = new _LockDataTupleAction();\n        action.delegateUuid = delegate.uuid;\n        action.userUuid = delegate[\"userUuid$\"].getValue();\n        action.lock = true;\n        action.tupleDataSelector = selector;\n        action.liveUpdateDataTuple = delegate.data;\n        await this.action.pushAction(action);\n    }\n\n    private convertResponse<T extends TupleDataLoaderTupleABC>(\n        tuples: Tuple[],\n    ): _DataLoaderTupleActionResponseTuple<T> {\n        return <_DataLoaderTupleActionResponseTuple<T>>tuples[0];\n    }\n}\n","import { BehaviorSubject, debounceTime, Observable, Subject } from \"rxjs\";\nimport { TupleSelector } from \"../TupleSelector\";\nimport { TupleDataLoader } from \"./TupleDataLoader\";\nimport { filter, skip, takeUntil } from \"rxjs/operators\";\nimport { NgOnDestroyEventI } from \"../../util/NgLifeCycleEvents\";\nimport { VortexClientABC } from \"../VortexClientABC\";\nimport { FormGroup } from \"@angular/forms\";\nimport { TupleDataLoaderTupleABC } from \"./TupleDataLoaderTupleABC\";\nimport { dateStr } from \"../UtilMisc\";\nimport { _DataLockStatusTuple } from \"./TupleDataLoaderTuples\";\n\nexport class TupleDataNotValidError extends Error {\n    constructor(message?: string) {\n        super(message);\n        this.name = \"TupleDataNotValidError\";\n    }\n}\n\n/*\n * Each tuple (TupleType) of data that needs to be loaded with the\n * `TupleDataLoader` is assigned a delegate of the type `TupleDataLoaderDelegate`\n *\n * The `TupleDataLoaderDelegate` class provides access to the data that is loaded\n * and to be sent to the backend delegate, accessible using the `data$` attribute\n *\n * The data that is to be loaded and modified is described using a `TupleSelector`\n * accessible using the `selector$` attribute. Using `.next()` on the `selector$`\n * will trigger a re-load of the data.\n *\n * If a lock is held by the current user and editing is allowed the `disabled`\n * attribute returns `false`. If a lock is not held or someone else holds the lock\n * the `disabled` attribute will return `true`. Any updates or attempts to lock\n * will fail and throw an exception if `disabled` returns `True`. Data however\n * can still be loaded and watched for live updates.\n * */\nexport class TupleDataLoaderDelegate<\n    TupleType extends TupleDataLoaderTupleABC,\n> {\n    // This allows some UI animations to run\n    readonly ANIMATION_WAIT_TIME_MS = 400;\n\n    /** Loading indicators **/\n    readonly loading$ = new BehaviorSubject<boolean>(false);\n    readonly storing$ = new BehaviorSubject<boolean>(false);\n    readonly deleting$ = new BehaviorSubject<boolean>(false);\n\n    // Something is happening indicator\n    readonly ready$ = new BehaviorSubject<boolean>(true);\n\n    readonly data$ = new BehaviorSubject<TupleType | null>(null);\n    readonly selector$ = new BehaviorSubject<TupleSelector | null>(null);\n\n    public readonly uuid = VortexClientABC.makeUuid();\n\n    readonly dataLocked$ = new BehaviorSubject<boolean>(false);\n    readonly lockExpires$ = new BehaviorSubject<Date>(null);\n\n    /**\n     * Returns an observable of boolean indicating if data has been deleted.\n     *\n     * @return {Observable<boolean>} An observable that emits\n     *  a boolean value indicating if data has been deleted.\n     */\n    get dataDeleted$(): Observable<void> {\n        return this._dataDeletedSubject.asObservable();\n    }\n    private _dataDeletedSubject = new Subject<void>();\n\n    // formGroupDirty is private, because it's only local to this form\n    // dataDirtyOrWeHaveLock$ is what the UI will use, because...\n    // The form group will not be dirty have receiving a live update via the\n    // lock status.\n    // The fact that we have a lock indicates that the form is dirty.\n    // However, to respond quicker, we also want to use the dirty flag.\n    // hence, the name \"dirty, or we have lock\"\n    private readonly formGroupDirty$ = new BehaviorSubject<boolean>(false);\n    readonly dataDirtyOrWeHaveLock$ = new BehaviorSubject<boolean>(false);\n\n    private _dataLoader: TupleDataLoader | null = null;\n\n    readonly formGroup$ = new BehaviorSubject<FormGroup | null>(null);\n\n    // noinspection JSUnusedLocalSymbols\n    private registeredName: string = \"SET FROM TupleDataLoader.addDelegate\";\n\n    constructor(\n        private lifeCycleEvents: NgOnDestroyEventI,\n        private userUuid$: BehaviorSubject<string>,\n    ) {\n        // When dirty changes, Set the observable the UIs will use\n        this.formGroupDirty$\n            .pipe(takeUntil(this.lifeCycleEvents.onDestroyEvent))\n            .pipe(filter((dirty) => dirty))\n            .subscribe((dirty: boolean) => {\n                console.log(\n                    `TupleDataLoaderDelegate: ${this.registeredName}` +\n                        \" formGroupDirty$, dirty=true,\" +\n                        \" calling setDataDirtyOrWeHaveLock \",\n                );\n                this.setDataDirtyOrWeHaveLock(dirty);\n            });\n\n        // When dirty changes, update the server.\n        this.formGroupDirty$\n            .pipe(takeUntil(this.lifeCycleEvents.onDestroyEvent))\n            .pipe(filter((dirty) => dirty))\n            .pipe(debounceTime(500))\n            .subscribe(() => {\n                console.log(\n                    `TupleDataLoaderDelegate: ${this.registeredName}` +\n                        \" formGroupDirty$, dirty=true,\" +\n                        \" calling sending lock to server \",\n                );\n                // Send a memory only snapshot of the data to the server\n                this.lockForEditing().catch((e) => {\n                    console.log(`ERROR: ${dateStr()}: updateEditing: ${e}`);\n                });\n            });\n\n        this.data$\n            .pipe(takeUntil(this.lifeCycleEvents.onDestroyEvent))\n            .subscribe((data: TupleDataLoaderTupleABC) => {\n                if (data == null) {\n                    console.log(\n                        `TupleDataLoaderDelegate: ${this.registeredName}` +\n                            \" data$,Observed data$\" +\n                            \" change,\" +\n                            ` value is null`,\n                    );\n                    this.formGroup$.next(null);\n                    return;\n                }\n\n                const unsub = this.data$.pipe(skip(1));\n                const formGroup = data.createFormGroup();\n                if (formGroup == null) {\n                    return;\n                }\n                this.data.updateValidation(formGroup);\n\n                if (this.dataDirtyOrWeHaveLock) {\n                    formGroup.markAllAsTouched();\n                }\n\n                // To subscribe for changes in the form, and assign them back to the\n                // tuple\n                formGroup.valueChanges\n                    .pipe(debounceTime(200)) // Debounce a LOT of calls\n                    .pipe(takeUntil(this.lifeCycleEvents.onDestroyEvent))\n                    .pipe(takeUntil(unsub))\n                    .subscribe(() => {\n                        this.synchroniseFormGroupToDataTuple(formGroup);\n                    });\n\n                console.log(\n                    `TupleDataLoaderDelegate: ${this.registeredName}` +\n                        \" data$ Emitting new pristine\" +\n                        \" formGroup$\",\n                );\n                this.resetFormGroupDirty();\n                this.formGroup$.next(formGroup);\n            });\n\n        this.dataDirtyOrWeHaveLock$\n            .pipe(takeUntil(this.lifeCycleEvents.onDestroyEvent))\n            .pipe(filter((value) => value))\n            .subscribe(() => {\n                if (this.formGroup != null) {\n                    console.log(\n                        `TupleDataLoaderDelegate: ${this.registeredName}` +\n                            \" dataDirtyOrWeHaveLock$,\" +\n                            \" calling markAllAsTouched\",\n                    );\n                    this.formGroup.markAllAsTouched();\n                }\n            });\n\n        // Tear down the circular dependency\n        this.lifeCycleEvents.onDestroyEvent //\n            .subscribe(() => (this._dataLoader = null));\n    }\n\n    private synchroniseFormGroupToDataTuple(formGroup: FormGroup<any>) {\n        // use formGroup from closure\n        // This will create circular dependency until takeUntil\n        const changes = formGroup.getRawValue();\n        if (changes == null) {\n            // FormGroup has been destroyed\n            return;\n        }\n        console.log(\n            `TupleDataLoaderDelegate: ${this.registeredName}` +\n                \" data$ Observed\" +\n                \" formGroup$.valueChanges, Updating data from\" +\n                \" formGroup\",\n        );\n\n        // Update the data tuple from the FormGroup\n        const differences = this.data.updateFromFormGroup(changes);\n\n        // Set the dirty flag\n        if (differences) {\n            // Only update the validation if something has\n            // changed, or we get an infinite loop.\n            this.data.updateValidation(formGroup);\n            this.setFormGroupDirty(true);\n            console.log(\n                `TupleDataLoaderDelegate: ${this.registeredName}` +\n                    \" data$ Updating data from\" +\n                    \" formGroup found changes\",\n            );\n        } else {\n            console.log(\n                `TupleDataLoaderDelegate: ${this.registeredName}` +\n                    \" data$ Updating data from\" +\n                    \" formGroup, both models match\",\n            );\n        }\n    }\n\n    private async animationDelay(\n        withAnimationDelay: boolean,\n        startDateMs: number,\n    ): Promise<void> {\n        if (!withAnimationDelay) {\n            return;\n        }\n\n        const timeTakenSoFar = new Date().getMilliseconds() - startDateMs;\n        await new Promise((resolve) => {\n            setTimeout(resolve, this.ANIMATION_WAIT_TIME_MS - timeTakenSoFar);\n        });\n    }\n\n    private resetFormGroupDirty(): void {\n        this.formGroupDirty$.next(false);\n    }\n\n    private setFormGroupDirty(value: boolean): void {\n        // Things use dirty updates to know when updates have happened.\n        // Even if it's true -> true\n        this.formGroupDirty$.next(this.formGroupDirty || value);\n    }\n\n    private get formGroupDirty(): boolean {\n        return this.formGroupDirty$.getValue();\n    }\n\n    private resetDataDirtyOrWeHaveLock(): void {\n        this.dataDirtyOrWeHaveLock$.next(false);\n    }\n\n    private setDataDirtyOrWeHaveLock(value: boolean): void {\n        // Things use lock updates to know when updates have happened.\n        // Even if it's true -> true\n        this.dataDirtyOrWeHaveLock$.next(this.dataDirtyOrWeHaveLock || value);\n\n        if (this.dataDirtyOrWeHaveLock && !this.dataLocked) {\n            // Preemptively set the lock\n            // console.log(\"Preemptively setting the lock for better response\");\n            this.dataLocked$.next(true);\n        }\n    }\n\n    get dataLocked() {\n        return this.dataLocked$.getValue();\n    }\n\n    get dataDirtyOrWeHaveLock() {\n        return this.dataDirtyOrWeHaveLock$.getValue();\n    }\n\n    get selector(): TupleSelector | null {\n        return this.selector$.getValue();\n    }\n\n    private get formGroup(): FormGroup | null {\n        return this.formGroup$?.getValue();\n    }\n\n    private set ready(value: boolean) {\n        this.ready$.next(value);\n    }\n\n    private set storing(value: boolean) {\n        this.storing$.next(value);\n    }\n\n    private set loading(value: boolean) {\n        this.loading$.next(value);\n    }\n\n    private set deleting(value: boolean) {\n        this.deleting$.next(value);\n    }\n\n    get data(): TupleType {\n        return this.data$.getValue();\n    }\n\n    set data(value: TupleType) {\n        this.data$.next(value);\n    }\n\n    // noinspection JSUnusedLocalSymbols\n    private setDataLoader(loader: TupleDataLoader) {\n        this._dataLoader = loader;\n    }\n\n    // noinspection JSUnusedLocalSymbols\n    private processDataUpdate(data: TupleType): void {\n        console.log(\n            \"TupleDataLoaderDelegate:\" +\n                \" processDataUpdate received data from server\",\n        );\n        this.data$.next(data);\n    }\n\n    // noinspection JSUnusedLocalSymbols\n    private processLockStatus(\n        lockStatus: _DataLockStatusTuple<TupleType>,\n    ): void {\n        this.dataLocked$.next(lockStatus.locked);\n        if (lockStatus.deleted) {\n            console.log(\n                \"TupleDataLoaderDelegate:\" +\n                    \" processLockStatus received DELETE from server\",\n            );\n            this.data$.next(null);\n            this.selector$.next(null);\n            this.resetDataDirtyOrWeHaveLock();\n            this.lockExpires$.next(null);\n            this._dataDeletedSubject.next();\n        } else if (lockStatus.locked) {\n            console.log(\n                \"TupleDataLoaderDelegate:\" +\n                    \" processLockStatus received LOCK from server\",\n            );\n            const userUuid = this.userUuid$.getValue();\n            this.setDataDirtyOrWeHaveLock(\n                lockStatus.lockedByUserUuid == userUuid,\n            );\n\n            if (lockStatus.liveUpdateDataFromDelegateUuid != this.uuid) {\n                this.data$.next(lockStatus.liveUpdateDataTuple);\n            }\n            this.lockExpires$.next(lockStatus.lockAutoExpireDate);\n        } else {\n            console.log(\n                \"TupleDataLoaderDelegate:\" +\n                    \" processLockStatus received UNLOCK from server\",\n            );\n            this.resetDataDirtyOrWeHaveLock();\n            this.lockExpires$.next(null);\n        }\n    }\n\n    /**\n     * Validates the form and throws an error if it is\n     * incomplete or contains errors.\n     *\n     * @throws {TupleDataNotValidError} If the form is incomplete\n     * or contains errors.\n     *\n     * @return {void}\n     */\n    validateForm(): void {\n        const formGroup = this.formGroup;\n        if (formGroup == null) {\n            return;\n        }\n\n        // These updates are debounced, ensure we have the latest data in the\n        // tuple\n        this.synchroniseFormGroupToDataTuple(formGroup);\n\n        if (formGroup.valid) {\n            return;\n        }\n\n        Object.values(formGroup.controls).forEach((control) => {\n            if (control.invalid) {\n                control.markAsDirty();\n                control.updateValueAndValidity({\n                    onlySelf: true,\n                });\n            }\n        });\n        throw new TupleDataNotValidError(\n            \"Form Incomplete: Please fix the errors and resubmit.\",\n        );\n    }\n\n    /*\n     * Store the data by calling the `storeData` method of the backend delegate\n     * */\n    async create(withAnimationDelay = true): Promise<void> {\n        if (this.selector != null) {\n            throw new Error(\"CREATE requires selector to be null\");\n        }\n\n        if (this._dataLoader == null) {\n            console.log(\"store called after destroy\");\n            return;\n        }\n\n        const startDateMs = new Date().getMilliseconds();\n\n        try {\n            this.ready = false;\n            this.storing = true;\n\n            // Ensure the form group is synchronised to the tuple and valid\n            this.validateForm();\n\n            await this._dataLoader.create(this);\n        } finally {\n            await this.animationDelay(withAnimationDelay, startDateMs);\n            this.storing = false;\n            this.ready = true;\n        }\n    }\n\n    /*\n     * Store the data by calling the `storeData` method of the backend delegate\n     * */\n    async store(withAnimationDelay = true): Promise<void> {\n        if (this.selector == null) {\n            throw new Error(\"STORE requires a selector\");\n        }\n\n        if (this._dataLoader == null) {\n            console.log(\"store called after destroy\");\n            return;\n        }\n\n        const startDateMs = new Date().getMilliseconds();\n\n        try {\n            this.ready = false;\n            this.storing = true;\n\n            // Ensure the form group is synchronised to the tuple and valid\n            this.validateForm();\n\n            await this._dataLoader.store(this);\n        } finally {\n            await this.animationDelay(withAnimationDelay, startDateMs);\n            this.storing = false;\n            this.ready = true;\n        }\n    }\n\n    /*\n     * Load the last saved data ignoring any live values using `loadData`\n     * Use this method for when the user hasn't clicked the revert button\n     * themselves.\n     * */\n    async load(withAnimationDelay = true): Promise<void> {\n        if (this.selector == null) {\n            throw new Error(\"LOAD requires a selector\");\n        }\n\n        if (this._dataLoader == null) {\n            console.log(\"load called after destroy\");\n            return;\n        }\n\n        const startDateMs = new Date().getMilliseconds();\n        try {\n            this.ready = false;\n            await this._dataLoader.load(this);\n        } finally {\n            await this.animationDelay(withAnimationDelay, startDateMs);\n            this.ready = true;\n        }\n    }\n\n    /*\n     * Do the same as load, but also emit the loading$ indicator\n     * Use this method for calls from revert buttons.\n     *\n     * Why is this different?\n     * We want to see the ready$ indicator showing the data load with\n     * an animation delay, but it looks weird having the Revert button\n     * spinning while it's happening.\n     * */\n    async revert(withAnimationDelay = true): Promise<void> {\n        try {\n            this.loading = true;\n            await this.load(withAnimationDelay);\n        } finally {\n            this.loading = false;\n        }\n    }\n\n    /*\n     * Delete the data referenced by the current `selector$.selector`. Will call\n     * the `deleteData` method of the backend delegate.\n     * */\n    async delete(withAnimationDelay = true): Promise<void> {\n        if (this.selector == null) {\n            throw new Error(\"DELETE requires a selector\");\n        }\n\n        if (this._dataLoader == null) {\n            console.log(\"delete called after destroy\");\n            return;\n        }\n\n        const startDateMs = new Date().getMilliseconds();\n        try {\n            this.ready = false;\n            this.deleting = true;\n            await this._dataLoader.delete(this);\n            this.data$.next(null);\n            this.selector$.next(null);\n        } finally {\n            await this.animationDelay(withAnimationDelay, startDateMs);\n            this.deleting = false;\n            this.ready = true;\n        }\n    }\n\n    /*\n     * Notify the backend that the data has been started to be edited and should\n     * be locked\n     * */\n    private async lockForEditing(): Promise<void> {\n        if (this.selector == null) {\n            // If there is no selector, don't lock the data\n            // this is the state for creating\n            return;\n        }\n\n        if (this._dataLoader == null) {\n            console.log(\"startEditing called after destroy\");\n            return;\n        }\n\n        await this._dataLoader.lock(this);\n    }\n}\n","import { Tuple } from \"../Tuple\";\nimport { FormGroup } from \"@angular/forms\";\n\nexport abstract class TupleDataLoaderTupleABC extends Tuple {\n    protected constructor(tupleName: string) {\n        super(tupleName);\n    }\n\n    /**\n     * Creates a new instance of FormGroup to enable ReactiveForms validation.\n     *\n     *\n     * @return {FormGroup} - The newly created FormGroup\n     *                       instance, or null of formGroup validation is\n     *                       not required.\n     */\n    createFormGroup(): FormGroup | null {\n        return null;\n    }\n\n    /**\n     * Update the form group with the given changes.\n     *\n     * If createFormGroup returns null, this method\n     * will never be called.\n     *\n     * @param {object} changes - The changes to apply to the form group.\n     * @return {boolean} - Returns a boolean value indicating if\n     * there were differences to update.\n     */\n    updateFromFormGroup(changes: {}): boolean | null {\n        return null;\n    }\n\n    /**\n     * Update the validation of a form group.\n     *\n     * This will be called when data in the form group changes, and after those\n     * changes have been synchronised to this data tuple.\n     *\n     * Updates of any kind must be made to the formGroup controls.\n     *\n     * Value reads may be performed on either this tuple or the formGroyp as\n     * both values should be identical. If they arn't then there is a bug in\n     * your updateTupleFromFormGroup call.\n     *\n     * Example: Disable one control based on the value of another control\n     *  being null.\n     *\n     * ```\n     * if (formGroup.get('control_1').value == null) {\n     *   formGroup.get('control_2').disable();\n     * } else {\n     *   formGroup.get('control_2').enable();\n     * }\n     * ```\n     *\n     * @param {FormGroup} formGroup - The form group to update validation for.\n     *\n     * @return {void}\n     */\n    updateValidation(formGroup: FormGroup): void {}\n\n    /**\n     * Updates the values of a FormGroup with the values from a given tuple.\n     *\n     * This method is unused at present.\n     *\n     * @param {FormGroup} formGroup - The FormGroup to be updated.\n     * @param {any} tuple - The tuple containing the updated values.\n     *\n     * @return {void}\n     */\n    static updateTupleToFormGroup(formGroup: FormGroup, tuple: any): void {\n        formGroup.patchValue(tuple);\n    }\n\n    /**\n     * Updates the values of a tuple based on the provided changes object.\n     * Recursively updates nested objects.\n     *\n     * Example:\n     * ```\n     *         return TupleDataLoaderTupleABC.updateTupleFromFormGroup(\n     *             changes,\n     *             this.step,\n     *             {\n     *                 parameterMap: StepParameterMappingUiTuple,\n     *                 links: StepGroupSubStepLinkUiTuple,\n     *                 makoFileNames: null,\n     *                 makoParameters: StepPushDesignFileCompiledParamUiTuple,\n     *             },\n     *         );\n     * ```\n     *\n     * @param changes - The changes object containing a deep stricture of the\n     * updated values.\n     * @param tuple - The tuple to be updated.\n     * @param TupleTypeByFieldName - The dictionary mapping field names to\n     * tuple types.\n     * @return {boolean} - Returns true if any changes were found and\n     * applied, false otherwise.\n     * @throws {Error} - Throws an error if no TupleTypeByFieldName entry is\n     * found for an array.\n     */\n    static updateTupleFromFormGroup(\n        changes: {},\n        tuple: Tuple,\n        TupleTypeByFieldName: {} = {},\n    ): boolean {\n        if (tuple == null) {\n            return;\n        }\n        let changesFound = false;\n        for (const key of Object.keys(changes)) {\n            if (Array.isArray(changes[key])) {\n                const changesArray = changes[key];\n                let tupleArray = tuple[key];\n                if (tupleArray?.length !== changesArray.length) {\n                    changesFound = true;\n                    console.log(\n                        `updateTupleFromFormGroup: Key '${key}', ` +\n                            ` found different array sizes` +\n                            ` tuple=${tupleArray?.length}` +\n                            ` form=${changesArray?.length}`,\n                    );\n                }\n\n                const TupleType = TupleTypeByFieldName[key];\n                if (TupleType === undefined) {\n                    throw new Error(\n                        `No TupleTypeByFieldName entry for` + ` field ${key}`,\n                    );\n                }\n\n                // null means just use the value, like string[]\n                if (TupleType === null) {\n                    if (\n                        JSON.stringify(tupleArray) !==\n                        JSON.stringify(changesArray)\n                    ) {\n                        changesFound = true;\n                        console.log(\n                            `updateTupleFromFormGroup: Key '${key}', ` +\n                                ` found different values in scalar array` +\n                                ` tuple=${JSON.stringify(tupleArray)}` +\n                                ` form=${JSON.stringify(changesArray)}`,\n                        );\n                    }\n\n                    tuple[key] = changes[key];\n                    continue;\n                }\n\n                if (!Array.isArray(tupleArray)) {\n                    tupleArray = [];\n                    tuple[key] = tupleArray;\n                }\n\n                while (tupleArray.length > changesArray.length) {\n                    tupleArray.pop();\n                }\n                while (tupleArray.length < changesArray.length) {\n                    tupleArray.push(new TupleType());\n                }\n                for (let i = 0; i < changesArray.length; i++) {\n                    changesFound =\n                        changesFound ||\n                        this.updateTupleFromFormGroup(\n                            changesArray[i],\n                            tupleArray[i],\n                            TupleTypeByFieldName,\n                        );\n                }\n                continue;\n            }\n\n            if (tuple[key] !== changes[key]) {\n                changesFound = true;\n                console.log(\n                    `updateTupleFromFormGroup: Key '${key}', ` +\n                        ` found different values ` +\n                        ` tuple=${tuple[key]}` +\n                        ` form=${changes[key]}`,\n                );\n                tuple[key] = changes[key];\n                // noinspection UnnecessaryContinueJS\n                continue;\n            }\n        }\n\n        return changesFound;\n    }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["now"],"mappings":"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"}