{"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/VortexStatusService.ts","../../src/vortex/VortexClientState.ts","../../src/vortex/VortexConnectionCheckReason.ts","../../src/vortex/TokenMaintainPolicy.ts","../../src/vortex/VortexClientOAuth.ts","../../src/vortex/network-state/NetworkStateABC.ts","../../src/vortex/network-state/NetworkStateBrowser.ts","../../src/vortex/network-state/NetworkStateCapacitor.ts","../../src/vortex/network-state/NetworkStateFactory.ts","../../src/vortex/websocket/WebsocketABC.ts","../../src/vortex/websocket/WebsocketBrowser.ts","../../src/vortex/websocket/WebsocketCapacitor.ts","../../src/vortex/websocket/WebsocketFactory.ts","../../src/util/PromiseSemaphore.ts","../../src/vortex/VortexClient.ts","../../src/vortex/TupleLoader.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 */\nimport { HttpHeaders } from \"@angular/common/http\";\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 */\n// Generate an RFC4122-ish v4 UUID string. Relocated here from VortexClientABC so\n// consumers (PayloadResponse, TupleDataLoaderDelegate, VortexClient) don't have\n// to depend on a connection-client class just to make a uuid.\nexport function makeUuid(): string {\n    function func(c: string): string {\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\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 * Convert Angular HttpHeaders into a plain dict suitable for native plugins\n * and Capacitor HTTP. Null/undefined values are dropped (they cause problems\n * with some native layers and produce ugly \"Authorization: null\" headers).\n */\nexport function headersToDict(headers: HttpHeaders): Record<string, string> {\n    const dict: Record<string, string> = {};\n    for (const key of headers.keys()) {\n        const val = headers.get(key);\n        if (val != null) {\n            dict[key] = val;\n        }\n    }\n    return dict;\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: (left: T, right: T) => 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 (\n        objectOrArray: Array<any> | any,\n    ): Array<any> {\n        if (objectOrArray == null) return this;\n\n        if (objectOrArray instanceof Array) {\n            return this.diff(objectOrArray);\n        } else {\n            let index = this.indexOf(objectOrArray);\n            if (index !== -1) this.splice(index, 1);\n            return this;\n        }\n    };\n}\n\nif (Array.prototype.add == null) {\n    Array.prototype.add = function (\n        objectOrArray: Array<any> | any,\n    ): Array<any> {\n        if (objectOrArray == null) 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(\n                \"Array.add, I was passed myself, i can't add my self to myself.\",\n            );\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) return false;\n\n        // compare object instances\n        if (this === array) return true;\n\n        // compare lengths - can save a lot of time\n        if (this.length !== array.length) 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])) return false;\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        return true;\n    };\n}\n\nif (Array.prototype.bubbleSort == null) {\n    Array.prototype.bubbleSort = function (\n        compFunc: (left: any, right: any) => number,\n    ): Array<any> {\n        let self = this;\n\n        function merge(left, right) {\n            let result = [];\n\n            while (left.length && right.length) {\n                if (compFunc(left[0], right[0]) <= 0) {\n                    result.push(left.shift());\n                } else {\n                    result.push(right.shift());\n                }\n            }\n\n            while (left.length) result.push(left.shift());\n\n            while (right.length) result.push(right.shift());\n\n            return result;\n        }\n\n        if (self.length < 2) 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) from += len;\n\n        for (; from < len; from++) {\n            if (from in this && this[from] === item) 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) 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    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","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(stringToFind: string, stringToReplace: string): 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 (match, num) {\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).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\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","import { Inject, Injectable, NgZone } from \"@angular/core\";\nimport { BehaviorSubject, combineLatest, Observable, Subject } from \"rxjs\";\nimport { map } from \"rxjs/operators\";\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    // True while an interactive OAuth login flow is in progress.\n    oAuthInProgress: boolean;\n}\n\n/**\n * Enum representing the different states of the Vortex application.\n * Disabled: The vortex if offline and disconnected\n * Reconnecting: The vortex is not online, but is in the reconnecting state\n * machine.\n * Online: The websocket is online and connected\n * NoNetwork: The network is offline\n * NetworkOnlineNoWebsocketResource:\n *     The HTTP service is online, but not serving the websocket upgrades\n *     (e.g. 404 or other 4xx, or a 2xx that isn't our resource).\n * NetworkOnlineProxyBadGateway:\n *     The HTTP gateway answered with 5xx — the backend is down or unreachable\n *     (e.g. App Proxy BadGateway while peek_field is stopped).\n * NetworkOnlineLoginRequired:\n *     The HTTP service is online but redirecting to a login page (the session\n *     has expired). Interactive or silent re-authentication is required;\n *     reconnecting with the same headers is futile.\n * Connecting: A socket open is actively in flight (dialing right now), as\n *     distinct from Reconnecting which covers waiting/idle between retries.\n * PausedForAuth: The socket is intentionally closed while an interactive OAuth\n *     login (webview/redirect) is in flight. Background reconnects/probes are\n *     suppressed for the duration; not a failure, so no \"Reconnect\" affordance.\n *\n * NOTE: values are baked into each app's separately-built node_modules copy.\n * Only ever APPEND new states (never insert) so existing numeric mappings stay\n * stable for consumers that have not yet rebuilt.\n */\nexport enum VortexStateEnum {\n    Disabled = 1,\n    Reconnecting,\n    Online,\n    NoNetwork,\n    NetworkOnlineNoWebsocketResource,\n    NetworkOnlineLoginRequired,\n    Connecting,\n    PausedForAuth,\n    NetworkOnlineProxyBadGateway,\n}\n\n@Injectable({\n    providedIn: \"root\",\n})\nexport class VortexStatusService {\n    private readonly _websocketState$ = new BehaviorSubject<VortexStateEnum>(\n        VortexStateEnum.NoNetwork,\n    );\n    private readonly _isOnline$ = new BehaviorSubject<boolean>(false);\n    // True while an interactive OAuth login flow is in progress (the websocket\n    // is paused for it). A first-class event so the login UI and the PWA updater\n    // can react to \"OAuth is happening\" independently of the connection state.\n    private readonly _oAuthInProgress$ = new BehaviorSubject<boolean>(false);\n    private readonly _reconnectingInSeconds$ = new BehaviorSubject<\n        number | null\n    >(null);\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\n    constructor(@Inject(NgZone) private zone: NgZone) {}\n\n    get snapshot(): VortexStatusServiceSnapshot {\n        return {\n            isOnline: this.websocketState == VortexStateEnum.Online,\n            queuedActionCount: this.lastQueuedTupleActions,\n            oAuthInProgress: this._oAuthInProgress$.getValue(),\n        };\n    }\n\n    get websocketState(): VortexStateEnum {\n        return this._websocketState$.getValue();\n    }\n\n    get websocketStateObservable(): Observable<VortexStateEnum> {\n        return this._websocketState$.asObservable();\n    }\n\n    get isOnline(): Observable<boolean> {\n        return this._isOnline$.asObservable();\n    }\n\n    // Current OAuth-in-progress flag (sync) and its observable.\n    get oAuthInProgress(): boolean {\n        return this._oAuthInProgress$.getValue();\n    }\n\n    get oAuthInProgress$(): Observable<boolean> {\n        return this._oAuthInProgress$.asObservable();\n    }\n\n    get reconnectingInSeconds$(): Observable<number | null> {\n        return this._reconnectingInSeconds$.asObservable();\n    }\n\n    // The single, human-readable connection status string — the state's label\n    // plus the retry countdown suffix when one is armed (e.g. \"Reconnecting\n    // (5s)\"). The one place that maps VortexStateEnum to display text, so every\n    // app shows identical wording.\n    get statusLabel$(): Observable<string> {\n        return combineLatest([\n            this._websocketState$,\n            this._reconnectingInSeconds$,\n        ]).pipe(map(([state, seconds]) => this.statusLabelFor(state, seconds)));\n    }\n\n    statusLabelFor(state: VortexStateEnum, seconds: number | null): string {\n        const label = VortexStatusService._stateLabel(state);\n        return seconds != null ? `${label} (${seconds}s)` : label;\n    }\n\n    private static _stateLabel(state: VortexStateEnum): string {\n        switch (state) {\n            case VortexStateEnum.NoNetwork:\n                return \"No network\";\n            case VortexStateEnum.PausedForAuth:\n                return \"Signing in…\";\n            case VortexStateEnum.Connecting:\n                return \"Connecting…\";\n            case VortexStateEnum.Reconnecting:\n                return \"Reconnecting\";\n            case VortexStateEnum.NetworkOnlineNoWebsocketResource:\n                return \"Server unavailable\";\n            case VortexStateEnum.NetworkOnlineProxyBadGateway:\n                return \"Bad gateway\";\n            case VortexStateEnum.NetworkOnlineLoginRequired:\n                return \"Login required\";\n            default:\n                return \"Offline\";\n        }\n    }\n\n    // Set by VortexClient's retry countdown to drive the \"(Ns)\" suffix on\n    // statusLabel$. A number arms the countdown; null clears it.\n    setReconnectingInSeconds(seconds: number | null) {\n        this._reconnectingInSeconds$.next(seconds);\n    }\n\n    // Set by VortexClient around the interactive-login (OAuth-pause) window.\n    setOAuthInProgress(value: boolean) {\n        if (this._oAuthInProgress$.getValue() !== value) {\n            logDebug(\n                dateStr() + `VortexStatusService.setOAuthInProgress = ${value}`,\n            );\n            this._oAuthInProgress$.next(value);\n        }\n    }\n\n    setVortexState(state: VortexStateEnum) {\n        logDebug(\n            dateStr() +\n                \"VortexStatusService.setWebsocketState \" +\n                ` old state = ${this.websocketState}` +\n                ` new state = ${state}`,\n        );\n\n        // Don't let a stale in-flight attempt clobber NoNetwork. A redial\n        // (Reconnecting) or an active socket open (Connecting) must not flip a\n        // correct \"No network\" away; only Online may override NoNetwork.\n        if (\n            this.websocketState === VortexStateEnum.NoNetwork &&\n            (state === VortexStateEnum.Reconnecting ||\n                state === VortexStateEnum.Connecting)\n        ) {\n            logDebug(\n                dateStr() +\n                    \"VortexStatusService.setWebsocketState skipping change from\" +\n                    ` NoNetwork to ${state}`,\n            );\n        } else {\n            this._websocketState$.next(state);\n        }\n\n        const isOnline = state === VortexStateEnum.Online;\n        if (this._isOnline$.getValue() !== isOnline) {\n            this._isOnline$.next(isOnline);\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.queuedActionCount.next(count);\n    }\n\n    logDebug(message: string) {\n        logDebug(dateStr() + \"Vortex Status - debug: \" + message);\n        this.debug.next(message);\n    }\n\n    logInfo(message: string) {\n        logInfo(dateStr() + \"Vortex Status - info: \" + message);\n        this.info.next(message);\n    }\n\n    logWarning(message: string) {\n        logWarning(dateStr() + \"Vortex Status - warning: \" + message);\n        this.warning.next(message);\n    }\n\n    logError(message: string) {\n        logError(dateStr() + \"Vortex Status - error: \" + message);\n        this.errors.next(message);\n    }\n}\n","import { VortexStateEnum, VortexStatusService } from \"./VortexStatusService\";\n\n// The lifecycle state of one logical vortex client.\nexport enum VortexClientStateE {\n    Idle,\n    Connecting,\n    Online,\n    Closing,\n    Closed,\n    PausedForAuth,\n}\n\n// The logical-connection state machine, extracted from the old VortexClientABC\n// so the VortexClient coordinator does not carry it inline. Each transition sets\n// the local state AND pushes the matching VortexStateEnum onto\n// VortexStatusService. It knows nothing about sockets, timers, or auth — purely\n// state + status — so the connection sequencing is easy to follow in one place.\n//\n// Note: the broader status values (NoNetwork / NetworkOnlineNoWebsocketResource\n// / NetworkOnlineProxyBadGateway / NetworkOnlineLoginRequired) are NOT lifecycle\n// states; VortexClient pushes\n// those onto VortexStatusService directly during connectionCheck.\nexport class VortexClientState {\n    private _state: VortexClientStateE = VortexClientStateE.Idle;\n    private _isShutdown: boolean = false;\n\n    constructor(private vortexStatusService: VortexStatusService) {}\n\n    get state(): VortexClientStateE {\n        return this._state;\n    }\n\n    get isConnecting(): boolean {\n        return this._state === VortexClientStateE.Connecting;\n    }\n\n    get isOnline(): boolean {\n        return this._state === VortexClientStateE.Online;\n    }\n\n    get isClosing(): boolean {\n        return this._state === VortexClientStateE.Closing;\n    }\n\n    get isClosed(): boolean {\n        return this._state === VortexClientStateE.Closed;\n    }\n\n    get isPausedForAuth(): boolean {\n        return this._state === VortexClientStateE.PausedForAuth;\n    }\n\n    get isShutdown(): boolean {\n        return this._isShutdown;\n    }\n\n    // Going Idle starts a fresh (re)connect attempt, so it also clears a prior\n    // shutdown — the client persists and can be revived by reconnect().\n    setIdle(): void {\n        this._state = VortexClientStateE.Idle;\n        this._isShutdown = false;\n    }\n\n    setConnecting(): void {\n        this._state = VortexClientStateE.Connecting;\n        this.vortexStatusService.setVortexState(VortexStateEnum.Connecting);\n    }\n\n    setOnline(): void {\n        this._state = VortexClientStateE.Online;\n        this.vortexStatusService.logDebug(\"Vortex Online\");\n        this.vortexStatusService.setVortexState(VortexStateEnum.Online);\n    }\n\n    setClosing(): void {\n        this._state = VortexClientStateE.Closing;\n        this.vortexStatusService.setVortexState(VortexStateEnum.Reconnecting);\n    }\n\n    setClosed(): void {\n        this._state = VortexClientStateE.Closed;\n        this.vortexStatusService.setVortexState(\n            this._isShutdown\n                ? VortexStateEnum.Disabled\n                : VortexStateEnum.Reconnecting,\n        );\n    }\n\n    // The socket is closed on purpose while an interactive OAuth login runs.\n    // Distinct from setClosed() so the UI shows \"Signing in…\" (no retry button)\n    // instead of \"Reconnecting\" during the login webview/redirect.\n    setPausedForAuth(): void {\n        this._state = VortexClientStateE.PausedForAuth;\n        this.vortexStatusService.setVortexState(VortexStateEnum.PausedForAuth);\n    }\n\n    setShutdown(): void {\n        this._isShutdown = true;\n    }\n}\n","// connectionCheck(reason) trigger names.\nexport enum VortexConnectionCheckReasonE {\n    AppResume = \"app-resume\",\n    AuthProviderRegistered = \"auth-provider-registered\",\n    Retry = \"retry\",\n    NetworkChange = \"network-change\",\n    ServerClosed = \"server-closed\",\n    AppResumeNoValidToken = \"app-resume-no-valid-token\",\n    AppResumeRefreshFailed = \"app-resume-refresh-failed\",\n    ScheduledRefreshFailed = \"scheduled-refresh-failed\",\n    UserRequest = \"user-request\",\n}\n","// How maintainAuthToken() should obtain/refresh the bearer token.\nexport enum TokenMaintainPolicyE {\n    // 90% timer or login-redirect silent step — always refresh + apply.\n    ForceSilentRefresh,\n    // Probe/connect — use getValidToken(); apply if the socket header is stale.\n    ValidOrRefreshIfExpired,\n    // App resume — refresh if >50% of issued lifetime has elapsed.\n    RefreshIfPastHalfLife,\n}\n\n// What maintainAuthToken() did (or why it stopped).\nexport enum TokenMaintainResultE {\n    Applied,\n    Unchanged,\n    LoginRequired,\n    RefreshFailed,\n}\n","import { HttpHeaders } from \"@angular/common/http\";\nimport { VortexStatusService } from \"./VortexStatusService\";\nimport { VortexAuthProvider, VortexAuthToken } from \"./auth/VortexAuthProvider\";\nimport { VortexConnectionCheckReasonE } from \"./VortexConnectionCheckReason\";\nimport {\n    TokenMaintainPolicyE,\n    TokenMaintainResultE,\n} from \"./TokenMaintainPolicy\";\n\n// What run() resolved to, so VortexClient knows whether to schedule a re-probe.\nexport enum VortexOAuthResultE {\n    // A token was obtained and applied (a reconnect is in flight via the host).\n    Authenticated,\n    // Could not authenticate this round (silent refresh failed and interactive\n    // login was backed-off or failed). The caller should re-probe shortly.\n    RetryLater,\n}\n\n// The narrow seam back to VortexClient. Keeps VortexClientOAuth from importing\n// or depending on VortexClient — the interactive-login ordering stays auditable\n// in run() alone.\nexport interface VortexOAuthHost {\n    // Quiesce the socket (close + suppress background activity) before the\n    // interactive webview/redirect; awaited so no socket is in flight.\n    pauseSocket(): Promise<void>;\n    // Resume background activity after the interactive flow settles.\n    resumeSocket(): void;\n    // Apply a fresh bearer header and (re)connect with it immediately.\n    applyAuthHeader(header: HttpHeaders): Promise<void>;\n    // Ask the client to re-run its probe → classify → act check.\n    requestConnectionCheck(reason: VortexConnectionCheckReasonE): void;\n}\n\n// Owns the whole product-agnostic OAuth flow for one VortexClient: the\n// VortexAuthProvider, the silent-refresh timer, the interactive-login cooldown,\n// and turning a token into a bearer header. VortexClient constructs this and\n// awaits run() when the probe says login is required. It drives the socket only\n// through the VortexOAuthHost hooks.\nexport class VortexClientOAuth {\n    // Minimum gap between interactive-login (webview/redirect) attempts, so a\n    // failing login is not re-popped on every retry while the cheap probe +\n    // silent refresh keep trying.\n    private readonly INTERACTIVE_LOGIN_BACKOFF_MS = 5000;\n\n    // Scheduled refresh fires after this fraction of the remaining lifetime to\n    // expiresAt (which the app already pads 30s early).\n    private static readonly REFRESH_SCHEDULE_FRACTION = 0.9;\n    // App-resume: refresh immediately once this fraction of the issued lifetime\n    // has elapsed.\n    private static readonly REFRESH_NOW_LIFETIME_FRACTION = 0.5;\n    // Must match VortexOAuth2Service.parseResponse early-expiry padding.\n    private static readonly TOKEN_EXPIRY_EARLY_BUFFER_MS = 30_000;\n\n    private _refreshTimerId: ReturnType<typeof setTimeout> | null = null;\n    private _interactiveLoginCooldownUntil = 0;\n    private _handlingLoginRequired = false;\n    private _lastAppliedAccessToken: string | null = null;\n\n    constructor(\n        private vortexStatusService: VortexStatusService,\n        private authProvider: VortexAuthProvider,\n        private host: VortexOAuthHost,\n    ) {}\n\n    get isEnabled(): boolean {\n        return this.authProvider != null && this.authProvider.isEnabled;\n    }\n\n    // The bearer header for a currently-valid token, or null if interactive\n    // login is required. No socket side-effect — probe seeding on cold start.\n    async currentAuthHeader(): Promise<HttpHeaders | null> {\n        const token = await this.authProvider.getValidToken();\n        return token == null ? null : this.authHeaderFromToken(token);\n    }\n\n    // Single entry for silent token maintenance. Refreshes per policy, applies\n    // the bearer header when it changed, arms the 90% timer after apply.\n    async maintainAuthToken(\n        policy: TokenMaintainPolicyE,\n    ): Promise<TokenMaintainResultE> {\n        if (!this.isEnabled || this._handlingLoginRequired) {\n            return TokenMaintainResultE.Unchanged;\n        }\n\n        // 90% timer: pull a brand-new token regardless of the current one.\n        if (policy === TokenMaintainPolicyE.ForceSilentRefresh) {\n            return this._refreshAndApply();\n        }\n\n        // Probe/connect and app-resume both start from the cached (or\n        // silently-refreshed-if-expired) token.\n        const token = await this.authProvider.getValidToken();\n        if (token == null) {\n            return TokenMaintainResultE.LoginRequired;\n        }\n\n        // App-resume only: a token already on the socket that has burned past\n        // half its issued lifetime gets refreshed now, ahead of the 90% timer.\n        if (\n            policy === TokenMaintainPolicyE.RefreshIfPastHalfLife &&\n            token.token === this._lastAppliedAccessToken &&\n            VortexClientOAuth.isPastLifetimeFraction(\n                token,\n                VortexClientOAuth.REFRESH_NOW_LIFETIME_FRACTION,\n            )\n        ) {\n            return this._refreshAndApply();\n        }\n\n        // Otherwise just ensure the current valid token is on the socket.\n        return this._applyTokenIfChanged(token);\n    }\n\n    // Server is reachable but gating us behind login. Silent refresh first; if\n    // that fails, raise the interactive login — at most once per\n    // INTERACTIVE_LOGIN_BACKOFF_MS. Deduped so two triggers can't drive two\n    // interactive logins at once.\n    async run(\n        reason: VortexConnectionCheckReasonE,\n    ): Promise<VortexOAuthResultE> {\n        if (!this.isEnabled) {\n            return VortexOAuthResultE.RetryLater;\n        }\n        if (this._handlingLoginRequired) {\n            this.vortexStatusService.logDebug(\n                `VortexClientOAuth.run (${reason}) skipped — already handling`,\n            );\n            return VortexOAuthResultE.RetryLater;\n        }\n        this._handlingLoginRequired = true;\n        try {\n            // Silent refresh first (no UI). Call _refreshAndApply directly —\n            // routing via maintainAuthToken would no-op, since we have already\n            // set _handlingLoginRequired above.\n            if (\n                (await this._refreshAndApply()) === TokenMaintainResultE.Applied\n            ) {\n                return VortexOAuthResultE.Authenticated;\n            }\n\n            // Silent refresh didn't get us a token — fall through to the\n            // interactive login, gated by the cooldown.\n            const now = Date.now();\n            if (now < this._interactiveLoginCooldownUntil) {\n                this.vortexStatusService.logDebug(\n                    \"VortexClientOAuth.run: interactive-login backoff active;\" +\n                        \" retry later\",\n                );\n                return VortexOAuthResultE.RetryLater;\n            }\n            this._interactiveLoginCooldownUntil =\n                now + this.INTERACTIVE_LOGIN_BACKOFF_MS;\n\n            try {\n                await this.host.pauseSocket();\n                const token = await this.authProvider.interactiveLogin();\n                this.host.resumeSocket();\n                await this._applyAuthToken(token);\n                return VortexOAuthResultE.Authenticated;\n            } catch (e) {\n                this.vortexStatusService.logDebug(\n                    `VortexClientOAuth.run: interactive login failed — ${e}`,\n                );\n                this.vortexStatusService.logWarning(\n                    \"Sign-in failed. Try again.\",\n                );\n                return VortexOAuthResultE.RetryLater;\n            } finally {\n                this.host.resumeSocket();\n            }\n        } finally {\n            this._handlingLoginRequired = false;\n        }\n    }\n\n    // Cancel any pending refresh timer (on disconnect/shutdown).\n    clearRefreshTimer(): void {\n        if (this._refreshTimerId != null) {\n            clearTimeout(this._refreshTimerId);\n            this._refreshTimerId = null;\n        }\n    }\n\n    private authHeaderFromToken(token: VortexAuthToken): HttpHeaders {\n        return new HttpHeaders({ Authorization: `Bearer ${token.token}` });\n    }\n\n    private async _applyAuthToken(token: VortexAuthToken): Promise<void> {\n        await this.host.applyAuthHeader(this.authHeaderFromToken(token));\n        this._lastAppliedAccessToken = token.token;\n        this.scheduleRefreshTimer(token.expiresAt);\n    }\n\n    // THE silent refresh: pull a brand-new token from the provider and apply\n    // it. Every \"it's time to refresh\" decision funnels through here.\n    private async _refreshAndApply(): Promise<TokenMaintainResultE> {\n        try {\n            const token = await this.authProvider.refresh();\n            this.vortexStatusService.logDebug(\n                \"VortexClientOAuth: silent token refresh succeeded\",\n            );\n            await this._applyAuthToken(token);\n            return TokenMaintainResultE.Applied;\n        } catch (e) {\n            this.vortexStatusService.logDebug(\n                `VortexClientOAuth: silent token refresh failed — ${e}`,\n            );\n            return TokenMaintainResultE.RefreshFailed;\n        }\n    }\n\n    // Put a known-valid token on the socket only if it differs from the one\n    // already applied (avoids a redundant reconnect + timer reschedule).\n    private async _applyTokenIfChanged(\n        token: VortexAuthToken,\n    ): Promise<TokenMaintainResultE> {\n        if (token.token === this._lastAppliedAccessToken) {\n            return TokenMaintainResultE.Unchanged;\n        }\n        await this._applyAuthToken(token);\n        return TokenMaintainResultE.Applied;\n    }\n\n    private static isPastLifetimeFraction(\n        token: VortexAuthToken,\n        fraction: number,\n    ): boolean {\n        if (\n            token.expiresAt == null ||\n            token.lifetimeMs == null ||\n            token.lifetimeMs <= 0\n        ) {\n            return false;\n        }\n        const remainingMs = Math.max(\n            0,\n            token.expiresAt.getTime() -\n                Date.now() +\n                VortexClientOAuth.TOKEN_EXPIRY_EARLY_BUFFER_MS,\n        );\n        return remainingMs <= token.lifetimeMs * (1 - fraction);\n    }\n\n    // Schedule a silent token refresh after 90% of the remaining lifetime.\n    private scheduleRefreshTimer(expiresAt: Date | null): void {\n        this.clearRefreshTimer();\n        if (expiresAt == null || isNaN(expiresAt.getTime())) {\n            return;\n        }\n        const fraction = VortexClientOAuth.REFRESH_SCHEDULE_FRACTION;\n        const ms = Math.max(\n            (expiresAt.getTime() - Date.now()) * fraction,\n            1000,\n        );\n        this.vortexStatusService.logDebug(\n            `VortexClientOAuth: scheduling token refresh in ${(\n                ms /\n                1000 /\n                60\n            ).toFixed(1)} min (${(fraction * 100).toFixed(0)}% of remaining)`,\n        );\n        this._refreshTimerId = setTimeout(() => {\n            this._refreshTimerId = null;\n            this._onScheduledRefreshTimer().catch((e) =>\n                this.vortexStatusService.logDebug(\n                    `VortexClientOAuth scheduled refresh failed ${e}`,\n                ),\n            );\n        }, ms);\n    }\n\n    private async _onScheduledRefreshTimer(): Promise<void> {\n        const result = await this.maintainAuthToken(\n            TokenMaintainPolicyE.ForceSilentRefresh,\n        );\n        if (result === TokenMaintainResultE.RefreshFailed) {\n            this.host.requestConnectionCheck(\n                VortexConnectionCheckReasonE.ScheduledRefreshFailed,\n            );\n        }\n    }\n}\n","import type { WebsocketLogger } from \"../websocket/WebsocketABC\";\n\n// The classified result of a side-channel network-state probe. run() never\n// throws for these outcomes — it returns one so the caller can decide.\n//\n//  - WebSocketAvailable  : the server answered and the resource is there (2xx).\n//                          Safe to (re)connect.\n//  - Offline             : no HTTP response at all — the OS reports no\n//                          connectivity, or the request timed out / DNS-failed /\n//                          was refused. The server could not be reached.\n//  - NoWebSocketResource : the server answered with a client error (4xx other\n//                          than auth codes). Reachable, but not our resource.\n//  - ProxyBadGateway     : the App Proxy (or gateway) answered with 5xx — the\n//                          backend is down or unreachable behind the proxy.\n//  - LoginRedirect       : a reachable server is gating us behind auth — an\n//                          opaque/explicit redirect to a login page, or\n//                          401 / 403 / 419. Interactive (or silent) re-auth is\n//                          required; reconnecting with the same headers is futile.\nexport enum NetworkStateE {\n    WebSocketAvailable,\n    Offline,\n    NoWebSocketResource,\n    LoginRedirect,\n    ProxyBadGateway,\n}\n\n// The single in-flight connection-test, shared across all NetworkStateABC\n// instances so overlapping triggers (heartbeat-timeout, socket-close, the\n// retry timer, a network-change edge, \"Reconnect now\") collapse onto ONE\n// network request instead of stampeding. Not exported — purely an\n// implementation detail of NetworkStateABC.run().\n//\n// It owns ONE shared deferred. Every run() caller gets a fresh derived promise\n// off it (so a .then throw in one caller cannot reject another), and the\n// deferred is ALWAYS resolved before the static reference is cleared — so no\n// caller is ever left hung. The deferred only ever resolves (probe errors and\n// aborts map to Offline), never rejects.\nclass ProbeInFlight {\n    // Identifies WHICH probe this is. endpointKey (probe target) decides\n    // whether another call is asking the same question; headersKey decides\n    // whether its auth differs (a token refreshed mid-probe → restart).\n    readonly endpointKey: string;\n    headersKey: string;\n    // The controller of the CURRENT attempt. A restart swaps this; a settle\n    // from a superseded attempt is ignored by comparing identity against it.\n    controller: AbortController | null = null;\n    timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n    readonly promise: Promise<NetworkStateE>;\n    private _resolve!: (state: NetworkStateE) => void;\n\n    constructor(endpointKey: string, headersKey: string) {\n        this.endpointKey = endpointKey;\n        this.headersKey = headersKey;\n        this.promise = new Promise<NetworkStateE>((resolve) => {\n            this._resolve = resolve;\n        });\n    }\n\n    // A fresh promise per caller — a downstream .then that throws rejects only\n    // that caller's chain, never the shared promise or another caller.\n    derive(): Promise<NetworkStateE> {\n        return this.promise.then((state) => state);\n    }\n\n    resolve(state: NetworkStateE): void {\n        this._resolve(state);\n    }\n\n    disarmTimeout(): void {\n        if (this.timeoutId != null) {\n            clearTimeout(this.timeoutId);\n            this.timeoutId = null;\n        }\n    }\n\n    // Drop the current (now-stale) attempt before a restart: clear its timeout\n    // and signal abort. Its eventual settle is ignored via the controller\n    // identity check, and the shared deferred stays unsettled for the restart.\n    abortStale(): void {\n        this.disarmTimeout();\n        this.controller?.abort();\n    }\n}\n\n// One side-channel HTTP probe + classifier. CONSTRUCT a platform subclass\n// (NetworkStateBrowser / NetworkStateCapacitor) and call run(). It reads no\n// WebSocket state and holds no auth state — the auth headers are passed in.\n//\n// This is the ONE detector every layer uses to learn the network state: the\n// heart-beat-timeout path (WebsocketABC) and the connection manager\n// (VortexService, which probes proactively when there is no live socket) both\n// run it, so they classify identically. On web, run() MUST bypass any\n// service-worker cache so a stale 200 can never mask a 302 login redirect.\nexport abstract class NetworkStateABC {\n    // The authoritative bound on every probe, on every platform (incl. iOS):\n    // arming a 5s timeout that aborts the AbortController, raced against the\n    // platform _probe. Native HTTP plugins cannot cancel an in-flight request,\n    // so this race — not the per-request native timeout — is what guarantees\n    // the caller is unblocked within 5s.\n    static readonly PROBE_TIMEOUT_MS = 5000;\n\n    private static _inFlight: ProbeInFlight | null = null;\n\n    constructor(\n        // The websocket URL (ws[s]://…). Probed as http[s] on the same path\n        // (query params stripped — they are socket-session filt, not reachability).\n        protected readonly url: string,\n        protected readonly headers: { [key: string]: string },\n        protected readonly log: WebsocketLogger,\n        protected readonly tag: string = \"[probe]\",\n    ) {}\n\n    // Probe the server and classify the result. Never throws for an expected\n    // outcome; resolves to a NetworkStateE.\n    //\n    // Overlapping calls are deduped only when they ask the SAME question\n    // (same probe target):\n    //   - same endpoint, same headers  → collapse onto the in-flight probe;\n    //   - same endpoint, new headers    → the auth token was refreshed\n    //     mid-probe, so the in-flight attempt is stale: abort it and restart\n    //     onto the SAME shared deferred with the new headers, so every waiter\n    //     gets the fresh-token result;\n    //   - different endpoint            → a genuinely different probe: NOT the\n    //     same question, so it gets its own independent, equally-bounded probe\n    //     rather than being collapsed onto — or hijacking — the in-flight one.\n    run(): Promise<NetworkStateE> {\n        const endpointKey = this._endpointKey();\n        const headersKey = NetworkStateABC._headersKey(this.headers);\n        const inFlight = NetworkStateABC._inFlight;\n\n        if (inFlight == null) {\n            const fresh = new ProbeInFlight(endpointKey, headersKey);\n            NetworkStateABC._inFlight = fresh;\n            this._startProbe(fresh);\n            return fresh.derive();\n        }\n\n        // A different question is in flight — run an independent probe. It is\n        // not stored as _inFlight (the slot stays with the running probe), so\n        // it is simply not deduped against; that is correct, they differ.\n        if (inFlight.endpointKey !== endpointKey) {\n            const detached = new ProbeInFlight(endpointKey, headersKey);\n            this._startProbe(detached);\n            return detached.derive();\n        }\n\n        // The same endpoint is already in flight. Triggers are meant to be\n        // deduped before they reach here, so this is logged as should-not-happen.\n        this.log.logDebug(\n            `${this.tag} probe: duplicate connection-test while one is in flight`,\n        );\n\n        if (inFlight.headersKey !== headersKey) {\n            this._restartProbe(inFlight, headersKey);\n        }\n        return inFlight.derive();\n    }\n\n    // The platform probe — one HTTP GET + classify. Honours the abort signal so\n    // it settles promptly at the 5s bound; aborts/errors resolve to Offline.\n    protected abstract _probe(signal: AbortSignal): Promise<NetworkStateE>;\n\n    // Arm a fresh controller + 5s abort timeout, then race the platform probe\n    // against an abort-resolves-Offline promise. The controller is THE 5s bound.\n    private _startProbe(probe: ProbeInFlight): void {\n        const controller = new AbortController();\n        probe.controller = controller;\n        probe.timeoutId = setTimeout(\n            () => controller.abort(),\n            NetworkStateABC.PROBE_TIMEOUT_MS,\n        );\n\n        const abortResolvesOffline = new Promise<NetworkStateE>((resolve) => {\n            controller.signal.addEventListener(\n                \"abort\",\n                () => resolve(NetworkStateE.Offline),\n                { once: true },\n            );\n        });\n\n        Promise.race([this._probe(controller.signal), abortResolvesOffline])\n            .then((state) => this._settleProbe(probe, controller, state))\n            .catch(() =>\n                this._settleProbe(probe, controller, NetworkStateE.Offline),\n            );\n    }\n\n    // Headers changed mid-flight (token refreshed): abort the stale attempt and\n    // restart on the same deferred with the new headers from this instance.\n    private _restartProbe(probe: ProbeInFlight, headersKey: string): void {\n        probe.abortStale();\n        probe.headersKey = headersKey;\n        this._startProbe(probe);\n    }\n\n    // Settle the shared deferred and clear the static reference — but only for\n    // the live attempt. A settle from an attempt a restart superseded is\n    // ignored, so the restarted attempt's result is the one that lands.\n    private _settleProbe(\n        probe: ProbeInFlight,\n        controller: AbortController,\n        state: NetworkStateE,\n    ): void {\n        if (probe.controller !== controller) {\n            return;\n        }\n        probe.disarmTimeout();\n        probe.resolve(state);\n        if (NetworkStateABC._inFlight === probe) {\n            NetworkStateABC._inFlight = null;\n        }\n    }\n\n    // Identifies the endpoint this probe asks about. Two probes with the same\n    // target are the same question and may be deduped.\n    private _endpointKey(): string {\n        return this.target;\n    }\n\n    // A stable string for a header set — sorted so key order never matters.\n    private static _headersKey(headers: { [key: string]: string }): string {\n        return Object.keys(headers)\n            .sort()\n            .map((name) => `${name}:${headers[name]}`)\n            .join(\"\\n\");\n    }\n\n    // The URL run() should GET: the vortex URL as http[s], without socket filt\n    // query params (ws[s]://host/path?filt → http[s]://host/path).\n    protected get target(): string {\n        const httpUrl = \"http\" + this.url.substring(2);\n        try {\n            const parsed = new URL(httpUrl);\n            parsed.search = \"\";\n            parsed.hash = \"\";\n            return parsed.toString();\n        } catch {\n            return httpUrl.replace(/[?#].*$/, \"\");\n        }\n    }\n\n    // Angular's ngsw-worker skips fetch handling when ngsw-bypass is present\n    // (query param or header). cache:\"no-store\" alone does not bypass the SW\n    // asset cache. Browser probes call this before fetch().\n    protected ensureNgswBypass(url: string): string {\n        if (NetworkStateABC.hasNgswBypassParam(url)) {\n            return url;\n        }\n\n        let parsed: URL;\n        try {\n            parsed = new URL(url);\n        } catch {\n            try {\n                parsed = new URL(url, NetworkStateABC.browserUrlBase());\n            } catch {\n                return NetworkStateABC.appendNgswBypassParam(url);\n            }\n        }\n\n        parsed.searchParams.set(\"ngsw-bypass\", String(Date.now()));\n        return parsed.toString();\n    }\n\n    private static hasNgswBypassParam(url: string): boolean {\n        // Match ngsw-worker's bypass detection:\n        // /[?&]ngsw-bypass(?:[=&]|$)/i\n        try {\n            const parsed = new URL(url, NetworkStateABC.browserUrlBase());\n            if (parsed.searchParams.has(\"ngsw-bypass\")) {\n                return true;\n            }\n        } catch {\n            // Fall through to regex.\n        }\n        return /[?&]ngsw-bypass(?:[=&]|$)/i.test(url);\n    }\n\n    private static appendNgswBypassParam(url: string): string {\n        const sep = url.includes(\"?\") ? \"&\" : \"?\";\n        return `${url}${sep}ngsw-bypass=${Date.now()}`;\n    }\n\n    private static browserUrlBase(): string {\n        if (typeof globalThis !== \"undefined\") {\n            const href = (globalThis as { location?: { href?: string } })\n                .location?.href;\n            if (typeof href === \"string\") {\n                return href;\n            }\n        }\n        return \"http://localhost/\";\n    }\n\n    // True when the final (post-redirect) URL is on a different origin than the\n    // one requested — i.e. the probe was bounced to the identity provider.\n    protected isCrossOrigin(requestedUrl: string, finalUrl: string): boolean {\n        if (!finalUrl) {\n            return false;\n        }\n        try {\n            return new URL(requestedUrl).origin !== new URL(finalUrl).origin;\n        } catch {\n            return false;\n        }\n    }\n\n    // Shared status → enum mapping. See NetworkStateE for the intent.\n    protected classify(status: number): NetworkStateE {\n        // Reachable but gated behind auth.\n        if (\n            status === 401 ||\n            status === 403 ||\n            status === 419 ||\n            (status >= 300 && status < 400)\n        ) {\n            this.log.logInfo(\n                `${this.tag} probe: login redirect (HTTP ${status})`,\n            );\n            return NetworkStateE.LoginRedirect;\n        }\n\n        // App Proxy / gateway BadGateway (e.g. 502 during peek_field restart).\n        if (status >= 500) {\n            this.log.logInfo(\n                `${this.tag} probe: proxy bad gateway (HTTP ${status})`,\n            );\n            return NetworkStateE.ProxyBadGateway;\n        }\n\n        // Reachable, but wrong resource / client error.\n        if (status >= 400 && status < 500) {\n            return NetworkStateE.NoWebSocketResource;\n        }\n\n        if (status >= 200 && status < 300) {\n            return NetworkStateE.WebSocketAvailable;\n        }\n\n        // Other statuses (e.g. a 400/426 to a plain GET on the ws endpoint):\n        // reachable and not auth-gated → available.\n        return NetworkStateE.WebSocketAvailable;\n    }\n}\n","import { NetworkStateABC, NetworkStateE } from \"./NetworkStateABC\";\n\n// Browser/web probe: fetch with redirect:\"manual\", cache:\"no-store\", and an\n// ngsw-bypass query param (via ensureNgswBypass) so a service-worker asset\n// cache cannot hide a login redirect (the PWA \"stuck offline, login never\n// raised\" bug).\nexport class NetworkStateBrowser extends NetworkStateABC {\n    // The 5s abort bound is owned by NetworkStateABC; this just forwards the\n    // signal to fetch so the request is cancelled when the base aborts.\n    protected async _probe(signal: AbortSignal): Promise<NetworkStateE> {\n        const url = this.ensureNgswBypass(this.target);\n\n        let response: Response;\n        try {\n            response = await fetch(url, {\n                method: \"GET\",\n                headers: this.headers,\n                redirect: \"manual\",\n                cache: \"no-store\",\n                signal,\n            });\n        } catch {\n            // No HTTP response — timeout / DNS / refused. Cannot reach the server.\n            return NetworkStateE.Offline;\n        }\n\n        // A manual-redirect fetch reports a redirect as an opaque response.\n        if (response.type === \"opaqueredirect\") {\n            return NetworkStateE.LoginRedirect;\n        }\n\n        return this.classify(response.status);\n    }\n}\n","import {\n    CapacitorHttp,\n    type HttpOptions,\n    type HttpResponse,\n} from \"@capacitor/core\";\nimport { NetworkStateABC, NetworkStateE } from \"./NetworkStateABC\";\n\n// Native probe: built-in CapacitorHttp (@capacitor/core). We FOLLOW redirects\n// and detect a login redirect by the final URL being bounced to a different\n// origin (the IdP, e.g. login.microsoftonline.com).\nexport class NetworkStateCapacitor extends NetworkStateABC {\n    // The plugin cannot cancel an in-flight native request, so honouring the\n    // signal here is what unblocks the caller at the base 5s bound: bail\n    // immediately if already aborted, and race the request against an\n    // abort-resolves-Offline promise. The late native result is then discarded\n    // by the base controller-identity check.\n    protected _probe(signal: AbortSignal): Promise<NetworkStateE> {\n        if (signal.aborted) {\n            return Promise.resolve(NetworkStateE.Offline);\n        }\n\n        const abortResolvesOffline = new Promise<NetworkStateE>((resolve) => {\n            signal.addEventListener(\n                \"abort\",\n                () => resolve(NetworkStateE.Offline),\n                { once: true },\n            );\n        });\n\n        return Promise.race([this._request(), abortResolvesOffline]);\n    }\n\n    private async _request(): Promise<NetworkStateE> {\n        const url = this.target;\n        this.log.logDebug(`${this.tag} probe: GET ${url}`);\n        const options: HttpOptions = {\n            url,\n            method: \"GET\",\n            headers: this.headers,\n            params: {},\n            readTimeout: 5000,\n            connectTimeout: 2000,\n        };\n\n        let response: HttpResponse;\n        try {\n            response = await CapacitorHttp.request(options);\n        } catch (e) {\n            // No HTTP response — timeout / DNS / refused. Cannot reach the server.\n            this.log.logDebug(`${this.tag} probe: unreachable — ${e}`);\n            return NetworkStateE.Offline;\n        }\n\n        // Followed a redirect to a different origin ⇒ an auth/login redirect.\n        if (this.isCrossOrigin(url, response.url)) {\n            this.log.logInfo(\n                `${this.tag} probe: login redirect ` +\n                    `(bounced ${url} → ${response.url})`,\n            );\n            return NetworkStateE.LoginRedirect;\n        }\n\n        return this.classify(response.status);\n    }\n}\n","import { Capacitor } from \"@capacitor/core\";\nimport type { WebsocketLogger } from \"../websocket/WebsocketABC\";\nimport { NetworkStateABC } from \"./NetworkStateABC\";\nimport { NetworkStateBrowser } from \"./NetworkStateBrowser\";\nimport { NetworkStateCapacitor } from \"./NetworkStateCapacitor\";\n\n// Builds the platform-appropriate network-state probe. The single place that\n// knows browser-vs-native for the probe — every caller (the socket heart-beat\n// path and the connection manager) goes through here, so they construct an\n// identical probe.\nexport class NetworkStateFactory {\n    static create(\n        url: string,\n        headers: { [key: string]: string },\n        log: WebsocketLogger,\n        tag: string = \"[probe]\",\n    ): NetworkStateABC {\n        return Capacitor.isNativePlatform()\n            ? new NetworkStateCapacitor(url, headers, log, tag)\n            : new NetworkStateBrowser(url, headers, log, tag);\n    }\n}\n","import { Observable, Subject } from \"rxjs\";\nimport { NetworkStateE } from \"../network-state/NetworkStateABC\";\nimport { NetworkStateFactory } from \"../network-state/NetworkStateFactory\";\n\n// Logging sink injected by the consumer. Keeps this layer free of any concrete\n// logger dependency.\nexport interface WebsocketLogger {\n    logDebug(message: string): void;\n    logInfo(message: string): void;\n    logWarning(message: string): void;\n    logError(message: string): void;\n}\n\n// The single, non-conflicting lifecycle state of one socket instance.\nexport enum WebsocketStateE {\n    Pristine,\n    Connecting,\n    Open,\n    Closing,\n    Closed,\n}\n\n// A single-use WebSocket transport.\n//\n// This transport has the following design objectives\n// 1. All websocket closing and opening controls are async.\n// 2. If the websocket is closing or opening, there will be a pending Promise\n// 3. The class is single shot / single connection, it can't be reconnected.\n// 4. The class manages heartbeats\n// 5. The mandatory goal is that this class never reports state Pristine/Closed\n//    while a websocket connection is in any state of opening,open,closing.\n//\n// connect() opens one socket. While open, peer frames are surfaced on message$\n// and outgoing frames are written with send().\n//\n// A heart-beat is sent every\n// HEART_BEAT_SEND_SECONDS, and any received frame counts as liveness. If no\n// frame arrives within HEART_BEAT_TIMEOUT_SECONDS the resource is probed via a\n// NetworkState* run(); the probe failing, or a second consecutive timeout,\n// closes the socket.\n//\n// close() begins teardown (state Closing); the instance reaches Closed when\n// handleClose() is called — triggered by the platform confirming closure, a\n// heart-beat timeout initiating _initiateClose, or any failure — at which\n// point message$ completes. A closed instance stays closed.\n//\n// Platform specifics (browser WebSocket vs a native socket) are implemented by\n// subclasses through the abstract primitives below.\nexport abstract class WebsocketABC {\n    readonly HEART_BEAT_SEND_SECONDS = 15.0;\n    readonly HEART_BEAT_TIMEOUT_SECONDS = 25.0;\n    // Consecutive receive timeouts (no frame within the window) before the\n    // socket is closed.\n    readonly HEART_BEAT_MISSED_CLOSE_LIMIT = 2;\n\n    // Keepalive marker. Sent on a timer; when received it counts as liveness\n    // and is not surfaced on message$.\n    protected readonly HEART_BEAT: string = \".\";\n\n    protected abstract readonly _logName: string;\n    private static _instanceCounter = 0;\n    protected readonly _instanceId = ++WebsocketABC._instanceCounter;\n\n    private _state: WebsocketStateE = WebsocketStateE.Pristine;\n\n    private _sendTimer: ReturnType<typeof setInterval> | null = null;\n    private _timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n    private _missedBeats = 0;\n    private _closePromise: Promise<void> | null = null;\n\n    private readonly _message$ = new Subject<string>();\n\n    constructor(\n        protected readonly url: string,\n        protected readonly name: string,\n        protected readonly headers: { [key: string]: string },\n        protected readonly log: WebsocketLogger,\n    ) {}\n\n    // -----------------------------------------------------------------------\n    // Public surface\n    // -----------------------------------------------------------------------\n\n    // Peer frames, with heart-beats removed. Completes when the socket closes.\n    get message$(): Observable<string> {\n        return this._message$;\n    }\n\n    // This socket's lifecycle state.\n    get state(): WebsocketStateE {\n        return this._state;\n    }\n\n    protected get tag(): string {\n        return `[${this._logName}#${this._instanceId}]`;\n    }\n\n    // Open the socket. Resolves once it is open and ready to send; rejects if\n    // it fails or closes before opening. Call once per instance.\n    async connect(): Promise<void> {\n        this.log.logInfo(`${this.tag} connect — ${this.url}`);\n        this._state = WebsocketStateE.Connecting;\n        await this._openSocket();\n\n        // If close() or a heart-beat timeout fired while the handshake was in\n        // flight, the socket is no longer Connecting; do not revive it.\n        if (this._state !== WebsocketStateE.Connecting) {\n            await this._initiateClose(\"closed during connect\");\n            return;\n        }\n\n        this._state = WebsocketStateE.Open;\n        this.startHeartBeat();\n    }\n\n    // Send one frame. Returns true if it was written, false if the socket is\n    // not open.\n    send(data: string): boolean {\n        if (this._state !== WebsocketStateE.Open) {\n            return false;\n        }\n        this._sendData(data);\n        return true;\n    }\n\n    // Begin closing the socket. Idempotent. Moves to Closing and asks the\n    // platform to close; resolves when the platform confirms closure via\n    // handleClose(), with the heart-beat timeout as a backstop if the platform\n    // stays silent.\n    close(): Promise<void> {\n        this.log.logInfo(`${this.tag} close`);\n        return this._initiateClose(\"client closing\");\n    }\n\n    private _initiateClose(reason: string): Promise<void> {\n        if (this._state === WebsocketStateE.Closing) {\n            return this._closePromise!;\n        }\n        if (this._state === WebsocketStateE.Closed) {\n            return Promise.resolve();\n        }\n        this.stopHeartBeat();\n        this._state = WebsocketStateE.Closing;\n        this._closePromise = this._closeSocket(reason);\n        return this._closePromise;\n    }\n\n    // -----------------------------------------------------------------------\n    // Abstract platform primitives — implemented by Browser/Capacitor\n    // -----------------------------------------------------------------------\n\n    // Open a socket to this.url with this.headers.\n    //\n    // Contract:\n    // - Resolve only once the socket is genuinely OPEN and ready to send.\n    // - On any pre-open failure: tear down the partial socket and reject.\n    // - Route every subsequent socket event to handleMessage and handleClose.\n    //   Both must remain wired for the socket's lifetime.\n    // - On a socket error: log it, then call handleClose() — this class\n    //   does not have an error handler; errors are the subclass's responsibility\n    //   and must always result in a close.\n    // - Never reconnect internally. Each instance is single-use.\n    protected abstract _openSocket(): Promise<void>;\n\n    // Ask the platform to close the current socket.\n    //\n    // Contract:\n    // - Return a Promise that resolves at the exact moment the socket is\n    //   genuinely closed — the same event on which handleClose() is called.\n    // - Always resolve, never reject: a failed or errored close is still a\n    //   close. Awaiting close() resolving means the socket is actually gone.\n    protected abstract _closeSocket(reason: string): Promise<void>;\n\n    // Write one frame to the current socket.\n    //\n    // Contract:\n    // - Only ever called by this class while the socket is Open.\n    protected abstract _sendData(data: string): void;\n\n    // The network-state probe is its own constructed object, built by\n    // NetworkStateFactory (see the heart-beat handler below). This transport\n    // only decides keep-vs-close from the result; it holds no probe logic.\n\n    // -----------------------------------------------------------------------\n    // Protected event handlers — subclasses call these from platform callbacks\n    // -----------------------------------------------------------------------\n\n    // Call for every inbound frame as a raw string, with no framing or\n    // heart-beat stripping — this class strips heart-beats itself.\n    protected handleMessage(data: string): void {\n        // Drop anything that arrives once teardown has begun.\n        if (\n            this._state === WebsocketStateE.Closing ||\n            this._state === WebsocketStateE.Closed\n        ) {\n            return;\n        }\n        this.recordBeat();\n\n        // A received heart-beat is measured above, then dropped.\n        if (data === this.HEART_BEAT) {\n            return;\n        }\n        this._message$.next(data);\n    }\n\n    // Call exactly once, only when the underlying socket is truly gone — the\n    // real platform close or fail event. Never early, never synthesised.\n    // This is the sole authority for transitioning to Closed.\n    //\n    // Subclasses are responsible for handling socket errors themselves (logging,\n    // etc.) and must call handleClose() afterward — there is no handleError().\n    protected handleClose(): void {\n        if (this._state === WebsocketStateE.Closed) {\n            return;\n        }\n        this._state = WebsocketStateE.Closed;\n        this.stopHeartBeat();\n        this.log.logInfo(`${this.tag} closed`);\n        this._message$.complete();\n    }\n\n    // -----------------------------------------------------------------------\n    // Heart-beat\n    // -----------------------------------------------------------------------\n\n    // Any inbound frame proves the socket is alive: clear the miss count\n    // and restart the receive window.\n    private recordBeat(): void {\n        this._missedBeats = 0;\n        this.restartTimeoutTimer();\n    }\n\n    private startHeartBeat(): void {\n        this._missedBeats = 0;\n        this._sendTimer = setInterval(() => {\n            if (this._state !== WebsocketStateE.Open) {\n                return;\n            }\n            this._sendData(this.HEART_BEAT);\n        }, this.HEART_BEAT_SEND_SECONDS * 1000);\n        this.restartTimeoutTimer();\n    }\n\n    private restartTimeoutTimer(): void {\n        if (this._timeoutTimer != null) {\n            clearTimeout(this._timeoutTimer);\n        }\n        this._timeoutTimer = setTimeout(() => {\n            void this.onHeartBeatTimeout().catch((e) =>\n                this.log.logError(\n                    `${this.tag} heart-beat timeout handler rejected: ${e}`,\n                ),\n            );\n        }, this.HEART_BEAT_TIMEOUT_SECONDS * 1000);\n    }\n\n    private async onHeartBeatTimeout(): Promise<void> {\n        // Teardown already underway and the platform has not confirmed: finalise.\n        if (this._state !== WebsocketStateE.Open) {\n            await this._initiateClose(\"heart-beat timeout\");\n            return;\n        }\n\n        this._missedBeats += 1;\n        this.log.logWarning(\n            `${this.tag} heart-beat timeout` +\n                ` (${this._missedBeats} of ${this.HEART_BEAT_MISSED_CLOSE_LIMIT})`,\n        );\n\n        if (this._missedBeats >= this.HEART_BEAT_MISSED_CLOSE_LIMIT) {\n            await this._initiateClose(\"heart-beat timeout\");\n            return;\n        }\n\n        // First miss: probe the resource with the receive timer paused.\n        let probeState: NetworkStateE;\n        try {\n            probeState = await NetworkStateFactory.create(\n                this.url,\n                this.headers,\n                this.log,\n                this.tag,\n            ).run();\n        } catch (error) {\n            // run() classifies rather than throws; an unexpected throw is\n            // treated as \"not our resource\" so the socket is dropped.\n            this.log.logWarning(\n                `${this.tag} network-state probe threw: ${error}`,\n            );\n            probeState = NetworkStateE.NoWebSocketResource;\n        }\n\n        // The socket may have been closed while the probe was in flight.\n        if (this._state !== WebsocketStateE.Open) {\n            return;\n        }\n\n        if (probeState === NetworkStateE.WebSocketAvailable) {\n            // False alarm — the server is fine. Keep the socket; resume\n            // measuring the receive window.\n            this.restartTimeoutTimer();\n            return;\n        }\n\n        // Anything else: close SILENTLY. This class never tells another layer\n        // WHY it closed — the orchestrator (VortexService) re-runs the\n        // network-state probe on close and decides what to do (reconnect /\n        // retry / re-auth).\n        this.log.logWarning(\n            `${this.tag} network-state probe: ` +\n                `${NetworkStateE[probeState]} — closing`,\n        );\n        await this._initiateClose(\n            `network-state probe: ${NetworkStateE[probeState]}`,\n        );\n    }\n\n    private stopHeartBeat(): void {\n        if (this._sendTimer != null) {\n            clearInterval(this._sendTimer);\n            this._sendTimer = null;\n        }\n        if (this._timeoutTimer != null) {\n            clearTimeout(this._timeoutTimer);\n            this._timeoutTimer = null;\n        }\n    }\n}\n","import { WebsocketABC } from \"./WebsocketABC\";\n\nexport class WebsocketBrowser extends WebsocketABC {\n    protected readonly _logName = \"BrowserWS\";\n\n    private _socket: WebSocket | null = null;\n\n    // Open a native browser WebSocket. Resolves on the \"open\" event; rejects if\n    // the socket closes or errors before opening.\n    //\n    // All platform events (message, close, error) are routed to the ABC\n    // handlers for the socket's lifetime. The close handler calls rejectOnce so\n    // that a pre-open close (connection refused, shutdown during connect, etc.)\n    // surfaces as a rejection, not a hang.\n    protected async _openSocket(): Promise<void> {\n        if (Object.keys(this.headers).length > 0) {\n            this.log.logWarning(\n                `${this.tag} ignoring headers —` +\n                    ` browser WebSocket does not support custom handshake headers`,\n            );\n        }\n\n        await new Promise<void>((resolve, reject) => {\n            let settled = false;\n\n            const resolveOnce = () => {\n                if (settled) return;\n                settled = true;\n                resolve();\n            };\n\n            const rejectOnce = (reason: string) => {\n                if (settled) return;\n                settled = true;\n                reject(new Error(reason));\n            };\n\n            const socket = new WebSocket(this.url, []);\n            socket.binaryType = \"arraybuffer\";\n            this._socket = socket;\n\n            socket.addEventListener(\"open\", () => {\n                this.log.logInfo(`${this.tag} socket open`);\n                resolveOnce();\n            });\n\n            socket.addEventListener(\"message\", (event: MessageEvent) => {\n                if (typeof event.data !== \"string\") {\n                    this.log.logError(\n                        `${this.tag} received binary message, expected string`,\n                    );\n                    return;\n                }\n                this.handleMessage(event.data);\n            });\n\n            socket.addEventListener(\"close\", (event: CloseEvent) => {\n                this.log.logInfo(\n                    `${this.tag} socket close` +\n                        ` code=${event.code} reason=\"${event.reason}\"` +\n                        ` wasClean=${event.wasClean}`,\n                );\n                // Reject before handleClose so that a pre-open close surfaces\n                // as a rejection (no-op if the promise already resolved).\n                rejectOnce(`close code=${event.code}`);\n                this.handleClose();\n            });\n\n            socket.addEventListener(\"error\", () => {\n                this.log.logError(`${this.tag} socket error`);\n                // The \"close\" event always follows \"error\"; handleClose() is\n                // called there. Reject the connect promise here so pre-open\n                // errors are not swallowed before the close event arrives.\n                rejectOnce(\"socket error\");\n            });\n        });\n    }\n\n    // Ask the platform to close the current socket. Resolves once the close\n    // event confirms the socket is gone and handleClose() has been called.\n    //\n    // The close listener from _openSocket will also fire (calling handleClose\n    // a second time), but handleClose() is idempotent.\n    protected async _closeSocket(reason: string): Promise<void> {\n        this.log.logInfo(`${this.tag} _closeSocket — ${reason}`);\n        const socket = this._socket;\n        this._socket = null;\n\n        if (socket == null || socket.readyState === WebSocket.CLOSED) {\n            this.handleClose();\n            return;\n        }\n\n        await new Promise<void>((resolve) => {\n            socket.addEventListener(\n                \"close\",\n                () => {\n                    this.handleClose();\n                    resolve();\n                },\n                { once: true },\n            );\n\n            // close() is a no-op while CLOSING; skip to avoid a spurious error.\n            if (socket.readyState !== WebSocket.CLOSING) {\n                socket.close();\n            }\n        });\n    }\n\n    protected _sendData(data: string): void {\n        this._socket?.send(data);\n    }\n}\n","import { WebsocketABC } from \"./WebsocketABC\";\n\ndeclare const CordovaWebsocketPlugin: any;\n\n// A single-use WebSocket transport backed by CordovaWebsocketPlugin\n// (the SocketRocket-based Cordova/Capacitor plugin).\n//\n// The plugin exposes a callback-based API:\n//   wsConnect(options, messageOrCloseCb, connectCb, errorCb)\n//   wsSend(wsId, data)\n//   wsClose(wsId, code, reason)\n//\n// messageOrCloseCb carries all post-connect events: onMessage, onClose, onFail.\n// connectCb fires once with the socket id when the handshake completes.\n// errorCb fires on socket-level errors (always followed by an onClose from\n// messageOrCloseCb, so we log there and let onClose do the teardown).\nexport class WebsocketCapacitor extends WebsocketABC {\n    protected readonly _logName = \"CapWS\";\n\n    private _wsId: string | null = null;\n\n    // Set by _closeSocket; resolved by _notifySocketClosed so that\n    // _closeSocket's Promise resolves exactly when the plugin confirms the\n    // close event.\n    private _closeResolve: (() => void) | null = null;\n\n    // Open the socket. Resolves on onConnect (when the handshake completes\n    // and wsSend is safe to call). Rejects if onClose/onFail/error fires\n    // before the socket is open.\n    //\n    // After resolving, all subsequent plugin events continue to route through\n    // the same callbacks for the socket's lifetime. handleClose() and\n    // _notifySocketClosed() are idempotent so the duplicate calls that can\n    // arise from error→onClose sequences are safe.\n    protected async _openSocket(): Promise<void> {\n        await new Promise<void>((resolve, reject) => {\n            let settled = false;\n\n            const resolveOnce = (event: string) => {\n                if (settled) return;\n                settled = true;\n                this.log.logInfo(`${this.tag} open (via ${event})`);\n                resolve();\n            };\n\n            const rejectOnce = (reason: string) => {\n                if (settled) return;\n                settled = true;\n                reject(new Error(reason));\n            };\n\n            const wsOptions = {\n                url: this.url,\n                timeout: 120 * 1000,\n                headers: this.headers,\n                acceptAllCerts: false,\n            };\n\n            try {\n                CordovaWebsocketPlugin.wsConnect(\n                    wsOptions,\n                    // Message / close / fail callback — all post-connect events.\n                    (event: Record<string, unknown>) => {\n                        const method = event[\"callbackMethod\"] as string;\n\n                        if (method === \"onMessage\") {\n                            // First message proves the socket is open even if\n                            // onConnect hasn't fired yet (belt-and-suspenders).\n                            resolveOnce(\"onMessage\");\n                            this.handleMessage(event[\"message\"] as string);\n                            return;\n                        }\n\n                        if (method === \"onClose\" || method === \"onFail\") {\n                            this.log.logInfo(\n                                `${this.tag} ${method}:` +\n                                    ` code=${event[\"code\"] ?? \"n/a\"}` +\n                                    ` reason=${event[\"reason\"] ?? \"n/a\"}`,\n                            );\n                            this._notifySocketClosed();\n                            rejectOnce(method);\n                            return;\n                        }\n\n                        this.log.logDebug(\n                            `${this.tag} unknown callback: ${JSON.stringify(event)}`,\n                        );\n                    },\n                    // Connect callback — fires once when the handshake completes.\n                    (event: Record<string, unknown>) => {\n                        const wsId = event[\"webSocketId\"] as string;\n                        this._wsId = wsId;\n                        this.log.logInfo(`${this.tag} onConnect wsId=${wsId}`);\n\n                        // If _closeSocket was called while the handshake was still\n                        // in flight (close requested before we had a wsId), close\n                        // the socket we just received. The resulting onClose fires\n                        // in the message callback and calls _notifySocketClosed(),\n                        // resolving the pending _closeSocket promise.\n                        if (this._closeResolve !== null) {\n                            this._closePluginSocket(\n                                wsId,\n                                \"connected during close\",\n                            );\n                            resolveOnce(\"onConnect-during-close\");\n                            return;\n                        }\n\n                        resolveOnce(\"onConnect\");\n                    },\n                    // Error callback — always followed by an onClose in the\n                    // message callback, so we only log here and let onClose\n                    // drive _notifySocketClosed() / rejectOnce().\n                    (event: Record<string, unknown>) => {\n                        const exception = (event[\"exception\"] as string) ?? \"\";\n                        this.log.logError(\n                            `${this.tag} socket error: ${exception || \"(no message)\"}`,\n                        );\n                        // Guard against a hang if onClose never follows the\n                        // error callback; both calls are idempotent.\n                        this._notifySocketClosed();\n                        rejectOnce(`error: ${exception}`);\n                    },\n                );\n            } catch (e) {\n                // wsConnect threw synchronously before registering any callbacks\n                // — no platform event will ever fire to settle the promise.\n                // _notifySocketClosed() transitions ABC state to Closed so that\n                // any subsequent _initiateClose() call returns immediately\n                // instead of invoking _closeSocket() with no plugin to respond.\n                this._notifySocketClosed();\n                rejectOnce(`wsConnect threw: ${e}`);\n            }\n        });\n    }\n\n    // Ask the plugin to close the socket. Resolves when the plugin fires\n    // onClose (which calls handleClose() and resolves via _notifySocketClosed).\n    //\n    // If _wsId is null the handshake is still in flight; the onConnect callback\n    // will see _closeResolve is set and close the socket the instant its id\n    // arrives, producing the onClose that resolves this promise.\n    protected async _closeSocket(reason: string): Promise<void> {\n        this.log.logInfo(`${this.tag} _closeSocket — ${reason}`);\n\n        await new Promise<void>((resolve) => {\n            this._closeResolve = resolve;\n\n            if (this._wsId != null) {\n                this._closePluginSocket(this._wsId, reason);\n            }\n            // If _wsId is null: the onConnect callback will close it when the\n            // handshake lands, producing the onClose that resolves this promise.\n        });\n    }\n\n    protected _sendData(data: string): void {\n        if (this._wsId != null) {\n            CordovaWebsocketPlugin.wsSend(this._wsId, data);\n        }\n    }\n\n    // Called whenever the plugin confirms the socket is gone (onClose, onFail,\n    // or error without follow-up onClose). Idempotent.\n    private _notifySocketClosed(): void {\n        this._wsId = null;\n        this.handleClose();\n\n        if (this._closeResolve !== null) {\n            const resolve = this._closeResolve;\n            this._closeResolve = null;\n            resolve();\n        }\n    }\n\n    private _closePluginSocket(wsId: string, reason: string): void {\n        try {\n            // SocketRocket aborts the process on an invalid close code;\n            // always pass the normal closure code 1000.\n            CordovaWebsocketPlugin.wsClose(wsId, 1000, reason);\n        } catch (e) {\n            // A throw usually means the socket is already gone. Log it so\n            // that a close that silently did nothing is visible in traces.\n            this.log.logWarning(\n                `${this.tag} wsClose(${wsId}, \"${reason}\") failed: ${e}`,\n            );\n        }\n    }\n}\n","import { Capacitor } from \"@capacitor/core\";\nimport { WebsocketABC, WebsocketLogger } from \"./WebsocketABC\";\nimport { WebsocketBrowser } from \"./WebsocketBrowser\";\nimport { WebsocketCapacitor } from \"./WebsocketCapacitor\";\n\n// Builds the platform-appropriate single-use socket. The single place that\n// knows browser-vs-native for the transport.\nexport class WebsocketFactory {\n    static create(\n        url: string,\n        name: string,\n        headers: { [key: string]: string },\n        log: WebsocketLogger,\n    ): WebsocketABC {\n        return Capacitor.isNativePlatform()\n            ? new WebsocketCapacitor(url, name, headers, log)\n            : new WebsocketBrowser(url, name, headers, log);\n    }\n}\n","/**\n * PromiseSemaphore - A TypeScript semaphore implementation using native Promises.\n * Mimics the behavior of Twisted's DeferredSemaphore while using modern JavaScript Promises.\n *\n * @example\n * ```typescript\n * const sem = new PromiseSemaphore(2); // Allow maximum 2 concurrent operations\n *\n * async function main() {\n *   const tasks = [1, 2, 3, 4, 5];\n *\n *   await Promise.all(\n *     tasks.map(id =>\n *       sem.run(async () => {\n *         console.log(`Task ${id} started`);\n *         await new Promise(r => setTimeout(r, 800)); // simulate work\n *         console.log(`Task ${id} finished`);\n *       })\n *     )\n *   );\n *\n *   console.log(\"All tasks completed\");\n * }\n *\n * main();\n * ```\n */\nexport class PromiseSemaphore {\n    private readonly limit: number;\n    private tokens: number;\n    private readonly waiting: Array<() => void> = [];\n\n    /**\n     * @param tokens The maximum number of concurrent tokens.\n     */\n    constructor(tokens: number) {\n        if (tokens < 1) {\n            throw new Error(\"PromiseSemaphore requires at least 1 token\");\n        }\n        this.limit = tokens;\n        this.tokens = tokens;\n    }\n\n    /**\n     * Acquire a token.\n     * Returns a Promise that resolves when a token is available.\n     */\n    acquire(): Promise<void> {\n        return new Promise<void>((resolve) => {\n            if (this.tokens > 0) {\n                this.tokens -= 1;\n                resolve();\n            } else {\n                this.waiting.push(() => {\n                    this.tokens -= 1;\n                    resolve();\n                });\n            }\n        });\n    }\n\n    /**\n     * Release a previously acquired token.\n     */\n    release(): void {\n        if (this.tokens >= this.limit) {\n            throw new Error(\"PromiseSemaphore: Released too many times\");\n        }\n\n        this.tokens += 1;\n\n        if (this.waiting.length > 0) {\n            const nextResolver = this.waiting.shift()!;\n            nextResolver();\n        }\n    }\n\n    /**\n     * Convenience method: Acquire → run function → automatically release the token.\n     * Perfect for limiting concurrency in loops with `Promise.all()`.\n     */\n    async run<T>(fn: () => T | Promise<T>): Promise<T> {\n        await this.acquire();\n        try {\n            return await fn();\n        } finally {\n            this.release();\n        }\n    }\n\n    /** Current number of available tokens */\n    get available(): number {\n        return this.tokens;\n    }\n\n    /** Maximum concurrency limit */\n    get max(): number {\n        return this.limit;\n    }\n\n    /** Number of pending waiters */\n    get waitingCount(): number {\n        return this.waiting.length;\n    }\n}\n","import { HttpHeaders } from \"@angular/common/http\";\nimport { Subscription } from \"rxjs\";\nimport { Network } from \"@capacitor/network\";\nimport type { PluginListenerHandle } from \"@capacitor/core\";\n// Network is retained only to subscribe to networkStatusChange edges as a\n// trigger to re-probe sooner; its connected flag is never used as a gate.\n\nimport { PayloadEnvelope } from \"./PayloadEnvelope\";\nimport { payloadIO } from \"./PayloadIO\";\nimport { rapuiClientEcho } from \"./PayloadFilterKeys\";\nimport { dateStr, getFiltStr, headersToDict, makeUuid } from \"./UtilMisc\";\nimport { VortexStateEnum, VortexStatusService } from \"./VortexStatusService\";\nimport { VortexClientState } from \"./VortexClientState\";\nimport { VortexConnectionCheckReasonE } from \"./VortexConnectionCheckReason\";\nimport {\n    VortexClientOAuth,\n    VortexOAuthHost,\n    VortexOAuthResultE,\n} from \"./VortexClientOAuth\";\nimport {\n    TokenMaintainPolicyE,\n    TokenMaintainResultE,\n} from \"./TokenMaintainPolicy\";\nimport { VortexAuthProvider } from \"./auth/VortexAuthProvider\";\nimport {\n    WebsocketABC,\n    type WebsocketLogger,\n    WebsocketStateE,\n} from \"./websocket/WebsocketABC\";\nimport { WebsocketFactory } from \"./websocket/WebsocketFactory\";\nimport { NetworkStateE } from \"./network-state/NetworkStateABC\";\nimport { NetworkStateFactory } from \"./network-state/NetworkStateFactory\";\nimport { PromiseSemaphore } from \"../util/PromiseSemaphore\";\n\n/**\n * Server response timeout in milliseconds\n * @type {number}\n */\nexport let SERVER_RESPONSE_TIMEOUT_SECONDS = 20.0;\n\n/**\n * Options controlling a reconnection attempt.\n * Used to distinguish normal retry/backoff reconnects from high-priority ones\n * (e.g. right after an OAuth token refresh or explicit user action).\n */\nexport interface VortexReconnectOptions {\n    // If true, bypass the normal RECONNECT_BACKOFF_SECONDS delay. Used for\n    // explicit auth refreshes so the socket recovers immediately.\n    immediate?: boolean;\n    // Why this reconnect is happening. Purely for logging.\n    reason?:\n        | \"initial\"\n        | \"user-request\"\n        | \"auth-refresh\"\n        | \"heartbeat-timeout\"\n        | \"network-change\"\n        | \"error\"\n        | \"server-closed\";\n}\n\n// One logical vortex client: the single owner of the connection brain. It\n// manages a one-shot WebsocketABC socket (rebuilt per reconnect via\n// WebsocketFactory), runs the side-channel probe (NetworkStateFactory),\n// classifies it, and decides what to do — reconnect / retry / re-auth. The\n// complexity is split into collaborators it composes:\n//\n//   - VortexClientState  — the lifecycle state machine + status pushing.\n//   - VortexClientOAuth   — the whole auth flow (provider, token→header,\n//                           silent refresh timer, interactive login).\n//\n// The client persists for its whole lifetime (stable identity for logs); only\n// the underlying socket is disposable. A fresh wire vortexUuid is generated per\n// socket connect so the server sees the same behaviour as the old\n// build-a-new-client-per-reconnect model.\nexport class VortexClient {\n    readonly RECONNECT_BACKOFF_SECONDS = 10.0;\n    private readonly RECONNECT_WAIT_SECONDS = 15;\n    // Re-probe cadence while gated behind login (LoginRedirect → RetryLater).\n    // Shorter than the generic reconnect wait so the OAuth tab re-offers\n    // promptly after a backed-off / dismissed / failed interactive login. The\n    // interactive-login cooldown (VortexClientOAuth.INTERACTIVE_LOGIN_BACKOFF_MS)\n    // still rate-limits the actual re-pop; this just stops the generic 15s wait\n    // from being the bottleneck.\n    private readonly LOGIN_REQUIRED_RETRY_SECONDS = 5;\n\n    private static _instanceCounter = 0;\n    private readonly _instanceId = ++VortexClient._instanceCounter;\n    private readonly _clientId = makeUuid();\n    private readonly _logName = \"VortexClient\";\n\n    private readonly _url: string;\n    private readonly _name: string;\n    private _headers: HttpHeaders;\n\n    private readonly state: VortexClientState;\n    private oauth: VortexClientOAuth | null = null;\n\n    private _websocket: WebsocketABC | null = null;\n    private _messageSub: Subscription | null = null;\n\n    private lastReconnectDate: number = Date.parse(\"01-Jan-2017\");\n    private unsentBuffer: string[] = [];\n    private reconnectingInProgress: boolean = false;\n\n    private _data: string = \"\";\n    private _vortexMsgsQueue: string[] = [];\n    private readonly _processSemaphore = new PromiseSemaphore(4);\n\n    private _retryTimerId: ReturnType<typeof setTimeout> | null = null;\n    private _networkListenerSetup = false;\n    private _networkListenerHandle: Promise<PluginListenerHandle> | null = null;\n\n    private serverVortexUuid: string | null = null;\n    private serverVortexName: string | null = null;\n\n    constructor(\n        private vortexStatusService: VortexStatusService,\n        url: string,\n        vortexClientName: string,\n        headers: HttpHeaders,\n        authProvider: VortexAuthProvider | null = null,\n    ) {\n        this._url = url;\n        this._name = vortexClientName;\n        this._headers = headers;\n        this.state = new VortexClientState(vortexStatusService);\n        if (authProvider != null) {\n            this.oauth = this._buildOAuth(authProvider);\n        }\n        this._log(`instance created (clientId=${this._clientId})`);\n        this._setupNetworkListener();\n    }\n\n    get isReady(): boolean {\n        return this._websocket?.state === WebsocketStateE.Open;\n    }\n\n    // -----------------------------------------------------------------------\n    // Auth registration\n    // -----------------------------------------------------------------------\n\n    setAuthProvider(provider: VortexAuthProvider | null): void {\n        this.oauth = provider != null ? this._buildOAuth(provider) : null;\n        this.vortexStatusService.logDebug(\n            `VortexClient.setAuthProvider — provider ${\n                provider?.isEnabled ? \"enabled\" : \"disabled/none\"\n            }`,\n        );\n        this.connectionCheck(\n            VortexConnectionCheckReasonE.AuthProviderRegistered,\n        ).catch((e) =>\n            this.vortexStatusService.logDebug(\n                `VortexClient initial connectionCheck failed ${e}`,\n            ),\n        );\n    }\n\n    // Fire-and-forget connectionCheck with consistent error logging.\n    private _requestConnectionCheck(\n        reason: VortexConnectionCheckReasonE,\n    ): void {\n        this.connectionCheck(reason).catch((e) =>\n            this.vortexStatusService.logDebug(\n                `VortexClient connectionCheck(${reason}) failed ${e}`,\n            ),\n        );\n    }\n\n    // The narrow seam VortexClientOAuth drives the socket through.\n    private _buildOAuth(provider: VortexAuthProvider): VortexClientOAuth {\n        const host: VortexOAuthHost = {\n            pauseSocket: () => this.pauseForOAuthFlow(),\n            resumeSocket: () => this.resumeAfterOAuthFlow(),\n            applyAuthHeader: (header) => this.updateAuthHeaders(header),\n            requestConnectionCheck: (reason) =>\n                this._requestConnectionCheck(reason),\n        };\n        return new VortexClientOAuth(this.vortexStatusService, provider, host);\n    }\n\n    // -----------------------------------------------------------------------\n    // Connection manager — probe → classify → decide → retry → re-auth\n    // -----------------------------------------------------------------------\n\n    // Probe the server and act on the classification. Safe to call from any\n    // trigger (startup, app-resume, network-up, retry timer, socket close).\n    // Overlapping probes are deduped in the probe layer (NetworkStateABC), so\n    // this is NOT wrapped in a whole-flow lock — a stuck connect can never\n    // freeze reconnection state. Overlapping connects stay guarded by\n    // reconnectingInProgress.\n    async connectionCheck(reason: VortexConnectionCheckReasonE): Promise<void> {\n        if (this.vortexStatusService.oAuthInProgress) {\n            this.vortexStatusService.logDebug(\n                `VortexClient.connectionCheck (${reason}) skipped — oauth flow in progress`,\n            );\n            return;\n        }\n        await this._connectionCheckImpl(reason);\n        if (reason === VortexConnectionCheckReasonE.AppResume) {\n            await this._maintainAuthTokenOnAppResume();\n        }\n    }\n\n    private async _maintainAuthTokenOnAppResume(): Promise<void> {\n        const oauth = this.oauth;\n        if (oauth == null || !oauth.isEnabled) {\n            return;\n        }\n        const result = await oauth.maintainAuthToken(\n            TokenMaintainPolicyE.RefreshIfPastHalfLife,\n        );\n        if (result === TokenMaintainResultE.LoginRequired) {\n            this._requestConnectionCheck(\n                VortexConnectionCheckReasonE.AppResumeNoValidToken,\n            );\n            return;\n        }\n        if (result === TokenMaintainResultE.RefreshFailed) {\n            this._requestConnectionCheck(\n                VortexConnectionCheckReasonE.AppResumeRefreshFailed,\n            );\n        }\n    }\n\n    private async _connectionCheckImpl(\n        reason: VortexConnectionCheckReasonE,\n    ): Promise<void> {\n        const oauth = this.oauth;\n\n        // No auth configured — just ensure we are connected (legacy behaviour).\n        if (oauth == null || !oauth.isEnabled) {\n            await this.reconnect();\n            return;\n        }\n\n        // Seed the probe header from a currently-valid token before probing. On\n        // cold start loadState() populates the provider's token but\n        // maintainAuthToken() hasn't run yet, so this._headers carries no\n        // Bearer — the first probe would go out token-less, get a 302, and be\n        // misread as LoginRedirect, forcing an unnecessary interactive login.\n        // This has no socket side-effect (unlike maintainAuthToken apply path).\n        const seedHeader = await oauth.currentAuthHeader();\n        if (seedHeader != null) {\n            this._headers = seedHeader;\n        }\n\n        // The ONE detector — the exact same NetworkState probe the live socket's\n        // heart-beat path constructs (via the same factory). Always probes the\n        // VortexClient vortex URL (ws→http), never a product-specific side URL.\n        const state = await NetworkStateFactory.create(\n            this._url,\n            headersToDict(this._headers),\n            this._websocketLogger,\n            \"[VortexClient]\",\n        ).run();\n\n        this.vortexStatusService.logDebug(\n            `VortexClient.connectionCheck (${reason}): probe = ${NetworkStateE[state]}`,\n        );\n\n        switch (state) {\n            case NetworkStateE.Offline:\n                this.vortexStatusService.setVortexState(\n                    VortexStateEnum.NoNetwork,\n                );\n                // Always re-probe periodically. The OS connectivity flag is not\n                // trusted (it falsely reports \"none\" on the iOS simulator's\n                // virtualized interface), so the probe is the source of truth —\n                // schedule a retry regardless and let the next probe decide.\n                this.scheduleRetry();\n                return;\n\n            case NetworkStateE.NoWebSocketResource:\n                // Reachable but wrong resource — retry in 2s.\n                this.vortexStatusService.setVortexState(\n                    VortexStateEnum.NetworkOnlineNoWebsocketResource,\n                );\n                this.scheduleRetry();\n                return;\n\n            case NetworkStateE.ProxyBadGateway:\n                // App Proxy BadGateway — retry in 2s; do not treat as login.\n                this.vortexStatusService.setVortexState(\n                    VortexStateEnum.NetworkOnlineProxyBadGateway,\n                );\n                this.scheduleRetry();\n                return;\n\n            case NetworkStateE.LoginRedirect:\n                this.vortexStatusService.setVortexState(\n                    VortexStateEnum.NetworkOnlineLoginRequired,\n                );\n                {\n                    const result = await oauth.run(reason);\n                    if (result === VortexOAuthResultE.RetryLater) {\n                        this.scheduleRetry(this.LOGIN_REQUIRED_RETRY_SECONDS);\n                    }\n                }\n                return;\n\n            case NetworkStateE.WebSocketAvailable:\n            default:\n                this.clearRetry();\n                if (this.state.isOnline) {\n                    // Already connected — nothing to do.\n                    return;\n                }\n                {\n                    const result = await oauth.maintainAuthToken(\n                        TokenMaintainPolicyE.ValidOrRefreshIfExpired,\n                    );\n                    if (result === TokenMaintainResultE.Applied) {\n                        // maintainAuthToken applied the bearer (reconnect + timer).\n                        return;\n                    }\n                    // Unchanged / LoginRequired — still need a socket if offline.\n                    await this.reconnect();\n                }\n                return;\n        }\n    }\n\n    private scheduleRetry(seconds: number = this.RECONNECT_WAIT_SECONDS): void {\n        if (this._retryTimerId != null) {\n            return;\n        }\n        this._startRetryCountdown(seconds);\n    }\n\n    private _startRetryCountdown(seconds: number): void {\n        this.vortexStatusService.setReconnectingInSeconds(seconds);\n        this._retryTimerId = setTimeout(() => {\n            this._retryTimerId = null;\n            if (seconds > 1) {\n                this._startRetryCountdown(seconds - 1);\n                return;\n            }\n            this.vortexStatusService.setReconnectingInSeconds(null);\n            void this._retryNow();\n        }, 1000);\n    }\n\n    private async _retryNow(): Promise<void> {\n        if (this.vortexStatusService.oAuthInProgress) return;\n        this.connectionCheck(VortexConnectionCheckReasonE.Retry).catch((e) =>\n            this.vortexStatusService.logDebug(\n                `VortexClient retry connectionCheck failed ${e}`,\n            ),\n        );\n    }\n\n    private clearRetry(): void {\n        if (this._retryTimerId != null) {\n            clearTimeout(this._retryTimerId);\n            this._retryTimerId = null;\n            this.vortexStatusService.setReconnectingInSeconds(null);\n        }\n    }\n\n    private _setupNetworkListener(): void {\n        if (this._networkListenerSetup) {\n            return;\n        }\n        this._networkListenerSetup = true;\n        // Keep the handle so shutdown() can release it — otherwise a client\n        // rebuilt on a url change would leak its listener (and keep probing on a\n        // dead client).\n        this._networkListenerHandle = Network.addListener(\n            \"networkStatusChange\",\n            (status) => {\n                this.vortexStatusService.logDebug(\n                    `VortexClient network change: connected=${status.connected}`,\n                );\n                // Route BOTH edges through the probe. The connected flag is only\n                // a trigger to re-check sooner, never a gate — a false value\n                // (e.g. the iOS simulator's bogus \"none\") must not short-circuit\n                // us to NoNetwork while the socket is actually reachable.\n                this.connectionCheck(\n                    VortexConnectionCheckReasonE.NetworkChange,\n                ).catch((e) =>\n                    this.vortexStatusService.logDebug(\n                        `VortexClient network-change connectionCheck failed ${e}`,\n                    ),\n                );\n            },\n        );\n    }\n\n    private async _removeNetworkListener(): Promise<void> {\n        const handle = this._networkListenerHandle;\n        this._networkListenerHandle = null;\n        this._networkListenerSetup = false;\n        try {\n            (await handle)?.remove();\n        } catch (e) {\n            this._log(`_removeNetworkListener — ignored: ${e}`);\n        }\n    }\n\n    private get _websocketLogger(): WebsocketLogger {\n        const log = (m: string) => this.vortexStatusService.logDebug(m);\n        return {\n            logDebug: log,\n            logInfo: log,\n            logWarning: log,\n            logError: log,\n        };\n    }\n\n    // -----------------------------------------------------------------------\n    // OAuth pause window (driven by VortexClientOAuth via its host hooks)\n    // -----------------------------------------------------------------------\n\n    // Close the socket and suppress background reconnects/probes while the\n    // interactive webview/redirect is in flight (\"zero or one websocket\"), and\n    // raise the OAuth-in-progress event for the duration. Awaits the close so no\n    // socket is left tearing down. Note: this does NOT shut the client down —\n    // the same client reconnects after resume with the fresh token.\n    async pauseForOAuthFlow(): Promise<void> {\n        if (this.vortexStatusService.oAuthInProgress) {\n            return;\n        }\n        this.vortexStatusService.setOAuthInProgress(true);\n        this._log(\n            \"pauseForOAuthFlow — closing socket + suppressing reconnects for the OAuth webview\",\n        );\n        try {\n            await this._closeAndDiscard();\n        } catch (e) {\n            this._log(`pauseForOAuthFlow — close error (ignored): ${e}`);\n        }\n        this.state.setPausedForAuth();\n    }\n\n    resumeAfterOAuthFlow(): void {\n        this.vortexStatusService.setOAuthInProgress(false);\n        this._log(\"resumeAfterOAuthFlow — connectivity re-enabled\");\n    }\n\n    private async updateAuthHeaders(headers: HttpHeaders): Promise<void> {\n        this._headers = headers;\n        await this.reconnect({ immediate: true, reason: \"auth-refresh\" });\n    }\n\n    // -----------------------------------------------------------------------\n    // Socket lifecycle\n    // -----------------------------------------------------------------------\n\n    async reconnect(options?: VortexReconnectOptions): Promise<void> {\n        const logReason = options?.reason ?? \"unspecified\";\n        this._log(\n            `reconnect (reason=${logReason}, immediate=${!!options?.immediate})`,\n        );\n\n        if (this.vortexStatusService.oAuthInProgress) {\n            this._log(\"reconnect suppressed during oauth flow\");\n            return;\n        }\n        if (this.reconnectingInProgress === true) {\n            this._log(\"reconnect skipped — already in progress\");\n            return;\n        }\n        this.clearRetry();\n        this.state.setIdle();\n        this.reconnectingInProgress = true;\n        try {\n            await this._createWebsocket(options);\n        } catch (e) {\n            this._log(`reconnect: _createWebsocket threw: ${e}`);\n            // Discard the failed transport so _onSocketClosed cannot fire on it.\n            await this._closeAndDiscard();\n        } finally {\n            this.reconnectingInProgress = false;\n        }\n\n        // Only schedule a retry if the connection failed. When _createWebsocket()\n        // succeeds, setOnline() already has us connected. When it fails (or\n        // returns early), _onSocketClosed will NOT fire — we unsubscribed in\n        // _closeAndDiscard — so we must arm the retry timer here (same as the\n        // old restartTimer() behaviour). Without this the UI sits on plain\n        // \"Offline\" with no countdown until a network-change edge or manual\n        // \"Reconnect now\".\n        if (!this.state.isOnline) {\n            this._log(\n                \"reconnect: not online after _createWebsocket, scheduling retry\",\n            );\n            this.scheduleRetry();\n        }\n    }\n\n    async disconnect(): Promise<void> {\n        await this.close();\n    }\n\n    async close(): Promise<void> {\n        this.state.setClosing();\n        this.vortexStatusService.logDebug(\"VortexClient closing\");\n        await this.shutdown();\n    }\n\n    private async shutdown(): Promise<void> {\n        this.state.setShutdown();\n        this.oauth?.clearRefreshTimer();\n        this.clearRetry();\n        await this._removeNetworkListener();\n        this._log(\"shutdown\");\n        await this._closeAndDiscard();\n        this.state.setClosed();\n    }\n\n    // Unsubscribe BEFORE close() so that the message$.complete() callback\n    // (_onSocketClosed) does NOT fire during intentional teardowns, preventing a\n    // spurious reconnect. The awaited close() is then our teardown confirmation.\n    private async _closeAndDiscard(): Promise<void> {\n        const ws = this._websocket;\n        const sub = this._messageSub;\n        this._websocket = null;\n        this._messageSub = null;\n        sub?.unsubscribe();\n        await ws?.close();\n    }\n\n    private async _createWebsocket(\n        options?: VortexReconnectOptions,\n    ): Promise<void> {\n        this._log(\n            `_createWebsocket (reason=${options?.reason ?? \"unspecified\"},` +\n                ` immediate=${!!options?.immediate})`,\n        );\n\n        if (this.vortexStatusService.oAuthInProgress) {\n            this._log(\"_createWebsocket suppressed — oauth flow in progress\");\n            return;\n        }\n\n        await this._closeAndDiscard();\n\n        const bypassBackoff = !!options?.immediate;\n        const reconnectDiffMs = Date.now() - this.lastReconnectDate;\n        if (\n            !bypassBackoff &&\n            reconnectDiffMs < this.RECONNECT_BACKOFF_SECONDS * 1000\n        ) {\n            const waitMs =\n                this.RECONNECT_BACKOFF_SECONDS * 1000 - reconnectDiffMs + 10;\n            this._log(\n                `_createWebsocket: backoff — re-checking via retry timer (~${waitMs}ms)`,\n            );\n            // Make sure the backoff actually leads somewhere (the old\n            // client-side beat timer used to drive this).\n            this.scheduleRetry();\n            return;\n        }\n        this.lastReconnectDate = Date.now();\n\n        this.state.setConnecting();\n\n        // Fresh wire uuid per socket — server-visible behaviour unchanged vs the\n        // old build-a-new-client-per-reconnect model.\n        const socketUuid = makeUuid();\n        const fullUrl =\n            this._url +\n            getFiltStr({ vortexUuid: socketUuid, vortexName: this._name });\n        const headersDict = headersToDict(this._headers);\n\n        this._websocket = WebsocketFactory.create(\n            fullUrl,\n            this._name,\n            headersDict,\n            this._websocketLogger,\n        );\n\n        // Subscribe before connect() so no frames are missed between connect\n        // resolving and the subscription being established.\n        this._messageSub = this._websocket.message$.subscribe({\n            next: (frame: string) => this._onFrame(frame),\n            error: (e) => this._log(`message$ error (unexpected): ${e}`),\n            complete: () => this._onSocketClosed(),\n        });\n\n        this._log(`_createWebsocket: connect() — ${fullUrl}`);\n        await this._websocket.connect();\n\n        this.state.setOnline();\n\n        this.send(new PayloadEnvelope()).catch((e) =>\n            this._log(\n                `_createWebsocket: initial PayloadEnvelope send failed: ${e}`,\n            ),\n        );\n\n        this.sendMessages();\n        this._log(\"_createWebsocket done\");\n    }\n\n    // Fired when message$ completes — the socket closed unexpectedly (not via\n    // our own _closeAndDiscard, which unsubscribes first). The socket never says\n    // WHY it closed; we re-run the detector and act on the fresh classification.\n    private _onSocketClosed(): void {\n        if (this._websocket == null) {\n            return;\n        }\n        this._log(\"_onSocketClosed: socket closed unexpectedly\");\n        this.state.setClosed();\n        if (this.vortexStatusService.oAuthInProgress) {\n            return;\n        }\n        this.connectionCheck(VortexConnectionCheckReasonE.ServerClosed).catch(\n            (e) =>\n                this.vortexStatusService.logDebug(\n                    `VortexClient server-closed connectionCheck failed ${e}`,\n                ),\n        );\n    }\n\n    // -----------------------------------------------------------------------\n    // Send / receive / frame processing\n    // -----------------------------------------------------------------------\n\n    async send(\n        payloadEnvelope: PayloadEnvelope | PayloadEnvelope[],\n    ): Promise<void> {\n        if (!this.isReady) {\n            throw new Error(\"Websocket vortex is not online.\");\n        }\n\n        let payloadEnvelopes: PayloadEnvelope[] =\n            payloadEnvelope instanceof Array\n                ? payloadEnvelope\n                : [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        for (let pe of payloadEnvelopes) {\n            promises.push(\n                pe\n                    .toVortexMsg()\n                    .then((vortexMsg) => vortexMsgs.push(vortexMsg)),\n            );\n        }\n\n        try {\n            await Promise.all(promises);\n            return this.sendVortexMsg(vortexMsgs);\n        } catch (e) {\n            let msg = `ERROR VortexClient: ${e.toString()}`;\n            console.log(msg);\n            throw new Error(msg);\n        }\n    }\n\n    private sendVortexMsg(vortexMsgs: string[]): void {\n        this.unsentBuffer.add(vortexMsgs);\n        this.sendMessages();\n    }\n\n    private sendMessages(): void {\n        while (this.unsentBuffer.length !== 0) {\n            const ws = this._websocket;\n            if (ws == null || ws.state !== WebsocketStateE.Open) return;\n\n            const vortexMsg = this.unsentBuffer.shift()!;\n            // The \".\" is the vortex wire-protocol frame delimiter; WebsocketABC\n            // transmits it verbatim.\n            if (!ws.send(vortexMsg + \".\")) {\n                this.unsentBuffer.unshift(vortexMsg);\n                return;\n            }\n        }\n    }\n\n    // Called for each non-heartbeat frame emitted by WebsocketABC.message$.\n    // WebsocketABC has already filtered bare \".\" heartbeat frames.\n    private _onFrame(frame: string): void {\n        if (frame[0] !== \"{\") {\n            this._data += frame;\n        } else {\n            if (frame[frame.length - 1] !== \"}\") {\n                console.log(\n                    dateStr() +\n                        \" ERROR, Payload should end with }, but doesn't: \" +\n                        frame,\n                );\n                return;\n            }\n            this._vortexMsgsQueue.push(frame);\n        }\n        this._processData();\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            const vortexMsg = this._vortexMsgsQueue.shift()!;\n            this._processSemaphore\n                .run(() => this._processVortexMsgs(vortexMsg))\n                .catch((e) =>\n                    console.log(`ERROR VortexClient._processData: ${e}`),\n                );\n        }\n    }\n\n    private async _processVortexMsgs(vortexMsg: string): Promise<void> {\n        const payloadEnvelope = await PayloadEnvelope.fromVortexMsg(vortexMsg);\n        this.receive(payloadEnvelope);\n    }\n\n    private receive(payloadEnvelope: PayloadEnvelope): void {\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(\n            dateStr() +\n                \"Received payloadEnvelope with filt : \" +\n                JSON.stringify(payloadEnvelope.filt),\n        );\n\n        payloadIO.process(payloadEnvelope);\n    }\n\n    private _log(msg: string): void {\n        this.vortexStatusService.logDebug(\n            `[${this._logName}#${this._instanceId}] ${msg}`,\n        );\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 { SERVER_RESPONSE_TIMEOUT_SECONDS, VortexClient } from \"./VortexClient\";\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: VortexClient,\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 { 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 { VortexStateEnum, VortexStatusService } from \"./VortexStatusService\";\nimport { VortexClient, type VortexReconnectOptions } from \"./VortexClient\";\nimport { PayloadEnvelope } from \"./PayloadEnvelope\";\nimport { NgLifeCycleEvents } from \"../util/NgLifeCycleEvents\";\nimport { dateStr } from \"./UtilMisc\";\nimport { HttpHeaders } from \"@angular/common/http\";\nimport { VortexAuthProvider } from \"./auth/VortexAuthProvider\";\nimport { VortexConnectionCheckReasonE } from \"./VortexConnectionCheckReason\";\n\n// Thin Angular facade over a single, persistent VortexClient.\n//\n// VortexService holds the static startup config (url, client name) and the\n// convenience send/endpoint/tuple-loader helpers consumers depend on, and\n// delegates the whole connection API (reconnect, OAuth pause/resume, auth\n// provider, connectionCheck) to the VortexClient — which is the real connection\n// brain. The client persists for the app's lifetime; only the underlying socket\n// is rebuilt on reconnect. (See README_VORTEX_RETRY_OAUTH.md.)\n@Injectable({\n    providedIn: \"root\",\n})\nexport class VortexService {\n    private static _vortexUrl: string | null = \"/vortex\";\n    private static vortexClientName: string = \"\";\n\n    private _client: VortexClient | null = null;\n    private _clientUrl: string | null = null;\n    private _authProvider: VortexAuthProvider | null = null;\n\n    constructor(\n        @Inject(VortexStatusService)\n        private vortexStatusService: VortexStatusService,\n    ) {\n        // Auto-connect on construction (a no-op until the url + client name are\n        // configured — for native they arrive later via setVortexUrl).\n        this.reconnect().catch((e) =>\n            console.log(\n                `${dateStr()} VortexService constructor reconnect failed ${e}`,\n            ),\n        );\n    }\n\n    // -----------------------------------------------------------------------\n    // Static startup config\n    // -----------------------------------------------------------------------\n\n    /**\n     * Set Vortex URL\n     *\n     * This method should not be used except in rare cases, such as an ios or\n     * android app.\n     *\n     * @param url The new URL (ws[s]://…) for the vortex to use.\n     */\n    static setVortexUrl(url: string | null) {\n        // Remove a stray empty-port colon (e.g. \"wss://host:/path\" →\n        // \"wss://host/path\"). \\/[^/] avoids stripping the protocol colon.\n        VortexService._vortexUrl =\n            url != null ? url.replace(/:(?=\\/[^/])/, \"\") : null;\n    }\n\n    /** The URL the vortex is trying to connect to. */\n    static getVortexUrl(): string | null {\n        return VortexService._vortexUrl;\n    }\n\n    /**\n     * Set Vortex Name\n     *\n     * @param vortexClientName The name to tell the server that we are.\n     */\n    static setVortexClientName(vortexClientName: string) {\n        VortexService.vortexClientName = vortexClientName;\n    }\n\n    setAuthProvider(provider: VortexAuthProvider | null): void {\n        this._authProvider = provider;\n        const existed =\n            this._client != null &&\n            this._clientUrl === VortexService._vortexUrl;\n        const client = this._ensureClient();\n        // _ensureClient applies the provider when it builds a fresh client; if\n        // the client already existed, apply it now.\n        if (existed) {\n            client?.setAuthProvider(provider);\n        }\n    }\n\n    // -----------------------------------------------------------------------\n    // Connection API — delegated to the persistent VortexClient\n    // -----------------------------------------------------------------------\n\n    get isPausedForOAuthFlow(): boolean {\n        // The OAuth-pause window is published on the status bus (the client sets\n        // it in pause/resumeForOAuthFlow); read it from the single source of\n        // truth rather than reaching into the client.\n        return this.vortexStatusService.oAuthInProgress;\n    }\n\n    async reconnect(options?: VortexReconnectOptions): Promise<void> {\n        const client = this._ensureClient();\n        if (client == null) {\n            // Url / name not configured yet — nothing to connect to.\n            this.vortexStatusService.setVortexState(\n                VortexStateEnum.Reconnecting,\n            );\n            return;\n        }\n        return client.reconnect(options);\n    }\n\n    async disconnect(): Promise<void> {\n        await this._client?.disconnect();\n    }\n\n    async connectionCheck(reason: VortexConnectionCheckReasonE): Promise<void> {\n        await this._ensureClient()?.connectionCheck(reason);\n    }\n\n    async pauseForOAuthFlow(): Promise<void> {\n        await this._client?.pauseForOAuthFlow();\n    }\n\n    resumeAfterOAuthFlow(): void {\n        this._client?.resumeAfterOAuthFlow();\n    }\n\n    // Build (or return) the one persistent client once url + name are set;\n    // rebuild only on a url change (rare — native goes null→wss once at boot).\n    private _ensureClient(): VortexClient | null {\n        const url = VortexService._vortexUrl;\n        if (url == null || VortexService.vortexClientName === \"\") {\n            return this._client;\n        }\n        if (this._client != null && this._clientUrl === url) {\n            return this._client;\n        }\n        const old = this._client;\n        const client = new VortexClient(\n            this.vortexStatusService,\n            url,\n            VortexService.vortexClientName,\n            new HttpHeaders(),\n        );\n        this._client = client;\n        this._clientUrl = url;\n        old?.disconnect().catch(() => {});\n        if (this._authProvider != null) {\n            client.setAuthProvider(this._authProvider);\n        }\n        return client;\n    }\n\n    // -----------------------------------------------------------------------\n    // Convenience — payload / endpoint / tuple-loader helpers\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    sendPayload(payload: Payload[] | Payload): Promise<void> {\n        const client = this._ensureClient();\n        if (client == 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                        client.send(payloadEnvelope);\n                    }),\n            );\n        }\n        let ret: any = Promise.all(promises);\n        return ret;\n    }\n\n    /** Send Payload Envelope(s) */\n    sendPayloadEnvelope(\n        payloadEnvelope: PayloadEnvelope[] | PayloadEnvelope,\n    ): Promise<void> {\n        const client = this._ensureClient();\n        if (client == null) {\n            throw new Error(\"The vortex is not initialised yet.\");\n        }\n        return client.send(payloadEnvelope);\n    }\n\n    createEndpointObservable(\n        component: NgLifeCycleEvents,\n        filter: IPayloadFilt,\n        processLatestOnly: boolean = false,\n    ): Observable<PayloadEnvelope> {\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._ensureClient()!,\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 { IPayloadFilt } from \"./Payload\";\nimport { dateStr, makeUuid } 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 = 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        // 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\n        // The plugin keeps a singleton connection per DB name across all\n        // CapSqlApi instances. Without isolation, two callers can both see\n        // isConnection=false and both call createConnection — the second\n        // throws \"Connection <dbName> already exists\". Fall back to\n        // retrieveConnection in that case.\n        await this._acquireConnection(this.dbName);\n\n        const dbOpen = await this.capDbConn.isDBOpen();\n        if (dbOpen?.result !== true) {\n            await this.capDbConn.open();\n        }\n        await this.installSchema();\n    }\n\n    private async _acquireConnection(dbName: string): Promise<void> {\n        const existing = await this._sqliteConnection.isConnection(\n            dbName,\n            false,\n        );\n        if (existing?.result === true) {\n            this.capDbConn = await this._sqliteConnection.retrieveConnection(\n                dbName,\n                false,\n            );\n            return;\n        }\n        try {\n            this.capDbConn = await this._sqliteConnection.createConnection(\n                dbName,\n                false,\n                \"no-encryption\",\n                1,\n                false,\n            );\n        } catch (e) {\n            // Defence-in-depth: if createConnection still races past the\n            // lock (e.g. another code path bypassed CapSqlApi), fall back\n            // to retrieving the existing connection.\n            const msg = typeof e === \"string\" ? e : (e as Error)?.message;\n            if (msg && msg.indexOf(\"already exists\") !== -1) {\n                this.capDbConn =\n                    await this._sqliteConnection.retrieveConnection(\n                        dbName,\n                        false,\n                    );\n                return;\n            }\n            throw e;\n        }\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","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\";\n\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.logDebug(\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.logDebug(`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 {\n    TupleDataObservableNameService,\n    TupleDataOfflineObserverService,\n} 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(\n                \"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,\n            disableCache,\n            true,\n            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/** 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/** 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","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@Injectable()\nexport class TupleActionPushService {\n    constructor(\n        @Inject(forwardRef(() => TupleActionPushNameService))\n        public tupleActionProcessorName,\n        @Inject(forwardRef(() => VortexService)) public vortexService,\n        @Inject(forwardRef(() => VortexStatusService)) public vortexStatus,\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).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            {\n                key: \"tupleActionProcessorName\",\n                name: this.tupleActionProcessorName.name,\n            },\n            this.tupleActionProcessorName.additionalFilt,\n        );\n\n        payload.tuples = [tupleAction];\n\n        return payload;\n    }\n}\n","import { Inject, Injectable } from \"@angular/core\";\nimport { VortexStatusService } from \"../VortexStatusService\";\n\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\n            .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.logDebug(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) return;\n\n        if (!this.vortexStatus.snapshot.isOnline) 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(\n                    () => this.sendNextAction(),\n                    this.SEND_FAIL_RETRY_BACKOFF - reconnectDiffMs + 10,\n                );\n                return;\n            } else {\n                this.lastSendFailTime = null;\n            }\n        }\n\n        this.sendingTuple = true;\n\n        // Get the next tuple from the persistent queue\n        this.storage\n            .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\n                    .makePayloadEnvelope()\n                    .then((sendPayloadEnvelope: PayloadEnvelope) => {\n                        let uuid = (<TupleActionABC>sendPayload.tuples[0]).uuid;\n                        let scope = sendPayload.filt[\"name\"];\n\n                        return new PayloadResponse(\n                            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: \" +\n                                        responsePayload.result.toString(),\n                                );\n                            }\n\n                            this.storage.deleteAction(scope, uuid).then(() => {\n                                this.vortexStatus.decrementQueuedActionCount();\n                            });\n                            this.sendingTuple = false;\n                            this.sendNextAction();\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(\n                    () => this.sendNextAction(),\n                    this.SEND_FAIL_RETRY_TIMEOUT,\n                );\n                return null; // Handle the error\n            });\n    }\n}\n","import { Inject, Injectable } from \"@angular/core\";\nimport { VortexStatusService } from \"../VortexStatusService\";\nimport { TupleActionABC } from \"../TupleAction\";\nimport { Tuple } from \"../exports\";\nimport {\n    TupleActionPushNameService,\n    TupleActionPushService,\n} 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(\n                this.tupleActionProcessorName.name,\n                tupleAction,\n                payload,\n            )\n            .then(() => []);\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(\n        public name: string,\n        public additionalFilt: any = {},\n    ) {}\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(\n                `${dateStr()} ERROR No delegate registered for ${tupleName}`,\n            );\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    abstract processTupleAction(tupleAction: TupleActionABC): Promise<Tuple[]>;\n}\n","function parseCurrency(value) {\n    return Number(value.replace(/[^0-9\\.\\-]+/g, \"\"));\n}\n\nfunction parseDate(date) {\n    if (date.toString().match(/^\\d{4}-\\d{2}-\\d{2}$/g)) {\n        date += \" 00:00:00\";\n    }\n\n    return Date.parse(date);\n}\n\nfunction compareText(a, b) {\n    const x = a.toLowerCase();\n    const y = b.toLowerCase();\n\n    return x > y ? 1 : x < y ? -1 : 0;\n}\n\nfunction compareNumeric(a, b) {\n    return a - b;\n}\n\nfunction compareCurrency(a, b) {\n    return parseCurrency(a) - parseCurrency(b);\n}\n\nfunction compareDate(a, b) {\n    return parseDate(a) - parseDate(b);\n}\n\nfunction getKey(object: any, key): any {\n    if (key == null) return key;\n\n    if (typeof key === \"function\") 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((a, b) =>\n        compareText(getKey(a, key), getKey(b, key)),\n    );\n}\n\nexport function sortNumeric(\n    collection: any[],\n    key: SortKeyCallableI | string | null = null,\n): any[] {\n    return collection.sort((a, b) =>\n        compareNumeric(getKey(a, key), getKey(b, key)),\n    );\n}\n\nexport function sortCurrency(\n    collection: any[],\n    key: SortKeyCallableI | string | null = null,\n): any[] {\n    return collection.sort((a, b) =>\n        compareCurrency(getKey(a, key), getKey(b, key)),\n    );\n}\n\nexport function sortDate(\n    collection: any[],\n    key: SortKeyCallableI | string | null = null,\n): any[] {\n    return collection.sort((a, b) =>\n        compareDate(getKey(a, key), getKey(b, key)),\n    );\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(\n        createWorker,\n        private readonly count: number,\n    ) {\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(\n        encodePayloadWorkerCreator: Function,\n        decodePayloadWorkerCreator: Function,\n        encodePayloadEnvelopeWorkerCreator: Function,\n        decodePayloadEnvelopeWorkerCreator: Function,\n    ) {\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            () => encodePayloadEnvelopeWorkerCreator,\n            this.ENCODE_WORKER_COUNT,\n        );\n\n        this.decodePayloadEnvelopeWorker = new WorkerRotator(\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 =\n    window.indexedDB ||\n    window.mozIndexedDB ||\n    window.webkitIndexedDB ||\n    window.msIndexedDB;\n\nexport let IDBTransaction: any =\n    window.IDBTransaction ||\n    window.webkitIDBTransaction ||\n    window.msIDBTransaction;\n\nexport let IDBKeyRange: any =\n    window.IDBKeyRange || 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    toString() {\n        return \"IndexedDB : IDBException: \" + this.message;\n    }\n}\n\nexport function addIndexedDbHandlers(request, stacktraceFunctor) {\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(\n            \"IndexedDB : BLOCKED \" + request.target.error,\n        );\n        stacktraceFunctor();\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    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(scope: string, actionUuid: string): 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 { FormGroup } from \"@angular/forms\";\nimport { TupleDataLoaderTupleABC } from \"./TupleDataLoaderTupleABC\";\nimport { dateStr, makeUuid } 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 = 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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"}