@azure/web-pubsub-client 1.0.3-alpha.20250619.1 → 1.0.3-alpha.20250718.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.
- package/dist/browser/errors/index.js +12 -0
- package/dist/browser/errors/index.js.map +1 -1
- package/dist/browser/protocols/jsonProtocolBase.js +9 -5
- package/dist/browser/protocols/jsonProtocolBase.js.map +1 -1
- package/dist/browser/protocols/webPubSubJsonProtocol.js +8 -10
- package/dist/browser/protocols/webPubSubJsonProtocol.js.map +1 -1
- package/dist/browser/protocols/webPubSubJsonReliableProtocol.js +8 -10
- package/dist/browser/protocols/webPubSubJsonReliableProtocol.js.map +1 -1
- package/dist/browser/webPubSubClient.js +57 -27
- package/dist/browser/webPubSubClient.js.map +1 -1
- package/dist/browser/websocket/websocketClient-browser.mjs.map +1 -1
- package/dist/browser/websocket/websocketClient.js +1 -0
- package/dist/commonjs/errors/index.js +12 -0
- package/dist/commonjs/errors/index.js.map +1 -1
- package/dist/commonjs/protocols/jsonProtocolBase.js +9 -5
- package/dist/commonjs/protocols/jsonProtocolBase.js.map +1 -1
- package/dist/commonjs/protocols/webPubSubJsonProtocol.js +8 -10
- package/dist/commonjs/protocols/webPubSubJsonProtocol.js.map +1 -1
- package/dist/commonjs/protocols/webPubSubJsonReliableProtocol.js +8 -10
- package/dist/commonjs/protocols/webPubSubJsonReliableProtocol.js.map +1 -1
- package/dist/commonjs/tsdoc-metadata.json +11 -11
- package/dist/commonjs/webPubSubClient.js +57 -27
- package/dist/commonjs/webPubSubClient.js.map +1 -1
- package/dist/commonjs/websocket/websocketClient.js +1 -0
- package/dist/commonjs/websocket/websocketClient.js.map +1 -1
- package/dist/esm/errors/index.js +12 -0
- package/dist/esm/errors/index.js.map +1 -1
- package/dist/esm/protocols/jsonProtocolBase.js +9 -5
- package/dist/esm/protocols/jsonProtocolBase.js.map +1 -1
- package/dist/esm/protocols/webPubSubJsonProtocol.js +8 -10
- package/dist/esm/protocols/webPubSubJsonProtocol.js.map +1 -1
- package/dist/esm/protocols/webPubSubJsonReliableProtocol.js +8 -10
- package/dist/esm/protocols/webPubSubJsonReliableProtocol.js.map +1 -1
- package/dist/esm/webPubSubClient.js +57 -27
- package/dist/esm/webPubSubClient.js.map +1 -1
- package/dist/esm/websocket/websocketClient.js +1 -0
- package/dist/esm/websocket/websocketClient.js.map +1 -1
- package/dist/react-native/errors/index.js +12 -0
- package/dist/react-native/errors/index.js.map +1 -1
- package/dist/react-native/protocols/jsonProtocolBase.js +9 -5
- package/dist/react-native/protocols/jsonProtocolBase.js.map +1 -1
- package/dist/react-native/protocols/webPubSubJsonProtocol.js +8 -10
- package/dist/react-native/protocols/webPubSubJsonProtocol.js.map +1 -1
- package/dist/react-native/protocols/webPubSubJsonReliableProtocol.js +8 -10
- package/dist/react-native/protocols/webPubSubJsonReliableProtocol.js.map +1 -1
- package/dist/react-native/webPubSubClient.js +57 -27
- package/dist/react-native/webPubSubClient.js.map +1 -1
- package/dist/react-native/websocket/websocketClient.js +1 -0
- package/dist/react-native/websocket/websocketClient.js.map +1 -1
- package/package.json +2 -2
|
@@ -19,16 +19,35 @@ var WebPubSubClientState;
|
|
|
19
19
|
* The WebPubSub client
|
|
20
20
|
*/
|
|
21
21
|
export class WebPubSubClient {
|
|
22
|
+
_protocol;
|
|
23
|
+
_credential;
|
|
24
|
+
_options;
|
|
25
|
+
_groupMap;
|
|
26
|
+
_ackMap;
|
|
27
|
+
_sequenceId;
|
|
28
|
+
_messageRetryPolicy;
|
|
29
|
+
_reconnectRetryPolicy;
|
|
30
|
+
_quickSequenceAckDiff = 300;
|
|
31
|
+
_activeTimeoutInMs = 20000;
|
|
32
|
+
_emitter = new EventEmitter();
|
|
33
|
+
_state;
|
|
34
|
+
_isStopping = false;
|
|
35
|
+
_ackId;
|
|
36
|
+
_activeKeepaliveTask;
|
|
37
|
+
// connection lifetime
|
|
38
|
+
_wsClient;
|
|
39
|
+
_uri;
|
|
40
|
+
_lastCloseEvent;
|
|
41
|
+
_lastDisconnectedMessage;
|
|
42
|
+
_connectionId;
|
|
43
|
+
_reconnectionToken;
|
|
44
|
+
_isInitialConnected = false;
|
|
45
|
+
_sequenceAckTask;
|
|
22
46
|
nextAckId() {
|
|
23
47
|
this._ackId = this._ackId + 1;
|
|
24
48
|
return this._ackId;
|
|
25
49
|
}
|
|
26
50
|
constructor(credential, options) {
|
|
27
|
-
this._quickSequenceAckDiff = 300;
|
|
28
|
-
this._activeTimeoutInMs = 20000;
|
|
29
|
-
this._emitter = new EventEmitter();
|
|
30
|
-
this._isStopping = false;
|
|
31
|
-
this._isInitialConnected = false;
|
|
32
51
|
if (typeof credential === "string") {
|
|
33
52
|
this._credential = { getClientAccessUrl: credential };
|
|
34
53
|
}
|
|
@@ -156,11 +175,10 @@ export class WebPubSubClient {
|
|
|
156
175
|
* @param abortSignal - The abort signal
|
|
157
176
|
*/
|
|
158
177
|
async sendEvent(eventName, content, dataType, options) {
|
|
159
|
-
return this._operationExecuteWithRetry(() => this._sendEventAttempt(eventName, content, dataType, options), options
|
|
178
|
+
return this._operationExecuteWithRetry(() => this._sendEventAttempt(eventName, content, dataType, options), options?.abortSignal);
|
|
160
179
|
}
|
|
161
180
|
async _sendEventAttempt(eventName, content, dataType, options) {
|
|
162
|
-
|
|
163
|
-
const fireAndForget = (_a = options === null || options === void 0 ? void 0 : options.fireAndForget) !== null && _a !== void 0 ? _a : false;
|
|
181
|
+
const fireAndForget = options?.fireAndForget ?? false;
|
|
164
182
|
if (!fireAndForget) {
|
|
165
183
|
return this._sendMessageWithAckId((id) => {
|
|
166
184
|
return {
|
|
@@ -170,7 +188,7 @@ export class WebPubSubClient {
|
|
|
170
188
|
ackId: id,
|
|
171
189
|
event: eventName,
|
|
172
190
|
};
|
|
173
|
-
}, options
|
|
191
|
+
}, options?.ackId, options?.abortSignal);
|
|
174
192
|
}
|
|
175
193
|
const message = {
|
|
176
194
|
kind: "sendEvent",
|
|
@@ -178,7 +196,7 @@ export class WebPubSubClient {
|
|
|
178
196
|
data: content,
|
|
179
197
|
event: eventName,
|
|
180
198
|
};
|
|
181
|
-
await this._sendMessage(message, options
|
|
199
|
+
await this._sendMessage(message, options?.abortSignal);
|
|
182
200
|
return { isDuplicated: false };
|
|
183
201
|
}
|
|
184
202
|
/**
|
|
@@ -187,7 +205,7 @@ export class WebPubSubClient {
|
|
|
187
205
|
* @param options - The join group options
|
|
188
206
|
*/
|
|
189
207
|
async joinGroup(groupName, options) {
|
|
190
|
-
return this._operationExecuteWithRetry(() => this._joinGroupAttempt(groupName, options), options
|
|
208
|
+
return this._operationExecuteWithRetry(() => this._joinGroupAttempt(groupName, options), options?.abortSignal);
|
|
191
209
|
}
|
|
192
210
|
async _joinGroupAttempt(groupName, options) {
|
|
193
211
|
const group = this._getOrAddGroup(groupName);
|
|
@@ -202,7 +220,7 @@ export class WebPubSubClient {
|
|
|
202
220
|
ackId: id,
|
|
203
221
|
kind: "joinGroup",
|
|
204
222
|
};
|
|
205
|
-
}, options
|
|
223
|
+
}, options?.ackId, options?.abortSignal);
|
|
206
224
|
}
|
|
207
225
|
/**
|
|
208
226
|
* Leave the client from group
|
|
@@ -211,7 +229,7 @@ export class WebPubSubClient {
|
|
|
211
229
|
* @param abortSignal - The abort signal
|
|
212
230
|
*/
|
|
213
231
|
async leaveGroup(groupName, options) {
|
|
214
|
-
return this._operationExecuteWithRetry(() => this._leaveGroupAttempt(groupName, options), options
|
|
232
|
+
return this._operationExecuteWithRetry(() => this._leaveGroupAttempt(groupName, options), options?.abortSignal);
|
|
215
233
|
}
|
|
216
234
|
async _leaveGroupAttempt(groupName, options) {
|
|
217
235
|
const group = this._getOrAddGroup(groupName);
|
|
@@ -221,7 +239,7 @@ export class WebPubSubClient {
|
|
|
221
239
|
ackId: id,
|
|
222
240
|
kind: "leaveGroup",
|
|
223
241
|
};
|
|
224
|
-
}, options
|
|
242
|
+
}, options?.ackId, options?.abortSignal);
|
|
225
243
|
group.isJoined = false;
|
|
226
244
|
return result;
|
|
227
245
|
}
|
|
@@ -234,12 +252,11 @@ export class WebPubSubClient {
|
|
|
234
252
|
* @param abortSignal - The abort signal
|
|
235
253
|
*/
|
|
236
254
|
async sendToGroup(groupName, content, dataType, options) {
|
|
237
|
-
return this._operationExecuteWithRetry(() => this._sendToGroupAttempt(groupName, content, dataType, options), options
|
|
255
|
+
return this._operationExecuteWithRetry(() => this._sendToGroupAttempt(groupName, content, dataType, options), options?.abortSignal);
|
|
238
256
|
}
|
|
239
257
|
async _sendToGroupAttempt(groupName, content, dataType, options) {
|
|
240
|
-
|
|
241
|
-
const
|
|
242
|
-
const noEcho = (_b = options === null || options === void 0 ? void 0 : options.noEcho) !== null && _b !== void 0 ? _b : false;
|
|
258
|
+
const fireAndForget = options?.fireAndForget ?? false;
|
|
259
|
+
const noEcho = options?.noEcho ?? false;
|
|
243
260
|
if (!fireAndForget) {
|
|
244
261
|
return this._sendMessageWithAckId((id) => {
|
|
245
262
|
return {
|
|
@@ -250,7 +267,7 @@ export class WebPubSubClient {
|
|
|
250
267
|
ackId: id,
|
|
251
268
|
noEcho: noEcho,
|
|
252
269
|
};
|
|
253
|
-
}, options
|
|
270
|
+
}, options?.ackId, options?.abortSignal);
|
|
254
271
|
}
|
|
255
272
|
const message = {
|
|
256
273
|
kind: "sendToGroup",
|
|
@@ -259,7 +276,7 @@ export class WebPubSubClient {
|
|
|
259
276
|
data: content,
|
|
260
277
|
noEcho: noEcho,
|
|
261
278
|
};
|
|
262
|
-
await this._sendMessage(message, options
|
|
279
|
+
await this._sendMessage(message, options?.abortSignal);
|
|
263
280
|
return { isDuplicated: false };
|
|
264
281
|
}
|
|
265
282
|
_getWebSocketClientFactory() {
|
|
@@ -279,7 +296,7 @@ export class WebPubSubClient {
|
|
|
279
296
|
try {
|
|
280
297
|
await this._sendMessage(message);
|
|
281
298
|
}
|
|
282
|
-
catch
|
|
299
|
+
catch {
|
|
283
300
|
this._sequenceId.tryUpdate(seqId); // If sending failed, mark it as updated so that it can be sent again.
|
|
284
301
|
}
|
|
285
302
|
}
|
|
@@ -297,7 +314,7 @@ export class WebPubSubClient {
|
|
|
297
314
|
try {
|
|
298
315
|
client.close();
|
|
299
316
|
}
|
|
300
|
-
catch
|
|
317
|
+
catch {
|
|
301
318
|
/** empty */
|
|
302
319
|
}
|
|
303
320
|
reject(new Error(`The client is stopped`));
|
|
@@ -599,7 +616,7 @@ export class WebPubSubClient {
|
|
|
599
616
|
recovered = true;
|
|
600
617
|
return;
|
|
601
618
|
}
|
|
602
|
-
catch
|
|
619
|
+
catch {
|
|
603
620
|
await delay(1000);
|
|
604
621
|
}
|
|
605
622
|
}
|
|
@@ -728,7 +745,7 @@ export class WebPubSubClient {
|
|
|
728
745
|
throw err;
|
|
729
746
|
}
|
|
730
747
|
await delay(delayInMs);
|
|
731
|
-
if (signal
|
|
748
|
+
if (signal?.aborted) {
|
|
732
749
|
throw err;
|
|
733
750
|
}
|
|
734
751
|
}
|
|
@@ -736,6 +753,8 @@ export class WebPubSubClient {
|
|
|
736
753
|
}
|
|
737
754
|
}
|
|
738
755
|
class RetryPolicy {
|
|
756
|
+
_retryOptions;
|
|
757
|
+
_maxRetriesToGetMaxDelay;
|
|
739
758
|
constructor(retryOptions) {
|
|
740
759
|
this._retryOptions = retryOptions;
|
|
741
760
|
this._maxRetriesToGetMaxDelay = Math.ceil(Math.log2(this._retryOptions.maxRetryDelayInMs) -
|
|
@@ -765,12 +784,16 @@ class RetryPolicy {
|
|
|
765
784
|
}
|
|
766
785
|
}
|
|
767
786
|
class WebPubSubGroup {
|
|
787
|
+
name;
|
|
788
|
+
isJoined = false;
|
|
768
789
|
constructor(name) {
|
|
769
|
-
this.isJoined = false;
|
|
770
790
|
this.name = name;
|
|
771
791
|
}
|
|
772
792
|
}
|
|
773
793
|
class AckEntity {
|
|
794
|
+
_promise;
|
|
795
|
+
_resolve;
|
|
796
|
+
_reject;
|
|
774
797
|
constructor(ackId) {
|
|
775
798
|
this._promise = new Promise((resolve, reject) => {
|
|
776
799
|
this._resolve = resolve;
|
|
@@ -778,6 +801,7 @@ class AckEntity {
|
|
|
778
801
|
});
|
|
779
802
|
this.ackId = ackId;
|
|
780
803
|
}
|
|
804
|
+
ackId;
|
|
781
805
|
promise() {
|
|
782
806
|
return this._promise;
|
|
783
807
|
}
|
|
@@ -789,6 +813,8 @@ class AckEntity {
|
|
|
789
813
|
}
|
|
790
814
|
}
|
|
791
815
|
class SequenceId {
|
|
816
|
+
_sequenceId;
|
|
817
|
+
_isUpdate;
|
|
792
818
|
constructor() {
|
|
793
819
|
this._sequenceId = 0;
|
|
794
820
|
this._isUpdate = false;
|
|
@@ -815,6 +841,10 @@ class SequenceId {
|
|
|
815
841
|
}
|
|
816
842
|
}
|
|
817
843
|
class AbortableTask {
|
|
844
|
+
_func;
|
|
845
|
+
_abortController;
|
|
846
|
+
_interval;
|
|
847
|
+
_obj;
|
|
818
848
|
constructor(func, interval, obj) {
|
|
819
849
|
this._func = func;
|
|
820
850
|
this._abortController = new AbortController();
|
|
@@ -826,7 +856,7 @@ class AbortableTask {
|
|
|
826
856
|
try {
|
|
827
857
|
this._abortController.abort();
|
|
828
858
|
}
|
|
829
|
-
catch
|
|
859
|
+
catch {
|
|
830
860
|
/** empty */
|
|
831
861
|
}
|
|
832
862
|
}
|
|
@@ -836,7 +866,7 @@ class AbortableTask {
|
|
|
836
866
|
try {
|
|
837
867
|
await this._func(this._obj);
|
|
838
868
|
}
|
|
839
|
-
catch
|
|
869
|
+
catch {
|
|
840
870
|
/** empty */
|
|
841
871
|
}
|
|
842
872
|
finally {
|
|
@@ -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 { abortablePromise } from \"./utils/abortablePromise.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 _ackMap: Map<number, AckEntity>;\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 _ackId: number;\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 private nextAckId(): number {\n this._ackId = this._ackId + 1;\n return this._ackId;\n }\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._ackMap = new Map<number, AckEntity>();\n this._sequenceId = new SequenceId();\n\n this._state = WebPubSubClientState.Stopped;\n this._ackId = 0;\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 if (this._ackMap.has(message.ackId)) {\n const entity = this._ackMap.get(message.ackId)!;\n this._ackMap.delete(message.ackId);\n const isDuplicated: boolean =\n message.error != null && message.error.name === \"Duplicate\";\n if (message.success || isDuplicated) {\n entity.resolve({\n ackId: message.ackId,\n isDuplicated: isDuplicated,\n } as WebPubSubResult);\n } else {\n entity.reject(\n new SendMessageError(\"Failed to send message.\", {\n ackId: message.ackId,\n errorDetail: message.error,\n } as SendMessageErrorOptions),\n );\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 if (ackId == null) {\n ackId = this.nextAckId();\n }\n\n const message = messageProvider(ackId);\n if (!this._ackMap.has(ackId)) {\n this._ackMap.set(ackId, new AckEntity(ackId));\n }\n const entity = this._ackMap.get(ackId)!;\n\n try {\n await this._sendMessage(message, abortSignal);\n } catch (error) {\n this._ackMap.delete(ackId);\n\n let errorMessage: string = \"\";\n if (error instanceof Error) {\n errorMessage = error.message;\n }\n throw new SendMessageError(errorMessage, { ackId: ackId });\n }\n\n if (abortSignal) {\n try {\n return await abortablePromise(entity.promise(), abortSignal);\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new SendMessageError(\"Cancelled by abortSignal\", { ackId: ackId });\n }\n throw err;\n }\n }\n\n return entity.promise();\n }\n\n private async _handleConnectionClose(): Promise<void> {\n // Clean ack cache\n this._ackMap.forEach((value, key) => {\n if (this._ackMap.delete(key)) {\n value.reject(\n new SendMessageError(\"Connection is disconnected before receive ack from the service\", {\n ackId: value.ackId,\n } as SendMessageErrorOptions),\n );\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 AckEntity {\n private readonly _promise: Promise<WebPubSubResult>;\n private _resolve?: (value: WebPubSubResult | PromiseLike<WebPubSubResult>) => void;\n private _reject?: (reason?: any) => void;\n\n constructor(ackId: number) {\n this._promise = new Promise<WebPubSubResult>((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n this.ackId = ackId;\n }\n\n public ackId;\n\n public promise(): Promise<WebPubSubResult> {\n return this._promise;\n }\n\n public resolve(value: WebPubSubResult | PromiseLike<WebPubSubResult>): void {\n this._resolve!(value);\n }\n\n public reject(reason?: any): void {\n this._reject!(reason);\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} 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 { abortablePromise } from \"./utils/abortablePromise.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 _ackMap: Map<number, AckEntity>;\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 _ackId: number;\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 private nextAckId(): number {\n this._ackId = this._ackId + 1;\n return this._ackId;\n }\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._ackMap = new Map<number, AckEntity>();\n this._sequenceId = new SequenceId();\n\n this._state = WebPubSubClientState.Stopped;\n this._ackId = 0;\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 if (this._ackMap.has(message.ackId)) {\n const entity = this._ackMap.get(message.ackId)!;\n this._ackMap.delete(message.ackId);\n const isDuplicated: boolean =\n message.error != null && message.error.name === \"Duplicate\";\n if (message.success || isDuplicated) {\n entity.resolve({\n ackId: message.ackId,\n isDuplicated: isDuplicated,\n } as WebPubSubResult);\n } else {\n entity.reject(\n new SendMessageError(\"Failed to send message.\", {\n ackId: message.ackId,\n errorDetail: message.error,\n } as SendMessageErrorOptions),\n );\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 if (ackId == null) {\n ackId = this.nextAckId();\n }\n\n const message = messageProvider(ackId);\n if (!this._ackMap.has(ackId)) {\n this._ackMap.set(ackId, new AckEntity(ackId));\n }\n const entity = this._ackMap.get(ackId)!;\n\n try {\n await this._sendMessage(message, abortSignal);\n } catch (error) {\n this._ackMap.delete(ackId);\n\n let errorMessage: string = \"\";\n if (error instanceof Error) {\n errorMessage = error.message;\n }\n throw new SendMessageError(errorMessage, { ackId: ackId });\n }\n\n if (abortSignal) {\n try {\n return await abortablePromise(entity.promise(), abortSignal);\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new SendMessageError(\"Cancelled by abortSignal\", { ackId: ackId });\n }\n throw err;\n }\n }\n\n return entity.promise();\n }\n\n private async _handleConnectionClose(): Promise<void> {\n // Clean ack cache\n this._ackMap.forEach((value, key) => {\n if (this._ackMap.delete(key)) {\n value.reject(\n new SendMessageError(\"Connection is disconnected before receive ack from the service\", {\n ackId: value.ackId,\n } as SendMessageErrorOptions),\n );\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 AckEntity {\n private readonly _promise: Promise<WebPubSubResult>;\n private _resolve?: (value: WebPubSubResult | PromiseLike<WebPubSubResult>) => void;\n private _reject?: (reason?: any) => void;\n\n constructor(ackId: number) {\n this._promise = new Promise<WebPubSubResult>((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n this.ackId = ackId;\n }\n\n public ackId;\n\n public promise(): Promise<WebPubSubResult> {\n return this._promise;\n }\n\n public resolve(value: WebPubSubResult | PromiseLike<WebPubSubResult>): void {\n this._resolve!(value);\n }\n\n public reject(reason?: any): void {\n this._reject!(reason);\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocketClient.js","sourceRoot":"","sources":["../../../src/websocket/websocketClient.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,OAAO,SAAS,MAAM,IAAI,CAAC;AAG3B,MAAM,OAAO,eAAe;
|
|
1
|
+
{"version":3,"file":"websocketClient.js","sourceRoot":"","sources":["../../../src/websocket/websocketClient.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,OAAO,SAAS,MAAM,IAAI,CAAC;AAG3B,MAAM,OAAO,eAAe;IAClB,OAAO,CAAY;IAE3B,YAAmB,GAAW,EAAE,YAAoB;QAClD,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,aAAa,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,EAAc;QACnB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,EAA0C;QAChD,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,CAAC,EAAwB;QAC9B,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAED,SAAS,CAAC,EAA4D;QACpE,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,IAAa,EAAE,MAAe;QAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,6EAA6E;IAC7E,IAAI,CAAC,IAAS,EAAE,CAAmB;QACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC9B,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,sBAAsB;IAC1B,MAAM,CAAC,GAAW,EAAE,YAAoB;QAC7C,OAAO,IAAI,eAAe,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { CloseEvent, MessageEvent, ErrorEvent } from \"ws\";\nimport WebSocket from \"ws\";\nimport type { WebSocketClientLike, WebSocketClientFactoryLike } from \"./websocketClientLike.js\";\n\nexport class WebSocketClient implements WebSocketClientLike {\n private _socket: WebSocket;\n\n public constructor(uri: string, protocolName: string) {\n this._socket = new WebSocket(uri, protocolName);\n this._socket.binaryType = \"arraybuffer\";\n }\n\n onopen(fn: () => void): void {\n this._socket.onopen = fn;\n }\n\n onclose(fn: (code: number, reason: string) => void): void {\n this._socket.onclose = (event: CloseEvent) => fn(event.code, event.reason);\n }\n\n onerror(fn: (error: any) => void): void {\n this._socket.onerror = (event: ErrorEvent) => fn(event.error);\n }\n\n onmessage(fn: (data: string | Buffer | ArrayBuffer | Buffer[]) => void): void {\n this._socket.onmessage = (event: MessageEvent) => fn(event.data);\n }\n\n close(code?: number, reason?: string): void {\n this._socket.close(code, reason);\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n send(data: any, _?: AbortSignalLike): Promise<void> {\n return new Promise((resolve, reject) => {\n this._socket.send(data, (err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n\n isOpen(): boolean {\n return this._socket.readyState === WebSocket.OPEN;\n }\n}\n\nexport class WebSocketClientFactory implements WebSocketClientFactoryLike {\n public create(uri: string, protocolName: string): WebSocketClient {\n return new WebSocketClient(uri, protocolName);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@azure/web-pubsub-client",
|
|
3
|
-
"version": "1.0.3-alpha.
|
|
3
|
+
"version": "1.0.3-alpha.20250718.1",
|
|
4
4
|
"description": "Azure Web PubSub Client",
|
|
5
5
|
"sdk-type": "client",
|
|
6
6
|
"main": "./dist/commonjs/index.js",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
},
|
|
78
78
|
"type": "module",
|
|
79
79
|
"tshy": {
|
|
80
|
-
"project": "
|
|
80
|
+
"project": "../../../tsconfig.src.build.json",
|
|
81
81
|
"exports": {
|
|
82
82
|
"./package.json": "./package.json",
|
|
83
83
|
".": "./src/index.ts"
|