@cratis/arc 22.185.0 → 22.186.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.
- package/commands/Command.ts +13 -20
- package/dist/cjs/commands/Command.d.ts +1 -0
- package/dist/cjs/commands/Command.d.ts.map +1 -1
- package/dist/cjs/commands/Command.js +15 -16
- package/dist/cjs/commands/Command.js.map +1 -1
- package/dist/cjs/queries/ObservableQueryFor.d.ts +2 -0
- package/dist/cjs/queries/ObservableQueryFor.d.ts.map +1 -1
- package/dist/cjs/queries/ObservableQueryFor.js +34 -27
- package/dist/cjs/queries/ObservableQueryFor.js.map +1 -1
- package/dist/cjs/queries/QueryInstanceCache.d.ts +1 -0
- package/dist/cjs/queries/QueryInstanceCache.d.ts.map +1 -1
- package/dist/cjs/queries/QueryInstanceCache.js +11 -16
- package/dist/cjs/queries/QueryInstanceCache.js.map +1 -1
- package/dist/cjs/queries/ServerSentEventHubConnection.d.ts +7 -0
- package/dist/cjs/queries/ServerSentEventHubConnection.d.ts.map +1 -1
- package/dist/cjs/queries/ServerSentEventHubConnection.js +97 -57
- package/dist/cjs/queries/ServerSentEventHubConnection.js.map +1 -1
- package/dist/cjs/queries/WebSocketHubConnection.d.ts +6 -0
- package/dist/cjs/queries/WebSocketHubConnection.d.ts.map +1 -1
- package/dist/cjs/queries/WebSocketHubConnection.js +62 -43
- package/dist/cjs/queries/WebSocketHubConnection.js.map +1 -1
- package/dist/esm/commands/Command.d.ts +1 -0
- package/dist/esm/commands/Command.d.ts.map +1 -1
- package/dist/esm/commands/Command.js +15 -16
- package/dist/esm/commands/Command.js.map +1 -1
- package/dist/esm/queries/ObservableQueryFor.d.ts +2 -0
- package/dist/esm/queries/ObservableQueryFor.d.ts.map +1 -1
- package/dist/esm/queries/ObservableQueryFor.js +35 -28
- package/dist/esm/queries/ObservableQueryFor.js.map +1 -1
- package/dist/esm/queries/QueryInstanceCache.d.ts +1 -0
- package/dist/esm/queries/QueryInstanceCache.d.ts.map +1 -1
- package/dist/esm/queries/QueryInstanceCache.js +11 -16
- package/dist/esm/queries/QueryInstanceCache.js.map +1 -1
- package/dist/esm/queries/ServerSentEventHubConnection.d.ts +7 -0
- package/dist/esm/queries/ServerSentEventHubConnection.d.ts.map +1 -1
- package/dist/esm/queries/ServerSentEventHubConnection.js +97 -57
- package/dist/esm/queries/ServerSentEventHubConnection.js.map +1 -1
- package/dist/esm/queries/WebSocketHubConnection.d.ts +6 -0
- package/dist/esm/queries/WebSocketHubConnection.d.ts.map +1 -1
- package/dist/esm/queries/WebSocketHubConnection.js +62 -43
- package/dist/esm/queries/WebSocketHubConnection.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/queries/ObservableQueryFor.ts +43 -32
- package/queries/QueryInstanceCache.ts +12 -18
- package/queries/ServerSentEventHubConnection.ts +120 -113
- package/queries/WebSocketHubConnection.ts +72 -53
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketHubConnection.js","sources":["../../../queries/WebSocketHubConnection.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Globals } from '../Globals.js';\nimport type { DataReceived } from './ObservableQueryConnection.js';\nimport { HubConnectionKeepAlive } from './HubConnectionKeepAlive.js';\nimport type { IReconnectPolicy } from './IReconnectPolicy.js';\nimport { ReconnectPolicy } from './ReconnectPolicy.js';\nimport { QueryResult } from './QueryResult.js';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Message types matching the backend {@link ObservableQueryHubMessageType} enum.\n * Serialized as strings by the JsonStringEnumConverter on the server.\n */\nexport enum HubMessageType {\n Subscribe = 'Subscribe',\n Unsubscribe = 'Unsubscribe',\n QueryResult = 'QueryResult',\n Unauthorized = 'Unauthorized',\n Error = 'Error',\n Ping = 'Ping',\n Pong = 'Pong',\n Connected = 'Connected',\n}\n\n/**\n * Wire format for messages exchanged over the observable query WebSocket and SSE hub transports.\n */\nexport interface HubMessage {\n type: HubMessageType;\n queryId?: string;\n\n /** Optional positive safe-integer revision used to reject stale replacement messages. */\n revision?: number;\n\n /**\n * Whether the server supports revision-aware subscription operations and result frames.\n * Only present on {@link HubMessageType.Connected} messages from capable servers.\n */\n supportsSubscriptionRevisions?: boolean;\n payload?: any;\n timestamp?: number;\n\n /**\n * The server's keep-alive interval in milliseconds, or 0 when keep-alive is disabled.\n * Only present on {@link HubMessageType.Connected} messages.\n */\n keepAliveIntervalMs?: number;\n}\n\n/**\n * Matches the backend {@link ObservableQuerySubscriptionRequest} record.\n */\nexport interface SubscriptionRequest {\n queryName: string;\n arguments?: Record<string, string | null>;\n page?: number;\n pageSize?: number;\n sortBy?: string;\n sortDirection?: string;\n transferMode?: string;\n}\n\ninterface ActiveSubscription {\n request: SubscriptionRequest;\n callback: DataReceived<any>;\n revision: number;\n}\n\n/**\n * Represents a single multiplexed WebSocket connection to the observable query hub\n * at {@code /.cratis/queries/ws}.\n *\n * Multiple query subscriptions are carried over the same physical WebSocket. Each subscription\n * is identified by a client-generated {@code queryId}; the server tags every result message with\n * the same id so responses can be routed to the correct callback. The client initially subscribes\n * without revisions for compatibility with older servers, then replaces active subscriptions with\n * revision-aware operations when the server advertises support in a Connected message.\n */\nexport class WebSocketHubConnection {\n /** How long to wait for the server's Connected message before subscribing the way older servers expect. */\n static readonly ConnectedGraceMs = 1000;\n\n private _socket?: WebSocket;\n private _disconnected = false;\n private _subscriptions: Map<string, ActiveSubscription> = new Map();\n private readonly _keepAlive: HubConnectionKeepAlive;\n private _lastPingSentTime?: number;\n private _lastPongLatency: number = 0;\n private _latencySamples: number[] = [];\n private _nextRevision = 0;\n private _supportsSubscriptionRevisions = false;\n private _reconnectPending = false;\n private _subscriptionsReleased = false;\n private _releaseTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * Initializes a new instance of {@link WebSocketHubConnection}.\n * @param {string} _url The WebSocket URL of the hub endpoint (e.g. {@code ws://localhost:5000/.cratis/queries/ws}).\n * @param {string} _microservice The microservice name to pass as a query argument.\n * @param {number} pingIntervalMs How often to send keep-alive pings when the connection is idle (default: 10 000 ms).\n * @param {IReconnectPolicy} _policy The reconnect policy to use (default: {@link ReconnectPolicy}).\n */\n constructor(\n private readonly _url: string,\n private readonly _microservice: string,\n pingIntervalMs: number = 10000,\n private readonly _policy: IReconnectPolicy = new ReconnectPolicy(),\n ) {\n this._keepAlive = new HubConnectionKeepAlive(pingIntervalMs, () => {\n if (this._socket?.readyState === WebSocket.OPEN) {\n this._lastPingSentTime = Date.now();\n this.sendMessage({\n type: HubMessageType.Ping,\n timestamp: this._lastPingSentTime,\n });\n }\n });\n }\n\n /**\n * Gets the number of active query subscriptions on this connection.\n */\n get queryCount(): number {\n return this._subscriptions.size;\n }\n\n /**\n * Gets whether the WebSocket connection is currently open.\n */\n get isConnected(): boolean {\n return this._socket?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Gets the latency of the last ping/pong sequence in milliseconds.\n */\n get lastPingLatency(): number {\n return this._lastPongLatency;\n }\n\n /**\n * Gets the rolling average latency in milliseconds.\n */\n get averageLatency(): number {\n if (this._latencySamples.length === 0) return 0;\n return (\n this._latencySamples.reduce((a, b) => a + b, 0) / this._latencySamples.length\n );\n }\n\n /**\n * Subscribe to a query on this hub connection.\n * If the WebSocket is not yet open, the subscribe message will be sent once the connection is established.\n * @param {string} queryId Client-generated unique identifier for this subscription.\n * @param {SubscriptionRequest} request The subscription request payload.\n * @param {DataReceived<any>} callback Callback invoked whenever the server pushes a result for this query.\n */\n subscribe(\n queryId: string,\n request: SubscriptionRequest,\n callback: DataReceived<any>,\n ): void {\n const subscription = { request, callback, revision: this.getNextRevision() };\n this._subscriptions.set(queryId, subscription);\n this.ensureConnected();\n\n if (this._socket?.readyState === WebSocket.OPEN && this._subscriptionsReleased) {\n this.sendSubscribeMessage(queryId, subscription);\n }\n // Until the server has said what it supports, subscriptions are held back and sent once, by releaseSubscriptions.\n }\n\n /**\n * Unsubscribe from a query on this hub connection.\n * @param {string} queryId The identifier of the subscription to cancel.\n */\n unsubscribe(queryId: string): void {\n const subscription = this._subscriptions.get(queryId);\n this._subscriptions.delete(queryId);\n\n if (this._socket?.readyState === WebSocket.OPEN && this._subscriptionsReleased && subscription) {\n const message: HubMessage = {\n type: HubMessageType.Unsubscribe,\n queryId,\n };\n if (this._supportsSubscriptionRevisions) {\n message.revision = subscription.revision;\n }\n this.sendMessage(message);\n }\n\n // If no subscriptions remain, close the connection to free resources.\n if (this._subscriptions.size === 0) {\n this.close();\n }\n }\n\n /**\n * Permanently close this hub connection and clean up all subscriptions.\n */\n dispose(): void {\n this._subscriptions.clear();\n this.close();\n }\n\n private ensureConnected(): void {\n if (this._disconnected) {\n // Reset disconnected flag when a new subscription comes in\n this._disconnected = false;\n }\n\n if (\n this._socket &&\n (this._socket.readyState === WebSocket.OPEN ||\n this._socket.readyState === WebSocket.CONNECTING)\n ) {\n this.cancelPendingReconnect();\n return;\n }\n\n // A subscription can arrive while an earlier close is waiting in reconnect backoff. The immediate open owns\n // the connection now, so the delayed callback must not be allowed to create a competing socket later.\n this.cancelPendingReconnect();\n this.openSocket();\n }\n\n private close(): void {\n this._disconnected = true;\n this._keepAlive.stop();\n this._policy.cancel();\n this._reconnectPending = false;\n this.resetSubscriptionRelease();\n const socket = this._socket;\n this._socket = undefined;\n this._supportsSubscriptionRevisions = false;\n if (socket) {\n this.detachAndCloseSocket(socket);\n }\n }\n\n private openSocket(): void {\n const currentSocket = this._socket;\n if (\n currentSocket &&\n (currentSocket.readyState === WebSocket.OPEN ||\n currentSocket.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n if (currentSocket) {\n this._socket = undefined;\n this.detachAndCloseSocket(currentSocket);\n }\n\n this._supportsSubscriptionRevisions = false;\n this.resetSubscriptionRelease();\n\n let url = this._url;\n if (this._microservice?.length > 0) {\n const param = `${Globals.microserviceWSQueryArgument}=${encodeURIComponent(this._microservice)}`;\n url += (url.includes('?') ? '&' : '?') + param;\n }\n\n const socket = new WebSocket(url);\n this._socket = socket;\n\n socket.onopen = () => {\n if (this._socket !== socket || this._disconnected) return;\n console.log('Hub connection established', url);\n this.cancelPendingReconnect();\n this._policy.reset();\n this._keepAlive.start();\n\n // A capable server announces itself with a Connected message straight after accepting the socket. Sending\n // the subscriptions before that would mean sending them twice (once without a revision, once with), and the\n // server would run every query twice and cancel the first run. Wait for it, and only fall back to the\n // revision-less form for a server that never says anything.\n this._releaseTimer = setTimeout(() => {\n this._releaseTimer = undefined;\n if (this._socket === socket && !this._disconnected) {\n this.releaseSubscriptions();\n }\n }, WebSocketHubConnection.ConnectedGraceMs);\n };\n\n socket.onclose = () => {\n if (this._socket !== socket || this._disconnected) return;\n console.log('Hub connection closed', url);\n this._socket = undefined;\n this._supportsSubscriptionRevisions = false;\n this.resetSubscriptionRelease();\n this._keepAlive.stop();\n if (this._subscriptions.size === 0) return;\n this._reconnectPending = true;\n const scheduled = this._policy.schedule(() => {\n this._reconnectPending = false;\n if (!this._disconnected && this._subscriptions.size > 0) {\n this.ensureConnected();\n }\n }, this._url);\n if (!scheduled) {\n this._reconnectPending = false;\n }\n };\n\n socket.onerror = (error) => {\n if (this._socket !== socket || this._disconnected) return;\n console.error('Hub connection error', url, error);\n this._keepAlive.stop();\n // onclose will fire after onerror, triggering reconnect\n };\n\n socket.onmessage = (ev) => {\n if (this._socket !== socket || this._disconnected) return;\n this.handleMessage(ev.data as string);\n };\n }\n\n private cancelPendingReconnect(): void {\n if (!this._reconnectPending) return;\n\n this._policy.cancel();\n this._reconnectPending = false;\n }\n\n private detachAndCloseSocket(socket: WebSocket): void {\n socket.onopen = null;\n socket.onclose = null;\n socket.onerror = null;\n socket.onmessage = null;\n socket.close();\n }\n\n private resetSubscriptionRelease(): void {\n this._subscriptionsReleased = false;\n if (this._releaseTimer !== undefined) {\n clearTimeout(this._releaseTimer);\n this._releaseTimer = undefined;\n }\n }\n\n private releaseSubscriptions(): void {\n if (this._subscriptionsReleased) return;\n this._subscriptionsReleased = true;\n if (this._releaseTimer !== undefined) {\n clearTimeout(this._releaseTimer);\n this._releaseTimer = undefined;\n }\n this.sendAllSubscriptions();\n }\n\n private sendAllSubscriptions(): void {\n for (const [queryId, sub] of this._subscriptions) {\n this.sendSubscribeMessage(queryId, sub);\n }\n }\n\n private sendSubscribeMessage(\n queryId: string,\n subscription: ActiveSubscription,\n ): void {\n const message: HubMessage = {\n type: HubMessageType.Subscribe,\n queryId,\n payload: subscription.request,\n };\n if (this._supportsSubscriptionRevisions) {\n message.revision = subscription.revision;\n }\n this.sendMessage(message);\n }\n\n private sendMessage(message: HubMessage): void {\n if (this._socket?.readyState === WebSocket.OPEN) {\n this._socket.send(JSON.stringify(message));\n }\n }\n\n private handleMessage(rawData: string): void {\n try {\n const message = JSON.parse(rawData) as HubMessage;\n\n // Every received message is activity — skip keep-alive ping if data is flowing.\n this._keepAlive.recordActivity();\n\n switch (message.type) {\n case HubMessageType.Connected:\n this.handleConnected(message);\n break;\n case HubMessageType.QueryResult:\n this.handleQueryResult(message);\n break;\n case HubMessageType.Pong:\n this.handlePong(message);\n break;\n case HubMessageType.Unauthorized:\n console.warn('Hub: query unauthorized', message.queryId);\n this.handleUnauthorized(message);\n break;\n case HubMessageType.Error:\n if (this.isMessageForCurrentSubscription(message)) {\n console.error(\n 'Hub: query error',\n message.queryId,\n message.payload,\n );\n this.handleError(message);\n }\n break;\n }\n } catch (error) {\n console.error('Hub: error parsing message', error);\n }\n }\n\n private handleConnected(message: HubMessage): void {\n if (this._subscriptionsReleased) return;\n\n // Capability is known before anything is sent, so every subscription goes out exactly once, in its final form.\n this._supportsSubscriptionRevisions = message.supportsSubscriptionRevisions === true;\n this.releaseSubscriptions();\n }\n\n private handleQueryResult(message: HubMessage): void {\n if (!message.queryId) return;\n\n const sub = this._subscriptions.get(message.queryId);\n if (!sub || !this.isMessageForCurrentSubscription(message)) return;\n\n const result = message.payload as QueryResult<any>;\n if (result?.isValid === false) {\n this._subscriptions.delete(message.queryId);\n }\n sub.callback(result);\n }\n\n private handleError(message: HubMessage): void {\n const result = new QueryResult(\n {\n data: undefined,\n isSuccess: false,\n isReady: true,\n isAuthorized: true,\n isValid: true,\n hasExceptions: true,\n validationResults: [],\n exceptionMessages: [message.payload as string],\n exceptionStackTrace: '',\n paging: { totalItems: 0, totalPages: 0, page: 0, size: 0 },\n },\n Object,\n false,\n );\n this.handleQueryResult({ ...message, payload: result });\n }\n\n private handleUnauthorized(message: HubMessage): void {\n if (!message.queryId) return;\n\n const sub = this._subscriptions.get(message.queryId);\n if (!sub || !this.isMessageForCurrentSubscription(message)) return;\n\n this._subscriptions.delete(message.queryId);\n sub.callback(QueryResult.unauthorized());\n }\n\n private isMessageForCurrentSubscription(message: HubMessage): boolean {\n if (!message.queryId) return false;\n\n if (!this._supportsSubscriptionRevisions) {\n return (\n message.revision === undefined &&\n this._subscriptions.has(message.queryId)\n );\n }\n\n return (\n this.isValidRevision(message.revision) &&\n this._subscriptions.get(message.queryId)?.revision === message.revision\n );\n }\n\n private isValidRevision(revision: number | undefined): revision is number {\n return revision !== undefined && Number.isSafeInteger(revision) && revision > 0;\n }\n\n private getNextRevision(): number {\n if (this._nextRevision >= Number.MAX_SAFE_INTEGER) {\n throw new RangeError(\n 'WebSocket hub subscription revision exhausted the safe integer range',\n );\n }\n\n return ++this._nextRevision;\n }\n\n private handlePong(message: HubMessage): void {\n if (message.timestamp && this._lastPingSentTime) {\n const latency = Date.now() - message.timestamp;\n this._lastPongLatency = latency;\n this._latencySamples.push(latency);\n\n if (this._latencySamples.length > 100) {\n this._latencySamples.shift();\n }\n }\n }\n}\n"],"names":["HubMessageType","WebSocketHubConnection","ConnectedGraceMs","_socket","_disconnected","_subscriptions","Map","_keepAlive","_lastPingSentTime","_lastPongLatency","_latencySamples","_nextRevision","_supportsSubscriptionRevisions","_reconnectPending","_subscriptionsReleased","_releaseTimer","_url","pingIntervalMs","_policy","ReconnectPolicy","_microservice","HubConnectionKeepAlive","readyState","WebSocket","OPEN","Date","now","sendMessage","type","timestamp","queryCount","size","isConnected","lastPingLatency","averageLatency","length","reduce","a","b","subscribe","queryId","request","callback","subscription","revision","getNextRevision","set","ensureConnected","sendSubscribeMessage","unsubscribe","get","delete","message","close","dispose","clear","CONNECTING","cancelPendingReconnect","openSocket","stop","cancel","resetSubscriptionRelease","socket","undefined","detachAndCloseSocket","currentSocket","url","param","Globals","microserviceWSQueryArgument","encodeURIComponent","includes","onopen","console","log","reset","start","setTimeout","releaseSubscriptions","onclose","scheduled","schedule","onerror","error","onmessage","ev","handleMessage","data","clearTimeout","sendAllSubscriptions","sub","payload","send","JSON","stringify","rawData","parse","recordActivity","handleConnected","handleQueryResult","handlePong","warn","handleUnauthorized","isMessageForCurrentSubscription","handleError","supportsSubscriptionRevisions","result","isValid","QueryResult","isSuccess","isReady","isAuthorized","hasExceptions","validationResults","exceptionMessages","exceptionStackTrace","paging","totalItems","totalPages","page","Object","unauthorized","has","isValidRevision","Number","isSafeInteger","MAX_SAFE_INTEGER","RangeError","latency","push","shift"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebSocketHubConnection.js","sources":["../../../queries/WebSocketHubConnection.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Globals } from '../Globals.js';\nimport type { DataReceived } from './ObservableQueryConnection.js';\nimport { HubConnectionKeepAlive } from './HubConnectionKeepAlive.js';\nimport type { IReconnectPolicy } from './IReconnectPolicy.js';\nimport { ReconnectPolicy } from './ReconnectPolicy.js';\nimport { QueryResult } from './QueryResult.js';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Message types matching the backend {@link ObservableQueryHubMessageType} enum.\n * Serialized as strings by the JsonStringEnumConverter on the server.\n */\nexport enum HubMessageType {\n Subscribe = 'Subscribe',\n Unsubscribe = 'Unsubscribe',\n QueryResult = 'QueryResult',\n Unauthorized = 'Unauthorized',\n Error = 'Error',\n Ping = 'Ping',\n Pong = 'Pong',\n Connected = 'Connected',\n}\n\n/**\n * Wire format for messages exchanged over the observable query WebSocket and SSE hub transports.\n */\nexport interface HubMessage {\n type: HubMessageType;\n queryId?: string;\n\n /** Optional positive safe-integer revision used to reject stale replacement messages. */\n revision?: number;\n\n /**\n * Whether the server supports revision-aware subscription operations and result frames.\n * Only present on {@link HubMessageType.Connected} messages from capable servers.\n */\n supportsSubscriptionRevisions?: boolean;\n payload?: any;\n timestamp?: number;\n\n /**\n * The server's keep-alive interval in milliseconds, or 0 when keep-alive is disabled.\n * Only present on {@link HubMessageType.Connected} messages.\n */\n keepAliveIntervalMs?: number;\n}\n\n/**\n * Matches the backend {@link ObservableQuerySubscriptionRequest} record.\n */\nexport interface SubscriptionRequest {\n queryName: string;\n arguments?: Record<string, string | null>;\n page?: number;\n pageSize?: number;\n sortBy?: string;\n sortDirection?: string;\n transferMode?: string;\n}\n\ninterface ActiveSubscription {\n request: SubscriptionRequest;\n callback: DataReceived<any>;\n revision: number;\n}\n\n/**\n * Represents a single multiplexed WebSocket connection to the observable query hub\n * at {@code /.cratis/queries/ws}.\n *\n * Multiple query subscriptions are carried over the same physical WebSocket. Each subscription\n * is identified by a client-generated {@code queryId}; the server tags every result message with\n * the same id so responses can be routed to the correct callback. The client initially subscribes\n * without revisions for compatibility with older servers, then replaces active subscriptions with\n * revision-aware operations when the server advertises support in a Connected message.\n */\nexport class WebSocketHubConnection {\n /** How long to wait for the server's Connected message before subscribing the way older servers expect. */\n static readonly ConnectedGraceMs = 1000;\n\n private _socket?: WebSocket;\n private _disconnected = false;\n private _subscriptions: Map<string, ActiveSubscription> = new Map();\n private readonly _keepAlive: HubConnectionKeepAlive;\n private _lastPingSentTime?: number;\n private _lastPongLatency: number = 0;\n private _latencySamples: number[] = [];\n private _nextRevision = 0;\n private _supportsSubscriptionRevisions = false;\n private _reconnectPending = false;\n private _subscriptionsReleased = false;\n private _releaseTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * Initializes a new instance of {@link WebSocketHubConnection}.\n * @param {string} _url The WebSocket URL of the hub endpoint (e.g. {@code ws://localhost:5000/.cratis/queries/ws}).\n * @param {string} _microservice The microservice name to pass as a query argument.\n * @param {number} pingIntervalMs How often to send keep-alive pings when the connection is idle (default: 10 000 ms).\n * @param {IReconnectPolicy} _policy The reconnect policy to use (default: {@link ReconnectPolicy}).\n */\n constructor(\n private readonly _url: string,\n private readonly _microservice: string,\n pingIntervalMs: number = 10000,\n private readonly _policy: IReconnectPolicy = new ReconnectPolicy(),\n ) {\n this._keepAlive = new HubConnectionKeepAlive(pingIntervalMs, () => {\n if (this._socket?.readyState === WebSocket.OPEN) {\n this._lastPingSentTime = Date.now();\n this.sendMessage({\n type: HubMessageType.Ping,\n timestamp: this._lastPingSentTime,\n });\n }\n });\n }\n\n /**\n * Gets the number of active query subscriptions on this connection.\n */\n get queryCount(): number {\n return this._subscriptions.size;\n }\n\n /**\n * Gets whether the WebSocket connection is currently open.\n */\n get isConnected(): boolean {\n return this._socket?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Gets the latency of the last ping/pong sequence in milliseconds.\n */\n get lastPingLatency(): number {\n return this._lastPongLatency;\n }\n\n /**\n * Gets the rolling average latency in milliseconds.\n */\n get averageLatency(): number {\n if (this._latencySamples.length === 0) return 0;\n return (\n this._latencySamples.reduce((a, b) => a + b, 0) / this._latencySamples.length\n );\n }\n\n /**\n * Subscribe to a query on this hub connection.\n * If the WebSocket is not yet open, the subscribe message will be sent once the connection is established.\n * @param {string} queryId Client-generated unique identifier for this subscription.\n * @param {SubscriptionRequest} request The subscription request payload.\n * @param {DataReceived<any>} callback Callback invoked whenever the server pushes a result for this query.\n */\n subscribe(\n queryId: string,\n request: SubscriptionRequest,\n callback: DataReceived<any>,\n ): void {\n const subscription = { request, callback, revision: this.getNextRevision() };\n this._subscriptions.set(queryId, subscription);\n this.ensureConnected();\n\n if (this.isOpenAndReleased()) {\n this.sendSubscribeMessage(queryId, subscription);\n }\n // Until the server has said what it supports, subscriptions are held back and sent once, by releaseSubscriptions.\n }\n\n /**\n * Unsubscribe from a query on this hub connection.\n * @param {string} queryId The identifier of the subscription to cancel.\n */\n unsubscribe(queryId: string): void {\n const subscription = this._subscriptions.get(queryId);\n this._subscriptions.delete(queryId);\n\n if (this.isOpenAndReleased() && subscription) {\n const message: HubMessage = {\n type: HubMessageType.Unsubscribe,\n queryId,\n };\n if (this._supportsSubscriptionRevisions) {\n message.revision = subscription.revision;\n }\n this.sendMessage(message);\n }\n\n // If no subscriptions remain, close the connection to free resources.\n if (this._subscriptions.size === 0) {\n this.close();\n }\n }\n\n /**\n * Permanently close this hub connection and clean up all subscriptions.\n */\n dispose(): void {\n this._subscriptions.clear();\n this.close();\n }\n\n private ensureConnected(): void {\n if (this._disconnected) {\n // Reset disconnected flag when a new subscription comes in\n this._disconnected = false;\n }\n\n if (this.isSocketLive(this._socket)) {\n this.cancelPendingReconnect();\n return;\n }\n\n // A subscription can arrive while an earlier close is waiting in reconnect backoff. The immediate open owns\n // the connection now, so the delayed callback must not be allowed to create a competing socket later.\n this.cancelPendingReconnect();\n this.openSocket();\n }\n\n private close(): void {\n this._disconnected = true;\n this._keepAlive.stop();\n this._policy.cancel();\n this._reconnectPending = false;\n this.resetSubscriptionRelease();\n const socket = this._socket;\n this._socket = undefined;\n this._supportsSubscriptionRevisions = false;\n if (socket) {\n this.detachAndCloseSocket(socket);\n }\n }\n\n private openSocket(): void {\n const currentSocket = this._socket;\n if (this.isSocketLive(currentSocket)) {\n return;\n }\n\n if (currentSocket) {\n this._socket = undefined;\n this.detachAndCloseSocket(currentSocket);\n }\n\n this._supportsSubscriptionRevisions = false;\n this.resetSubscriptionRelease();\n\n const url = this.buildSocketUrl();\n const socket = new WebSocket(url);\n this._socket = socket;\n\n socket.onopen = () => {\n if (!this.isActiveSocket(socket)) return;\n this.handleSocketOpened(socket, url);\n };\n\n socket.onclose = () => {\n if (!this.isActiveSocket(socket)) return;\n this.handleSocketClosed(url);\n };\n\n socket.onerror = (error) => {\n if (!this.isActiveSocket(socket)) return;\n console.error('Hub connection error', url, error);\n this._keepAlive.stop();\n // onclose will fire after onerror, triggering reconnect\n };\n\n socket.onmessage = (ev) => {\n if (!this.isActiveSocket(socket)) return;\n this.handleMessage(ev.data as string);\n };\n }\n\n private buildSocketUrl(): string {\n let url = this._url;\n if (this._microservice?.length > 0) {\n const param = `${Globals.microserviceWSQueryArgument}=${encodeURIComponent(this._microservice)}`;\n url += (url.includes('?') ? '&' : '?') + param;\n }\n return url;\n }\n\n private isSocketLive(socket: WebSocket | undefined): boolean {\n return (\n socket !== undefined &&\n (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)\n );\n }\n\n private isActiveSocket(socket: WebSocket): boolean {\n return this._socket === socket && !this._disconnected;\n }\n\n private isOpenAndReleased(): boolean {\n return this._socket?.readyState === WebSocket.OPEN && this._subscriptionsReleased;\n }\n\n private handleSocketOpened(socket: WebSocket, url: string): void {\n console.log('Hub connection established', url);\n this.cancelPendingReconnect();\n this._policy.reset();\n this._keepAlive.start();\n\n // A capable server announces itself with a Connected message straight after accepting the socket. Sending\n // the subscriptions before that would mean sending them twice (once without a revision, once with), and the\n // server would run every query twice and cancel the first run. Wait for it, and only fall back to the\n // revision-less form for a server that never says anything.\n this._releaseTimer = setTimeout(() => {\n this._releaseTimer = undefined;\n if (this.isActiveSocket(socket)) {\n this.releaseSubscriptions();\n }\n }, WebSocketHubConnection.ConnectedGraceMs);\n }\n\n private handleSocketClosed(url: string): void {\n console.log('Hub connection closed', url);\n this._socket = undefined;\n this._supportsSubscriptionRevisions = false;\n this.resetSubscriptionRelease();\n this._keepAlive.stop();\n if (this._subscriptions.size === 0) return;\n this._reconnectPending = true;\n const scheduled = this._policy.schedule(() => {\n this._reconnectPending = false;\n if (!this._disconnected && this._subscriptions.size > 0) {\n this.ensureConnected();\n }\n }, this._url);\n if (!scheduled) {\n this._reconnectPending = false;\n }\n }\n\n private cancelPendingReconnect(): void {\n if (!this._reconnectPending) return;\n\n this._policy.cancel();\n this._reconnectPending = false;\n }\n\n private detachAndCloseSocket(socket: WebSocket): void {\n socket.onopen = null;\n socket.onclose = null;\n socket.onerror = null;\n socket.onmessage = null;\n socket.close();\n }\n\n private resetSubscriptionRelease(): void {\n this._subscriptionsReleased = false;\n if (this._releaseTimer !== undefined) {\n clearTimeout(this._releaseTimer);\n this._releaseTimer = undefined;\n }\n }\n\n private releaseSubscriptions(): void {\n if (this._subscriptionsReleased) return;\n this._subscriptionsReleased = true;\n if (this._releaseTimer !== undefined) {\n clearTimeout(this._releaseTimer);\n this._releaseTimer = undefined;\n }\n this.sendAllSubscriptions();\n }\n\n private sendAllSubscriptions(): void {\n for (const [queryId, sub] of this._subscriptions) {\n this.sendSubscribeMessage(queryId, sub);\n }\n }\n\n private sendSubscribeMessage(\n queryId: string,\n subscription: ActiveSubscription,\n ): void {\n const message: HubMessage = {\n type: HubMessageType.Subscribe,\n queryId,\n payload: subscription.request,\n };\n if (this._supportsSubscriptionRevisions) {\n message.revision = subscription.revision;\n }\n this.sendMessage(message);\n }\n\n private sendMessage(message: HubMessage): void {\n if (this._socket?.readyState === WebSocket.OPEN) {\n this._socket.send(JSON.stringify(message));\n }\n }\n\n private handleMessage(rawData: string): void {\n try {\n const message = JSON.parse(rawData) as HubMessage;\n\n // Every received message is activity — skip keep-alive ping if data is flowing.\n this._keepAlive.recordActivity();\n\n switch (message.type) {\n case HubMessageType.Connected:\n this.handleConnected(message);\n break;\n case HubMessageType.QueryResult:\n this.handleQueryResult(message);\n break;\n case HubMessageType.Pong:\n this.handlePong(message);\n break;\n case HubMessageType.Unauthorized:\n console.warn('Hub: query unauthorized', message.queryId);\n this.handleUnauthorized(message);\n break;\n case HubMessageType.Error:\n if (this.isMessageForCurrentSubscription(message)) {\n console.error(\n 'Hub: query error',\n message.queryId,\n message.payload,\n );\n this.handleError(message);\n }\n break;\n }\n } catch (error) {\n console.error('Hub: error parsing message', error);\n }\n }\n\n private handleConnected(message: HubMessage): void {\n if (this._subscriptionsReleased) return;\n\n // Capability is known before anything is sent, so every subscription goes out exactly once, in its final form.\n this._supportsSubscriptionRevisions = message.supportsSubscriptionRevisions === true;\n this.releaseSubscriptions();\n }\n\n private handleQueryResult(message: HubMessage): void {\n if (!message.queryId) return;\n\n const sub = this._subscriptions.get(message.queryId);\n if (!sub || !this.isMessageForCurrentSubscription(message)) return;\n\n const result = message.payload as QueryResult<any>;\n if (result?.isValid === false) {\n this._subscriptions.delete(message.queryId);\n }\n sub.callback(result);\n }\n\n private handleError(message: HubMessage): void {\n const result = new QueryResult(\n {\n data: undefined,\n isSuccess: false,\n isReady: true,\n isAuthorized: true,\n isValid: true,\n hasExceptions: true,\n validationResults: [],\n exceptionMessages: [message.payload as string],\n exceptionStackTrace: '',\n paging: { totalItems: 0, totalPages: 0, page: 0, size: 0 },\n },\n Object,\n false,\n );\n this.handleQueryResult({ ...message, payload: result });\n }\n\n private handleUnauthorized(message: HubMessage): void {\n if (!message.queryId) return;\n\n const sub = this._subscriptions.get(message.queryId);\n if (!sub || !this.isMessageForCurrentSubscription(message)) return;\n\n this._subscriptions.delete(message.queryId);\n sub.callback(QueryResult.unauthorized());\n }\n\n private isMessageForCurrentSubscription(message: HubMessage): boolean {\n if (!message.queryId) return false;\n\n if (!this._supportsSubscriptionRevisions) {\n return (\n message.revision === undefined &&\n this._subscriptions.has(message.queryId)\n );\n }\n\n return (\n this.isValidRevision(message.revision) &&\n this._subscriptions.get(message.queryId)?.revision === message.revision\n );\n }\n\n private isValidRevision(revision: number | undefined): revision is number {\n return revision !== undefined && Number.isSafeInteger(revision) && revision > 0;\n }\n\n private getNextRevision(): number {\n if (this._nextRevision >= Number.MAX_SAFE_INTEGER) {\n throw new RangeError(\n 'WebSocket hub subscription revision exhausted the safe integer range',\n );\n }\n\n return ++this._nextRevision;\n }\n\n private handlePong(message: HubMessage): void {\n if (message.timestamp && this._lastPingSentTime) {\n const latency = Date.now() - message.timestamp;\n this._lastPongLatency = latency;\n this._latencySamples.push(latency);\n\n if (this._latencySamples.length > 100) {\n this._latencySamples.shift();\n }\n }\n }\n}\n"],"names":["HubMessageType","WebSocketHubConnection","ConnectedGraceMs","_socket","_disconnected","_subscriptions","Map","_keepAlive","_lastPingSentTime","_lastPongLatency","_latencySamples","_nextRevision","_supportsSubscriptionRevisions","_reconnectPending","_subscriptionsReleased","_releaseTimer","_url","pingIntervalMs","_policy","ReconnectPolicy","_microservice","HubConnectionKeepAlive","readyState","WebSocket","OPEN","Date","now","sendMessage","type","timestamp","queryCount","size","isConnected","lastPingLatency","averageLatency","length","reduce","a","b","subscribe","queryId","request","callback","subscription","revision","getNextRevision","set","ensureConnected","isOpenAndReleased","sendSubscribeMessage","unsubscribe","get","delete","message","close","dispose","clear","isSocketLive","cancelPendingReconnect","openSocket","stop","cancel","resetSubscriptionRelease","socket","undefined","detachAndCloseSocket","currentSocket","url","buildSocketUrl","onopen","isActiveSocket","handleSocketOpened","onclose","handleSocketClosed","onerror","error","console","onmessage","ev","handleMessage","data","param","Globals","microserviceWSQueryArgument","encodeURIComponent","includes","CONNECTING","log","reset","start","setTimeout","releaseSubscriptions","scheduled","schedule","clearTimeout","sendAllSubscriptions","sub","payload","send","JSON","stringify","rawData","parse","recordActivity","handleConnected","handleQueryResult","handlePong","warn","handleUnauthorized","isMessageForCurrentSubscription","handleError","supportsSubscriptionRevisions","result","isValid","QueryResult","isSuccess","isReady","isAuthorized","hasExceptions","validationResults","exceptionMessages","exceptionStackTrace","paging","totalItems","totalPages","page","Object","unauthorized","has","isValidRevision","Number","isSafeInteger","MAX_SAFE_INTEGER","RangeError","latency","push","shift"],"mappings":"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"}
|