@azure/web-pubsub-client 1.0.4-alpha.20251126.1 → 1.0.4-alpha.20251127.1

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 (53) hide show
  1. package/dist/browser/models/index.d.ts +15 -0
  2. package/dist/browser/models/index.d.ts.map +1 -1
  3. package/dist/browser/models/index.js.map +1 -1
  4. package/dist/browser/models/messages.d.ts +28 -2
  5. package/dist/browser/models/messages.d.ts.map +1 -1
  6. package/dist/browser/models/messages.js.map +1 -1
  7. package/dist/browser/protocols/jsonProtocolBase.d.ts.map +1 -1
  8. package/dist/browser/protocols/jsonProtocolBase.js +7 -0
  9. package/dist/browser/protocols/jsonProtocolBase.js.map +1 -1
  10. package/dist/browser/webPubSubClient.d.ts +10 -3
  11. package/dist/browser/webPubSubClient.d.ts.map +1 -1
  12. package/dist/browser/webPubSubClient.js +79 -14
  13. package/dist/browser/webPubSubClient.js.map +1 -1
  14. package/dist/commonjs/models/index.d.ts +15 -0
  15. package/dist/commonjs/models/index.d.ts.map +1 -1
  16. package/dist/commonjs/models/index.js.map +1 -1
  17. package/dist/commonjs/models/messages.d.ts +28 -2
  18. package/dist/commonjs/models/messages.d.ts.map +1 -1
  19. package/dist/commonjs/models/messages.js.map +1 -1
  20. package/dist/commonjs/protocols/jsonProtocolBase.d.ts.map +1 -1
  21. package/dist/commonjs/protocols/jsonProtocolBase.js +7 -0
  22. package/dist/commonjs/protocols/jsonProtocolBase.js.map +1 -1
  23. package/dist/commonjs/webPubSubClient.d.ts +10 -3
  24. package/dist/commonjs/webPubSubClient.d.ts.map +1 -1
  25. package/dist/commonjs/webPubSubClient.js +79 -14
  26. package/dist/commonjs/webPubSubClient.js.map +1 -1
  27. package/dist/esm/models/index.d.ts +15 -0
  28. package/dist/esm/models/index.d.ts.map +1 -1
  29. package/dist/esm/models/index.js.map +1 -1
  30. package/dist/esm/models/messages.d.ts +28 -2
  31. package/dist/esm/models/messages.d.ts.map +1 -1
  32. package/dist/esm/models/messages.js.map +1 -1
  33. package/dist/esm/protocols/jsonProtocolBase.d.ts.map +1 -1
  34. package/dist/esm/protocols/jsonProtocolBase.js +7 -0
  35. package/dist/esm/protocols/jsonProtocolBase.js.map +1 -1
  36. package/dist/esm/webPubSubClient.d.ts +10 -3
  37. package/dist/esm/webPubSubClient.d.ts.map +1 -1
  38. package/dist/esm/webPubSubClient.js +79 -14
  39. package/dist/esm/webPubSubClient.js.map +1 -1
  40. package/dist/react-native/models/index.d.ts +15 -0
  41. package/dist/react-native/models/index.d.ts.map +1 -1
  42. package/dist/react-native/models/index.js.map +1 -1
  43. package/dist/react-native/models/messages.d.ts +28 -2
  44. package/dist/react-native/models/messages.d.ts.map +1 -1
  45. package/dist/react-native/models/messages.js.map +1 -1
  46. package/dist/react-native/protocols/jsonProtocolBase.d.ts.map +1 -1
  47. package/dist/react-native/protocols/jsonProtocolBase.js +7 -0
  48. package/dist/react-native/protocols/jsonProtocolBase.js.map +1 -1
  49. package/dist/react-native/webPubSubClient.d.ts +10 -3
  50. package/dist/react-native/webPubSubClient.d.ts.map +1 -1
  51. package/dist/react-native/webPubSubClient.js +79 -14
  52. package/dist/react-native/webPubSubClient.js.map +1 -1
  53. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"webPubSubClient.js","sourceRoot":"","sources":["../../src/webPubSubClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { delay } from \"@azure/core-util\";\nimport EventEmitter from \"events\";\nimport type { SendMessageErrorOptions } from \"./errors/index.js\";\nimport { SendMessageError } from \"./errors/index.js\";\nimport { logger } from \"./logger.js\";\nimport type {\n WebPubSubResult,\n JoinGroupOptions,\n LeaveGroupOptions,\n OnConnectedArgs,\n OnDisconnectedArgs,\n OnGroupDataMessageArgs,\n OnServerDataMessageArgs,\n OnStoppedArgs,\n WebPubSubRetryOptions,\n SendToGroupOptions,\n SendEventOptions,\n WebPubSubClientOptions,\n OnRejoinGroupFailedArgs,\n StartOptions,\n GetClientAccessUrlOptions,\n} from \"./models/index.js\";\nimport type {\n ConnectedMessage,\n DisconnectedMessage,\n GroupDataMessage,\n ServerDataMessage,\n WebPubSubDataType,\n WebPubSubMessage,\n JoinGroupMessage,\n LeaveGroupMessage,\n SendToGroupMessage,\n SendEventMessage,\n AckMessage,\n SequenceAckMessage,\n} from \"./models/messages.js\";\nimport type { WebPubSubClientProtocol } from \"./protocols/index.js\";\nimport { WebPubSubJsonReliableProtocol } from \"./protocols/index.js\";\nimport type { WebPubSubClientCredential } from \"./webPubSubClientCredential.js\";\nimport { WebSocketClientFactory } from \"./websocket/websocketClient.js\";\nimport type {\n WebSocketClientFactoryLike,\n WebSocketClientLike,\n} from \"./websocket/websocketClientLike.js\";\nimport { AckManager } from \"./ackManager.js\";\n\nenum WebPubSubClientState {\n Stopped = \"Stopped\",\n Disconnected = \"Disconnected\",\n Connecting = \"Connecting\",\n Connected = \"Connected\",\n Recovering = \"Recovering\",\n}\n\n/**\n * Types which can be serialized and sent as JSON.\n */\nexport type JSONTypes = string | number | boolean | object;\n\n/**\n * The WebPubSub client\n */\nexport class WebPubSubClient {\n private readonly _protocol: WebPubSubClientProtocol;\n private readonly _credential: WebPubSubClientCredential;\n private readonly _options: WebPubSubClientOptions;\n private readonly _groupMap: Map<string, WebPubSubGroup>;\n private readonly _ackManager: AckManager;\n private readonly _sequenceId: SequenceId;\n private readonly _messageRetryPolicy: RetryPolicy;\n private readonly _reconnectRetryPolicy: RetryPolicy;\n private readonly _quickSequenceAckDiff = 300;\n private readonly _activeTimeoutInMs = 20000;\n\n private readonly _emitter: EventEmitter = new EventEmitter();\n private _state: WebPubSubClientState;\n private _isStopping: boolean = false;\n private _activeKeepaliveTask: AbortableTask | undefined;\n\n // connection lifetime\n private _wsClient?: WebSocketClientLike;\n private _uri?: string;\n private _lastCloseEvent?: { code: number; reason: string };\n private _lastDisconnectedMessage?: DisconnectedMessage;\n private _connectionId?: string;\n private _reconnectionToken?: string;\n private _isInitialConnected = false;\n private _sequenceAckTask?: AbortableTask;\n\n /**\n * Create an instance of WebPubSubClient\n * @param clientAccessUrl - The uri to connect\n * @param options - The client options\n */\n constructor(clientAccessUrl: string, options?: WebPubSubClientOptions);\n /**\n * Create an instance of WebPubSubClient\n * @param credential - The credential to use when connecting\n * @param options - The client options\n */\n constructor(credential: WebPubSubClientCredential, options?: WebPubSubClientOptions);\n constructor(credential: string | WebPubSubClientCredential, options?: WebPubSubClientOptions) {\n if (typeof credential === \"string\") {\n this._credential = { getClientAccessUrl: credential } as WebPubSubClientCredential;\n } else {\n this._credential = credential;\n }\n\n if (options == null) {\n options = {};\n }\n this._buildDefaultOptions(options);\n this._options = options;\n\n this._messageRetryPolicy = new RetryPolicy(this._options.messageRetryOptions!);\n this._reconnectRetryPolicy = new RetryPolicy(this._options.reconnectRetryOptions!);\n\n this._protocol = this._options.protocol!;\n this._groupMap = new Map<string, WebPubSubGroup>();\n this._ackManager = new AckManager();\n this._sequenceId = new SequenceId();\n\n this._state = WebPubSubClientState.Stopped;\n }\n\n /**\n * Start to start to the service.\n * @param abortSignal - The abort signal\n */\n public async start(options?: StartOptions): Promise<void> {\n if (this._isStopping) {\n throw new Error(\"Can't start a client during stopping\");\n }\n\n if (this._state !== WebPubSubClientState.Stopped) {\n throw new Error(\"Client can be only started when it's Stopped\");\n }\n\n let abortSignal: AbortSignalLike | undefined;\n if (options) {\n abortSignal = options.abortSignal;\n }\n\n if (!this._activeKeepaliveTask) {\n this._activeKeepaliveTask = this._getActiveKeepaliveTask();\n }\n\n try {\n await this._startCore(abortSignal);\n } catch (err) {\n // this two sentense should be set together. Consider client.stop() is called during _startCore()\n this._changeState(WebPubSubClientState.Stopped);\n if (this._activeKeepaliveTask) {\n this._activeKeepaliveTask.abort();\n this._activeKeepaliveTask = undefined;\n }\n this._isStopping = false;\n throw err;\n }\n }\n\n private async _startFromRestarting(abortSignal?: AbortSignalLike): Promise<void> {\n if (this._state !== WebPubSubClientState.Disconnected) {\n throw new Error(\"Client can be only restarted when it's Disconnected\");\n }\n\n try {\n logger.verbose(\"Staring reconnecting.\");\n await this._startCore(abortSignal);\n } catch (err) {\n this._changeState(WebPubSubClientState.Disconnected);\n throw err;\n }\n }\n\n private async _startCore(abortSignal?: AbortSignalLike): Promise<void> {\n this._changeState(WebPubSubClientState.Connecting);\n\n logger.info(\"Staring a new connection\");\n // Reset before a pure new connection\n this._sequenceId.reset();\n this._isInitialConnected = false;\n this._lastCloseEvent = undefined;\n this._lastDisconnectedMessage = undefined;\n this._connectionId = undefined;\n this._reconnectionToken = undefined;\n this._uri = undefined;\n\n if (typeof this._credential.getClientAccessUrl === \"string\") {\n this._uri = this._credential.getClientAccessUrl;\n } else {\n this._uri = await this._credential.getClientAccessUrl({\n abortSignal: abortSignal,\n } as GetClientAccessUrlOptions);\n }\n\n if (typeof this._uri !== \"string\") {\n throw new Error(\n `The clientAccessUrl must be a string but currently it's ${typeof this._uri}`,\n );\n }\n await this._connectCore(this._uri);\n }\n\n /**\n * Stop the client.\n */\n public stop(): void {\n if (this._state === WebPubSubClientState.Stopped || this._isStopping) {\n return;\n }\n\n // TODO: Maybe we need a better logic for stopping control\n this._isStopping = true;\n if (this._wsClient && this._wsClient.isOpen()) {\n this._wsClient.close();\n } else {\n this._isStopping = false;\n }\n if (this._activeKeepaliveTask) {\n this._activeKeepaliveTask.abort();\n this._activeKeepaliveTask = undefined;\n }\n }\n\n /**\n * Add handler for connected event\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"connected\", listener: (e: OnConnectedArgs) => void): void;\n /**\n * Add handler for disconnected event\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"disconnected\", listener: (e: OnDisconnectedArgs) => void): void;\n /**\n * Add handler for stopped event\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"stopped\", listener: (e: OnStoppedArgs) => void): void;\n /**\n * Add handler for server messages\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"server-message\", listener: (e: OnServerDataMessageArgs) => void): void;\n /**\n * Add handler for group messags\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"group-message\", listener: (e: OnGroupDataMessageArgs) => void): void;\n /**\n * Add handler for rejoining group failed\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"rejoin-group-failed\", listener: (e: OnRejoinGroupFailedArgs) => void): void;\n public on(\n event:\n | \"connected\"\n | \"disconnected\"\n | \"stopped\"\n | \"server-message\"\n | \"group-message\"\n | \"rejoin-group-failed\",\n listener: (e: any) => void,\n ): void {\n this._emitter.on(event, listener);\n }\n\n /**\n * Remove handler for connected event\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"connected\", listener: (e: OnConnectedArgs) => void): void;\n /**\n * Remove handler for disconnected event\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"disconnected\", listener: (e: OnDisconnectedArgs) => void): void;\n /**\n * Remove handler for stopped event\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"stopped\", listener: (e: OnStoppedArgs) => void): void;\n /**\n * Remove handler for server message\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"server-message\", listener: (e: OnServerDataMessageArgs) => void): void;\n /**\n * Remove handler for group message\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"group-message\", listener: (e: OnGroupDataMessageArgs) => void): void;\n /**\n * Remove handler for rejoining group failed\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"rejoin-group-failed\", listener: (e: OnRejoinGroupFailedArgs) => void): void;\n public off(\n event:\n | \"connected\"\n | \"disconnected\"\n | \"stopped\"\n | \"server-message\"\n | \"group-message\"\n | \"rejoin-group-failed\",\n listener: (e: any) => void,\n ): void {\n this._emitter.removeListener(event, listener);\n }\n\n private _emitEvent(event: \"connected\", args: OnConnectedArgs): void;\n private _emitEvent(event: \"disconnected\", args: OnDisconnectedArgs): void;\n private _emitEvent(event: \"stopped\", args: OnStoppedArgs): void;\n private _emitEvent(event: \"server-message\", args: OnServerDataMessageArgs): void;\n private _emitEvent(event: \"group-message\", args: OnGroupDataMessageArgs): void;\n private _emitEvent(event: \"rejoin-group-failed\", args: OnRejoinGroupFailedArgs): void;\n private _emitEvent(\n event:\n | \"connected\"\n | \"disconnected\"\n | \"stopped\"\n | \"server-message\"\n | \"group-message\"\n | \"rejoin-group-failed\",\n args: any,\n ): void {\n this._emitter.emit(event, args);\n }\n\n /**\n * Send custom event to server.\n * @param eventName - The event name\n * @param content - The data content\n * @param dataType - The data type\n * @param options - The options\n * @param abortSignal - The abort signal\n */\n public async sendEvent(\n eventName: string,\n content: JSONTypes | ArrayBuffer,\n dataType: WebPubSubDataType,\n options?: SendEventOptions,\n ): Promise<WebPubSubResult> {\n return this._operationExecuteWithRetry(\n () => this._sendEventAttempt(eventName, content, dataType, options),\n options?.abortSignal,\n );\n }\n\n private async _sendEventAttempt(\n eventName: string,\n content: JSONTypes | ArrayBuffer,\n dataType: WebPubSubDataType,\n options?: SendEventOptions,\n ): Promise<WebPubSubResult> {\n const fireAndForget = options?.fireAndForget ?? false;\n if (!fireAndForget) {\n return this._sendMessageWithAckId(\n (id) => {\n return {\n kind: \"sendEvent\",\n dataType: dataType,\n data: content,\n ackId: id,\n event: eventName,\n } as SendEventMessage;\n },\n options?.ackId,\n options?.abortSignal,\n );\n }\n\n const message = {\n kind: \"sendEvent\",\n dataType: dataType,\n data: content,\n event: eventName,\n } as SendEventMessage;\n\n await this._sendMessage(message, options?.abortSignal);\n return { isDuplicated: false };\n }\n\n /**\n * Join the client to group\n * @param groupName - The group name\n * @param options - The join group options\n */\n public async joinGroup(groupName: string, options?: JoinGroupOptions): Promise<WebPubSubResult> {\n return this._operationExecuteWithRetry(\n () => this._joinGroupAttempt(groupName, options),\n options?.abortSignal,\n );\n }\n\n private async _joinGroupAttempt(\n groupName: string,\n options?: JoinGroupOptions,\n ): Promise<WebPubSubResult> {\n const group = this._getOrAddGroup(groupName);\n const result = await this._joinGroupCore(groupName, options);\n group.isJoined = true;\n return result;\n }\n\n private async _joinGroupCore(\n groupName: string,\n options?: JoinGroupOptions,\n ): Promise<WebPubSubResult> {\n return this._sendMessageWithAckId(\n (id) => {\n return {\n group: groupName,\n ackId: id,\n kind: \"joinGroup\",\n } as JoinGroupMessage;\n },\n options?.ackId,\n options?.abortSignal,\n );\n }\n\n /**\n * Leave the client from group\n * @param groupName - The group name\n * @param ackId - The optional ackId. If not specified, client will generate one.\n * @param abortSignal - The abort signal\n */\n public async leaveGroup(\n groupName: string,\n options?: LeaveGroupOptions,\n ): Promise<WebPubSubResult> {\n return this._operationExecuteWithRetry(\n () => this._leaveGroupAttempt(groupName, options),\n options?.abortSignal,\n );\n }\n\n private async _leaveGroupAttempt(\n groupName: string,\n options?: LeaveGroupOptions,\n ): Promise<WebPubSubResult> {\n const group = this._getOrAddGroup(groupName);\n const result = await this._sendMessageWithAckId(\n (id) => {\n return {\n group: groupName,\n ackId: id,\n kind: \"leaveGroup\",\n } as LeaveGroupMessage;\n },\n options?.ackId,\n options?.abortSignal,\n );\n group.isJoined = false;\n return result;\n }\n\n /**\n * Send message to group.\n * @param groupName - The group name\n * @param content - The data content\n * @param dataType - The data type\n * @param options - The options\n * @param abortSignal - The abort signal\n */\n public async sendToGroup(\n groupName: string,\n content: JSONTypes | ArrayBuffer,\n dataType: WebPubSubDataType,\n options?: SendToGroupOptions,\n ): Promise<WebPubSubResult> {\n return this._operationExecuteWithRetry(\n () => this._sendToGroupAttempt(groupName, content, dataType, options),\n options?.abortSignal,\n );\n }\n\n private async _sendToGroupAttempt(\n groupName: string,\n content: JSONTypes | ArrayBuffer,\n dataType: WebPubSubDataType,\n options?: SendToGroupOptions,\n ): Promise<WebPubSubResult> {\n const fireAndForget = options?.fireAndForget ?? false;\n const noEcho = options?.noEcho ?? false;\n if (!fireAndForget) {\n return this._sendMessageWithAckId(\n (id) => {\n return {\n kind: \"sendToGroup\",\n group: groupName,\n dataType: dataType,\n data: content,\n ackId: id,\n noEcho: noEcho,\n } as SendToGroupMessage;\n },\n options?.ackId,\n options?.abortSignal,\n );\n }\n\n const message = {\n kind: \"sendToGroup\",\n group: groupName,\n dataType: dataType,\n data: content,\n noEcho: noEcho,\n } as SendToGroupMessage;\n\n await this._sendMessage(message, options?.abortSignal);\n return { isDuplicated: false };\n }\n\n private _getWebSocketClientFactory(): WebSocketClientFactoryLike {\n return new WebSocketClientFactory();\n }\n\n private async _trySendSequenceAck(): Promise<void> {\n if (!this._protocol.isReliableSubProtocol) {\n return;\n }\n const [isUpdated, seqId] = this._sequenceId.tryGetSequenceId();\n if (isUpdated && seqId !== null && seqId !== undefined) {\n // seqId can be 0\n const message: SequenceAckMessage = {\n kind: \"sequenceAck\",\n sequenceId: seqId!,\n };\n try {\n await this._sendMessage(message);\n } catch {\n this._sequenceId.tryUpdate(seqId!); // If sending failed, mark it as updated so that it can be sent again.\n }\n }\n }\n\n private _connectCore(uri: string): Promise<void> {\n if (this._isStopping) {\n throw new Error(\"Can't start a client during stopping\");\n }\n\n return new Promise<void>((resolve, reject) => {\n // This part is executed sync\n const client = (this._wsClient = this._getWebSocketClientFactory().create(\n uri,\n this._protocol.name,\n ));\n client.onopen(() => {\n // There's a case that client called stop() before this method. We need to check and close it if it's the case.\n if (this._isStopping) {\n try {\n client.close();\n } catch {\n /** empty */\n }\n\n reject(new Error(`The client is stopped`));\n }\n logger.verbose(\"WebSocket connection has opened\");\n this._changeState(WebPubSubClientState.Connected);\n if (this._protocol.isReliableSubProtocol) {\n if (this._sequenceAckTask != null) {\n this._sequenceAckTask.abort();\n }\n this._sequenceAckTask = new AbortableTask(async () => {\n await this._trySendSequenceAck();\n }, 1000);\n }\n\n resolve();\n });\n\n client.onerror((e) => {\n if (this._sequenceAckTask != null) {\n this._sequenceAckTask.abort();\n }\n reject(e);\n });\n\n client.onclose((code: number, reason: string) => {\n if (this._state === WebPubSubClientState.Connected) {\n logger.verbose(\"WebSocket closed after open\");\n if (this._sequenceAckTask != null) {\n this._sequenceAckTask.abort();\n }\n logger.info(`WebSocket connection closed. Code: ${code}, Reason: ${reason}`);\n this._lastCloseEvent = { code: code, reason: reason };\n this._handleConnectionClose.call(this);\n } else {\n logger.verbose(\"WebSocket closed before open\");\n reject(new Error(`Failed to start WebSocket: ${code}`));\n }\n });\n\n client.onmessage((data: any) => {\n const handleAckMessage = (message: AckMessage): void => {\n const isDuplicated: boolean = message.error != null && message.error.name === \"Duplicate\";\n if (message.success || isDuplicated) {\n this._ackManager.resolveAck(message.ackId, {\n ackId: message.ackId,\n isDuplicated: isDuplicated,\n } as WebPubSubResult);\n } else {\n this._ackManager.rejectAck(\n message.ackId,\n new SendMessageError(\"Failed to send message.\", {\n ackId: message.ackId,\n errorDetail: message.error,\n } as SendMessageErrorOptions),\n );\n }\n };\n\n const handleConnectedMessage = async (message: ConnectedMessage): Promise<void> => {\n this._connectionId = message.connectionId;\n this._reconnectionToken = message.reconnectionToken;\n\n if (!this._isInitialConnected) {\n this._isInitialConnected = true;\n\n if (this._options.autoRejoinGroups) {\n const groupPromises: Promise<void>[] = [];\n this._groupMap.forEach((g) => {\n if (g.isJoined) {\n groupPromises.push(\n (async () => {\n try {\n await this._joinGroupCore(g.name);\n } catch (err) {\n this._safeEmitRejoinGroupFailed(g.name, err);\n }\n })(),\n );\n }\n });\n\n await Promise.all(groupPromises).catch(() => {\n /** empty */\n });\n }\n\n this._safeEmitConnected(message.connectionId, message.userId);\n }\n };\n\n const handleDisconnectedMessage = (message: DisconnectedMessage): void => {\n this._lastDisconnectedMessage = message;\n };\n\n const handleGroupDataMessage = (message: GroupDataMessage): void => {\n if (message.sequenceId != null) {\n const diff = this._sequenceId.tryUpdate(message.sequenceId);\n if (diff === 0) {\n // drop duplicated message\n return;\n }\n\n // If the diff is larger than the threshold, we must ack quicker to avoid slow client drop.\n if (diff > this._quickSequenceAckDiff) {\n this._trySendSequenceAck();\n }\n }\n\n this._safeEmitGroupMessage(message);\n };\n\n const handleServerDataMessage = (message: ServerDataMessage): void => {\n if (message.sequenceId != null) {\n const diff = this._sequenceId.tryUpdate(message.sequenceId);\n if (diff === 0) {\n // drop duplicated message\n return;\n }\n\n // If the diff is larger than the threshold, we must ack quicker to avoid slow client drop.\n if (diff > this._quickSequenceAckDiff) {\n this._trySendSequenceAck();\n }\n }\n\n this._safeEmitServerMessage(message);\n };\n\n let messages: WebPubSubMessage[] | WebPubSubMessage | null;\n try {\n let convertedData: Buffer | ArrayBuffer | string;\n if (Array.isArray(data)) {\n convertedData = Buffer.concat(data);\n } else {\n convertedData = data;\n }\n\n messages = this._protocol.parseMessages(convertedData);\n if (messages === null) {\n // null means the message is not recognized.\n return;\n }\n } catch (err) {\n logger.warning(\"An error occurred while parsing the message from service\", err);\n throw err;\n }\n\n if (!Array.isArray(messages)) {\n messages = [messages];\n }\n\n messages.forEach((message) => {\n try {\n switch (message.kind) {\n case \"ack\": {\n handleAckMessage(message as AckMessage);\n break;\n }\n case \"connected\": {\n handleConnectedMessage(message as ConnectedMessage);\n break;\n }\n case \"disconnected\": {\n handleDisconnectedMessage(message as DisconnectedMessage);\n break;\n }\n case \"groupData\": {\n handleGroupDataMessage(message as GroupDataMessage);\n break;\n }\n case \"serverData\": {\n handleServerDataMessage(message as ServerDataMessage);\n break;\n }\n }\n } catch (err) {\n logger.warning(\n `An error occurred while handling the message with kind: ${message.kind} from service`,\n err,\n );\n }\n });\n });\n });\n }\n\n private async _handleConnectionCloseAndNoRecovery(): Promise<void> {\n this._state = WebPubSubClientState.Disconnected;\n\n this._safeEmitDisconnected(this._connectionId, this._lastDisconnectedMessage);\n\n // Auto reconnect or stop\n if (this._options.autoReconnect) {\n await this._autoReconnect();\n } else {\n await this._handleConnectionStopped();\n }\n }\n\n private async _autoReconnect(): Promise<void> {\n let isSuccess = false;\n let attempt = 0;\n try {\n while (!this._isStopping) {\n try {\n await this._startFromRestarting();\n isSuccess = true;\n break;\n } catch (err) {\n logger.warning(\"An attempt to reconnect connection failed.\", err);\n\n attempt++;\n const delayInMs = this._reconnectRetryPolicy.nextRetryDelayInMs(attempt);\n\n if (delayInMs == null) {\n break;\n }\n\n logger.verbose(`Delay time for reconnect attempt ${attempt}: ${delayInMs}`);\n await delay(delayInMs).catch(() => {\n /** empty */\n });\n }\n }\n } finally {\n if (!isSuccess) {\n this._handleConnectionStopped();\n }\n }\n }\n\n private _handleConnectionStopped(): void {\n this._isStopping = false;\n this._state = WebPubSubClientState.Stopped;\n this._safeEmitStopped();\n }\n\n private _getActiveKeepaliveTask(): AbortableTask {\n return new AbortableTask(async () => {\n this._sequenceId.tryUpdate(0); // force update\n }, this._activeTimeoutInMs);\n }\n\n private async _sendMessage(\n message: WebPubSubMessage,\n abortSignal?: AbortSignalLike,\n ): Promise<void> {\n if (!this._wsClient || !this._wsClient.isOpen()) {\n throw new Error(\"The connection is not connected.\");\n }\n\n const payload = this._protocol.writeMessage(message);\n await this._wsClient!.send(payload, abortSignal);\n }\n\n private async _sendMessageWithAckId(\n messageProvider: (ackId: number) => WebPubSubMessage,\n ackId?: number,\n abortSignal?: AbortSignalLike,\n ): Promise<WebPubSubResult> {\n const { ackId: resolvedAckId, wait } = this._ackManager.registerAck(ackId);\n const message = messageProvider(resolvedAckId);\n\n try {\n await this._sendMessage(message, abortSignal);\n } catch (error) {\n this._ackManager.discard(resolvedAckId);\n\n let errorMessage: string = \"\";\n if (error instanceof Error) {\n errorMessage = error.message;\n }\n throw new SendMessageError(errorMessage, { ackId: resolvedAckId });\n }\n\n return wait(abortSignal);\n }\n\n private async _handleConnectionClose(): Promise<void> {\n // Clean ack cache\n this._ackManager.rejectAll((ackId) => {\n return new SendMessageError(\n \"Connection is disconnected before receive ack from the service\",\n {\n ackId,\n } as SendMessageErrorOptions,\n );\n });\n\n if (this._isStopping) {\n logger.warning(\"The client is stopping state. Stop recovery.\");\n this._handleConnectionCloseAndNoRecovery();\n return;\n }\n\n if (this._lastCloseEvent && this._lastCloseEvent.code === 1008) {\n logger.warning(\"The websocket close with status code 1008. Stop recovery.\");\n this._handleConnectionCloseAndNoRecovery();\n return;\n }\n\n if (!this._protocol.isReliableSubProtocol) {\n logger.warning(\"The protocol is not reliable, recovery is not applicable\");\n this._handleConnectionCloseAndNoRecovery();\n return;\n }\n\n // Build recovery uri\n const recoveryUri = this._buildRecoveryUri();\n if (!recoveryUri) {\n logger.warning(\"Connection id or reconnection token is not available\");\n this._handleConnectionCloseAndNoRecovery();\n return;\n }\n\n // Try recover connection\n let recovered = false;\n this._state = WebPubSubClientState.Recovering;\n const abortSignal = AbortSignal.timeout(30 * 1000);\n try {\n while (!abortSignal.aborted || this._isStopping) {\n try {\n await this._connectCore.call(this, recoveryUri);\n recovered = true;\n return;\n } catch {\n await delay(1000);\n }\n }\n } finally {\n if (!recovered) {\n logger.warning(\"Recovery attempts failed more then 30 seconds or the client is stopping\");\n this._handleConnectionCloseAndNoRecovery();\n }\n }\n }\n\n private _safeEmitConnected(connectionId: string, userId: string): void {\n this._emitEvent(\"connected\", {\n connectionId: connectionId,\n userId: userId,\n } as OnConnectedArgs);\n }\n\n private _safeEmitDisconnected(\n connectionId: string | undefined,\n lastDisconnectedMessage: DisconnectedMessage | undefined,\n ): void {\n this._emitEvent(\"disconnected\", {\n connectionId: connectionId,\n message: lastDisconnectedMessage,\n } as OnDisconnectedArgs);\n }\n\n private _safeEmitGroupMessage(message: GroupDataMessage): void {\n this._emitEvent(\"group-message\", {\n message: message,\n } as OnGroupDataMessageArgs);\n }\n\n private _safeEmitServerMessage(message: ServerDataMessage): void {\n this._emitEvent(\"server-message\", {\n message: message,\n } as OnServerDataMessageArgs);\n }\n\n private _safeEmitStopped(): void {\n this._emitEvent(\"stopped\", {});\n }\n\n private _safeEmitRejoinGroupFailed(groupName: string, err: unknown): void {\n this._emitEvent(\"rejoin-group-failed\", {\n group: groupName,\n error: err,\n } as OnRejoinGroupFailedArgs);\n }\n\n private _buildDefaultOptions(clientOptions: WebPubSubClientOptions): WebPubSubClientOptions {\n if (clientOptions.autoReconnect == null) {\n clientOptions.autoReconnect = true;\n }\n\n if (clientOptions.autoRejoinGroups == null) {\n clientOptions.autoRejoinGroups = true;\n }\n\n if (clientOptions.protocol == null) {\n clientOptions.protocol = WebPubSubJsonReliableProtocol();\n }\n\n this._buildMessageRetryOptions(clientOptions);\n this._buildReconnectRetryOptions(clientOptions);\n\n return clientOptions;\n }\n\n private _buildMessageRetryOptions(clientOptions: WebPubSubClientOptions): void {\n if (!clientOptions.messageRetryOptions) {\n clientOptions.messageRetryOptions = {};\n }\n\n if (\n clientOptions.messageRetryOptions.maxRetries == null ||\n clientOptions.messageRetryOptions.maxRetries < 0\n ) {\n clientOptions.messageRetryOptions.maxRetries = 3;\n }\n\n if (\n clientOptions.messageRetryOptions.retryDelayInMs == null ||\n clientOptions.messageRetryOptions.retryDelayInMs < 0\n ) {\n clientOptions.messageRetryOptions.retryDelayInMs = 1000;\n }\n\n if (\n clientOptions.messageRetryOptions.maxRetryDelayInMs == null ||\n clientOptions.messageRetryOptions.maxRetryDelayInMs < 0\n ) {\n clientOptions.messageRetryOptions.maxRetryDelayInMs = 30000;\n }\n\n if (clientOptions.messageRetryOptions.mode == null) {\n clientOptions.messageRetryOptions.mode = \"Fixed\";\n }\n }\n\n private _buildReconnectRetryOptions(clientOptions: WebPubSubClientOptions): void {\n if (!clientOptions.reconnectRetryOptions) {\n clientOptions.reconnectRetryOptions = {};\n }\n\n if (\n clientOptions.reconnectRetryOptions.maxRetries == null ||\n clientOptions.reconnectRetryOptions.maxRetries < 0\n ) {\n clientOptions.reconnectRetryOptions.maxRetries = Number.MAX_VALUE;\n }\n\n if (\n clientOptions.reconnectRetryOptions.retryDelayInMs == null ||\n clientOptions.reconnectRetryOptions.retryDelayInMs < 0\n ) {\n clientOptions.reconnectRetryOptions.retryDelayInMs = 1000;\n }\n\n if (\n clientOptions.reconnectRetryOptions.maxRetryDelayInMs == null ||\n clientOptions.reconnectRetryOptions.maxRetryDelayInMs < 0\n ) {\n clientOptions.reconnectRetryOptions.maxRetryDelayInMs = 30000;\n }\n\n if (clientOptions.reconnectRetryOptions.mode == null) {\n clientOptions.reconnectRetryOptions.mode = \"Fixed\";\n }\n }\n\n private _buildRecoveryUri(): string | null {\n if (this._connectionId && this._reconnectionToken && this._uri) {\n const url = new URL(this._uri);\n url.searchParams.append(\"awps_connection_id\", this._connectionId);\n url.searchParams.append(\"awps_reconnection_token\", this._reconnectionToken);\n return url.toString();\n }\n return null;\n }\n\n private _getOrAddGroup(name: string): WebPubSubGroup {\n if (!this._groupMap.has(name)) {\n this._groupMap.set(name, new WebPubSubGroup(name));\n }\n return this._groupMap.get(name) as WebPubSubGroup;\n }\n\n private _changeState(newState: WebPubSubClientState): void {\n logger.verbose(\n `The client state transfer from ${this._state.toString()} to ${newState.toString()}`,\n );\n this._state = newState;\n }\n\n private async _operationExecuteWithRetry<T>(\n inner: () => Promise<T>,\n signal?: AbortSignalLike,\n ): Promise<T> {\n let retryAttempt = 0;\n\n while (true) {\n try {\n return await inner.call(this);\n } catch (err) {\n retryAttempt++;\n const delayInMs = this._messageRetryPolicy.nextRetryDelayInMs(retryAttempt);\n if (delayInMs == null) {\n throw err;\n }\n\n await delay(delayInMs);\n\n if (signal?.aborted) {\n throw err;\n }\n }\n }\n }\n}\n\nclass RetryPolicy {\n private _retryOptions: WebPubSubRetryOptions;\n private _maxRetriesToGetMaxDelay: number;\n\n public constructor(retryOptions: WebPubSubRetryOptions) {\n this._retryOptions = retryOptions;\n this._maxRetriesToGetMaxDelay = Math.ceil(\n Math.log2(this._retryOptions.maxRetryDelayInMs!) -\n Math.log2(this._retryOptions.retryDelayInMs!) +\n 1,\n );\n }\n\n public nextRetryDelayInMs(retryAttempt: number): number | null {\n if (retryAttempt > this._retryOptions.maxRetries!) {\n return null;\n } else {\n if (this._retryOptions.mode! === \"Fixed\") {\n return this._retryOptions.retryDelayInMs!;\n } else {\n return this._calculateExponentialDelay(retryAttempt);\n }\n }\n }\n\n private _calculateExponentialDelay(attempt: number): number {\n if (attempt >= this._maxRetriesToGetMaxDelay) {\n return this._retryOptions.maxRetryDelayInMs!;\n } else {\n return (1 << (attempt - 1)) * this._retryOptions.retryDelayInMs!;\n }\n }\n}\n\nclass WebPubSubGroup {\n public readonly name: string;\n public isJoined = false;\n\n constructor(name: string) {\n this.name = name;\n }\n}\n\nclass SequenceId {\n private _sequenceId: number;\n private _isUpdate: boolean;\n\n constructor() {\n this._sequenceId = 0;\n this._isUpdate = false;\n }\n\n public tryUpdate(sequenceId: number): number {\n this._isUpdate = true;\n if (sequenceId > this._sequenceId) {\n const diff = sequenceId - this._sequenceId;\n this._sequenceId = sequenceId;\n return diff;\n }\n return 0;\n }\n\n public tryGetSequenceId(): [boolean, number | null] {\n if (this._isUpdate) {\n this._isUpdate = false;\n return [true, this._sequenceId];\n }\n\n return [false, null];\n }\n\n public reset(): void {\n this._sequenceId = 0;\n this._isUpdate = false;\n }\n}\n\nclass AbortableTask {\n private readonly _func: (obj?: any) => Promise<void>;\n private readonly _abortController: AbortController;\n private readonly _interval: number;\n private readonly _obj?: any;\n\n constructor(func: (obj?: any) => Promise<void>, interval: number, obj?: any) {\n this._func = func;\n this._abortController = new AbortController();\n this._interval = interval;\n this._obj = obj;\n this._start();\n }\n\n public abort(): void {\n try {\n this._abortController.abort();\n } catch {\n /** empty */\n }\n }\n\n private async _start(): Promise<void> {\n const signal = this._abortController.signal;\n while (!signal.aborted) {\n try {\n await this._func(this._obj);\n } catch {\n /** empty */\n } finally {\n await delay(this._interval);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"webPubSubClient.js","sourceRoot":"","sources":["../../src/webPubSubClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { delay } from \"@azure/core-util\";\nimport EventEmitter from \"events\";\nimport type { SendMessageErrorOptions } from \"./errors/index.js\";\nimport { SendMessageError } from \"./errors/index.js\";\nimport { logger } from \"./logger.js\";\nimport type {\n WebPubSubResult,\n JoinGroupOptions,\n LeaveGroupOptions,\n OnConnectedArgs,\n OnDisconnectedArgs,\n OnGroupDataMessageArgs,\n OnServerDataMessageArgs,\n OnStoppedArgs,\n WebPubSubRetryOptions,\n SendToGroupOptions,\n SendEventOptions,\n WebPubSubClientOptions,\n OnRejoinGroupFailedArgs,\n StartOptions,\n GetClientAccessUrlOptions,\n} from \"./models/index.js\";\nimport type {\n ConnectedMessage,\n DisconnectedMessage,\n GroupDataMessage,\n ServerDataMessage,\n WebPubSubDataType,\n WebPubSubMessage,\n JoinGroupMessage,\n LeaveGroupMessage,\n SendToGroupMessage,\n SendEventMessage,\n AckMessage,\n SequenceAckMessage,\n PingMessage,\n} from \"./models/messages.js\";\nimport type { WebPubSubClientProtocol } from \"./protocols/index.js\";\nimport { WebPubSubJsonReliableProtocol } from \"./protocols/index.js\";\nimport type { WebPubSubClientCredential } from \"./webPubSubClientCredential.js\";\nimport { WebSocketClientFactory } from \"./websocket/websocketClient.js\";\nimport type {\n WebSocketClientFactoryLike,\n WebSocketClientLike,\n} from \"./websocket/websocketClientLike.js\";\nimport { AckManager } from \"./ackManager.js\";\n\nenum WebPubSubClientState {\n Stopped = \"Stopped\",\n Disconnected = \"Disconnected\",\n Connecting = \"Connecting\",\n Connected = \"Connected\",\n Recovering = \"Recovering\",\n}\n\n/**\n * Types which can be serialized and sent as JSON.\n */\nexport type JSONTypes = string | number | boolean | object;\n\n/**\n * The WebPubSub client\n */\nexport class WebPubSubClient {\n private readonly _protocol: WebPubSubClientProtocol;\n private readonly _credential: WebPubSubClientCredential;\n private readonly _options: WebPubSubClientOptions;\n private readonly _groupMap: Map<string, WebPubSubGroup>;\n private readonly _ackManager: AckManager;\n private readonly _sequenceId: SequenceId;\n private readonly _messageRetryPolicy: RetryPolicy;\n private readonly _reconnectRetryPolicy: RetryPolicy;\n private readonly _quickSequenceAckDiff = 300;\n // The timeout for keep alive\n private readonly _keepAliveTimeoutInMs: number;\n // The interval at which to send keep-alive ping messages to the runtime\n private readonly _keepAliveIntervalInMs: number;\n\n private readonly _emitter: EventEmitter = new EventEmitter();\n private _state: WebPubSubClientState;\n private _isStopping: boolean = false;\n private _pingKeepaliveTask: AbortableTask | undefined;\n private _timeoutMonitorTask: AbortableTask | undefined;\n\n // connection lifetime\n private _wsClient?: WebSocketClientLike;\n private _uri?: string;\n private _lastCloseEvent?: { code: number; reason: string };\n private _lastDisconnectedMessage?: DisconnectedMessage;\n private _connectionId?: string;\n private _reconnectionToken?: string;\n private _isInitialConnected = false;\n private _sequenceAckTask?: AbortableTask;\n\n private _lastMessageReceived: number = Date.now();\n\n /**\n * Create an instance of WebPubSubClient\n * @param clientAccessUrl - The uri to connect\n * @param options - The client options\n */\n constructor(clientAccessUrl: string, options?: WebPubSubClientOptions);\n /**\n * Create an instance of WebPubSubClient\n * @param credential - The credential to use when connecting\n * @param options - The client options\n */\n constructor(credential: WebPubSubClientCredential, options?: WebPubSubClientOptions);\n constructor(credential: string | WebPubSubClientCredential, options?: WebPubSubClientOptions) {\n if (typeof credential === \"string\") {\n this._credential = { getClientAccessUrl: credential } as WebPubSubClientCredential;\n } else {\n this._credential = credential;\n }\n\n if (options == null) {\n options = {};\n }\n this._buildDefaultOptions(options);\n this._options = options;\n\n this._messageRetryPolicy = new RetryPolicy(this._options.messageRetryOptions!);\n this._reconnectRetryPolicy = new RetryPolicy(this._options.reconnectRetryOptions!);\n\n this._protocol = this._options.protocol!;\n this._groupMap = new Map<string, WebPubSubGroup>();\n this._ackManager = new AckManager();\n this._sequenceId = new SequenceId();\n\n this._keepAliveTimeoutInMs = this._options.keepAliveTimeoutInMs ?? 120000;\n this._keepAliveIntervalInMs = this._options.keepAliveIntervalInMs ?? 20000;\n\n this._state = WebPubSubClientState.Stopped;\n }\n\n /**\n * Start to start to the service.\n * @param abortSignal - The abort signal\n */\n public async start(options?: StartOptions): Promise<void> {\n if (this._isStopping) {\n throw new Error(\"Can't start a client during stopping\");\n }\n\n if (this._state !== WebPubSubClientState.Stopped) {\n throw new Error(\"Client can be only started when it's Stopped\");\n }\n\n let abortSignal: AbortSignalLike | undefined;\n if (options) {\n abortSignal = options.abortSignal;\n }\n\n if (!this._pingKeepaliveTask && this._keepAliveIntervalInMs > 0) {\n this._pingKeepaliveTask = this._getPingKeepaliveTask();\n }\n if (!this._timeoutMonitorTask && this._keepAliveTimeoutInMs > 0) {\n this._timeoutMonitorTask = this._getTimeoutMonitorTask();\n }\n\n try {\n await this._startCore(abortSignal);\n } catch (err) {\n // this two sentense should be set together. Consider client.stop() is called during _startCore()\n this._changeState(WebPubSubClientState.Stopped);\n this._disposeKeepaliveTasks();\n this._isStopping = false;\n throw err;\n }\n }\n\n private async _startFromRestarting(abortSignal?: AbortSignalLike): Promise<void> {\n if (this._state !== WebPubSubClientState.Disconnected) {\n throw new Error(\"Client can be only restarted when it's Disconnected\");\n }\n\n try {\n logger.verbose(\"Staring reconnecting.\");\n await this._startCore(abortSignal);\n } catch (err) {\n this._changeState(WebPubSubClientState.Disconnected);\n throw err;\n }\n }\n\n private async _startCore(abortSignal?: AbortSignalLike): Promise<void> {\n this._changeState(WebPubSubClientState.Connecting);\n\n logger.info(\"Staring a new connection\");\n // Reset before a pure new connection\n this._sequenceId.reset();\n this._isInitialConnected = false;\n this._lastCloseEvent = undefined;\n this._lastDisconnectedMessage = undefined;\n this._connectionId = undefined;\n this._reconnectionToken = undefined;\n this._uri = undefined;\n\n if (typeof this._credential.getClientAccessUrl === \"string\") {\n this._uri = this._credential.getClientAccessUrl;\n } else {\n this._uri = await this._credential.getClientAccessUrl({\n abortSignal: abortSignal,\n } as GetClientAccessUrlOptions);\n }\n\n if (typeof this._uri !== \"string\") {\n throw new Error(\n `The clientAccessUrl must be a string but currently it's ${typeof this._uri}`,\n );\n }\n await this._connectCore(this._uri);\n }\n\n /**\n * Stop the client.\n */\n public stop(): void {\n if (this._state === WebPubSubClientState.Stopped || this._isStopping) {\n return;\n }\n\n // TODO: Maybe we need a better logic for stopping control\n this._isStopping = true;\n if (this._wsClient && this._wsClient.isOpen()) {\n this._wsClient.close();\n } else {\n this._isStopping = false;\n }\n this._disposeKeepaliveTasks();\n }\n\n private _disposeKeepaliveTasks(): void {\n if (this._pingKeepaliveTask) {\n this._pingKeepaliveTask.abort();\n this._pingKeepaliveTask = undefined;\n }\n if (this._timeoutMonitorTask) {\n this._timeoutMonitorTask.abort();\n this._timeoutMonitorTask = undefined;\n }\n }\n\n /**\n * Add handler for connected event\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"connected\", listener: (e: OnConnectedArgs) => void): void;\n /**\n * Add handler for disconnected event\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"disconnected\", listener: (e: OnDisconnectedArgs) => void): void;\n /**\n * Add handler for stopped event\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"stopped\", listener: (e: OnStoppedArgs) => void): void;\n /**\n * Add handler for server messages\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"server-message\", listener: (e: OnServerDataMessageArgs) => void): void;\n /**\n * Add handler for group messags\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"group-message\", listener: (e: OnGroupDataMessageArgs) => void): void;\n /**\n * Add handler for rejoining group failed\n * @param event - The event name\n * @param listener - The handler\n */\n public on(event: \"rejoin-group-failed\", listener: (e: OnRejoinGroupFailedArgs) => void): void;\n public on(\n event:\n | \"connected\"\n | \"disconnected\"\n | \"stopped\"\n | \"server-message\"\n | \"group-message\"\n | \"rejoin-group-failed\",\n listener: (e: any) => void,\n ): void {\n this._emitter.on(event, listener);\n }\n\n /**\n * Remove handler for connected event\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"connected\", listener: (e: OnConnectedArgs) => void): void;\n /**\n * Remove handler for disconnected event\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"disconnected\", listener: (e: OnDisconnectedArgs) => void): void;\n /**\n * Remove handler for stopped event\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"stopped\", listener: (e: OnStoppedArgs) => void): void;\n /**\n * Remove handler for server message\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"server-message\", listener: (e: OnServerDataMessageArgs) => void): void;\n /**\n * Remove handler for group message\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"group-message\", listener: (e: OnGroupDataMessageArgs) => void): void;\n /**\n * Remove handler for rejoining group failed\n * @param event - The event name\n * @param listener - The handler\n */\n public off(event: \"rejoin-group-failed\", listener: (e: OnRejoinGroupFailedArgs) => void): void;\n public off(\n event:\n | \"connected\"\n | \"disconnected\"\n | \"stopped\"\n | \"server-message\"\n | \"group-message\"\n | \"rejoin-group-failed\",\n listener: (e: any) => void,\n ): void {\n this._emitter.removeListener(event, listener);\n }\n\n private _emitEvent(event: \"connected\", args: OnConnectedArgs): void;\n private _emitEvent(event: \"disconnected\", args: OnDisconnectedArgs): void;\n private _emitEvent(event: \"stopped\", args: OnStoppedArgs): void;\n private _emitEvent(event: \"server-message\", args: OnServerDataMessageArgs): void;\n private _emitEvent(event: \"group-message\", args: OnGroupDataMessageArgs): void;\n private _emitEvent(event: \"rejoin-group-failed\", args: OnRejoinGroupFailedArgs): void;\n private _emitEvent(\n event:\n | \"connected\"\n | \"disconnected\"\n | \"stopped\"\n | \"server-message\"\n | \"group-message\"\n | \"rejoin-group-failed\",\n args: any,\n ): void {\n this._emitter.emit(event, args);\n }\n\n /**\n * Send custom event to server.\n * @param eventName - The event name\n * @param content - The data content\n * @param dataType - The data type\n * @param options - The options\n * @param abortSignal - The abort signal\n */\n public async sendEvent(\n eventName: string,\n content: JSONTypes | ArrayBuffer,\n dataType: WebPubSubDataType,\n options?: SendEventOptions,\n ): Promise<WebPubSubResult> {\n return this._operationExecuteWithRetry(\n () => this._sendEventAttempt(eventName, content, dataType, options),\n options?.abortSignal,\n );\n }\n\n private async _sendEventAttempt(\n eventName: string,\n content: JSONTypes | ArrayBuffer,\n dataType: WebPubSubDataType,\n options?: SendEventOptions,\n ): Promise<WebPubSubResult> {\n const fireAndForget = options?.fireAndForget ?? false;\n if (!fireAndForget) {\n return this._sendMessageWithAckId(\n (id) => {\n return {\n kind: \"sendEvent\",\n dataType: dataType,\n data: content,\n ackId: id,\n event: eventName,\n } as SendEventMessage;\n },\n options?.ackId,\n options?.abortSignal,\n );\n }\n\n const message = {\n kind: \"sendEvent\",\n dataType: dataType,\n data: content,\n event: eventName,\n } as SendEventMessage;\n\n await this._sendMessage(message, options?.abortSignal);\n return { isDuplicated: false };\n }\n\n /**\n * Join the client to group\n * @param groupName - The group name\n * @param options - The join group options\n */\n public async joinGroup(groupName: string, options?: JoinGroupOptions): Promise<WebPubSubResult> {\n return this._operationExecuteWithRetry(\n () => this._joinGroupAttempt(groupName, options),\n options?.abortSignal,\n );\n }\n\n private async _joinGroupAttempt(\n groupName: string,\n options?: JoinGroupOptions,\n ): Promise<WebPubSubResult> {\n const group = this._getOrAddGroup(groupName);\n const result = await this._joinGroupCore(groupName, options);\n group.isJoined = true;\n return result;\n }\n\n private async _joinGroupCore(\n groupName: string,\n options?: JoinGroupOptions,\n ): Promise<WebPubSubResult> {\n return this._sendMessageWithAckId(\n (id) => {\n return {\n group: groupName,\n ackId: id,\n kind: \"joinGroup\",\n } as JoinGroupMessage;\n },\n options?.ackId,\n options?.abortSignal,\n );\n }\n\n /**\n * Leave the client from group\n * @param groupName - The group name\n * @param ackId - The optional ackId. If not specified, client will generate one.\n * @param abortSignal - The abort signal\n */\n public async leaveGroup(\n groupName: string,\n options?: LeaveGroupOptions,\n ): Promise<WebPubSubResult> {\n return this._operationExecuteWithRetry(\n () => this._leaveGroupAttempt(groupName, options),\n options?.abortSignal,\n );\n }\n\n private async _leaveGroupAttempt(\n groupName: string,\n options?: LeaveGroupOptions,\n ): Promise<WebPubSubResult> {\n const group = this._getOrAddGroup(groupName);\n const result = await this._sendMessageWithAckId(\n (id) => {\n return {\n group: groupName,\n ackId: id,\n kind: \"leaveGroup\",\n } as LeaveGroupMessage;\n },\n options?.ackId,\n options?.abortSignal,\n );\n group.isJoined = false;\n return result;\n }\n\n /**\n * Send message to group.\n * @param groupName - The group name\n * @param content - The data content\n * @param dataType - The data type\n * @param options - The options\n * @param abortSignal - The abort signal\n */\n public async sendToGroup(\n groupName: string,\n content: JSONTypes | ArrayBuffer,\n dataType: WebPubSubDataType,\n options?: SendToGroupOptions,\n ): Promise<WebPubSubResult> {\n return this._operationExecuteWithRetry(\n () => this._sendToGroupAttempt(groupName, content, dataType, options),\n options?.abortSignal,\n );\n }\n\n private async _sendToGroupAttempt(\n groupName: string,\n content: JSONTypes | ArrayBuffer,\n dataType: WebPubSubDataType,\n options?: SendToGroupOptions,\n ): Promise<WebPubSubResult> {\n const fireAndForget = options?.fireAndForget ?? false;\n const noEcho = options?.noEcho ?? false;\n if (!fireAndForget) {\n return this._sendMessageWithAckId(\n (id) => {\n return {\n kind: \"sendToGroup\",\n group: groupName,\n dataType: dataType,\n data: content,\n ackId: id,\n noEcho: noEcho,\n } as SendToGroupMessage;\n },\n options?.ackId,\n options?.abortSignal,\n );\n }\n\n const message = {\n kind: \"sendToGroup\",\n group: groupName,\n dataType: dataType,\n data: content,\n noEcho: noEcho,\n } as SendToGroupMessage;\n\n await this._sendMessage(message, options?.abortSignal);\n return { isDuplicated: false };\n }\n\n private _getWebSocketClientFactory(): WebSocketClientFactoryLike {\n return new WebSocketClientFactory();\n }\n\n private async _trySendSequenceAck(): Promise<void> {\n if (!this._protocol.isReliableSubProtocol) {\n return;\n }\n const [isUpdated, seqId] = this._sequenceId.tryGetSequenceId();\n if (isUpdated && seqId !== null && seqId !== undefined) {\n // seqId can be 0\n const message: SequenceAckMessage = {\n kind: \"sequenceAck\",\n sequenceId: seqId!,\n };\n try {\n await this._sendMessage(message);\n } catch {\n this._sequenceId.tryUpdate(seqId!); // If sending failed, mark it as updated so that it can be sent again.\n }\n }\n }\n\n private _connectCore(uri: string): Promise<void> {\n if (this._isStopping) {\n throw new Error(\"Can't start a client during stopping\");\n }\n\n return new Promise<void>((resolve, reject) => {\n // This part is executed sync\n const client = (this._wsClient = this._getWebSocketClientFactory().create(\n uri,\n this._protocol.name,\n ));\n client.onopen(() => {\n // There's a case that client called stop() before this method. We need to check and close it if it's the case.\n if (this._isStopping) {\n try {\n client.close();\n } catch {\n /** empty */\n }\n\n reject(new Error(`The client is stopped`));\n }\n logger.verbose(\"WebSocket connection has opened\");\n this._lastMessageReceived = Date.now(); // reset last message received time to avoid immediate keepalive timeout after a longer reconnection\n this._changeState(WebPubSubClientState.Connected);\n if (this._protocol.isReliableSubProtocol) {\n if (this._sequenceAckTask != null) {\n this._sequenceAckTask.abort();\n }\n this._sequenceAckTask = new AbortableTask(async () => {\n await this._trySendSequenceAck();\n }, 1000);\n }\n\n resolve();\n });\n\n client.onerror((e) => {\n if (this._sequenceAckTask != null) {\n this._sequenceAckTask.abort();\n }\n reject(e);\n });\n\n client.onclose((code: number, reason: string) => {\n if (this._state === WebPubSubClientState.Connected) {\n logger.verbose(\"WebSocket closed after open\");\n if (this._sequenceAckTask != null) {\n this._sequenceAckTask.abort();\n }\n logger.info(`WebSocket connection closed. Code: ${code}, Reason: ${reason}`);\n this._lastCloseEvent = { code: code, reason: reason };\n this._handleConnectionClose.call(this);\n } else {\n logger.verbose(\"WebSocket closed before open\");\n reject(new Error(`Failed to start WebSocket: ${code}`));\n }\n });\n\n client.onmessage((data: any) => {\n const handleAckMessage = (message: AckMessage): void => {\n const isDuplicated: boolean = message.error != null && message.error.name === \"Duplicate\";\n if (message.success || isDuplicated) {\n this._ackManager.resolveAck(message.ackId, {\n ackId: message.ackId,\n isDuplicated: isDuplicated,\n } as WebPubSubResult);\n } else {\n this._ackManager.rejectAck(\n message.ackId,\n new SendMessageError(\"Failed to send message.\", {\n ackId: message.ackId,\n errorDetail: message.error,\n } as SendMessageErrorOptions),\n );\n }\n };\n\n const handleConnectedMessage = async (message: ConnectedMessage): Promise<void> => {\n this._connectionId = message.connectionId;\n this._reconnectionToken = message.reconnectionToken;\n\n if (!this._isInitialConnected) {\n this._isInitialConnected = true;\n\n if (this._options.autoRejoinGroups) {\n const groupPromises: Promise<void>[] = [];\n this._groupMap.forEach((g) => {\n if (g.isJoined) {\n groupPromises.push(\n (async () => {\n try {\n await this._joinGroupCore(g.name);\n } catch (err) {\n this._safeEmitRejoinGroupFailed(g.name, err);\n }\n })(),\n );\n }\n });\n\n await Promise.all(groupPromises).catch(() => {\n /** empty */\n });\n }\n\n this._safeEmitConnected(message.connectionId, message.userId);\n }\n };\n\n const handleDisconnectedMessage = (message: DisconnectedMessage): void => {\n this._lastDisconnectedMessage = message;\n };\n\n const handleGroupDataMessage = (message: GroupDataMessage): void => {\n if (message.sequenceId != null) {\n const diff = this._sequenceId.tryUpdate(message.sequenceId);\n if (diff === 0) {\n // drop duplicated message\n return;\n }\n\n // If the diff is larger than the threshold, we must ack quicker to avoid slow client drop.\n if (diff > this._quickSequenceAckDiff) {\n this._trySendSequenceAck();\n }\n }\n\n this._safeEmitGroupMessage(message);\n };\n\n const handleServerDataMessage = (message: ServerDataMessage): void => {\n if (message.sequenceId != null) {\n const diff = this._sequenceId.tryUpdate(message.sequenceId);\n if (diff === 0) {\n // drop duplicated message\n return;\n }\n\n // If the diff is larger than the threshold, we must ack quicker to avoid slow client drop.\n if (diff > this._quickSequenceAckDiff) {\n this._trySendSequenceAck();\n }\n }\n\n this._safeEmitServerMessage(message);\n };\n\n this._lastMessageReceived = Date.now();\n\n let messages: WebPubSubMessage[] | WebPubSubMessage | null;\n try {\n let convertedData: Buffer | ArrayBuffer | string;\n if (Array.isArray(data)) {\n convertedData = Buffer.concat(data);\n } else {\n convertedData = data;\n }\n\n messages = this._protocol.parseMessages(convertedData);\n if (messages === null) {\n // null means the message is not recognized.\n return;\n }\n } catch (err) {\n logger.warning(\"An error occurred while parsing the message from service\", err);\n throw err;\n }\n\n if (!Array.isArray(messages)) {\n messages = [messages];\n }\n\n messages.forEach((message) => {\n try {\n switch (message.kind) {\n case \"pong\": {\n // handled in _lastMessageReceived\n break;\n }\n case \"ack\": {\n handleAckMessage(message as AckMessage);\n break;\n }\n case \"connected\": {\n handleConnectedMessage(message as ConnectedMessage);\n break;\n }\n case \"disconnected\": {\n handleDisconnectedMessage(message as DisconnectedMessage);\n break;\n }\n case \"groupData\": {\n handleGroupDataMessage(message as GroupDataMessage);\n break;\n }\n case \"serverData\": {\n handleServerDataMessage(message as ServerDataMessage);\n break;\n }\n }\n } catch (err) {\n logger.warning(\n `An error occurred while handling the message with kind: ${message.kind} from service`,\n err,\n );\n }\n });\n });\n });\n }\n\n private async _handleConnectionCloseAndNoRecovery(): Promise<void> {\n this._state = WebPubSubClientState.Disconnected;\n\n this._safeEmitDisconnected(this._connectionId, this._lastDisconnectedMessage);\n\n // Auto reconnect or stop\n if (this._options.autoReconnect) {\n await this._autoReconnect();\n } else {\n await this._handleConnectionStopped();\n }\n }\n\n private async _autoReconnect(): Promise<void> {\n let isSuccess = false;\n let attempt = 0;\n try {\n while (!this._isStopping) {\n try {\n await this._startFromRestarting();\n isSuccess = true;\n break;\n } catch (err) {\n logger.warning(\"An attempt to reconnect connection failed.\", err);\n\n attempt++;\n const delayInMs = this._reconnectRetryPolicy.nextRetryDelayInMs(attempt);\n\n if (delayInMs == null) {\n break;\n }\n\n logger.verbose(`Delay time for reconnect attempt ${attempt}: ${delayInMs}`);\n await delay(delayInMs).catch(() => {\n /** empty */\n });\n }\n }\n } finally {\n if (!isSuccess) {\n this._handleConnectionStopped();\n }\n }\n }\n\n private _handleConnectionStopped(): void {\n this._isStopping = false;\n this._state = WebPubSubClientState.Stopped;\n this._disposeKeepaliveTasks();\n this._safeEmitStopped();\n }\n\n private async _trySendPing(): Promise<void> {\n // skip during reconnection\n if (this._state !== WebPubSubClientState.Connected || !this._wsClient?.isOpen()) {\n return;\n }\n\n const message: PingMessage = {\n kind: \"ping\",\n };\n try {\n await this._sendMessage(message);\n } catch {\n logger.warning(\"Failed to send keepalive message to the service\");\n }\n }\n\n private async _checkKeepAliveTimeout(): Promise<void> {\n if (this._state !== WebPubSubClientState.Connected || !this._wsClient?.isOpen()) {\n return;\n }\n\n const now = Date.now();\n if (now - this._lastMessageReceived > this._keepAliveTimeoutInMs) {\n logger.warning(\n `No messages received for ${now - this._lastMessageReceived} ms. Closing. The keep alive timeout is set to ${this._keepAliveTimeoutInMs} ms.`,\n );\n this._wsClient?.close();\n }\n }\n\n private _getPingKeepaliveTask(): AbortableTask {\n return new AbortableTask(async () => {\n await this._trySendPing();\n }, this._keepAliveIntervalInMs);\n }\n\n private _getTimeoutMonitorTask(): AbortableTask {\n const timeout = this._keepAliveTimeoutInMs;\n const checkInterval = Math.floor(timeout / 3);\n return new AbortableTask(async () => {\n await this._checkKeepAliveTimeout();\n }, checkInterval);\n }\n\n private async _sendMessage(\n message: WebPubSubMessage,\n abortSignal?: AbortSignalLike,\n ): Promise<void> {\n if (!this._wsClient || !this._wsClient.isOpen()) {\n throw new Error(\"The connection is not connected.\");\n }\n\n const payload = this._protocol.writeMessage(message);\n await this._wsClient!.send(payload, abortSignal);\n }\n\n private async _sendMessageWithAckId(\n messageProvider: (ackId: number) => WebPubSubMessage,\n ackId?: number,\n abortSignal?: AbortSignalLike,\n ): Promise<WebPubSubResult> {\n const { ackId: resolvedAckId, wait } = this._ackManager.registerAck(ackId);\n const message = messageProvider(resolvedAckId);\n\n try {\n await this._sendMessage(message, abortSignal);\n } catch (error) {\n this._ackManager.discard(resolvedAckId);\n\n let errorMessage: string = \"\";\n if (error instanceof Error) {\n errorMessage = error.message;\n }\n throw new SendMessageError(errorMessage, { ackId: resolvedAckId });\n }\n\n return wait(abortSignal);\n }\n\n private async _handleConnectionClose(): Promise<void> {\n // Clean ack cache\n this._ackManager.rejectAll((ackId) => {\n return new SendMessageError(\n \"Connection is disconnected before receive ack from the service\",\n {\n ackId,\n } as SendMessageErrorOptions,\n );\n });\n\n if (this._isStopping) {\n logger.warning(\"The client is stopping state. Stop recovery.\");\n this._handleConnectionCloseAndNoRecovery();\n return;\n }\n\n if (this._lastCloseEvent && this._lastCloseEvent.code === 1008) {\n logger.warning(\"The websocket close with status code 1008. Stop recovery.\");\n this._handleConnectionCloseAndNoRecovery();\n return;\n }\n\n if (!this._protocol.isReliableSubProtocol) {\n logger.warning(\"The protocol is not reliable, recovery is not applicable\");\n this._handleConnectionCloseAndNoRecovery();\n return;\n }\n\n // Build recovery uri\n const recoveryUri = this._buildRecoveryUri();\n if (!recoveryUri) {\n logger.warning(\"Connection id or reconnection token is not available\");\n this._handleConnectionCloseAndNoRecovery();\n return;\n }\n\n // Try recover connection\n let recovered = false;\n this._state = WebPubSubClientState.Recovering;\n const abortSignal = AbortSignal.timeout(30 * 1000);\n try {\n while (!abortSignal.aborted || this._isStopping) {\n try {\n await this._connectCore.call(this, recoveryUri);\n recovered = true;\n return;\n } catch {\n await delay(1000);\n }\n }\n } finally {\n if (!recovered) {\n logger.warning(\"Recovery attempts failed more then 30 seconds or the client is stopping\");\n this._handleConnectionCloseAndNoRecovery();\n }\n }\n }\n\n private _safeEmitConnected(connectionId: string, userId: string): void {\n this._emitEvent(\"connected\", {\n connectionId: connectionId,\n userId: userId,\n } as OnConnectedArgs);\n }\n\n private _safeEmitDisconnected(\n connectionId: string | undefined,\n lastDisconnectedMessage: DisconnectedMessage | undefined,\n ): void {\n this._emitEvent(\"disconnected\", {\n connectionId: connectionId,\n message: lastDisconnectedMessage,\n } as OnDisconnectedArgs);\n }\n\n private _safeEmitGroupMessage(message: GroupDataMessage): void {\n this._emitEvent(\"group-message\", {\n message: message,\n } as OnGroupDataMessageArgs);\n }\n\n private _safeEmitServerMessage(message: ServerDataMessage): void {\n this._emitEvent(\"server-message\", {\n message: message,\n } as OnServerDataMessageArgs);\n }\n\n private _safeEmitStopped(): void {\n this._emitEvent(\"stopped\", {});\n }\n\n private _safeEmitRejoinGroupFailed(groupName: string, err: unknown): void {\n this._emitEvent(\"rejoin-group-failed\", {\n group: groupName,\n error: err,\n } as OnRejoinGroupFailedArgs);\n }\n\n private _buildDefaultOptions(clientOptions: WebPubSubClientOptions): WebPubSubClientOptions {\n if (clientOptions.autoReconnect == null) {\n clientOptions.autoReconnect = true;\n }\n\n if (clientOptions.autoRejoinGroups == null) {\n clientOptions.autoRejoinGroups = true;\n }\n\n if (clientOptions.protocol == null) {\n clientOptions.protocol = WebPubSubJsonReliableProtocol();\n }\n\n if (clientOptions.keepAliveTimeoutInMs == null) {\n clientOptions.keepAliveTimeoutInMs = 120000; // 120 seconds\n }\n\n if (clientOptions.keepAliveTimeoutInMs < 0) {\n throw new RangeError(\"keepAliveTimeoutInMs must be greater than or equal to 0.\");\n }\n\n if (clientOptions.keepAliveIntervalInMs == null) {\n clientOptions.keepAliveIntervalInMs = 20000; // 20 seconds\n }\n\n if (clientOptions.keepAliveIntervalInMs < 0) {\n throw new RangeError(\"keepAliveIntervalInMs must be greater than or equal to 0.\");\n }\n\n this._buildMessageRetryOptions(clientOptions);\n this._buildReconnectRetryOptions(clientOptions);\n\n return clientOptions;\n }\n\n private _buildMessageRetryOptions(clientOptions: WebPubSubClientOptions): void {\n if (!clientOptions.messageRetryOptions) {\n clientOptions.messageRetryOptions = {};\n }\n\n if (\n clientOptions.messageRetryOptions.maxRetries == null ||\n clientOptions.messageRetryOptions.maxRetries < 0\n ) {\n clientOptions.messageRetryOptions.maxRetries = 3;\n }\n\n if (\n clientOptions.messageRetryOptions.retryDelayInMs == null ||\n clientOptions.messageRetryOptions.retryDelayInMs < 0\n ) {\n clientOptions.messageRetryOptions.retryDelayInMs = 1000;\n }\n\n if (\n clientOptions.messageRetryOptions.maxRetryDelayInMs == null ||\n clientOptions.messageRetryOptions.maxRetryDelayInMs < 0\n ) {\n clientOptions.messageRetryOptions.maxRetryDelayInMs = 30000;\n }\n\n if (clientOptions.messageRetryOptions.mode == null) {\n clientOptions.messageRetryOptions.mode = \"Fixed\";\n }\n }\n\n private _buildReconnectRetryOptions(clientOptions: WebPubSubClientOptions): void {\n if (!clientOptions.reconnectRetryOptions) {\n clientOptions.reconnectRetryOptions = {};\n }\n\n if (\n clientOptions.reconnectRetryOptions.maxRetries == null ||\n clientOptions.reconnectRetryOptions.maxRetries < 0\n ) {\n clientOptions.reconnectRetryOptions.maxRetries = Number.MAX_VALUE;\n }\n\n if (\n clientOptions.reconnectRetryOptions.retryDelayInMs == null ||\n clientOptions.reconnectRetryOptions.retryDelayInMs < 0\n ) {\n clientOptions.reconnectRetryOptions.retryDelayInMs = 1000;\n }\n\n if (\n clientOptions.reconnectRetryOptions.maxRetryDelayInMs == null ||\n clientOptions.reconnectRetryOptions.maxRetryDelayInMs < 0\n ) {\n clientOptions.reconnectRetryOptions.maxRetryDelayInMs = 30000;\n }\n\n if (clientOptions.reconnectRetryOptions.mode == null) {\n clientOptions.reconnectRetryOptions.mode = \"Fixed\";\n }\n }\n\n private _buildRecoveryUri(): string | null {\n if (this._connectionId && this._reconnectionToken && this._uri) {\n const url = new URL(this._uri);\n url.searchParams.append(\"awps_connection_id\", this._connectionId);\n url.searchParams.append(\"awps_reconnection_token\", this._reconnectionToken);\n return url.toString();\n }\n return null;\n }\n\n private _getOrAddGroup(name: string): WebPubSubGroup {\n if (!this._groupMap.has(name)) {\n this._groupMap.set(name, new WebPubSubGroup(name));\n }\n return this._groupMap.get(name) as WebPubSubGroup;\n }\n\n private _changeState(newState: WebPubSubClientState): void {\n logger.verbose(\n `The client state transfer from ${this._state.toString()} to ${newState.toString()}`,\n );\n this._state = newState;\n }\n\n private async _operationExecuteWithRetry<T>(\n inner: () => Promise<T>,\n signal?: AbortSignalLike,\n ): Promise<T> {\n let retryAttempt = 0;\n\n while (true) {\n try {\n return await inner.call(this);\n } catch (err) {\n retryAttempt++;\n const delayInMs = this._messageRetryPolicy.nextRetryDelayInMs(retryAttempt);\n if (delayInMs == null) {\n throw err;\n }\n\n await delay(delayInMs);\n\n if (signal?.aborted) {\n throw err;\n }\n }\n }\n }\n}\n\nclass RetryPolicy {\n private _retryOptions: WebPubSubRetryOptions;\n private _maxRetriesToGetMaxDelay: number;\n\n public constructor(retryOptions: WebPubSubRetryOptions) {\n this._retryOptions = retryOptions;\n this._maxRetriesToGetMaxDelay = Math.ceil(\n Math.log2(this._retryOptions.maxRetryDelayInMs!) -\n Math.log2(this._retryOptions.retryDelayInMs!) +\n 1,\n );\n }\n\n public nextRetryDelayInMs(retryAttempt: number): number | null {\n if (retryAttempt > this._retryOptions.maxRetries!) {\n return null;\n } else {\n if (this._retryOptions.mode! === \"Fixed\") {\n return this._retryOptions.retryDelayInMs!;\n } else {\n return this._calculateExponentialDelay(retryAttempt);\n }\n }\n }\n\n private _calculateExponentialDelay(attempt: number): number {\n if (attempt >= this._maxRetriesToGetMaxDelay) {\n return this._retryOptions.maxRetryDelayInMs!;\n } else {\n return (1 << (attempt - 1)) * this._retryOptions.retryDelayInMs!;\n }\n }\n}\n\nclass WebPubSubGroup {\n public readonly name: string;\n public isJoined = false;\n\n constructor(name: string) {\n this.name = name;\n }\n}\n\nclass SequenceId {\n private _sequenceId: number;\n private _isUpdate: boolean;\n\n constructor() {\n this._sequenceId = 0;\n this._isUpdate = false;\n }\n\n public tryUpdate(sequenceId: number): number {\n this._isUpdate = true;\n if (sequenceId > this._sequenceId) {\n const diff = sequenceId - this._sequenceId;\n this._sequenceId = sequenceId;\n return diff;\n }\n return 0;\n }\n\n public tryGetSequenceId(): [boolean, number | null] {\n if (this._isUpdate) {\n this._isUpdate = false;\n return [true, this._sequenceId];\n }\n\n return [false, null];\n }\n\n public reset(): void {\n this._sequenceId = 0;\n this._isUpdate = false;\n }\n}\n\nclass AbortableTask {\n private readonly _func: (obj?: any) => Promise<void>;\n private readonly _abortController: AbortController;\n private readonly _interval: number;\n private readonly _obj?: any;\n\n constructor(func: (obj?: any) => Promise<void>, interval: number, obj?: any) {\n this._func = func;\n this._abortController = new AbortController();\n this._interval = interval;\n this._obj = obj;\n this._start();\n }\n\n public abort(): void {\n try {\n this._abortController.abort();\n } catch {\n /** empty */\n }\n }\n\n private async _start(): Promise<void> {\n const signal = this._abortController.signal;\n while (!signal.aborted) {\n try {\n await this._func(this._obj);\n } catch {\n /** empty */\n } finally {\n await delay(this._interval);\n }\n }\n }\n}\n"]}
