active-connect-ng2 0.2.49 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/fesm2022/active-connect-ng2.mjs +1186 -0
  2. package/fesm2022/active-connect-ng2.mjs.map +1 -0
  3. package/package.json +11 -17
  4. package/types/active-connect-ng2.d.ts +254 -0
  5. package/esm2020/active-connect-ng2.mjs +0 -5
  6. package/esm2020/lib/active-connect-ng2.module.mjs +0 -42
  7. package/esm2020/lib/websocket/client.mjs +0 -442
  8. package/esm2020/lib/websocket/decorators/function.mjs +0 -40
  9. package/esm2020/lib/websocket/decorators/websocket/handle.mjs +0 -9
  10. package/esm2020/lib/websocket/decorators/websocket/on-reconnect.mjs +0 -6
  11. package/esm2020/lib/websocket/decorators/websocket/on-success.mjs +0 -8
  12. package/esm2020/lib/websocket/decorators/websocket/outbound.mjs +0 -213
  13. package/esm2020/lib/websocket/decorators/websocket/route.mjs +0 -31
  14. package/esm2020/lib/websocket/decorators/websocket/shared.mjs +0 -10
  15. package/esm2020/lib/websocket/decorators/websocket/websocket-route-service.mjs +0 -2
  16. package/esm2020/lib/websocket/index.mjs +0 -11
  17. package/esm2020/lib/websocket/json/json-parser.mjs +0 -23
  18. package/esm2020/lib/websocket/lifecycle/loading-status.mjs +0 -31
  19. package/esm2020/lib/websocket/objects/outbound-object.mjs +0 -410
  20. package/esm2020/public-api.mjs +0 -7
  21. package/fesm2015/active-connect-ng2.mjs +0 -1285
  22. package/fesm2015/active-connect-ng2.mjs.map +0 -1
  23. package/fesm2020/active-connect-ng2.mjs +0 -1267
  24. package/fesm2020/active-connect-ng2.mjs.map +0 -1
  25. package/index.d.ts +0 -5
  26. package/lib/active-connect-ng2.module.d.ts +0 -7
  27. package/lib/websocket/client.d.ts +0 -65
  28. package/lib/websocket/decorators/function.d.ts +0 -30
  29. package/lib/websocket/decorators/websocket/handle.d.ts +0 -1
  30. package/lib/websocket/decorators/websocket/on-reconnect.d.ts +0 -1
  31. package/lib/websocket/decorators/websocket/on-success.d.ts +0 -1
  32. package/lib/websocket/decorators/websocket/outbound.d.ts +0 -1
  33. package/lib/websocket/decorators/websocket/route.d.ts +0 -1
  34. package/lib/websocket/decorators/websocket/shared.d.ts +0 -4
  35. package/lib/websocket/decorators/websocket/websocket-route-service.d.ts +0 -5
  36. package/lib/websocket/index.d.ts +0 -10
  37. package/lib/websocket/json/json-parser.d.ts +0 -5
  38. package/lib/websocket/lifecycle/loading-status.d.ts +0 -9
  39. package/lib/websocket/objects/outbound-object.d.ts +0 -50
  40. package/public-api.d.ts +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-connect-ng2.mjs","names":[],"sources":["../../../projects/active-connect-ng2/src/lib/active-connect-ng2.module.ts","../../../projects/active-connect-ng2/src/lib/websocket/json/json-parser.ts","../../../projects/active-connect-ng2/src/lib/websocket/client.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/function.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/websocket/handle.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/websocket/on-success.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/websocket/on-reconnect.ts","../../../projects/active-connect-ng2/src/lib/websocket/reactivity.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/websocket/outbound.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/websocket/route.ts","../../../projects/active-connect-ng2/src/lib/websocket/decorators/websocket/shared.ts","../../../projects/active-connect-ng2/src/lib/websocket/lifecycle/loading-status.ts","../../../projects/active-connect-ng2/src/lib/websocket/objects/outbound-object.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\r\nimport { NgxIndexedDBModule, DBConfig } from 'ngx-indexed-db';\r\n\r\nconst dbConfig: DBConfig = {\r\n name: 'activeconnect_cache',\r\n version: 2,\r\n objectStoresMeta: [\r\n {\r\n store: 'outbound',\r\n storeConfig: { keyPath: 'method', autoIncrement: false },\r\n storeSchema: [\r\n { name: 'method', keypath: 'method', options: { unique: true } },\r\n { name: 'data', keypath: 'data', options: { unique: false } },\r\n {\r\n name: 'specificHash',\r\n keypath: 'specificHash',\r\n options: { unique: false },\r\n },\r\n {\r\n name: 'length',\r\n keypath: 'length',\r\n options: { unique: false },\r\n },\r\n ],\r\n },\r\n ],\r\n};\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [NgxIndexedDBModule.forRoot(dbConfig)],\r\n exports: [NgxIndexedDBModule],\r\n})\r\nexport class ActiveConnectNg2Module {}\r\n","export class JsonParser {\r\n static stringify(obj: any) {\r\n return JSON.stringify(obj);\r\n }\r\n\r\n static parsingFunction(key: any, value: any) {\r\n var a;\r\n if (typeof value === \"string\") {\r\n a =\r\n /^[0-9]{4}\\-[0-9]{2}\\-[0-9]{2}T[0-9]{2}\\:[0-9]{2}\\:[0-9]{2}\\.[0-9]{3}Z$/.exec(\r\n value\r\n );\r\n if (a) {\r\n return new Date(a as any);\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n static parse(str: string) {\r\n if (str && str != \"undefined\") {\r\n return JSON.parse(str, JsonParser.parsingFunction);\r\n }\r\n return str;\r\n }\r\n}\r\n","import { signal } from '@angular/core';\r\nimport { NgxIndexedDBService } from 'ngx-indexed-db';\r\nimport { DecorableFunction } from './decorators/function';\r\nimport { JsonParser } from './json/json-parser';\r\n\r\nexport class WebsocketClient {\r\n ws!: WebSocket;\r\n pool!: { WssConnected: boolean } | null;\r\n\r\n /**\r\n * Connection state as a signal, so `isConnected` can be used in OnPush /\r\n * zoneless templates (a socket's readyState alone is not observable).\r\n */\r\n private readonly _connected = signal(false);\r\n\r\n constructor(\r\n private url?: string,\r\n private supportsCache?: boolean,\r\n public dbService?: NgxIndexedDBService\r\n ) {\r\n if (supportsCache) this.initCache();\r\n // No websocket during server-side rendering / prerendering.\r\n if (typeof document === 'undefined' || typeof WebSocket === 'undefined') {\r\n return;\r\n }\r\n this.setUrl(this.url);\r\n }\r\n\r\n protected setUrl(url: string | undefined) {\r\n if (!url) {\r\n let protocol;\r\n let port;\r\n switch (document.location.protocol) {\r\n case 'https:': {\r\n protocol = 'wss:';\r\n port = ':443';\r\n break;\r\n }\r\n default: {\r\n protocol = 'ws:';\r\n port = ':80';\r\n break;\r\n }\r\n }\r\n url = protocol + '//' + document.location.hostname + port + '/wss';\r\n }\r\n this.url = url;\r\n // Initial setup: nothing to tear down yet, just open the first connection.\r\n this.closed = false;\r\n this.connect(this.url as string);\r\n }\r\n\r\n private connect(url: string) {\r\n if (!this.target.___connectionId) {\r\n this.target.___connectionId = 0;\r\n }\r\n this.target.___connectionId++;\r\n\r\n if (\r\n this.ws &&\r\n (this.ws.readyState === WebSocket.CONNECTING ||\r\n this.ws.readyState === WebSocket.OPEN)\r\n ) {\r\n return;\r\n }\r\n\r\n this.create(url);\r\n }\r\n\r\n public initTabSuspendedListener() {\r\n if (typeof document !== 'undefined') {\r\n document.addEventListener('visibilitychange', () => {\r\n if (document.visibilityState === 'hidden') {\r\n console.log(\r\n 'ActiveConnect: Closing WebSocket due to tab suspension...'\r\n );\r\n this.disconnect(true);\r\n } else if (document.visibilityState === 'visible') {\r\n console.log('ActiveConnect: Reconnecting WebSocket...');\r\n this.closed = false;\r\n this.connect(this.url as string);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private requestStack: any[] = [];\r\n private requestHistoryLogs: { timestamp: Date; method: string }[] = [];\r\n private logEntry(method: string) {\r\n this.requestHistoryLogs.push({ timestamp: new Date(Date.now()), method });\r\n }\r\n public get logs(): { timestamp: Date; method: string }[] {\r\n return this.requestHistoryLogs;\r\n }\r\n\r\n private _token = '';\r\n public get Token(): string {\r\n if (!this._token) {\r\n try {\r\n if (typeof window !== 'undefined' && window.localStorage)\r\n this._token = window.localStorage.getItem('token') || '';\r\n } catch {\r\n // storage unavailable (SSR, privacy mode)\r\n }\r\n }\r\n return this._token;\r\n }\r\n public set Token(val: string) {\r\n this._token = val;\r\n try {\r\n if (typeof window !== 'undefined' && window.localStorage)\r\n window.localStorage.setItem('token', val);\r\n } catch {\r\n // storage unavailable (SSR, privacy mode)\r\n }\r\n }\r\n\r\n private set Connected(value: boolean) {\r\n if (value) {\r\n this.sendBrowserInfoToServer();\r\n\r\n this.auth(this.Token)\r\n .catch((err) => {\r\n console.log('ActiveConnect: auth failed on reconnect: ' + err);\r\n })\r\n .then(() => {\r\n Promise.all(\r\n WebsocketClient.onReconnectCallback.map((c) =>\r\n c.Func ? c.Func() : null\r\n )\r\n ).then(() => {\r\n setTimeout(() => {\r\n this.resetRequestedState();\r\n this.requestStack.forEach((e) => {\r\n this.sendToSocket(e.method, e.data, false, e.messageId);\r\n this.requestStack = this.requestStack.filter((e1) => e1 != e);\r\n });\r\n }, 2000);\r\n });\r\n });\r\n }\r\n if (this.pool && this.pool.WssConnected) this.pool.WssConnected = value;\r\n }\r\n private static resetRequestedStateCallbacks: Function[] = [];\r\n private connectionEstablishedOnce: boolean = false;\r\n private resetRequestedState() {\r\n if (this.connectionEstablishedOnce) {\r\n // reset requested state for outbounds\r\n WebsocketClient.resetRequestedStateCallbacks.forEach((reset) => {\r\n reset(this);\r\n });\r\n } else {\r\n this.connectionEstablishedOnce = true;\r\n }\r\n }\r\n public static addResetRequestingStateCallback(callback: Function) {\r\n WebsocketClient.resetRequestedStateCallbacks.push(callback);\r\n }\r\n\r\n private static readonly HANDSHAKE_TIMEOUT_MS = 10000;\r\n private handshakeTimer: ReturnType<typeof setTimeout> | undefined;\r\n private clearHandshakeTimer() {\r\n if (this.handshakeTimer !== undefined) {\r\n clearTimeout(this.handshakeTimer);\r\n this.handshakeTimer = undefined;\r\n }\r\n }\r\n\r\n private create(url: string) {\r\n if (this.ws) {\r\n // Detach handlers first so the old socket's close event can't trigger\r\n // another reconnect cycle once it's no longer the \"current\" socket.\r\n this.ws.onopen = null;\r\n this.ws.onmessage = null;\r\n this.ws.onerror = null;\r\n this.ws.onclose = null;\r\n if (\r\n this.ws.readyState === WebSocket.CONNECTING ||\r\n this.ws.readyState === WebSocket.OPEN\r\n ) {\r\n this.ws.close();\r\n }\r\n }\r\n\r\n this.clearReconnectTimer();\r\n this.clearHandshakeTimer();\r\n\r\n this.closed = false;\r\n\r\n // create new connection\r\n this.logEntry('TCP/HTTP:CONNECT-SERVER');\r\n this.ws = new WebSocket(url + (this.supportsCache ? '?cache=true' : ''));\r\n\r\n this.handshakeTimer = setTimeout(() => {\r\n if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {\r\n this.logEntry('TCP/HTTP:HANDSHAKE-TIMEOUT');\r\n console.log(\r\n 'ActiveConnect: Handshake timed out, retrying connection...'\r\n );\r\n // Detach so the forced close below doesn't double-trigger reconnect logic.\r\n this.ws.onopen = null;\r\n this.ws.onmessage = null;\r\n this.ws.onerror = null;\r\n this.ws.onclose = null;\r\n try {\r\n this.ws.close();\r\n } catch (err) {\r\n // ignore - socket may already be in a bad state\r\n }\r\n if (!this.closed) {\r\n this.clearReconnectTimer();\r\n this.reconnectTimer = setTimeout(() => {\r\n this.reconnectTimer = undefined;\r\n this.connect(url);\r\n }, 1000);\r\n }\r\n }\r\n }, WebsocketClient.HANDSHAKE_TIMEOUT_MS);\r\n\r\n this.ws.onerror = (err) => {\r\n this.ws.close();\r\n this.logEntry('TCP/HTTP:ERROR:' + err);\r\n console.log('ActiveConnect: ' + err);\r\n };\r\n this.ws.onopen = () => {\r\n this.clearHandshakeTimer();\r\n this._connected.set(true);\r\n this.logEntry('TCP/HTTP:CONNECTED');\r\n this.Connected = true;\r\n };\r\n this.ws.onmessage = (e) => {\r\n let parsed;\r\n try {\r\n parsed = JsonParser.parse(e.data.toString());\r\n } catch (err) {\r\n // A malformed frame must not throw inside the onmessage handler -\r\n // that would silently kill message processing for the rest of the\r\n // connection's lifetime without ever surfacing an error.\r\n console.log('ActiveConnect: failed to parse incoming message: ' + err);\r\n return;\r\n }\r\n this.messageReceived(parsed);\r\n };\r\n this.ws.onclose = () => {\r\n this.clearHandshakeTimer();\r\n this._connected.set(false);\r\n this.logEntry('TCP/HTTP:CLOSED');\r\n if (!this.closed) {\r\n if (this.pool && this.pool.WssConnected) this.pool.WssConnected = false;\r\n this.logEntry('TCP/HTTP:RESET-REQUESTED-OUTBOUND-STATE');\r\n this.resetRequestedState();\r\n this.clearReconnectTimer();\r\n this.reconnectTimer = setTimeout(() => {\r\n this.reconnectTimer = undefined;\r\n this.connect(url);\r\n }, 1000);\r\n }\r\n };\r\n }\r\n\r\n private reconnectTimer: ReturnType<typeof setTimeout> | undefined;\r\n private clearReconnectTimer() {\r\n if (this.reconnectTimer !== undefined) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = undefined;\r\n }\r\n }\r\n\r\n private messageId: number = 0;\r\n protected sendToSocket(\r\n method: string,\r\n data: any,\r\n dontEnsureTransmission?: boolean,\r\n forcedMessageId?: number\r\n ) {\r\n const messageId = forcedMessageId ?? ++this.messageId;\r\n if (this.ws.readyState != this.ws.OPEN) {\r\n if (!dontEnsureTransmission)\r\n this.requestStack.push({ method, data, messageId });\r\n else return false;\r\n } else {\r\n this.ws.send(JsonParser.stringify({ method, value: data, messageId }));\r\n }\r\n return messageId;\r\n }\r\n\r\n async auth(token: string): Promise<any> {\r\n return this.sendToSocket('auth.token', token);\r\n }\r\n\r\n public send(\r\n method: string,\r\n data: any,\r\n dontEnsureTransmission?: boolean\r\n ): Promise<any> {\r\n this.logEntry('SEND:' + method);\r\n const messageId = this.sendToSocket(\r\n method,\r\n data,\r\n dontEnsureTransmission || false\r\n );\r\n if (messageId) {\r\n return this.expectMethod(`m.${method}`, messageId);\r\n } else {\r\n return new Promise((resolve) => {\r\n resolve(false);\r\n });\r\n }\r\n }\r\n\r\n private rejectCallbacks: Map<number, Function> = new Map();\r\n private expectedMethods: Map<string | number, Array<Function>> = new Map();\r\n private expectMethod(method: string, messageId?: number | null) {\r\n return new Promise((resolve, reject) => {\r\n if (messageId) {\r\n this.expectedMethods.set(messageId, [resolve]);\r\n this.rejectCallbacks.set(messageId, reject);\r\n } else {\r\n if (this.expectedMethods.has(method)) {\r\n let arr = this.expectedMethods.get(method);\r\n (arr as Array<Function>).push(resolve);\r\n } else {\r\n this.expectedMethods.set(method, [resolve]);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private messageReceived({\r\n method,\r\n value,\r\n messageId,\r\n specificHash,\r\n inserted,\r\n updated,\r\n deleted,\r\n length\r\n }: {\r\n method: string;\r\n value: any;\r\n messageId: number | null;\r\n specificHash: number | null;\r\n inserted: any[] | null;\r\n updated: any[] | null;\r\n deleted: any[] | null;\r\n length: number | null;\r\n }) {\r\n this.logEntry('RECEIVED:' + method);\r\n if (method == '___cache') {\r\n this.handleOutboundCacheRequest(value);\r\n }\r\n if (messageId) {\r\n if (method == 'm.error') {\r\n const reject = this.rejectCallbacks.get(messageId);\r\n if (reject) {\r\n reject(value);\r\n }\r\n messageId = -1;\r\n }\r\n }\r\n\r\n if (messageId != null) {\r\n const callback = this.expectedMethods.get(messageId);\r\n if (callback) {\r\n const func = callback.shift();\r\n if (func) func(value);\r\n this.invokeSuccessHandlers(method);\r\n } else {\r\n const callback = this.expectedMethods.get(method);\r\n if (callback && callback.length > 0) {\r\n const func = callback.shift();\r\n if (func) func(value);\r\n } else {\r\n const out = WebsocketClient.outbounds.get(method);\r\n if (out) {\r\n out(value, specificHash, inserted, updated, deleted, length, this);\r\n }\r\n const handle = WebsocketClient.handles.get(method);\r\n if (handle) {\r\n (handle.Func as Function)(value);\r\n }\r\n }\r\n }\r\n } else {\r\n throw Error(\r\n 'No MessageId was provided, the connection is not supported.'\r\n );\r\n }\r\n }\r\n\r\n private handleOutboundCacheRequest(method: string) {\r\n if (this.dbService) {\r\n try {\r\n this.dbService.getByKey('outbound', method).subscribe((item: any) => {\r\n if (item) {\r\n this.send('___cache', {\r\n method,\r\n specificHash: item.specificHash || null\r\n });\r\n } else {\r\n this.send('___cache', {\r\n method,\r\n specificHash: null\r\n });\r\n }\r\n });\r\n } catch (e) {\r\n this.send('___cache', {\r\n method,\r\n specificHash: null\r\n });\r\n console.error('ActiveConnect: ' + e);\r\n }\r\n } else {\r\n this.send('___cache', {\r\n method,\r\n specificHash: null\r\n });\r\n console.error(\r\n 'Active-Connect: Caching not possible as the indexedDB has not been initialized'\r\n );\r\n }\r\n }\r\n\r\n private static outbounds: Map<\r\n string,\r\n (\r\n data: any,\r\n specificHash: number | null,\r\n inserted: any[] | null,\r\n updated: any[] | null,\r\n deleted: any[] | null,\r\n length: number | null,\r\n _this: WebsocketClient\r\n ) => void\r\n > = new Map();\r\n static expectOutbound(\r\n method: string,\r\n callback: (\r\n data: any,\r\n specificHash: number | null,\r\n inserted: any[] | null,\r\n updated: any[] | null,\r\n deleted: any[] | null,\r\n length: number | null,\r\n _this: WebsocketClient\r\n ) => void\r\n ) {\r\n WebsocketClient.outbounds.set(method, callback);\r\n }\r\n\r\n private static handles: Map<string, DecorableFunction> = new Map();\r\n static registerHandle(method: string, callback: DecorableFunction) {\r\n WebsocketClient.handles.set(method, callback);\r\n }\r\n\r\n public get isConnected(): boolean {\r\n this._connected(); // register a signal dependency for templates / computed\r\n if (this.ws) return this.ws.readyState == WebSocket.OPEN;\r\n return true;\r\n }\r\n\r\n private sendBrowserInfoToServer() {\r\n // send browser / os information\r\n const browser = this.getBrowser();\r\n const os = this.getOS();\r\n this.send('___browser', {\r\n browser: `${browser.name} ${browser.version} ${os}`\r\n });\r\n }\r\n\r\n public getBrowser(): { name: string; version: string } {\r\n // https://www.gregoryvarghese.com/how-to-get-browser-name-and-version-via-javascript/\r\n var ua = navigator.userAgent,\r\n tem,\r\n M =\r\n ua.match(\r\n /(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i\r\n ) || [];\r\n if (/trident/i.test(M[1])) {\r\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\r\n return { name: 'IE ', version: tem[1] || '' };\r\n }\r\n if (M[1] === 'Chrome') {\r\n tem = ua.match(/\\bOPR\\/(\\d+)/);\r\n if (tem != null) {\r\n return { name: 'Opera', version: tem[1] };\r\n }\r\n }\r\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\r\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) {\r\n M.splice(1, 1, tem[1]);\r\n }\r\n return {\r\n name: M[0],\r\n version: M[1]\r\n };\r\n }\r\n\r\n public getOS(): string {\r\n var userAgent = window.navigator.userAgent,\r\n platform = window.navigator.platform,\r\n macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'],\r\n windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'],\r\n iosPlatforms = ['iPhone', 'iPad', 'iPod'],\r\n os = null;\r\n\r\n if (macosPlatforms.indexOf(platform) !== -1) {\r\n os = 'Mac OS';\r\n } else if (iosPlatforms.indexOf(platform) !== -1) {\r\n os = 'iOS';\r\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\r\n os = 'Windows';\r\n } else if (/Android/.test(userAgent)) {\r\n os = 'Android';\r\n } else if (!os && /Linux/.test(platform)) {\r\n os = 'Linux';\r\n }\r\n\r\n return os || '';\r\n }\r\n\r\n private static onSuccessHandlers: {\r\n callback: DecorableFunction;\r\n regexp: RegExp;\r\n }[] = [];\r\n public static onSuccess(callback: DecorableFunction, regexp: RegExp) {\r\n this.onSuccessHandlers.push({ callback, regexp });\r\n }\r\n\r\n private static onReconnectCallback: DecorableFunction[] = [];\r\n static onReconnect(callback: DecorableFunction) {\r\n WebsocketClient.onReconnectCallback.push(callback);\r\n }\r\n\r\n private invokeSuccessHandlers(method: string) {\r\n WebsocketClient.onSuccessHandlers\r\n .filter((e) => e.regexp.test(method))\r\n .forEach((e) => {\r\n var res = (e.callback.Func as Function)();\r\n if (res && res.then) {\r\n res.then();\r\n }\r\n });\r\n }\r\n\r\n public closed = false;\r\n public disconnect(restart?: boolean) {\r\n this.closed = true;\r\n this._connected.set(false);\r\n\r\n this.clearReconnectTimer();\r\n this.clearHandshakeTimer();\r\n\r\n if (this.ws) this.ws.close();\r\n\r\n if (!restart && this.ws) {\r\n this.ws.onopen = null;\r\n this.ws.onmessage = null;\r\n this.ws.onerror = null;\r\n this.ws.onclose = null;\r\n }\r\n }\r\n\r\n private initCache() {}\r\n\r\n get target(): any {\r\n return (this as any).__proto__;\r\n }\r\n}\r\n","/**\r\n * Represents the reference to an object method used for websocket routes and outbounds.\r\n */\r\nexport class DecorableFunction {\r\n /**\r\n * Creates an instance of DecorableFunction.\r\n * @param objConfig - The configuration object for the object method.\r\n * @param objConfig.target - The target object.\r\n * @param objConfig.propertyKey - The property key of the target object.\r\n */\r\n constructor(protected objConfig: { target: any; propertyKey: string }) {\r\n // singelton service - fetch from angular\r\n const prototype = this.objConfig.target.prototype || this.objConfig.target;\r\n if (!prototype.___constructorOverridden) {\r\n prototype.___constructorOverridden = true;\r\n }\r\n }\r\n\r\n /**\r\n * Returns the decorated function.\r\n * @returns - The decorated function.\r\n */\r\n public get Func(): ((...data: any[]) => Promise<any> | any) | null {\r\n if (\r\n this.objConfig?.target &&\r\n this.objConfig.target[this.objConfig.propertyKey]\r\n ) {\r\n return this.objConfig.target[this.objConfig.propertyKey].bind(\r\n this.getBindObject()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the bind object.\r\n * @private\r\n * @returns - The bind object.\r\n */\r\n private getBindObject(): any {\r\n const prototype = this.objConfig.target.prototype || this.objConfig.target;\r\n return prototype.___data._obj;\r\n }\r\n}\r\n","import { WebsocketClient } from '../../client';\r\nimport { DecorableFunction } from '../function';\r\n\r\nexport function Handle(method: string) {\r\n return function _Handle(target: any, propertyKey: string): any {\r\n // method annotation\r\n WebsocketClient.registerHandle(\r\n method,\r\n new DecorableFunction({ target, propertyKey })\r\n );\r\n };\r\n}\r\n","import { WebsocketClient } from '../../client';\r\nimport { DecorableFunction } from '../function';\r\n\r\nexport function OnSuccess(regexp: RegExp) {\r\n return function _Route(target: any, propertyKey: string): any {\r\n WebsocketClient.onSuccess(\r\n new DecorableFunction({ target, propertyKey }),\r\n regexp\r\n );\r\n };\r\n}\r\n","import { WebsocketClient } from '../../client';\r\nimport { DecorableFunction } from '../function';\r\n\r\nexport function OnReconnect(target: any, propertyKey: string) {\r\n WebsocketClient.onReconnect(new DecorableFunction({ target, propertyKey }));\r\n}\r\n","import { signal, WritableSignal } from '@angular/core';\r\n\r\n/**\r\n * Reactivity helpers.\r\n *\r\n * Why this exists: previously the library stored its state in plain objects and\r\n * relied on Zone.js to notice that \"something async happened\" (a websocket\r\n * message) and re-run change detection. Angular is now zoneless by default and\r\n * components are OnPush by default, so plain mutations are never rendered.\r\n * Everything a template can read is therefore backed by a signal. Reading it in\r\n * a template registers a dependency; writing it (from websocket handlers)\r\n * schedules change detection - with or without Zone.js.\r\n *\r\n * IMPORTANT: signals must never be *written* while a template is rendering\r\n * (Angular throws NG0600). Getters that are read from templates therefore only\r\n * read signals; any side effect they need to trigger is deferred with\r\n * `defer()`.\r\n */\r\n\r\n/** Runs a side effect after the current (possibly rendering) call stack. */\r\nexport function defer(fn: () => void): void {\r\n queueMicrotask(fn);\r\n}\r\n\r\n/**\r\n * A Map<string, boolean> that notifies signal consumers whenever it changes.\r\n * Drop-in replacement for the plain `Map` previously stored in `target.loading`.\r\n */\r\nexport class ReactiveLoadingMap extends Map<string, boolean> {\r\n private readonly _version = signal(0);\r\n private prunePending = false;\r\n\r\n private bump(): void {\r\n this._version.update((v) => v + 1);\r\n }\r\n\r\n override get(key: string): boolean | undefined {\r\n this._version();\r\n return super.get(key);\r\n }\r\n\r\n override has(key: string): boolean {\r\n this._version();\r\n return super.has(key);\r\n }\r\n\r\n override set(key: string, value: boolean): this {\r\n const changed = !super.has(key) || super.get(key) !== value;\r\n super.set(key, value);\r\n if (changed) this.bump();\r\n return this;\r\n }\r\n\r\n override delete(key: string): boolean {\r\n const existed = super.delete(key);\r\n if (existed) this.bump();\r\n return existed;\r\n }\r\n\r\n override clear(): void {\r\n let hadEntries = false;\r\n super.forEach(() => (hadEntries = true));\r\n super.clear();\r\n if (hadEntries) this.bump();\r\n }\r\n\r\n override forEach(\r\n callbackfn: (\r\n value: boolean,\r\n key: string,\r\n map: Map<string, boolean>\r\n ) => void,\r\n thisArg?: any\r\n ): void {\r\n this._version();\r\n super.forEach(callbackfn, thisArg);\r\n }\r\n\r\n constructor() {\r\n super();\r\n // `size` is declared as a property on Map's typings, so it is redefined here\r\n // instead of being overridden as an accessor.\r\n const nativeSize = Object.getOwnPropertyDescriptor(Map.prototype, 'size')!\r\n .get as () => number;\r\n Object.defineProperty(this, 'size', {\r\n configurable: true,\r\n get: () => {\r\n this._version();\r\n return nativeSize.call(this);\r\n }\r\n });\r\n }\r\n\r\n override keys(): MapIterator<string> {\r\n this._version();\r\n return super.keys();\r\n }\r\n\r\n override values(): MapIterator<boolean> {\r\n this._version();\r\n return super.values();\r\n }\r\n\r\n override entries(): MapIterator<[string, boolean]> {\r\n this._version();\r\n return super.entries();\r\n }\r\n\r\n override [Symbol.iterator](): MapIterator<[string, boolean]> {\r\n this._version();\r\n return super[Symbol.iterator]();\r\n }\r\n\r\n /** Reads a value without registering a signal dependency. */\r\n peek(key: string): boolean | undefined {\r\n return super.get(key);\r\n }\r\n\r\n /**\r\n * Removes all entries once nothing is loading anymore. Deferred, because it\r\n * is requested from getters that are evaluated while templates render.\r\n */\r\n pruneWhenIdle(): void {\r\n if (this.prunePending) return;\r\n this.prunePending = true;\r\n defer(() => {\r\n this.prunePending = false;\r\n let anyTrue = false;\r\n super.forEach((v) => (anyTrue ||= v));\r\n if (!anyTrue) this.clear();\r\n });\r\n }\r\n}\r\n\r\n/** Makes sure `target.loading` is a ReactiveLoadingMap (inherited maps are kept). */\r\nexport function ensureLoadingMap(target: any): ReactiveLoadingMap {\r\n if (!(target.loading instanceof ReactiveLoadingMap)) {\r\n target.loading = new ReactiveLoadingMap();\r\n }\r\n return target.loading;\r\n}\r\n\r\n/**\r\n * One \"version\" signal per decorated property. Bumped whenever the backing value\r\n * in `target.___data[key]` is replaced, read by the property getter.\r\n */\r\nfunction ticksOf(target: any): Record<string, WritableSignal<number>> {\r\n if (!target.___ticks) target.___ticks = {};\r\n return target.___ticks;\r\n}\r\n\r\nexport function readTick(target: any, key: string): number {\r\n const ticks = ticksOf(target);\r\n return (ticks[key] ??= signal(0))();\r\n}\r\n\r\nexport function bumpTick(target: any, key: string): void {\r\n const ticks = ticksOf(target);\r\n (ticks[key] ??= signal(0)).update((v) => v + 1);\r\n}\r\n\r\nconst reactiveLoadingElements = new WeakSet<object>();\r\n\r\nexport function isReactiveLoadingElements(obj: unknown): boolean {\r\n return !!obj && typeof obj === 'object' && reactiveLoadingElements.has(obj);\r\n}\r\n\r\n/**\r\n * Creates a `loadingElements` object (as used by `@Route(method, loadingKey)`)\r\n * whose properties are signal-backed. `service.loadingElements.save` can be\r\n * read in an OnPush / zoneless template and updates when `@Route` changes it.\r\n * Unknown keys read as 0.\r\n */\r\nexport function createLoadingElements(\r\n initial?: Record<string, number> | null\r\n): Record<string, number> {\r\n const signals = new Map<string, WritableSignal<number>>();\r\n const sigFor = (key: string): WritableSignal<number> => {\r\n let s = signals.get(key);\r\n if (!s) {\r\n s = signal(0);\r\n signals.set(key, s);\r\n }\r\n return s;\r\n };\r\n Object.entries(initial || {}).forEach(([k, v]) => sigFor(k).set(v));\r\n\r\n const proxy = new Proxy({} as Record<string, number>, {\r\n get: (_t, key) => (typeof key === 'string' ? sigFor(key)() : undefined),\r\n set: (_t, key, value) => {\r\n if (typeof key === 'string') sigFor(key).set(value);\r\n return true;\r\n },\r\n has: (_t, key) => typeof key === 'string' && signals.has(key),\r\n deleteProperty: (_t, key) => {\r\n if (typeof key === 'string') sigFor(key).set(0);\r\n return true;\r\n },\r\n ownKeys: () => Array.from(signals.keys()),\r\n getOwnPropertyDescriptor: (_t, key) =>\r\n typeof key === 'string' && signals.has(key)\r\n ? {\r\n value: sigFor(key)(),\r\n enumerable: true,\r\n configurable: true,\r\n writable: true\r\n }\r\n : undefined\r\n });\r\n reactiveLoadingElements.add(proxy);\r\n return proxy;\r\n}\r\n","import { WebsocketClient } from '../../client';\r\nimport {\r\n bumpTick,\r\n defer,\r\n ensureLoadingMap,\r\n ReactiveLoadingMap,\r\n readTick\r\n} from '../../reactivity';\r\n\r\nexport function Outbound(\r\n method: string,\r\n requestingRequired?: boolean,\r\n cached?: boolean,\r\n sortBy?: (a: any, b: any) => number\r\n) {\r\n return function _Outbound(target: any, propertyKey: string): any {\r\n ensureLoadingMap(target);\r\n // property annotation\r\n WebsocketClient.expectOutbound(\r\n method,\r\n function setOutbound(\r\n data: any,\r\n specificHash: number | null,\r\n inserted: any[] | null,\r\n updated: any[] | null,\r\n deleted: any[] | null,\r\n length: number | null,\r\n _this: WebsocketClient\r\n ) {\r\n if (!target.___received) target.___received = {};\r\n if (!target.___data) target.___data = {};\r\n if (!target.___received) target.___received = {};\r\n if (!target.___requested) target.___requested = {};\r\n if (!cached) {\r\n if (_this.dbService) {\r\n try {\r\n _this.dbService\r\n .deleteByKey('outbound', method)\r\n .subscribe(() => {});\r\n } catch (e) {\r\n console.error(\r\n 'ActiveConnect: could not delete indexdb cache entry'\r\n );\r\n }\r\n }\r\n }\r\n\r\n if (data == 'cache_restore') {\r\n if (_this.dbService) {\r\n try {\r\n _this.dbService\r\n .getByKey('outbound', method)\r\n .subscribe((result: any) => {\r\n target.___received[propertyKey] = true;\r\n target.___data[propertyKey] = result.data;\r\n target.loading.set(propertyKey, false);\r\n bumpTick(target, propertyKey);\r\n });\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to restore cached data.');\r\n console.error(e);\r\n }\r\n } else {\r\n console.error(\r\n 'ActiveConnect: Caching / restore not possible as the indexedDB is not accessible'\r\n );\r\n }\r\n } else if (data == 'cache_delete') {\r\n if (_this.dbService) {\r\n try {\r\n _this.dbService\r\n .deleteByKey('outbound', method)\r\n .subscribe(() => {});\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to delete cached data');\r\n console.error(e);\r\n }\r\n } else {\r\n console.error(\r\n 'ActiveConnect: Caching / restore not possible as the indexedDB is not accessible'\r\n );\r\n }\r\n target.___received[propertyKey] = false;\r\n target.___data[propertyKey] = undefined;\r\n target.loading.set(propertyKey, false);\r\n bumpTick(target, propertyKey);\r\n } else if (data == 'data_delete') {\r\n target.___data[propertyKey] = undefined;\r\n target.loading.set(propertyKey, false);\r\n target.___received[propertyKey] = false;\r\n target.___requested[propertyKey] = false;\r\n bumpTick(target, propertyKey);\r\n } else if (data == 'data_diff') {\r\n // copy: a new array reference is required so OnPush inputs / signals notice the change\r\n var data: any = [...(target.___data[propertyKey] || [])];\r\n inserted?.forEach((e) => {\r\n const matching = data.filter((d: any) => d.id == e.id);\r\n if (matching.length > 0) {\r\n data[data.indexOf(matching[0])] = e;\r\n } else {\r\n data.push(e);\r\n }\r\n });\r\n updated?.forEach((e) => {\r\n const matching = data.filter((d: any) => d.id == e.id);\r\n if (matching.length > 0) {\r\n data[data.indexOf(matching[0])] = e;\r\n } else {\r\n data.push(e);\r\n }\r\n });\r\n deleted?.forEach((e) => {\r\n data = data.filter((d: any) => d.id != e.id);\r\n });\r\n if (sortBy && data) data = data.sort(sortBy);\r\n target.___data[propertyKey] = data;\r\n target.loading.set(propertyKey, false);\r\n bumpTick(target, propertyKey);\r\n\r\n if (cached && specificHash) {\r\n if (_this.dbService) {\r\n if (data && data?.length > 0) {\r\n try {\r\n _this.dbService\r\n .update('outbound', {\r\n method,\r\n data,\r\n specificHash\r\n })\r\n .subscribe(() => {});\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to update cached data');\r\n console.error(e);\r\n }\r\n } else {\r\n try {\r\n _this.dbService\r\n .deleteByKey('outbound', method)\r\n .subscribe(() => {});\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to delete cached data');\r\n console.error(e);\r\n }\r\n }\r\n } else {\r\n console.error(\r\n 'ActiveConnect: Caching not possible as the indexedDB has not been initialized'\r\n );\r\n }\r\n }\r\n } else {\r\n if (sortBy && data) data = data.sort(sortBy);\r\n target.___received[propertyKey] = true;\r\n target.___data[propertyKey] = data;\r\n target.loading.set(propertyKey, false);\r\n bumpTick(target, propertyKey);\r\n if (cached && specificHash) {\r\n if (_this.dbService) {\r\n if (data && data?.length > 0) {\r\n try {\r\n _this.dbService\r\n .update('outbound', {\r\n method,\r\n data,\r\n specificHash\r\n })\r\n .subscribe(() => {});\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to update cached data');\r\n console.error(e);\r\n }\r\n } else {\r\n try {\r\n _this.dbService\r\n .deleteByKey('outbound', method)\r\n .subscribe(() => {});\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to update cached data');\r\n console.error(e);\r\n }\r\n }\r\n } else {\r\n console.error(\r\n 'ActiveConnect: Caching not possible as the indexedDB has not been initialized'\r\n );\r\n }\r\n }\r\n }\r\n }\r\n );\r\n if (requestingRequired) {\r\n WebsocketClient.addResetRequestingStateCallback(function callback(\r\n client: WebsocketClient\r\n ) {\r\n if (target.___requested && target.___requested[propertyKey]) {\r\n client.send('request.' + method, null).then();\r\n }\r\n });\r\n }\r\n\r\n const obj = {\r\n configurable: true,\r\n get() {\r\n // Registers a signal dependency, so templates re-render on new data.\r\n readTick(target, propertyKey);\r\n if (!target.___requested) target.___requested = {};\r\n if (requestingRequired && !target.___requested[propertyKey]) {\r\n target.___requested[propertyKey] = true;\r\n // never write signals / send while a template is rendering\r\n defer(() => (this as any).send('request.' + method, null).then());\r\n }\r\n if (!target.___data) target.___data = {};\r\n const loadingMap = target.loading as ReactiveLoadingMap;\r\n if (!target.___data[propertyKey]) {\r\n if (loadingMap.peek(propertyKey) !== true)\r\n defer(() => loadingMap.set(propertyKey, true));\r\n } else if (loadingMap.peek(propertyKey)) {\r\n defer(() => loadingMap.set(propertyKey, false));\r\n }\r\n return target.___data[propertyKey];\r\n },\r\n set(val: any) {\r\n if (!target.___data) target.___data = {};\r\n target.loading.set(propertyKey, false);\r\n if (sortBy && val) val = val.sort(sortBy);\r\n target.___data[propertyKey] = val;\r\n bumpTick(target, propertyKey);\r\n return val;\r\n }\r\n };\r\n target[propertyKey] = obj;\r\n return obj;\r\n };\r\n}\r\n","import {\r\n createLoadingElements,\r\n isReactiveLoadingElements\r\n} from '../../reactivity';\r\n\r\n/**\r\n * Upgrades a service's plain `loadingElements` object to a signal-backed one the\r\n * first time it is needed, so existing services keep working unchanged while\r\n * their templates become reactive under OnPush / zoneless change detection.\r\n */\r\nfunction ensureReactiveLoadingElements(service: any) {\r\n if (!isReactiveLoadingElements(service.loadingElements)) {\r\n try {\r\n service.loadingElements = createLoadingElements(service.loadingElements);\r\n } catch {\r\n // read-only property: keep the consumer's object (still works, just not reactive)\r\n }\r\n }\r\n}\r\n\r\nexport function Route(\r\n method: string,\r\n loadingKey?: string,\r\n dontEnsureTransmission?: boolean\r\n) {\r\n return function _Route(target: any, propertyKey: string): any {\r\n // method annotation\r\n const original = target[propertyKey];\r\n target[propertyKey] = async function execRoute(...data: any): Promise<any> {\r\n if (loadingKey) {\r\n ensureReactiveLoadingElements(this);\r\n if (!this.loadingElements[loadingKey]) {\r\n this.loadingElements[loadingKey] = 0;\r\n }\r\n this.loadingElements[loadingKey]++;\r\n }\r\n const promise = original.bind(this)(...data);\r\n let res = null;\r\n if (this.client) {\r\n res = await this.client\r\n .send(method, data[0], dontEnsureTransmission)\r\n ?.catch((err: any) => {\r\n if (loadingKey && this.loadingElements[loadingKey])\r\n this.loadingElements[loadingKey]--;\r\n throw err;\r\n });\r\n }\r\n await promise;\r\n if (loadingKey && this.loadingElements[loadingKey])\r\n this.loadingElements[loadingKey]--;\r\n return res;\r\n };\r\n return target;\r\n };\r\n}\r\n","/**\r\n * @deprecated\r\n */\r\nexport function Shared<T>(defaultValue?: T) {\r\n if (defaultValue) {\r\n throw Error(\r\n \"Active-Connect/@Shared: defaultValue is no longer supported, please assign the value to the variable itself.\"\r\n );\r\n }\r\n return function _Shared(target: any, propertyKey: string) {};\r\n}\r\n","import { WebsocketClient } from '../client';\r\nimport { ensureLoadingMap, ReactiveLoadingMap } from '../reactivity';\r\n\r\n/**\r\n * Aggregated loading state of all outbounds. The getters are signal-aware, so\r\n * they can be used directly in OnPush / zoneless templates.\r\n *\r\n * Note: the getters never write state themselves (they are evaluated while\r\n * templates render). Stale `false` entries are pruned shortly afterwards.\r\n */\r\nexport class LoadingStatus extends WebsocketClient {\r\n static loading: Map<string, boolean>;\r\n\r\n // Avoids `__proto__` (and a `__proto__` class field, which breaks under\r\n // useDefineForClassFields): the map lives on the concrete client prototype.\r\n private get loadingMap(): ReactiveLoadingMap {\r\n return ensureLoadingMap(Object.getPrototypeOf(this));\r\n }\r\n\r\n private countLoading(): number {\r\n const map = this.loadingMap;\r\n let count = 0;\r\n map.forEach((e: boolean) => {\r\n if (e) count++;\r\n });\r\n if (count == 0) map.pruneWhenIdle();\r\n return count;\r\n }\r\n\r\n get isLoading(): boolean {\r\n return this.countLoading() > 0;\r\n }\r\n\r\n getLoadingMap(): Map<string, boolean> {\r\n return this.loadingMap;\r\n }\r\n\r\n get getCurrent(): number {\r\n return this.countLoading();\r\n }\r\n\r\n get getTotal(): number {\r\n return this.countLoading() > 0 ? this.loadingMap.size : 0;\r\n }\r\n}\r\n","import { signal, untracked } from '@angular/core';\r\nimport { Observable, Observer } from 'rxjs';\r\nimport { WebsocketClient } from '../client';\r\nimport { defer, ensureLoadingMap } from '../reactivity';\r\n\r\nexport interface IdObject {\r\n id: number | null | undefined;\r\n}\r\n\r\nexport class OutboundObject<T extends IdObject> {\r\n private previouslyCachedCount: number | undefined;\r\n constructor(\r\n private client: WebsocketClient,\r\n private method: string,\r\n private lazyLoaded?: boolean,\r\n public readonly cached?: boolean,\r\n private initialLoadingCount?: number,\r\n private sortBy?: (a: T, b: T) => number\r\n ) {\r\n ensureLoadingMap(this.target);\r\n\r\n if (this.client.dbService) {\r\n try {\r\n this.client.dbService\r\n .getByKey('outbound', method)\r\n .subscribe((result: any) => {\r\n if (result) {\r\n this.previouslyCachedCount = result.data?.length || null;\r\n }\r\n });\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to read cached data');\r\n console.error(e);\r\n }\r\n }\r\n\r\n const _this = this;\r\n WebsocketClient.expectOutbound(\r\n method,\r\n function setOutbound(\r\n data: any,\r\n specificHash: number | null,\r\n insertedOrGroupData: any[] | null,\r\n updatedOrGroupId: any[] | null,\r\n deleted: any[] | null,\r\n length: number | null,\r\n _client: WebsocketClient\r\n ) {\r\n if (!cached) {\r\n if (_client.dbService) {\r\n try {\r\n _client.dbService\r\n .deleteByKey('outbound', method)\r\n .subscribe(() => {});\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to delete cached data');\r\n console.error(e);\r\n }\r\n }\r\n }\r\n\r\n if (data == 'cache_restore') {\r\n if (_client.dbService) {\r\n try {\r\n _client.dbService\r\n .getByKey('outbound', method)\r\n .subscribe((result: any) => {\r\n _this.setData(result.data);\r\n if (result.length) _this._length = result.length;\r\n _this.loading = false;\r\n });\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to restore cached data');\r\n console.error(e);\r\n }\r\n } else {\r\n console.error(\r\n 'ActiveConnect: Caching / restore not possible as the indexedDB is not accessible'\r\n );\r\n }\r\n } else if (data == 'cache_delete') {\r\n if (_client.dbService) {\r\n try {\r\n _client.dbService\r\n .deleteByKey('outbound', method)\r\n .subscribe(() => {});\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to delete cached data');\r\n console.error(e);\r\n }\r\n } else {\r\n console.error(\r\n 'ActiveConnect: Caching / restore not possible as the indexedDB is not accessible'\r\n );\r\n }\r\n _this.loading = false;\r\n _this.requested = false;\r\n } else if (data == 'data_delete') {\r\n _this.data = undefined;\r\n _this.dataMap = new Map();\r\n _this.requested = false;\r\n _this.loadedGroupData = null;\r\n _this.loadedGroupId = null;\r\n _this._length = undefined;\r\n _this.loading = false;\r\n } else if (data == 'data_group') {\r\n if (\r\n _this.requestedGroupId ==\r\n (updatedOrGroupId ? updatedOrGroupId[0] : 0)\r\n ) {\r\n _this.loadedGroupData = insertedOrGroupData;\r\n _this.loadedGroupId = updatedOrGroupId ? updatedOrGroupId[0] : 0;\r\n _this.requestedGroupIdConnectionId = _this.target.___connectionId;\r\n _this.loadedGroupChanged?.next(insertedOrGroupData as T[]);\r\n _this.loading = false;\r\n }\r\n } else if (data == 'data_id') {\r\n if (\r\n _this.requestedId == (updatedOrGroupId ? updatedOrGroupId[0] : 0)\r\n ) {\r\n _this.loadedIdData =\r\n (insertedOrGroupData?.length || 0) > 0\r\n ? (insertedOrGroupData as any[])[0]\r\n : null;\r\n _this.loadedId = updatedOrGroupId ? updatedOrGroupId[0] : 0;\r\n _this.requestedIdConnectionId = _this.target.___connectionId;\r\n _this.loadedIdChanged?.next(_this.loadedIdData as T);\r\n _this.loading = false;\r\n }\r\n } else if (data == 'data_diff') {\r\n insertedOrGroupData?.forEach((e) => {\r\n _this.dataMap.set(e.id, e);\r\n if (e.id == _this.loadedId) {\r\n _this.loadedIdChanged?.next(e);\r\n }\r\n });\r\n updatedOrGroupId?.forEach((e) => {\r\n _this.dataMap.set(e.id, e);\r\n if (e.id == _this.loadedId) {\r\n _this.loadedIdChanged?.next(e);\r\n }\r\n });\r\n deleted?.forEach((e) => {\r\n _this.dataMap.delete(e.id);\r\n if (e.id == _this.loadedId) {\r\n _this.loadedIdChanged?.next(null as any);\r\n }\r\n });\r\n _this.data = Array.from(_this.dataMap.values());\r\n if (_this.data && _this.sortBy)\r\n _this.data = _this.data.sort(_this.sortBy);\r\n _this.loading = false;\r\n\r\n if (cached && specificHash) {\r\n if (_client.dbService) {\r\n try {\r\n if (_this.data && _this.data?.length > 0) {\r\n _client.dbService\r\n .update('outbound', {\r\n method,\r\n data: _this.data,\r\n specificHash,\r\n length\r\n })\r\n .subscribe(() => {});\r\n } else {\r\n _client.dbService\r\n .deleteByKey('outbound', method)\r\n .subscribe(() => {});\r\n }\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to update cached data.');\r\n console.error(e);\r\n }\r\n } else {\r\n console.error(\r\n 'ActiveConnect: Caching not possible as the indexedDB has not been initialized'\r\n );\r\n }\r\n }\r\n } else {\r\n _this.setData(data);\r\n if (_this.loadedId) {\r\n const loadedValue = _this.dataMap.get(_this.loadedId);\r\n if (loadedValue) {\r\n _this.loadedIdData = loadedValue;\r\n _this.loadedIdChanged?.next(_this.loadedIdData);\r\n }\r\n }\r\n _this.loading = false;\r\n if (cached && specificHash) {\r\n if (_client.dbService) {\r\n try {\r\n if (data && data?.length > 0) {\r\n _client.dbService\r\n .update('outbound', {\r\n method,\r\n data,\r\n specificHash,\r\n length\r\n })\r\n .subscribe(() => {});\r\n } else {\r\n _client.dbService\r\n .deleteByKey('outbound', method)\r\n .subscribe(() => {});\r\n }\r\n } catch (e) {\r\n console.error('ActiveConnect: Unable to update cached data.');\r\n console.error(e);\r\n }\r\n } else {\r\n console.error(\r\n 'ActiveConnect: Caching not possible as the indexedDB has not been initialized'\r\n );\r\n }\r\n }\r\n }\r\n if (length) _this._length = length;\r\n }\r\n );\r\n\r\n WebsocketClient.addResetRequestingStateCallback(() => {\r\n this.afterServerReconnected();\r\n });\r\n }\r\n\r\n get target(): any {\r\n return (this.client as any).__proto__;\r\n }\r\n\r\n private dataMap: Map<number | null | undefined, T> = new Map();\r\n\r\n // State that templates can read is signal-backed so OnPush / zoneless\r\n // components re-render when websocket data arrives.\r\n private readonly _dataSig = signal<T[] | undefined>(undefined);\r\n private get data(): T[] | undefined {\r\n // internal reads never register a dependency\r\n return untracked(this._dataSig);\r\n }\r\n private set data(value: T[] | undefined) {\r\n this._dataSig.set(value);\r\n }\r\n\r\n public get(id: number): Observable<T> {\r\n if (\r\n this.requestedId == id &&\r\n this.target.___connectionId == this.requestedIdConnectionId &&\r\n this.loadedObservable &&\r\n this.loadedIdData\r\n ) {\r\n if (this.loadedIdData)\r\n setTimeout(() => {\r\n if (this.loadedIdData) this.loadedIdChanged?.next(this.loadedIdData);\r\n }, 50);\r\n return this.loadedObservable;\r\n }\r\n\r\n let observablePromise: Promise<any> | undefined;\r\n if (\r\n this.requestedId != id ||\r\n this.target.___connectionId != this.requestedIdConnectionId ||\r\n !this.loadedObservable\r\n ) {\r\n observablePromise = new Promise<void>((resolve) => {\r\n this.loadedObservable = new Observable<T>((observer: Observer<T>) => {\r\n this.loadedIdChanged = observer;\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n Promise.all([observablePromise]).then(() => {\r\n new Promise<void>(async (resolve) => {\r\n if (!this.requested && this.lazyLoaded) {\r\n this.load().then();\r\n }\r\n if (this.data) {\r\n const res = this.dataMap.get(id);\r\n if (res) {\r\n this.loadedIdChanged?.next(res);\r\n resolve();\r\n return;\r\n }\r\n }\r\n if (this.loadedId == id) {\r\n this.loadedIdChanged?.next(this.loadedIdData as T);\r\n } else {\r\n await this.requestById(id);\r\n }\r\n resolve();\r\n }).then();\r\n });\r\n return this.loadedObservable as Observable<T>;\r\n }\r\n\r\n public getForGroup(groupId: number): Observable<T[]> {\r\n if (\r\n this.requestedGroupId == groupId &&\r\n this.target.___connectionId == this.requestedGroupIdConnectionId &&\r\n this.loadedGroupObservable &&\r\n this.loadedGroupData\r\n ) {\r\n setTimeout(() => {\r\n if (this.loadedGroupData)\r\n this.loadedGroupChanged?.next(this.loadedGroupData);\r\n }, 50);\r\n return this.loadedGroupObservable;\r\n }\r\n\r\n let observablePromise: Promise<any> | undefined;\r\n if (\r\n this.requestedGroupId != groupId ||\r\n this.target.___connectionId != this.requestedGroupIdConnectionId ||\r\n !this.loadedGroupObservable\r\n ) {\r\n observablePromise = new Promise<void>((resolve) => {\r\n this.loadedGroupObservable = new Observable<T[]>(\r\n (observer: Observer<T[]>) => {\r\n this.loadedGroupChanged = observer;\r\n resolve();\r\n }\r\n );\r\n });\r\n }\r\n\r\n Promise.all([observablePromise]).then(() => {\r\n new Promise<void>(async (resolve) => {\r\n if (!this.requested && this.lazyLoaded) {\r\n this.load().then();\r\n }\r\n if (this.loadedGroupId == groupId && this.loadedGroupData) {\r\n this.loadedGroupChanged?.next(this.loadedGroupData as T[]);\r\n } else {\r\n await this.requestForGroup(groupId);\r\n }\r\n resolve();\r\n }).then();\r\n });\r\n return this.loadedGroupObservable as Observable<T[]>;\r\n }\r\n\r\n public get all(): T[] | undefined {\r\n this.ensureLoaded();\r\n return this._dataSig();\r\n }\r\n\r\n private loadScheduled = false;\r\n /**\r\n * `all` is read from templates, where signals must not be written. The lazy\r\n * load (which flips loading state) is therefore started after rendering.\r\n */\r\n private ensureLoaded() {\r\n if (this.requested || !this.lazyLoaded || this.loadScheduled) return;\r\n this.loadScheduled = true;\r\n defer(() => {\r\n this.loadScheduled = false;\r\n if (!this.requested) {\r\n this.load().catch((e) =>\r\n console.error('ActiveConnect: lazy load failed', e)\r\n );\r\n }\r\n });\r\n }\r\n\r\n private requested: boolean = false;\r\n public async load(count?: number): Promise<void> {\r\n if (this.lazyLoaded) {\r\n const hasBeenRequestedBefore = this.requested;\r\n this._loading = true;\r\n if (!this.requested) {\r\n this.loading = true;\r\n }\r\n this.requested = true;\r\n await this.client.send('request.' + this.method, {\r\n count: hasBeenRequestedBefore\r\n ? this.data\r\n ? count || this.initialLoadingCount\r\n ? (count || (this.initialLoadingCount as number)) +\r\n this.loadedLength\r\n : undefined\r\n : undefined\r\n : this.previouslyCachedCount || (this.initialLoadingCount as number),\r\n loaded: this.loadedLength\r\n });\r\n } else {\r\n throw Error(\r\n 'Active-Connect: Cannot run loading request as this outbound is not lazy-loaded.'\r\n );\r\n }\r\n }\r\n\r\n private readonly _loadingSig = signal(false);\r\n private get _loading(): boolean {\r\n return untracked(this._loadingSig);\r\n }\r\n private set _loading(value: boolean) {\r\n this._loadingSig.set(value);\r\n }\r\n private set loading(value: boolean) {\r\n this._loading = value;\r\n this.target.loading.set(this.method, value);\r\n }\r\n public get loading(): boolean {\r\n return this._loadingSig();\r\n }\r\n public get loadedLength(): number {\r\n return this._dataSig()?.length || 0;\r\n }\r\n private readonly _lengthSig = signal<number | undefined>(undefined);\r\n private get _length(): number | undefined {\r\n return untracked(this._lengthSig);\r\n }\r\n private set _length(value: number | undefined) {\r\n this._lengthSig.set(value);\r\n }\r\n public get length(): number | undefined {\r\n return this._lengthSig();\r\n }\r\n\r\n private requestedId: number | null = null;\r\n private requestedIdConnectionId: number | null = null;\r\n private loadedObservable: Observable<T> | null = null;\r\n private loadedId: number | null = null;\r\n private loadedIdData: T | null = null;\r\n private loadedIdChanged: Observer<T> | null = null;\r\n private requestById(id: number): Promise<any> {\r\n this.loading = true;\r\n this.requestedId = id;\r\n return this.client.send('request.' + this.method, { id }) as Promise<any>;\r\n }\r\n\r\n private requestedGroupId: number | null = null;\r\n private requestedGroupIdConnectionId: number | null = null;\r\n private loadedGroupObservable: Observable<T[]> | null = null;\r\n private loadedGroupId: number | null = null;\r\n private loadedGroupData: T[] | null = null;\r\n private loadedGroupChanged: Observer<T[]> | null = null;\r\n private requestForGroup(groupId: number): Promise<T[]> {\r\n this.loading = true;\r\n this.requestedGroupId = groupId;\r\n return this.client.send('request.' + this.method, { groupId });\r\n }\r\n\r\n private setData(data: T[] | { added: T[] | undefined; length: number }) {\r\n const incoming = data as T[];\r\n if (this.sortBy) incoming.sort(this.sortBy);\r\n // always publish a new array reference so signal consumers are notified\r\n const next = [...incoming];\r\n this._length = next.length;\r\n this.dataMap = new Map();\r\n next.forEach((d) => {\r\n this.dataMap.set(d.id, d);\r\n });\r\n this.data = next;\r\n }\r\n\r\n get isEmpty() {\r\n return this._dataSig() == undefined;\r\n }\r\n\r\n /**\r\n * The contained data can be modified within the callback method\r\n */\r\n public update(callback: (data: T[]) => void) {\r\n if (this.data) {\r\n const updateLengthVariable = this.data.length == this._length;\r\n const length = this._length;\r\n // work on a copy: a new array reference is what notifies signal consumers\r\n const copy = [...this.data];\r\n callback(copy);\r\n this.setData(copy);\r\n if (!updateLengthVariable) {\r\n this._length = length;\r\n }\r\n }\r\n }\r\n\r\n private afterServerReconnected() {\r\n if (this.requested && this.lazyLoaded) {\r\n this.requested = false;\r\n this.load(this.loadedLength).then();\r\n }\r\n if (this.loadedId) {\r\n this.loadedIdData = null;\r\n this.requestById(this.loadedId).catch(() => {});\r\n }\r\n if (this.loadedGroupId) {\r\n this.loadedGroupData = null;\r\n this.requestForGroup(this.loadedGroupId).catch(() => {});\r\n }\r\n }\r\n}\r\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,32 +1,26 @@
1
1
  {
2
2
  "name": "active-connect-ng2",
3
- "version": "0.2.49",
3
+ "version": "0.3.0",
4
4
  "peerDependencies": {
5
- "@angular/common": "^15.1.0",
6
- "@angular/core": "^15.1.0",
7
- "ngx-indexed-db": "^16.0.0"
5
+ "@angular/common": "^20.0.0 || ^21.0.0 || ^22.0.0",
6
+ "@angular/core": "^20.0.0 || ^21.0.0 || ^22.0.0",
7
+ "ngx-indexed-db": "^21.0.0 || ^22.0.0",
8
+ "rxjs": "^7.8.0"
8
9
  },
9
10
  "dependencies": {
10
11
  "tslib": "^2.3.0"
11
12
  },
12
13
  "sideEffects": false,
13
- "module": "fesm2015/active-connect-ng2.mjs",
14
- "es2020": "fesm2020/active-connect-ng2.mjs",
15
- "esm2020": "esm2020/active-connect-ng2.mjs",
16
- "fesm2020": "fesm2020/active-connect-ng2.mjs",
17
- "fesm2015": "fesm2015/active-connect-ng2.mjs",
18
- "typings": "index.d.ts",
14
+ "module": "fesm2022/active-connect-ng2.mjs",
15
+ "typings": "types/active-connect-ng2.d.ts",
19
16
  "exports": {
20
17
  "./package.json": {
21
18
  "default": "./package.json"
22
19
  },
23
20
  ".": {
24
- "types": "./index.d.ts",
25
- "esm2020": "./esm2020/active-connect-ng2.mjs",
26
- "es2020": "./fesm2020/active-connect-ng2.mjs",
27
- "es2015": "./fesm2015/active-connect-ng2.mjs",
28
- "node": "./fesm2015/active-connect-ng2.mjs",
29
- "default": "./fesm2020/active-connect-ng2.mjs"
21
+ "types": "./types/active-connect-ng2.d.ts",
22
+ "default": "./fesm2022/active-connect-ng2.mjs"
30
23
  }
31
- }
24
+ },
25
+ "type": "module"
32
26
  }
@@ -0,0 +1,254 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "ngx-indexed-db";
3
+ import { NgxIndexedDBService, NgxIndexedDBService as NgxIndexedDBService$1 } from "ngx-indexed-db";
4
+ import { Observable } from "rxjs";
5
+ export declare class ActiveConnectNg2Module {
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<ActiveConnectNg2Module, never>;
7
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ActiveConnectNg2Module, never, [typeof i1.NgxIndexedDBModule], [typeof i1.NgxIndexedDBModule]>;
8
+ static ɵinj: i0.ɵɵInjectorDeclaration<ActiveConnectNg2Module>;
9
+ }
10
+ /**
11
+ * Represents the reference to an object method used for websocket routes and outbounds.
12
+ */
13
+ declare class DecorableFunction {
14
+ protected objConfig: {
15
+ target: any;
16
+ propertyKey: string;
17
+ };
18
+ /**
19
+ * Creates an instance of DecorableFunction.
20
+ * @param objConfig - The configuration object for the object method.
21
+ * @param objConfig.target - The target object.
22
+ * @param objConfig.propertyKey - The property key of the target object.
23
+ */
24
+ constructor(objConfig: {
25
+ target: any;
26
+ propertyKey: string;
27
+ });
28
+ /**
29
+ * Returns the decorated function.
30
+ * @returns - The decorated function.
31
+ */
32
+ get Func(): ((...data: any[]) => Promise<any> | any) | null;
33
+ /**
34
+ * Returns the bind object.
35
+ * @private
36
+ * @returns - The bind object.
37
+ */
38
+ private getBindObject;
39
+ }
40
+ export declare class WebsocketClient {
41
+ private url?;
42
+ private supportsCache?;
43
+ dbService?: NgxIndexedDBService$1 | undefined;
44
+ ws: WebSocket;
45
+ pool: {
46
+ WssConnected: boolean;
47
+ } | null;
48
+ /**
49
+ * Connection state as a signal, so `isConnected` can be used in OnPush /
50
+ * zoneless templates (a socket's readyState alone is not observable).
51
+ */
52
+ private readonly _connected;
53
+ constructor(url?: string | undefined, supportsCache?: boolean | undefined, dbService?: NgxIndexedDBService$1 | undefined);
54
+ protected setUrl(url: string | undefined): void;
55
+ private connect;
56
+ initTabSuspendedListener(): void;
57
+ private requestStack;
58
+ private requestHistoryLogs;
59
+ private logEntry;
60
+ get logs(): {
61
+ timestamp: Date;
62
+ method: string;
63
+ }[];
64
+ private _token;
65
+ get Token(): string;
66
+ set Token(val: string);
67
+ private set Connected(value);
68
+ private static resetRequestedStateCallbacks;
69
+ private connectionEstablishedOnce;
70
+ private resetRequestedState;
71
+ static addResetRequestingStateCallback(callback: Function): void;
72
+ private static readonly HANDSHAKE_TIMEOUT_MS;
73
+ private handshakeTimer;
74
+ private clearHandshakeTimer;
75
+ private create;
76
+ private reconnectTimer;
77
+ private clearReconnectTimer;
78
+ private messageId;
79
+ protected sendToSocket(method: string, data: any, dontEnsureTransmission?: boolean, forcedMessageId?: number): number | false;
80
+ auth(token: string): Promise<any>;
81
+ send(method: string, data: any, dontEnsureTransmission?: boolean): Promise<any>;
82
+ private rejectCallbacks;
83
+ private expectedMethods;
84
+ private expectMethod;
85
+ private messageReceived;
86
+ private handleOutboundCacheRequest;
87
+ private static outbounds;
88
+ static expectOutbound(method: string, callback: (data: any, specificHash: number | null, inserted: any[] | null, updated: any[] | null, deleted: any[] | null, length: number | null, _this: WebsocketClient) => void): void;
89
+ private static handles;
90
+ static registerHandle(method: string, callback: DecorableFunction): void;
91
+ get isConnected(): boolean;
92
+ private sendBrowserInfoToServer;
93
+ getBrowser(): {
94
+ name: string;
95
+ version: string;
96
+ };
97
+ getOS(): string;
98
+ private static onSuccessHandlers;
99
+ static onSuccess(callback: DecorableFunction, regexp: RegExp): void;
100
+ private static onReconnectCallback;
101
+ static onReconnect(callback: DecorableFunction): void;
102
+ private invokeSuccessHandlers;
103
+ closed: boolean;
104
+ disconnect(restart?: boolean): void;
105
+ private initCache;
106
+ get target(): any;
107
+ }
108
+ export declare function Handle(method: string): (target: any, propertyKey: string) => any;
109
+ export declare function OnSuccess(regexp: RegExp): (target: any, propertyKey: string) => any;
110
+ export declare function OnReconnect(target: any, propertyKey: string): void;
111
+ export declare function Outbound(method: string, requestingRequired?: boolean, cached?: boolean, sortBy?: (a: any, b: any) => number): (target: any, propertyKey: string) => any;
112
+ export declare function Route(method: string, loadingKey?: string, dontEnsureTransmission?: boolean): (target: any, propertyKey: string) => any;
113
+ /**
114
+ * @deprecated
115
+ */
116
+ export declare function Shared<T>(defaultValue?: T): (target: any, propertyKey: string) => void;
117
+ export interface WebsocketRouteService {
118
+ loadingElements: any;
119
+ client: WebsocketClient;
120
+ }
121
+ /**
122
+ * Aggregated loading state of all outbounds. The getters are signal-aware, so
123
+ * they can be used directly in OnPush / zoneless templates.
124
+ *
125
+ * Note: the getters never write state themselves (they are evaluated while
126
+ * templates render). Stale `false` entries are pruned shortly afterwards.
127
+ */
128
+ export declare class LoadingStatus extends WebsocketClient {
129
+ static loading: Map<string, boolean>;
130
+ private get loadingMap();
131
+ private countLoading;
132
+ get isLoading(): boolean;
133
+ getLoadingMap(): Map<string, boolean>;
134
+ get getCurrent(): number;
135
+ get getTotal(): number;
136
+ }
137
+ export interface IdObject {
138
+ id: number | null | undefined;
139
+ }
140
+ export declare class OutboundObject<T extends IdObject> {
141
+ private client;
142
+ private method;
143
+ private lazyLoaded?;
144
+ readonly cached?: boolean | undefined;
145
+ private initialLoadingCount?;
146
+ private sortBy?;
147
+ private previouslyCachedCount;
148
+ constructor(client: WebsocketClient, method: string, lazyLoaded?: boolean | undefined, cached?: boolean | undefined, initialLoadingCount?: number | undefined, sortBy?: ((a: T, b: T) => number) | undefined);
149
+ get target(): any;
150
+ private dataMap;
151
+ private readonly _dataSig;
152
+ private get data();
153
+ private set data(value);
154
+ get(id: number): Observable<T>;
155
+ getForGroup(groupId: number): Observable<T[]>;
156
+ get all(): T[] | undefined;
157
+ private loadScheduled;
158
+ /**
159
+ * `all` is read from templates, where signals must not be written. The lazy
160
+ * load (which flips loading state) is therefore started after rendering.
161
+ */
162
+ private ensureLoaded;
163
+ private requested;
164
+ load(count?: number): Promise<void>;
165
+ private readonly _loadingSig;
166
+ private get _loading();
167
+ private set _loading(value);
168
+ private set loading(value);
169
+ get loading(): boolean;
170
+ get loadedLength(): number;
171
+ private readonly _lengthSig;
172
+ private get _length();
173
+ private set _length(value);
174
+ get length(): number | undefined;
175
+ private requestedId;
176
+ private requestedIdConnectionId;
177
+ private loadedObservable;
178
+ private loadedId;
179
+ private loadedIdData;
180
+ private loadedIdChanged;
181
+ private requestById;
182
+ private requestedGroupId;
183
+ private requestedGroupIdConnectionId;
184
+ private loadedGroupObservable;
185
+ private loadedGroupId;
186
+ private loadedGroupData;
187
+ private loadedGroupChanged;
188
+ private requestForGroup;
189
+ private setData;
190
+ get isEmpty(): boolean;
191
+ /**
192
+ * The contained data can be modified within the callback method
193
+ */
194
+ update(callback: (data: T[]) => void): void;
195
+ private afterServerReconnected;
196
+ }
197
+ /**
198
+ * Reactivity helpers.
199
+ *
200
+ * Why this exists: previously the library stored its state in plain objects and
201
+ * relied on Zone.js to notice that "something async happened" (a websocket
202
+ * message) and re-run change detection. Angular is now zoneless by default and
203
+ * components are OnPush by default, so plain mutations are never rendered.
204
+ * Everything a template can read is therefore backed by a signal. Reading it in
205
+ * a template registers a dependency; writing it (from websocket handlers)
206
+ * schedules change detection - with or without Zone.js.
207
+ *
208
+ * IMPORTANT: signals must never be *written* while a template is rendering
209
+ * (Angular throws NG0600). Getters that are read from templates therefore only
210
+ * read signals; any side effect they need to trigger is deferred with
211
+ * `defer()`.
212
+ */
213
+ /** Runs a side effect after the current (possibly rendering) call stack. */
214
+ export declare function defer(fn: () => void): void;
215
+ /**
216
+ * A Map<string, boolean> that notifies signal consumers whenever it changes.
217
+ * Drop-in replacement for the plain `Map` previously stored in `target.loading`.
218
+ */
219
+ export declare class ReactiveLoadingMap extends Map<string, boolean> {
220
+ private readonly _version;
221
+ private prunePending;
222
+ private bump;
223
+ get(key: string): boolean | undefined;
224
+ has(key: string): boolean;
225
+ set(key: string, value: boolean): this;
226
+ delete(key: string): boolean;
227
+ clear(): void;
228
+ forEach(callbackfn: (value: boolean, key: string, map: Map<string, boolean>) => void, thisArg?: any): void;
229
+ constructor();
230
+ keys(): MapIterator<string>;
231
+ values(): MapIterator<boolean>;
232
+ entries(): MapIterator<[string, boolean]>;
233
+ [Symbol.iterator](): MapIterator<[string, boolean]>;
234
+ /** Reads a value without registering a signal dependency. */
235
+ peek(key: string): boolean | undefined;
236
+ /**
237
+ * Removes all entries once nothing is loading anymore. Deferred, because it
238
+ * is requested from getters that are evaluated while templates render.
239
+ */
240
+ pruneWhenIdle(): void;
241
+ }
242
+ /** Makes sure `target.loading` is a ReactiveLoadingMap (inherited maps are kept). */
243
+ export declare function ensureLoadingMap(target: any): ReactiveLoadingMap;
244
+ export declare function readTick(target: any, key: string): number;
245
+ export declare function bumpTick(target: any, key: string): void;
246
+ export declare function isReactiveLoadingElements(obj: unknown): boolean;
247
+ /**
248
+ * Creates a `loadingElements` object (as used by `@Route(method, loadingKey)`)
249
+ * whose properties are signal-backed. `service.loadingElements.save` can be
250
+ * read in an OnPush / zoneless template and updates when `@Route` changes it.
251
+ * Unknown keys read as 0.
252
+ */
253
+ export declare function createLoadingElements(initial?: Record<string, number> | null): Record<string, number>;
254
+ export { NgxIndexedDBService };
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWNvbm5lY3QtbmcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlLWNvbm5lY3QtbmcyL3NyYy9hY3RpdmUtY29ubmVjdC1uZzIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -1,42 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { NgxIndexedDBModule } from 'ngx-indexed-db';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "ngx-indexed-db";
5
- const dbConfig = {
6
- name: 'activeconnect_cache',
7
- version: 2,
8
- objectStoresMeta: [
9
- {
10
- store: 'outbound',
11
- storeConfig: { keyPath: 'method', autoIncrement: false },
12
- storeSchema: [
13
- { name: 'method', keypath: 'method', options: { unique: true } },
14
- { name: 'data', keypath: 'data', options: { unique: false } },
15
- {
16
- name: 'specificHash',
17
- keypath: 'specificHash',
18
- options: { unique: false },
19
- },
20
- {
21
- name: 'length',
22
- keypath: 'length',
23
- options: { unique: false },
24
- },
25
- ],
26
- },
27
- ],
28
- };
29
- export class ActiveConnectNg2Module {
30
- }
31
- ActiveConnectNg2Module.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ActiveConnectNg2Module, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
32
- ActiveConnectNg2Module.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: ActiveConnectNg2Module, imports: [i1.NgxIndexedDBModule], exports: [NgxIndexedDBModule] });
33
- ActiveConnectNg2Module.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ActiveConnectNg2Module, imports: [NgxIndexedDBModule.forRoot(dbConfig), NgxIndexedDBModule] });
34
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ActiveConnectNg2Module, decorators: [{
35
- type: NgModule,
36
- args: [{
37
- declarations: [],
38
- imports: [NgxIndexedDBModule.forRoot(dbConfig)],
39
- exports: [NgxIndexedDBModule],
40
- }]
41
- }] });
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWNvbm5lY3QtbmcyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZS1jb25uZWN0LW5nMi9zcmMvbGliL2FjdGl2ZS1jb25uZWN0LW5nMi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsa0JBQWtCLEVBQVksTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRTlELE1BQU0sUUFBUSxHQUFhO0lBQ3pCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLENBQUM7SUFDVixnQkFBZ0IsRUFBRTtRQUNoQjtZQUNFLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRTtZQUN4RCxXQUFXLEVBQUU7Z0JBQ1gsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUNoRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzdEO29CQUNFLElBQUksRUFBRSxjQUFjO29CQUNwQixPQUFPLEVBQUUsY0FBYztvQkFDdkIsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtpQkFDM0I7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsT0FBTyxFQUFFLFFBQVE7b0JBQ2pCLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7aUJBQzNCO2FBQ0Y7U0FDRjtLQUNGO0NBQ0YsQ0FBQztBQU9GLE1BQU0sT0FBTyxzQkFBc0I7O21IQUF0QixzQkFBc0I7b0hBQXRCLHNCQUFzQiw4Q0FGdkIsa0JBQWtCO29IQUVqQixzQkFBc0IsWUFIdkIsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUNwQyxrQkFBa0I7MkZBRWpCLHNCQUFzQjtrQkFMbEMsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztpQkFDOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ3hJbmRleGVkREJNb2R1bGUsIERCQ29uZmlnIH0gZnJvbSAnbmd4LWluZGV4ZWQtZGInO1xyXG5cclxuY29uc3QgZGJDb25maWc6IERCQ29uZmlnID0ge1xyXG4gIG5hbWU6ICdhY3RpdmVjb25uZWN0X2NhY2hlJyxcclxuICB2ZXJzaW9uOiAyLFxyXG4gIG9iamVjdFN0b3Jlc01ldGE6IFtcclxuICAgIHtcclxuICAgICAgc3RvcmU6ICdvdXRib3VuZCcsXHJcbiAgICAgIHN0b3JlQ29uZmlnOiB7IGtleVBhdGg6ICdtZXRob2QnLCBhdXRvSW5jcmVtZW50OiBmYWxzZSB9LFxyXG4gICAgICBzdG9yZVNjaGVtYTogW1xyXG4gICAgICAgIHsgbmFtZTogJ21ldGhvZCcsIGtleXBhdGg6ICdtZXRob2QnLCBvcHRpb25zOiB7IHVuaXF1ZTogdHJ1ZSB9IH0sXHJcbiAgICAgICAgeyBuYW1lOiAnZGF0YScsIGtleXBhdGg6ICdkYXRhJywgb3B0aW9uczogeyB1bmlxdWU6IGZhbHNlIH0gfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnc3BlY2lmaWNIYXNoJyxcclxuICAgICAgICAgIGtleXBhdGg6ICdzcGVjaWZpY0hhc2gnLFxyXG4gICAgICAgICAgb3B0aW9uczogeyB1bmlxdWU6IGZhbHNlIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnbGVuZ3RoJyxcclxuICAgICAgICAgIGtleXBhdGg6ICdsZW5ndGgnLFxyXG4gICAgICAgICAgb3B0aW9uczogeyB1bmlxdWU6IGZhbHNlIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgIH0sXHJcbiAgXSxcclxufTtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXSxcclxuICBpbXBvcnRzOiBbTmd4SW5kZXhlZERCTW9kdWxlLmZvclJvb3QoZGJDb25maWcpXSxcclxuICBleHBvcnRzOiBbTmd4SW5kZXhlZERCTW9kdWxlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjdGl2ZUNvbm5lY3ROZzJNb2R1bGUge31cclxuIl19