@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
@@ -18,11 +18,13 @@ export declare class WebPubSubClient {
18
18
  private readonly _messageRetryPolicy;
19
19
  private readonly _reconnectRetryPolicy;
20
20
  private readonly _quickSequenceAckDiff;
21
- private readonly _activeTimeoutInMs;
21
+ private readonly _keepAliveTimeoutInMs;
22
+ private readonly _keepAliveIntervalInMs;
22
23
  private readonly _emitter;
23
24
  private _state;
24
25
  private _isStopping;
25
- private _activeKeepaliveTask;
26
+ private _pingKeepaliveTask;
27
+ private _timeoutMonitorTask;
26
28
  private _wsClient?;
27
29
  private _uri?;
28
30
  private _lastCloseEvent?;
@@ -31,6 +33,7 @@ export declare class WebPubSubClient {
31
33
  private _reconnectionToken?;
32
34
  private _isInitialConnected;
33
35
  private _sequenceAckTask?;
36
+ private _lastMessageReceived;
34
37
  /**
35
38
  * Create an instance of WebPubSubClient
36
39
  * @param clientAccessUrl - The uri to connect
@@ -54,6 +57,7 @@ export declare class WebPubSubClient {
54
57
  * Stop the client.
55
58
  */
56
59
  stop(): void;
60
+ private _disposeKeepaliveTasks;
57
61
  /**
58
62
  * Add handler for connected event
59
63
  * @param event - The event name
@@ -169,7 +173,10 @@ export declare class WebPubSubClient {
169
173
  private _handleConnectionCloseAndNoRecovery;
170
174
  private _autoReconnect;
171
175
  private _handleConnectionStopped;
172
- private _getActiveKeepaliveTask;
176
+ private _trySendPing;
177
+ private _checkKeepAliveTimeout;
178
+ private _getPingKeepaliveTask;
179
+ private _getTimeoutMonitorTask;
173
180
  private _sendMessage;
174
181
  private _sendMessageWithAckId;
175
182
  private _handleConnectionClose;
@@ -1 +1 @@
1
- {"version":3,"file":"webPubSubClient.d.ts","sourceRoot":"","sources":["../../src/webPubSubClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webPubSubClient.d.ts","sourceRoot":"","sources":["../../src/webPubSubClient.ts"],"names":[],"mappings":"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"}
@@ -28,11 +28,15 @@ export class WebPubSubClient {
28
28
  _messageRetryPolicy;
29
29
  _reconnectRetryPolicy;
30
30
  _quickSequenceAckDiff = 300;
31
- _activeTimeoutInMs = 20000;
31
+ // The timeout for keep alive
32
+ _keepAliveTimeoutInMs;
33
+ // The interval at which to send keep-alive ping messages to the runtime
34
+ _keepAliveIntervalInMs;
32
35
  _emitter = new EventEmitter();
33
36
  _state;
34
37
  _isStopping = false;
35
- _activeKeepaliveTask;
38
+ _pingKeepaliveTask;
39
+ _timeoutMonitorTask;
36
40
  // connection lifetime
37
41
  _wsClient;
38
42
  _uri;
@@ -42,6 +46,7 @@ export class WebPubSubClient {
42
46
  _reconnectionToken;
43
47
  _isInitialConnected = false;
44
48
  _sequenceAckTask;
49
+ _lastMessageReceived = Date.now();
45
50
  constructor(credential, options) {
46
51
  if (typeof credential === "string") {
47
52
  this._credential = { getClientAccessUrl: credential };
@@ -60,6 +65,8 @@ export class WebPubSubClient {
60
65
  this._groupMap = new Map();
61
66
  this._ackManager = new AckManager();
62
67
  this._sequenceId = new SequenceId();
68
+ this._keepAliveTimeoutInMs = this._options.keepAliveTimeoutInMs ?? 120000;
69
+ this._keepAliveIntervalInMs = this._options.keepAliveIntervalInMs ?? 20000;
63
70
  this._state = WebPubSubClientState.Stopped;
64
71
  }
65
72
  /**
@@ -77,8 +84,11 @@ export class WebPubSubClient {
77
84
  if (options) {
78
85
  abortSignal = options.abortSignal;
79
86
  }
80
- if (!this._activeKeepaliveTask) {
81
- this._activeKeepaliveTask = this._getActiveKeepaliveTask();
87
+ if (!this._pingKeepaliveTask && this._keepAliveIntervalInMs > 0) {
88
+ this._pingKeepaliveTask = this._getPingKeepaliveTask();
89
+ }
90
+ if (!this._timeoutMonitorTask && this._keepAliveTimeoutInMs > 0) {
91
+ this._timeoutMonitorTask = this._getTimeoutMonitorTask();
82
92
  }
83
93
  try {
84
94
  await this._startCore(abortSignal);
@@ -86,10 +96,7 @@ export class WebPubSubClient {
86
96
  catch (err) {
87
97
  // this two sentense should be set together. Consider client.stop() is called during _startCore()
88
98
  this._changeState(WebPubSubClientState.Stopped);
89
- if (this._activeKeepaliveTask) {
90
- this._activeKeepaliveTask.abort();
91
- this._activeKeepaliveTask = undefined;
92
- }
99
+ this._disposeKeepaliveTasks();
93
100
  this._isStopping = false;
94
101
  throw err;
95
102
  }
@@ -146,9 +153,16 @@ export class WebPubSubClient {
146
153
  else {
147
154
  this._isStopping = false;
148
155
  }
149
- if (this._activeKeepaliveTask) {
150
- this._activeKeepaliveTask.abort();
151
- this._activeKeepaliveTask = undefined;
156
+ this._disposeKeepaliveTasks();
157
+ }
158
+ _disposeKeepaliveTasks() {
159
+ if (this._pingKeepaliveTask) {
160
+ this._pingKeepaliveTask.abort();
161
+ this._pingKeepaliveTask = undefined;
162
+ }
163
+ if (this._timeoutMonitorTask) {
164
+ this._timeoutMonitorTask.abort();
165
+ this._timeoutMonitorTask = undefined;
152
166
  }
153
167
  }
154
168
  on(event, listener) {
@@ -314,6 +328,7 @@ export class WebPubSubClient {
314
328
  reject(new Error(`The client is stopped`));
315
329
  }
316
330
  logger.verbose("WebSocket connection has opened");
331
+ this._lastMessageReceived = Date.now(); // reset last message received time to avoid immediate keepalive timeout after a longer reconnection
317
332
  this._changeState(WebPubSubClientState.Connected);
318
333
  if (this._protocol.isReliableSubProtocol) {
319
334
  if (this._sequenceAckTask != null) {
@@ -419,6 +434,7 @@ export class WebPubSubClient {
419
434
  }
420
435
  this._safeEmitServerMessage(message);
421
436
  };
437
+ this._lastMessageReceived = Date.now();
422
438
  let messages;
423
439
  try {
424
440
  let convertedData;
@@ -444,6 +460,10 @@ export class WebPubSubClient {
444
460
  messages.forEach((message) => {
445
461
  try {
446
462
  switch (message.kind) {
463
+ case "pong": {
464
+ // handled in _lastMessageReceived
465
+ break;
466
+ }
447
467
  case "ack": {
448
468
  handleAckMessage(message);
449
469
  break;
@@ -517,12 +537,45 @@ export class WebPubSubClient {
517
537
  _handleConnectionStopped() {
518
538
  this._isStopping = false;
519
539
  this._state = WebPubSubClientState.Stopped;
540
+ this._disposeKeepaliveTasks();
520
541
  this._safeEmitStopped();
521
542
  }
522
- _getActiveKeepaliveTask() {
543
+ async _trySendPing() {
544
+ // skip during reconnection
545
+ if (this._state !== WebPubSubClientState.Connected || !this._wsClient?.isOpen()) {
546
+ return;
547
+ }
548
+ const message = {
549
+ kind: "ping",
550
+ };
551
+ try {
552
+ await this._sendMessage(message);
553
+ }
554
+ catch {
555
+ logger.warning("Failed to send keepalive message to the service");
556
+ }
557
+ }
558
+ async _checkKeepAliveTimeout() {
559
+ if (this._state !== WebPubSubClientState.Connected || !this._wsClient?.isOpen()) {
560
+ return;
561
+ }
562
+ const now = Date.now();
563
+ if (now - this._lastMessageReceived > this._keepAliveTimeoutInMs) {
564
+ logger.warning(`No messages received for ${now - this._lastMessageReceived} ms. Closing. The keep alive timeout is set to ${this._keepAliveTimeoutInMs} ms.`);
565
+ this._wsClient?.close();
566
+ }
567
+ }
568
+ _getPingKeepaliveTask() {
523
569
  return new AbortableTask(async () => {
524
- this._sequenceId.tryUpdate(0); // force update
525
- }, this._activeTimeoutInMs);
570
+ await this._trySendPing();
571
+ }, this._keepAliveIntervalInMs);
572
+ }
573
+ _getTimeoutMonitorTask() {
574
+ const timeout = this._keepAliveTimeoutInMs;
575
+ const checkInterval = Math.floor(timeout / 3);
576
+ return new AbortableTask(async () => {
577
+ await this._checkKeepAliveTimeout();
578
+ }, checkInterval);
526
579
  }
527
580
  async _sendMessage(message, abortSignal) {
528
581
  if (!this._wsClient || !this._wsClient.isOpen()) {
@@ -640,6 +693,18 @@ export class WebPubSubClient {
640
693
  if (clientOptions.protocol == null) {
641
694
  clientOptions.protocol = WebPubSubJsonReliableProtocol();
642
695
  }
696
+ if (clientOptions.keepAliveTimeoutInMs == null) {
697
+ clientOptions.keepAliveTimeoutInMs = 120000; // 120 seconds
698
+ }
699
+ if (clientOptions.keepAliveTimeoutInMs < 0) {
700
+ throw new RangeError("keepAliveTimeoutInMs must be greater than or equal to 0.");
701
+ }
702
+ if (clientOptions.keepAliveIntervalInMs == null) {
703
+ clientOptions.keepAliveIntervalInMs = 20000; // 20 seconds
704
+ }
705
+ if (clientOptions.keepAliveIntervalInMs < 0) {
706
+ throw new RangeError("keepAliveIntervalInMs must be greater than or equal to 0.");
707
+ }
643
708
  this._buildMessageRetryOptions(clientOptions);
644
709
  this._buildReconnectRetryOptions(clientOptions);
645
710
  return clientOptions;
@@ -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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azure/web-pubsub-client",
3
- "version": "1.0.4-alpha.20251126.1",
3
+ "version": "1.0.4-alpha.20251127.1",
4
4
  "description": "Azure Web PubSub Client",
5
5
  "sdk-type": "client",
6
6
  "main": "./dist/commonjs/index.js",
@@ -53,8 +53,8 @@
53
53
  "typescript": "~5.9.3",
54
54
  "vitest": "^4.0.8",
55
55
  "@azure-tools/test-utils-vitest": "^2.0.1",
56
- "@azure/dev-tool": "^1.0.0",
57
- "@azure/eslint-plugin-azure-sdk": "^3.0.0"
56
+ "@azure/eslint-plugin-azure-sdk": "^3.0.0",
57
+ "@azure/dev-tool": "^1.0.0"
58
58
  },
59
59
  "//sampleConfiguration": {
60
60
  "productName": "Azure Web PubSub Client",