@@ -25,6 +25,21 @@ export interface WebPubSubClientOptions {
25
25
  * The retry options for reconnection. Only available when autoReconnect is true.
26
26
  */
27
27
  reconnectRetryOptions?: WebPubSubRetryOptions;
28
+ /**
29
+ * The idle timeout in milliseconds used to detect half-open connections when no data or pong has
30
+ * been received. Default is 120000ms (120 seconds). Set to 0 to disable this timeout check. Must
31
+ * be greater than or equal to 0. We recommend keeping this value comfortably larger than
32
+ * `keepAliveIntervalInMs` (for example 3x) so that probes have time to run before the timeout
33
+ * closes the socket.
34
+ */
35
+ keepAliveTimeoutInMs?: number;
36
+ /**
37
+ * The interval in milliseconds at which to send keep-alive ping messages to the runtime. Default
38
+ * is 20000ms (20 seconds). Set to 0 to disable client-initiated keep-alive pings. Must be greater
39
+ * than or equal to 0. We recommend choosing a value that is lower than `keepAliveTimeoutInMs`
40
+ * (again, about 3x lower) so the timeout only triggers when multiple pings fail.
41
+ */
42
+ keepAliveIntervalInMs?: number;
28
43
  }
29
44
  /**
30
45
  * The retry options
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE9F;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;OAEG;IACH,mBAAmB,CAAC,EAAE,qBAAqB,CAAC;IAC5C;;OAEG;IACH,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;CAAG;AAEjC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAyOlC,wDAA8B","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { WebPubSubClientProtocol } from \"../protocols/index.js\";\nimport type { DisconnectedMessage, GroupDataMessage, ServerDataMessage } from \"./messages.js\";\n\n/**\n * The client options\n */\nexport interface WebPubSubClientOptions {\n /**\n * The subprotocol\n */\n protocol?: WebPubSubClientProtocol;\n /**\n * Whether to auto reconnect after connection is dropped and not recoverable\n */\n autoReconnect?: boolean;\n /**\n * Whether to enable restoring group after reconnecting\n */\n autoRejoinGroups?: boolean;\n /**\n * The retry options for operations like joining group and sending messages\n */\n messageRetryOptions?: WebPubSubRetryOptions;\n /**\n * The retry options for reconnection. Only available when autoReconnect is true.\n */\n reconnectRetryOptions?: WebPubSubRetryOptions;\n}\n\n/**\n * The retry options\n */\nexport interface WebPubSubRetryOptions {\n /**\n * Number of times the operation needs to be retried in case\n * of retryable error. Default: 3.\n */\n maxRetries?: number;\n /**\n * Amount of time to wait in milliseconds before making the\n * next attempt. Default: `1000 milliseconds`.\n * When `mode` option is set to `Exponential`,\n * this is used to compute the exponentially increasing delays between retries.\n */\n retryDelayInMs?: number;\n /**\n * Denotes the maximum delay between retries\n * that the retry attempts will be capped at. Applicable only when performing exponential retry.\n */\n maxRetryDelayInMs?: number;\n /**\n * Denotes which retry mode to apply. If undefined, defaults to `Fixed`\n */\n mode?: RetryMode;\n}\n\n/**\n * Describes the Retry Mode type\n */\nexport type RetryMode = \"Exponential\" | \"Fixed\";\n\n/**\n * The start options\n */\nexport interface StartOptions {\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * Join group operation options\n */\nexport interface JoinGroupOptions {\n /**\n * The optional ackId. If not specified, client will generate one.\n */\n ackId?: number;\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * Leave group operation options\n */\nexport interface LeaveGroupOptions {\n /**\n * The optional ackId. If not specified, client will generate one.\n */\n ackId?: number;\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * Send to group operation options\n */\nexport interface SendToGroupOptions {\n /**\n * Whether the message needs to echo to sender\n */\n noEcho?: boolean;\n /**\n * If true, the message won't contains ackId. No AckMessage will be returned from the service.\n */\n fireAndForget?: boolean;\n /**\n * The optional ackId. If not specified, client will generate one.\n */\n ackId?: number;\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * Send event operation options\n */\nexport interface SendEventOptions {\n /**\n * If true, the message won't contains ackId. No AckMessage will be returned from the service.\n */\n fireAndForget?: boolean;\n /**\n * The optional ackId. If not specified, client will generate one.\n */\n ackId?: number;\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * Parameter of OnConnected callback\n */\nexport interface OnConnectedArgs {\n /**\n * The connection id\n */\n connectionId: string;\n /**\n * The user id of the client connection\n */\n userId: string;\n}\n\n/**\n * Parameter of OnDisconnected callback\n */\nexport interface OnDisconnectedArgs {\n /**\n * The connection id\n */\n connectionId?: string;\n /**\n * The disconnected message\n */\n message?: DisconnectedMessage;\n}\n\n/**\n * Parameter of OnStopped callback\n */\nexport interface OnStoppedArgs {}\n\n/**\n * Parameter of OnDataMessage callback\n */\nexport interface OnServerDataMessageArgs {\n /**\n * The data message\n */\n message: ServerDataMessage;\n}\n\n/**\n * Parameter of OnGroupDataMessage callback\n */\nexport interface OnGroupDataMessageArgs {\n /**\n * The group data message\n */\n message: GroupDataMessage;\n}\n\n/**\n * Parameter of RejoinGroupFailed callback\n */\nexport interface OnRejoinGroupFailedArgs {\n /**\n * The group name\n */\n group: string;\n /**\n * The failure error\n */\n error: Error;\n}\n\n/**\n * The ack result\n */\nexport interface WebPubSubResult {\n /**\n * The ack message from the service. If the message is fire-and-forget, this will be undefined.\n */\n ackId?: number;\n /**\n * Whether the message is duplicated.\n */\n isDuplicated: boolean;\n}\n\n/**\n * The start options\n */\nexport interface GetClientAccessUrlOptions {\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport * from \"./messages.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAwPlC,wDAA8B","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { WebPubSubClientProtocol } from \"../protocols/index.js\";\nimport type { DisconnectedMessage, GroupDataMessage, ServerDataMessage } from \"./messages.js\";\n\n/**\n * The client options\n */\nexport interface WebPubSubClientOptions {\n /**\n * The subprotocol\n */\n protocol?: WebPubSubClientProtocol;\n /**\n * Whether to auto reconnect after connection is dropped and not recoverable\n */\n autoReconnect?: boolean;\n /**\n * Whether to enable restoring group after reconnecting\n */\n autoRejoinGroups?: boolean;\n /**\n * The retry options for operations like joining group and sending messages\n */\n messageRetryOptions?: WebPubSubRetryOptions;\n /**\n * The retry options for reconnection. Only available when autoReconnect is true.\n */\n reconnectRetryOptions?: WebPubSubRetryOptions;\n /**\n * The idle timeout in milliseconds used to detect half-open connections when no data or pong has\n * been received. Default is 120000ms (120 seconds). Set to 0 to disable this timeout check. Must\n * be greater than or equal to 0. We recommend keeping this value comfortably larger than\n * `keepAliveIntervalInMs` (for example 3x) so that probes have time to run before the timeout\n * closes the socket.\n */\n keepAliveTimeoutInMs?: number;\n /**\n * The interval in milliseconds at which to send keep-alive ping messages to the runtime. Default\n * is 20000ms (20 seconds). Set to 0 to disable client-initiated keep-alive pings. Must be greater\n * than or equal to 0. We recommend choosing a value that is lower than `keepAliveTimeoutInMs`\n * (again, about 3x lower) so the timeout only triggers when multiple pings fail.\n */\n keepAliveIntervalInMs?: number;\n}\n\n/**\n * The retry options\n */\nexport interface WebPubSubRetryOptions {\n /**\n * Number of times the operation needs to be retried in case\n * of retryable error. Default: 3.\n */\n maxRetries?: number;\n /**\n * Amount of time to wait in milliseconds before making the\n * next attempt. Default: `1000 milliseconds`.\n * When `mode` option is set to `Exponential`,\n * this is used to compute the exponentially increasing delays between retries.\n */\n retryDelayInMs?: number;\n /**\n * Denotes the maximum delay between retries\n * that the retry attempts will be capped at. Applicable only when performing exponential retry.\n */\n maxRetryDelayInMs?: number;\n /**\n * Denotes which retry mode to apply. If undefined, defaults to `Fixed`\n */\n mode?: RetryMode;\n}\n\n/**\n * Describes the Retry Mode type\n */\nexport type RetryMode = \"Exponential\" | \"Fixed\";\n\n/**\n * The start options\n */\nexport interface StartOptions {\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * Join group operation options\n */\nexport interface JoinGroupOptions {\n /**\n * The optional ackId. If not specified, client will generate one.\n */\n ackId?: number;\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * Leave group operation options\n */\nexport interface LeaveGroupOptions {\n /**\n * The optional ackId. If not specified, client will generate one.\n */\n ackId?: number;\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * Send to group operation options\n */\nexport interface SendToGroupOptions {\n /**\n * Whether the message needs to echo to sender\n */\n noEcho?: boolean;\n /**\n * If true, the message won't contains ackId. No AckMessage will be returned from the service.\n */\n fireAndForget?: boolean;\n /**\n * The optional ackId. If not specified, client will generate one.\n */\n ackId?: number;\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * Send event operation options\n */\nexport interface SendEventOptions {\n /**\n * If true, the message won't contains ackId. No AckMessage will be returned from the service.\n */\n fireAndForget?: boolean;\n /**\n * The optional ackId. If not specified, client will generate one.\n */\n ackId?: number;\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * Parameter of OnConnected callback\n */\nexport interface OnConnectedArgs {\n /**\n * The connection id\n */\n connectionId: string;\n /**\n * The user id of the client connection\n */\n userId: string;\n}\n\n/**\n * Parameter of OnDisconnected callback\n */\nexport interface OnDisconnectedArgs {\n /**\n * The connection id\n */\n connectionId?: string;\n /**\n * The disconnected message\n */\n message?: DisconnectedMessage;\n}\n\n/**\n * Parameter of OnStopped callback\n */\nexport interface OnStoppedArgs {}\n\n/**\n * Parameter of OnDataMessage callback\n */\nexport interface OnServerDataMessageArgs {\n /**\n * The data message\n */\n message: ServerDataMessage;\n}\n\n/**\n * Parameter of OnGroupDataMessage callback\n */\nexport interface OnGroupDataMessageArgs {\n /**\n * The group data message\n */\n message: GroupDataMessage;\n}\n\n/**\n * Parameter of RejoinGroupFailed callback\n */\nexport interface OnRejoinGroupFailedArgs {\n /**\n * The group name\n */\n group: string;\n /**\n * The failure error\n */\n error: Error;\n}\n\n/**\n * The ack result\n */\nexport interface WebPubSubResult {\n /**\n * The ack message from the service. If the message is fire-and-forget, this will be undefined.\n */\n ackId?: number;\n /**\n * Whether the message is duplicated.\n */\n isDuplicated: boolean;\n}\n\n/**\n * The start options\n */\nexport interface GetClientAccessUrlOptions {\n /**\n * The abort signal\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport * from \"./messages.js\";\n"]}
@@ -2,7 +2,7 @@ import type { JSONTypes } from "../webPubSubClient.js";
2
2
  /**
3
3
  * The web pubsub message
4
4
  */
5
- export type WebPubSubMessage = GroupDataMessage | ServerDataMessage | JoinGroupMessage | LeaveGroupMessage | ConnectedMessage | DisconnectedMessage | SendToGroupMessage | SendEventMessage | SequenceAckMessage | AckMessage;
5
+ export type WebPubSubMessage = GroupDataMessage | ServerDataMessage | JoinGroupMessage | LeaveGroupMessage | ConnectedMessage | DisconnectedMessage | SendToGroupMessage | SendEventMessage | SequenceAckMessage | PingMessage | AckMessage | PongMessage;
6
6
  /**
7
7
  * The common of web pubsub message
8
8
  */
@@ -17,6 +17,10 @@ export type DownstreamMessageType =
17
17
  * Type for AckMessage
18
18
  */
19
19
  "ack"
20
+ /**
21
+ * Type for PongMessage
22
+ */
23
+ | "pong"
20
24
  /**
21
25
  * Type for ConnectedMessage
22
26
  */
@@ -56,7 +60,11 @@ export type UpstreamMessageType =
56
60
  /**
57
61
  * Type for SequenceAckMessage
58
62
  */
59
- | "sequenceAck";
63
+ | "sequenceAck"
64
+ /**
65
+ * Type for PingMessage
66
+ */
67
+ | "ping";
60
68
  /**
61
69
  * The ack message
62
70
  */
@@ -78,6 +86,15 @@ export interface AckMessage extends WebPubSubMessageBase {
78
86
  */
79
87
  error?: AckMessageError;
80
88
  }
89
+ /**
90
+ * The pong message
91
+ */
92
+ export interface PongMessage extends WebPubSubMessageBase {
93
+ /**
94
+ * Message type
95
+ */
96
+ readonly kind: "pong";
97
+ }
81
98
  /**
82
99
  * Error detail in AckMessage
83
100
  */
@@ -276,6 +293,15 @@ export interface SequenceAckMessage extends WebPubSubMessageBase {
276
293
  */
277
294
  sequenceId: number;
278
295
  }
296
+ /**
297
+ * Ping message
298
+ */
299
+ export interface PingMessage extends WebPubSubMessageBase {
300
+ /**
301
+ * Message type
302
+ */
303
+ readonly kind: "ping";
304
+ }
279
305
  /**
280
306
  * The data type
281
307
  */
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/models/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/models/messages.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/models/messages.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { JSONTypes } from \"../webPubSubClient.js\";\n\n/**\n * The web pubsub message\n */\nexport type WebPubSubMessage =\n | GroupDataMessage\n | ServerDataMessage\n | JoinGroupMessage\n | LeaveGroupMessage\n | ConnectedMessage\n | DisconnectedMessage\n | SendToGroupMessage\n | SendEventMessage\n | SequenceAckMessage\n | AckMessage;\n\n/**\n * The common of web pubsub message\n */\nexport interface WebPubSubMessageBase {\n kind: DownstreamMessageType | UpstreamMessageType;\n}\n\n/**\n * Types for downstream messages\n */\nexport type DownstreamMessageType =\n /**\n * Type for AckMessage\n */\n | \"ack\"\n /**\n * Type for ConnectedMessage\n */\n | \"connected\"\n /**\n * Type for DisconnectedMessage\n */\n | \"disconnected\"\n /**\n * Type for GroupDataMessage\n */\n | \"groupData\"\n /**\n * Type for ServerDataMessage\n */\n | \"serverData\";\n\n/**\n * Types for upstream messages\n */\nexport type UpstreamMessageType =\n /**\n * Type for JoinGroupMessage\n */\n | \"joinGroup\"\n /**\n * Type for LeaveGroupMessage\n */\n | \"leaveGroup\"\n /**\n * Type for SendToGroupMessage\n */\n | \"sendToGroup\"\n /**\n * Type for SendEventMessage\n */\n | \"sendEvent\"\n /**\n * Type for SequenceAckMessage\n */\n | \"sequenceAck\";\n\n/**\n * The ack message\n */\nexport interface AckMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"ack\";\n /**\n * The correspending id\n */\n ackId: number;\n /**\n * Is operation success or not\n */\n success: boolean;\n /**\n * The error detail. Only available when success is false\n */\n error?: AckMessageError;\n}\n\n/**\n * Error detail in AckMessage\n */\nexport interface AckMessageError {\n /**\n * Error name\n */\n name: string;\n /**\n * Details error message\n */\n message: string;\n}\n\n/**\n * Connected message\n */\nexport interface ConnectedMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"connected\";\n /**\n * The connection id\n */\n connectionId: string;\n /**\n * The user id of the client connection\n */\n userId: string;\n /**\n * The reconnection token. Only available in reliable protocols.\n */\n reconnectionToken: string;\n}\n\n/**\n * Disconnected message\n */\nexport interface DisconnectedMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"disconnected\";\n /**\n * Reason of disconnection.\n */\n message: string;\n}\n\n/**\n * Group data message\n */\nexport interface GroupDataMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"groupData\";\n /**\n * The data type\n */\n dataType: WebPubSubDataType;\n /**\n * The data\n */\n data: JSONTypes | ArrayBuffer;\n /**\n * The sequence id of the data. Only available in reliable protocols\n */\n sequenceId?: number;\n /**\n * The name of group that the message come from.\n */\n group: string;\n /**\n * The user id of the sender\n */\n fromUserId: string;\n}\n\n/**\n * Server data message\n */\nexport interface ServerDataMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"serverData\";\n /**\n * The data type\n */\n dataType: WebPubSubDataType;\n /**\n * The data\n */\n data: JSONTypes | ArrayBuffer;\n /**\n * The sequence id of the data. Only available in reliable protocols\n */\n sequenceId?: number;\n}\n\n/**\n * Join group message\n */\nexport interface JoinGroupMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"joinGroup\";\n /**\n * The group to join\n */\n group: string;\n /**\n * Optional ack id. If specified, an AckMessage with success or not will be returned with the same ackId\n */\n ackId?: number;\n}\n\n/**\n * Leave group message\n */\nexport interface LeaveGroupMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"leaveGroup\";\n /**\n * The group to leave\n */\n group: string;\n /**\n * Optional ack id. If specified, an AckMessage with success or not will be returned with the same ackId\n */\n ackId?: number;\n}\n\n/**\n * Send custom event message\n */\nexport interface SendEventMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"sendEvent\";\n /**\n * Optional ack id. If specified, an AckMessage with success or not will be returned with the same ackId\n */\n ackId?: number;\n /**\n * The data type\n */\n dataType: WebPubSubDataType;\n /**\n * The data\n */\n data: JSONTypes | ArrayBuffer;\n /**\n * The event name\n */\n event: string;\n}\n\n/**\n * Send to group message\n */\nexport interface SendToGroupMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"sendToGroup\";\n /**\n * The group to send\n */\n group: string;\n /**\n * Optional ack id. If specified, an AckMessage with success or not will be returned with the same ackId\n */\n ackId?: number;\n /**\n * The data type\n */\n dataType: WebPubSubDataType;\n /**\n * The data\n */\n data: JSONTypes | ArrayBuffer;\n /**\n * Whether the message needs to echo to sender\n */\n noEcho: boolean;\n}\n\n/**\n * Sequence ack message\n */\nexport interface SequenceAckMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"sequenceAck\";\n /**\n * The sequence id\n */\n sequenceId: number;\n}\n\n/**\n * The data type\n */\nexport type WebPubSubDataType =\n /**\n * Binary type\n */\n | \"binary\"\n /**\n * Json type\n */\n | \"json\"\n /**\n * Text type\n */\n | \"text\"\n /**\n * Protobuf type\n */\n | \"protobuf\";\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/models/messages.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { JSONTypes } from \"../webPubSubClient.js\";\n\n/**\n * The web pubsub message\n */\nexport type WebPubSubMessage =\n | GroupDataMessage\n | ServerDataMessage\n | JoinGroupMessage\n | LeaveGroupMessage\n | ConnectedMessage\n | DisconnectedMessage\n | SendToGroupMessage\n | SendEventMessage\n | SequenceAckMessage\n | PingMessage\n | AckMessage\n | PongMessage;\n\n/**\n * The common of web pubsub message\n */\nexport interface WebPubSubMessageBase {\n kind: DownstreamMessageType | UpstreamMessageType;\n}\n\n/**\n * Types for downstream messages\n */\nexport type DownstreamMessageType =\n /**\n * Type for AckMessage\n */\n | \"ack\"\n /**\n * Type for PongMessage\n */\n | \"pong\"\n /**\n * Type for ConnectedMessage\n */\n | \"connected\"\n /**\n * Type for DisconnectedMessage\n */\n | \"disconnected\"\n /**\n * Type for GroupDataMessage\n */\n | \"groupData\"\n /**\n * Type for ServerDataMessage\n */\n | \"serverData\";\n\n/**\n * Types for upstream messages\n */\nexport type UpstreamMessageType =\n /**\n * Type for JoinGroupMessage\n */\n | \"joinGroup\"\n /**\n * Type for LeaveGroupMessage\n */\n | \"leaveGroup\"\n /**\n * Type for SendToGroupMessage\n */\n | \"sendToGroup\"\n /**\n * Type for SendEventMessage\n */\n | \"sendEvent\"\n /**\n * Type for SequenceAckMessage\n */\n | \"sequenceAck\"\n /**\n * Type for PingMessage\n */\n | \"ping\";\n\n/**\n * The ack message\n */\nexport interface AckMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"ack\";\n /**\n * The correspending id\n */\n ackId: number;\n /**\n * Is operation success or not\n */\n success: boolean;\n /**\n * The error detail. Only available when success is false\n */\n error?: AckMessageError;\n}\n\n/**\n * The pong message\n */\nexport interface PongMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"pong\";\n}\n\n/**\n * Error detail in AckMessage\n */\nexport interface AckMessageError {\n /**\n * Error name\n */\n name: string;\n /**\n * Details error message\n */\n message: string;\n}\n\n/**\n * Connected message\n */\nexport interface ConnectedMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"connected\";\n /**\n * The connection id\n */\n connectionId: string;\n /**\n * The user id of the client connection\n */\n userId: string;\n /**\n * The reconnection token. Only available in reliable protocols.\n */\n reconnectionToken: string;\n}\n\n/**\n * Disconnected message\n */\nexport interface DisconnectedMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"disconnected\";\n /**\n * Reason of disconnection.\n */\n message: string;\n}\n\n/**\n * Group data message\n */\nexport interface GroupDataMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"groupData\";\n /**\n * The data type\n */\n dataType: WebPubSubDataType;\n /**\n * The data\n */\n data: JSONTypes | ArrayBuffer;\n /**\n * The sequence id of the data. Only available in reliable protocols\n */\n sequenceId?: number;\n /**\n * The name of group that the message come from.\n */\n group: string;\n /**\n * The user id of the sender\n */\n fromUserId: string;\n}\n\n/**\n * Server data message\n */\nexport interface ServerDataMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"serverData\";\n /**\n * The data type\n */\n dataType: WebPubSubDataType;\n /**\n * The data\n */\n data: JSONTypes | ArrayBuffer;\n /**\n * The sequence id of the data. Only available in reliable protocols\n */\n sequenceId?: number;\n}\n\n/**\n * Join group message\n */\nexport interface JoinGroupMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"joinGroup\";\n /**\n * The group to join\n */\n group: string;\n /**\n * Optional ack id. If specified, an AckMessage with success or not will be returned with the same ackId\n */\n ackId?: number;\n}\n\n/**\n * Leave group message\n */\nexport interface LeaveGroupMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"leaveGroup\";\n /**\n * The group to leave\n */\n group: string;\n /**\n * Optional ack id. If specified, an AckMessage with success or not will be returned with the same ackId\n */\n ackId?: number;\n}\n\n/**\n * Send custom event message\n */\nexport interface SendEventMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"sendEvent\";\n /**\n * Optional ack id. If specified, an AckMessage with success or not will be returned with the same ackId\n */\n ackId?: number;\n /**\n * The data type\n */\n dataType: WebPubSubDataType;\n /**\n * The data\n */\n data: JSONTypes | ArrayBuffer;\n /**\n * The event name\n */\n event: string;\n}\n\n/**\n * Send to group message\n */\nexport interface SendToGroupMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"sendToGroup\";\n /**\n * The group to send\n */\n group: string;\n /**\n * Optional ack id. If specified, an AckMessage with success or not will be returned with the same ackId\n */\n ackId?: number;\n /**\n * The data type\n */\n dataType: WebPubSubDataType;\n /**\n * The data\n */\n data: JSONTypes | ArrayBuffer;\n /**\n * Whether the message needs to echo to sender\n */\n noEcho: boolean;\n}\n\n/**\n * Sequence ack message\n */\nexport interface SequenceAckMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"sequenceAck\";\n /**\n * The sequence id\n */\n sequenceId: number;\n}\n\n/**\n * Ping message\n */\nexport interface PingMessage extends WebPubSubMessageBase {\n /**\n * Message type\n */\n readonly kind: \"ping\";\n}\n\n/**\n * The data type\n */\nexport type WebPubSubDataType =\n /**\n * Binary type\n */\n | \"binary\"\n /**\n * Json type\n */\n | \"json\"\n /**\n * Text type\n */\n | \"text\"\n /**\n * Protobuf type\n */\n | \"protobuf\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"jsonProtocolBase.d.ts","sourceRoot":"","sources":["../../../src/protocols/jsonProtocolBase.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAOV,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAI/B,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAmDpE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CA0C9D"}
1
+ {"version":3,"file":"jsonProtocolBase.d.ts","sourceRoot":"","sources":["../../../src/protocols/jsonProtocolBase.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAQV,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAI/B,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAqDpE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CA8C9D"}
@@ -55,6 +55,9 @@ function parseMessages(input) {
55
55
  else if (typedMessage.type === "ack") {
56
56
  returnMessage = { ...parsedMessage, kind: "ack" };
57
57
  }
58
+ else if (typedMessage.type === "pong") {
59
+ returnMessage = { ...parsedMessage, kind: "pong" };
60
+ }
58
61
  else {
59
62
  // Forward compatible
60
63
  return null;
@@ -97,6 +100,10 @@ function writeMessage(message) {
97
100
  data = { type: "sequenceAck", sequenceId: message.sequenceId };
98
101
  break;
99
102
  }
103
+ case "ping": {
104
+ data = { type: "ping" };
105
+ break;
106
+ }
100
107
  default: {
101
108
  throw new Error(`Unsupported type: ${message.kind}`);
102
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jsonProtocolBase.js","sourceRoot":"","sources":["../../../src/protocols/jsonProtocolBase.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n AckMessage,\n ConnectedMessage,\n DisconnectedMessage,\n GroupDataMessage,\n ServerDataMessage,\n WebPubSubDataType,\n WebPubSubMessage,\n} from \"../models/messages.js\";\nimport type { JSONTypes } from \"../webPubSubClient.js\";\nimport { Buffer } from \"buffer\";\n\nexport function parseMessages(input: string): WebPubSubMessage | null {\n // The interface does allow \"ArrayBuffer\" to be passed in, but this implementation does not. So let's throw a useful error.\n if (typeof input !== \"string\") {\n throw new Error(\"Invalid input for JSON hub protocol. Expected a string.\");\n }\n\n if (!input) {\n throw new Error(\"No input\");\n }\n\n const parsedMessage = JSON.parse(input);\n const typedMessage = parsedMessage as { type: string; from: string; event: string };\n let returnMessage: WebPubSubMessage;\n\n if (typedMessage.type === \"system\") {\n if (typedMessage.event === \"connected\") {\n returnMessage = { ...parsedMessage, kind: \"connected\" } as ConnectedMessage;\n } else if (typedMessage.event === \"disconnected\") {\n returnMessage = { ...parsedMessage, kind: \"disconnected\" } as DisconnectedMessage;\n } else {\n // Forward compatible\n return null;\n }\n } else if (typedMessage.type === \"message\") {\n if (typedMessage.from === \"group\") {\n const data = parsePayload(parsedMessage.data, parsedMessage.dataType as WebPubSubDataType);\n if (data === null) {\n return null;\n }\n returnMessage = { ...parsedMessage, data: data, kind: \"groupData\" } as GroupDataMessage;\n } else if (typedMessage.from === \"server\") {\n const data = parsePayload(parsedMessage.data, parsedMessage.dataType as WebPubSubDataType);\n if (data === null) {\n return null;\n }\n returnMessage = {\n ...parsedMessage,\n data: data,\n kind: \"serverData\",\n } as ServerDataMessage;\n } else {\n // Forward compatible\n return null;\n }\n } else if (typedMessage.type === \"ack\") {\n returnMessage = { ...parsedMessage, kind: \"ack\" } as AckMessage;\n } else {\n // Forward compatible\n return null;\n }\n return returnMessage;\n}\n\nexport function writeMessage(message: WebPubSubMessage): string {\n let data: any;\n switch (message.kind) {\n case \"joinGroup\": {\n data = { type: \"joinGroup\", group: message.group, ackId: message.ackId } as JoinGroupData;\n break;\n }\n case \"leaveGroup\": {\n data = { type: \"leaveGroup\", group: message.group, ackId: message.ackId } as LeaveGroupData;\n break;\n }\n case \"sendEvent\": {\n data = {\n type: \"event\",\n event: message.event,\n ackId: message.ackId,\n dataType: message.dataType,\n data: getPayload(message.data, message.dataType),\n } as SendEventData;\n break;\n }\n case \"sendToGroup\": {\n data = {\n type: \"sendToGroup\",\n group: message.group,\n ackId: message.ackId,\n dataType: message.dataType,\n data: getPayload(message.data, message.dataType),\n noEcho: message.noEcho,\n } as SendToGroupData;\n break;\n }\n case \"sequenceAck\": {\n data = { type: \"sequenceAck\", sequenceId: message.sequenceId } as SequenceAckData;\n break;\n }\n default: {\n throw new Error(`Unsupported type: ${message.kind}`);\n }\n }\n\n return JSON.stringify(data);\n}\n\ninterface JoinGroupData {\n readonly type: \"joinGroup\";\n group: string;\n ackId?: number;\n}\n\ninterface LeaveGroupData {\n readonly type: \"leaveGroup\";\n group: string;\n ackId?: number;\n}\n\ninterface SendToGroupData {\n readonly type: \"sendToGroup\";\n group: string;\n ackId?: number;\n dataType: WebPubSubDataType;\n data: any;\n noEcho: boolean;\n}\n\ninterface SendEventData {\n readonly type: \"event\";\n ackId?: number;\n dataType: WebPubSubDataType;\n data: any;\n event: string;\n}\n\ninterface SequenceAckData {\n readonly type: \"sequenceAck\";\n sequenceId: number;\n}\n\nfunction getPayload(data: JSONTypes | ArrayBuffer, dataType: WebPubSubDataType): any {\n switch (dataType) {\n case \"text\": {\n if (typeof data !== \"string\") {\n throw new TypeError(\"Message must be a string.\");\n }\n return data;\n }\n case \"json\": {\n return data;\n }\n case \"binary\":\n case \"protobuf\": {\n if (data instanceof ArrayBuffer) {\n return Buffer.from(data).toString(\"base64\");\n }\n throw new TypeError(\"Message must be a ArrayBuffer\");\n }\n }\n}\n\nfunction parsePayload(data: any, dataType: string): JSONTypes | ArrayBuffer | null {\n if (dataType === \"text\") {\n if (typeof data !== \"string\") {\n throw new TypeError(\"Message must be a string when dataType is text\");\n }\n return data as string;\n } else if (dataType === \"json\") {\n return data as JSONTypes;\n } else if (dataType === \"binary\" || dataType === \"protobuf\") {\n const buf = Buffer.from(data as string, \"base64\");\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer;\n } else {\n // Forward compatible\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"jsonProtocolBase.js","sourceRoot":"","sources":["../../../src/protocols/jsonProtocolBase.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n AckMessage,\n PongMessage,\n ConnectedMessage,\n DisconnectedMessage,\n GroupDataMessage,\n ServerDataMessage,\n WebPubSubDataType,\n WebPubSubMessage,\n} from \"../models/messages.js\";\nimport type { JSONTypes } from \"../webPubSubClient.js\";\nimport { Buffer } from \"buffer\";\n\nexport function parseMessages(input: string): WebPubSubMessage | null {\n // The interface does allow \"ArrayBuffer\" to be passed in, but this implementation does not. So let's throw a useful error.\n if (typeof input !== \"string\") {\n throw new Error(\"Invalid input for JSON hub protocol. Expected a string.\");\n }\n\n if (!input) {\n throw new Error(\"No input\");\n }\n\n const parsedMessage = JSON.parse(input);\n const typedMessage = parsedMessage as { type: string; from: string; event: string };\n let returnMessage: WebPubSubMessage;\n\n if (typedMessage.type === \"system\") {\n if (typedMessage.event === \"connected\") {\n returnMessage = { ...parsedMessage, kind: \"connected\" } as ConnectedMessage;\n } else if (typedMessage.event === \"disconnected\") {\n returnMessage = { ...parsedMessage, kind: \"disconnected\" } as DisconnectedMessage;\n } else {\n // Forward compatible\n return null;\n }\n } else if (typedMessage.type === \"message\") {\n if (typedMessage.from === \"group\") {\n const data = parsePayload(parsedMessage.data, parsedMessage.dataType as WebPubSubDataType);\n if (data === null) {\n return null;\n }\n returnMessage = { ...parsedMessage, data: data, kind: \"groupData\" } as GroupDataMessage;\n } else if (typedMessage.from === \"server\") {\n const data = parsePayload(parsedMessage.data, parsedMessage.dataType as WebPubSubDataType);\n if (data === null) {\n return null;\n }\n returnMessage = {\n ...parsedMessage,\n data: data,\n kind: \"serverData\",\n } as ServerDataMessage;\n } else {\n // Forward compatible\n return null;\n }\n } else if (typedMessage.type === \"ack\") {\n returnMessage = { ...parsedMessage, kind: \"ack\" } as AckMessage;\n } else if (typedMessage.type === \"pong\") {\n returnMessage = { ...parsedMessage, kind: \"pong\" } as PongMessage;\n } else {\n // Forward compatible\n return null;\n }\n return returnMessage;\n}\n\nexport function writeMessage(message: WebPubSubMessage): string {\n let data: any;\n switch (message.kind) {\n case \"joinGroup\": {\n data = { type: \"joinGroup\", group: message.group, ackId: message.ackId } as JoinGroupData;\n break;\n }\n case \"leaveGroup\": {\n data = { type: \"leaveGroup\", group: message.group, ackId: message.ackId } as LeaveGroupData;\n break;\n }\n case \"sendEvent\": {\n data = {\n type: \"event\",\n event: message.event,\n ackId: message.ackId,\n dataType: message.dataType,\n data: getPayload(message.data, message.dataType),\n } as SendEventData;\n break;\n }\n case \"sendToGroup\": {\n data = {\n type: \"sendToGroup\",\n group: message.group,\n ackId: message.ackId,\n dataType: message.dataType,\n data: getPayload(message.data, message.dataType),\n noEcho: message.noEcho,\n } as SendToGroupData;\n break;\n }\n case \"sequenceAck\": {\n data = { type: \"sequenceAck\", sequenceId: message.sequenceId } as SequenceAckData;\n break;\n }\n case \"ping\": {\n data = { type: \"ping\" } as PingData;\n break;\n }\n default: {\n throw new Error(`Unsupported type: ${message.kind}`);\n }\n }\n\n return JSON.stringify(data);\n}\n\ninterface JoinGroupData {\n readonly type: \"joinGroup\";\n group: string;\n ackId?: number;\n}\n\ninterface LeaveGroupData {\n readonly type: \"leaveGroup\";\n group: string;\n ackId?: number;\n}\n\ninterface SendToGroupData {\n readonly type: \"sendToGroup\";\n group: string;\n ackId?: number;\n dataType: WebPubSubDataType;\n data: any;\n noEcho: boolean;\n}\n\ninterface SendEventData {\n readonly type: \"event\";\n ackId?: number;\n dataType: WebPubSubDataType;\n data: any;\n event: string;\n}\n\ninterface SequenceAckData {\n readonly type: \"sequenceAck\";\n sequenceId: number;\n}\n\ninterface PingData {\n readonly type: \"ping\";\n}\n\nfunction getPayload(data: JSONTypes | ArrayBuffer, dataType: WebPubSubDataType): any {\n switch (dataType) {\n case \"text\": {\n if (typeof data !== \"string\") {\n throw new TypeError(\"Message must be a string.\");\n }\n return data;\n }\n case \"json\": {\n return data;\n }\n case \"binary\":\n case \"protobuf\": {\n if (data instanceof ArrayBuffer) {\n return Buffer.from(data).toString(\"base64\");\n }\n throw new TypeError(\"Message must be a ArrayBuffer\");\n }\n }\n}\n\nfunction parsePayload(data: any, dataType: string): JSONTypes | ArrayBuffer | null {\n if (dataType === \"text\") {\n if (typeof data !== \"string\") {\n throw new TypeError(\"Message must be a string when dataType is text\");\n }\n return data as string;\n } else if (dataType === \"json\") {\n return data as JSONTypes;\n } else if (dataType === \"binary\" || dataType === \"protobuf\") {\n const buf = Buffer.from(data as string, \"base64\");\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer;\n } else {\n // Forward compatible\n return null;\n }\n}\n"]}