@sevtech/client-websocket 0.0.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/sevtech-client-websocket.mjs +142 -114
- package/fesm2022/sevtech-client-websocket.mjs.map +1 -1
- package/lib/base-socket.d.ts +29 -0
- package/lib/events.d.ts +4 -21
- package/lib/helpers.d.ts +2 -2
- package/lib/types.d.ts +19 -11
- package/lib/websocket-options.d.ts +7 -6
- package/lib/websocket.d.ts +5 -20
- package/package.json +1 -1
- package/public-api.d.ts +3 -3
|
@@ -1,56 +1,3 @@
|
|
|
1
|
-
class SocketOpenEvent extends Event {
|
|
2
|
-
constructor() {
|
|
3
|
-
super("open" /* EventName.Open */);
|
|
4
|
-
}
|
|
5
|
-
}
|
|
6
|
-
class SocketCloseEvent extends CloseEvent {
|
|
7
|
-
constructor(code, reason) {
|
|
8
|
-
super("close" /* EventName.Close */, {
|
|
9
|
-
code,
|
|
10
|
-
reason,
|
|
11
|
-
wasClean: true
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
class SocketErrorEvent extends Event {
|
|
16
|
-
constructor(error) {
|
|
17
|
-
super("error" /* EventName.Error */);
|
|
18
|
-
this.error = error;
|
|
19
|
-
this.message = error?.message ?? '[UNKNOWN ERROR]';
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
class SocketMessageEvent extends Event {
|
|
23
|
-
constructor(message, options) {
|
|
24
|
-
super("message" /* EventName.Message */);
|
|
25
|
-
this.message = message;
|
|
26
|
-
this.ports = options.ports;
|
|
27
|
-
this.source = options.source;
|
|
28
|
-
this.origin = options.origin;
|
|
29
|
-
this.lastEventId = options.lastEventId;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
class SocketTimeoutEvent extends Event {
|
|
33
|
-
constructor(reason) {
|
|
34
|
-
super("timeout" /* EventName.Timeout */);
|
|
35
|
-
this.reason = reason;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
class SocketPermanentCloseEvent extends Event {
|
|
39
|
-
constructor() {
|
|
40
|
-
super("permanentClose" /* EventName.PermanentClose */);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
class InternalEventTarget extends EventTarget {
|
|
44
|
-
// @ts-ignore
|
|
45
|
-
addEventListener(type, callback, options) {
|
|
46
|
-
super.addEventListener(type, callback, options);
|
|
47
|
-
}
|
|
48
|
-
// @ts-ignore
|
|
49
|
-
removeEventListener(type, callback, options) {
|
|
50
|
-
super.removeEventListener(type, callback, options);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
1
|
function selectNextProtocols(provider) {
|
|
55
2
|
if (!provider) {
|
|
56
3
|
return Promise.resolve(null);
|
|
@@ -99,6 +46,81 @@ function isAbortController(data) {
|
|
|
99
46
|
return data instanceof AbortController;
|
|
100
47
|
}
|
|
101
48
|
|
|
49
|
+
class BaseSocket extends EventTarget {
|
|
50
|
+
constructor() {
|
|
51
|
+
super(...arguments);
|
|
52
|
+
this._binaryType = 'blob';
|
|
53
|
+
}
|
|
54
|
+
/* Соединение ещё не установлено */
|
|
55
|
+
static get CONNECTING() {
|
|
56
|
+
return WebSocket.CONNECTING;
|
|
57
|
+
}
|
|
58
|
+
/* Соединение открыто и готово к обмену данными */
|
|
59
|
+
static get OPEN() {
|
|
60
|
+
return WebSocket.OPEN;
|
|
61
|
+
}
|
|
62
|
+
/* Соединение в процессе закрытия */
|
|
63
|
+
static get CLOSING() {
|
|
64
|
+
return WebSocket.CLOSING;
|
|
65
|
+
}
|
|
66
|
+
/* Соединение закрыто или не может быть открыто */
|
|
67
|
+
static get CLOSED() {
|
|
68
|
+
return WebSocket.CLOSED;
|
|
69
|
+
}
|
|
70
|
+
/* Соединение ещё не установлено */
|
|
71
|
+
get CONNECTING() {
|
|
72
|
+
return BaseSocket.CONNECTING;
|
|
73
|
+
}
|
|
74
|
+
/* Соединение открыто и готово к обмену данными */
|
|
75
|
+
get OPEN() {
|
|
76
|
+
return BaseSocket.OPEN;
|
|
77
|
+
}
|
|
78
|
+
/* Соединение в процессе закрытия */
|
|
79
|
+
get CLOSING() {
|
|
80
|
+
return BaseSocket.CLOSING;
|
|
81
|
+
}
|
|
82
|
+
/* Соединение закрыто или не может быть открыто */
|
|
83
|
+
get CLOSED() {
|
|
84
|
+
return BaseSocket.CLOSED;
|
|
85
|
+
}
|
|
86
|
+
/* Тип бинарных данных (blob или arraybuffer) */
|
|
87
|
+
set binaryType(type) {
|
|
88
|
+
this._binaryType = type;
|
|
89
|
+
if (isWebSocket(this._websocket)) {
|
|
90
|
+
this._websocket.binaryType = type;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/* Тип бинарных данных (blob или arraybuffer) */
|
|
94
|
+
get binaryType() {
|
|
95
|
+
return isWebSocket(this._websocket) ? this._websocket.binaryType : this._binaryType;
|
|
96
|
+
}
|
|
97
|
+
/* URL соединения */
|
|
98
|
+
get url() {
|
|
99
|
+
return isWebSocket(this._websocket) ? this._websocket.url : '';
|
|
100
|
+
}
|
|
101
|
+
/* Согласованные расширения */
|
|
102
|
+
get extensions() {
|
|
103
|
+
return isWebSocket(this._websocket) ? this._websocket.extensions : '';
|
|
104
|
+
}
|
|
105
|
+
/* Выбранный подпротокол соединения */
|
|
106
|
+
get protocol() {
|
|
107
|
+
return isWebSocket(this._websocket) ? this._websocket.protocol : '';
|
|
108
|
+
}
|
|
109
|
+
/* Объём данных в очереди отправки */
|
|
110
|
+
get bufferedAmount() {
|
|
111
|
+
return calcBytesSize(this._messageQueue) + (isWebSocket(this._websocket)
|
|
112
|
+
? this._websocket.bufferedAmount
|
|
113
|
+
: 0);
|
|
114
|
+
}
|
|
115
|
+
addEventListener(type, listener, options) {
|
|
116
|
+
super.addEventListener(type, listener, options);
|
|
117
|
+
}
|
|
118
|
+
;
|
|
119
|
+
removeEventListener(type, listener, options) {
|
|
120
|
+
super.removeEventListener(type, listener, options);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
102
124
|
const PONG_MESSAGE = 'pong';
|
|
103
125
|
const PING_MESSAGE = 'ping';
|
|
104
126
|
const OPTIONS = {
|
|
@@ -109,6 +131,7 @@ const OPTIONS = {
|
|
|
109
131
|
pingInterval: 1000,
|
|
110
132
|
startClosed: false,
|
|
111
133
|
connectionTimeout: 4000,
|
|
134
|
+
skipPongMessage: false,
|
|
112
135
|
maxReconnectionDelay: 10_000,
|
|
113
136
|
reconnectionDelayGrowFactor: 1.3,
|
|
114
137
|
maxRetries: Number.POSITIVE_INFINITY,
|
|
@@ -137,6 +160,9 @@ class WebSocketOptions {
|
|
|
137
160
|
get pingInterval() {
|
|
138
161
|
return this.getOption('pingInterval');
|
|
139
162
|
}
|
|
163
|
+
get skipPongMessage() {
|
|
164
|
+
return this.getOption('skipPongMessage');
|
|
165
|
+
}
|
|
140
166
|
get connectionTimeout() {
|
|
141
167
|
return this.getOption('connectionTimeout');
|
|
142
168
|
}
|
|
@@ -174,7 +200,7 @@ class WebSocketOptions {
|
|
|
174
200
|
if (isBufferedData(message)) {
|
|
175
201
|
return message;
|
|
176
202
|
}
|
|
177
|
-
return typeof message
|
|
203
|
+
return typeof message === 'string'
|
|
178
204
|
? JSON.stringify(message)
|
|
179
205
|
: message;
|
|
180
206
|
}
|
|
@@ -216,67 +242,65 @@ function isBufferedData(value) {
|
|
|
216
242
|
return value instanceof ArrayBuffer || value instanceof Blob || (ArrayBuffer.isView(value) && value !== null);
|
|
217
243
|
}
|
|
218
244
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
static get OPEN() {
|
|
224
|
-
return WebSocket.OPEN;
|
|
225
|
-
}
|
|
226
|
-
static get CLOSING() {
|
|
227
|
-
return WebSocket.CLOSING;
|
|
228
|
-
}
|
|
229
|
-
static get CLOSED() {
|
|
230
|
-
return WebSocket.CLOSED;
|
|
231
|
-
}
|
|
232
|
-
get CONNECTING() {
|
|
233
|
-
return ClientSocket.CONNECTING;
|
|
234
|
-
}
|
|
235
|
-
get OPEN() {
|
|
236
|
-
return ClientSocket.OPEN;
|
|
237
|
-
}
|
|
238
|
-
get CLOSING() {
|
|
239
|
-
return ClientSocket.CLOSING;
|
|
240
|
-
}
|
|
241
|
-
get CLOSED() {
|
|
242
|
-
return ClientSocket.CLOSED;
|
|
243
|
-
}
|
|
244
|
-
set binaryType(type) {
|
|
245
|
-
this._binaryType = type;
|
|
246
|
-
if (isWebSocket(this._websocket)) {
|
|
247
|
-
this._websocket.binaryType = type;
|
|
248
|
-
}
|
|
245
|
+
/* Событие успешного установления WebSocket-соединения */
|
|
246
|
+
class SocketOpenEvent extends Event {
|
|
247
|
+
constructor() {
|
|
248
|
+
super("open" /* EventName.Open */);
|
|
249
249
|
}
|
|
250
|
-
|
|
251
|
-
|
|
250
|
+
}
|
|
251
|
+
/* Событие закрытия WebSocket-соединения */
|
|
252
|
+
class SocketCloseEvent extends CloseEvent {
|
|
253
|
+
constructor(code, reason) {
|
|
254
|
+
super("close" /* EventName.Close */, {
|
|
255
|
+
code,
|
|
256
|
+
reason,
|
|
257
|
+
wasClean: true
|
|
258
|
+
});
|
|
252
259
|
}
|
|
253
|
-
|
|
254
|
-
|
|
260
|
+
}
|
|
261
|
+
/* Событие ошибки в WebSocket-соединении */
|
|
262
|
+
class SocketErrorEvent extends Event {
|
|
263
|
+
constructor(error) {
|
|
264
|
+
super("error" /* EventName.Error */);
|
|
265
|
+
this.error = error;
|
|
266
|
+
this.message = error?.message ?? '[UNKNOWN ERROR]';
|
|
255
267
|
}
|
|
256
|
-
|
|
257
|
-
|
|
268
|
+
}
|
|
269
|
+
/* Событие получения сообщения в WebSocket-соединении */
|
|
270
|
+
class SocketMessageEvent extends Event {
|
|
271
|
+
constructor(message, options) {
|
|
272
|
+
super("message" /* EventName.Message */);
|
|
273
|
+
this.message = message;
|
|
274
|
+
this.ports = options?.ports;
|
|
275
|
+
this.source = options?.source;
|
|
276
|
+
this.origin = options?.origin;
|
|
277
|
+
this.lastEventId = options?.lastEventId;
|
|
258
278
|
}
|
|
259
|
-
|
|
260
|
-
|
|
279
|
+
}
|
|
280
|
+
/* Событие превышения лимита переподключение WebSocket-соединения */
|
|
281
|
+
class SocketPermanentCloseEvent extends Event {
|
|
282
|
+
constructor() {
|
|
283
|
+
super("permanentClose" /* EventName.PermanentClose */);
|
|
261
284
|
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
class SocketClient extends BaseSocket {
|
|
288
|
+
/* Количество попыток переподключения */
|
|
262
289
|
get retryCount() {
|
|
263
290
|
return Math.max(this._reconnectCount, 0);
|
|
264
291
|
}
|
|
292
|
+
/* Флаг автоматического переподключения */
|
|
265
293
|
get shouldReconnect() {
|
|
266
294
|
return this._shouldReconnect;
|
|
267
295
|
}
|
|
296
|
+
/* Состояние подключения */
|
|
268
297
|
get readyState() {
|
|
269
298
|
if (isWebSocket(this._websocket)) {
|
|
270
299
|
return this._websocket.readyState;
|
|
271
300
|
}
|
|
272
301
|
return this._options.startClosed
|
|
273
|
-
?
|
|
274
|
-
:
|
|
275
|
-
}
|
|
276
|
-
get bufferedAmount() {
|
|
277
|
-
return calcBytesSize(this._messageQueue) + (isWebSocket(this._websocket)
|
|
278
|
-
? this._websocket.bufferedAmount
|
|
279
|
-
: 0);
|
|
302
|
+
? SocketClient.CLOSED
|
|
303
|
+
: SocketClient.CONNECTING;
|
|
280
304
|
}
|
|
281
305
|
get _nextDelay() {
|
|
282
306
|
if (this._reconnectCount <= 0) {
|
|
@@ -290,7 +314,6 @@ class ClientSocket extends InternalEventTarget {
|
|
|
290
314
|
this._connectLock = false;
|
|
291
315
|
this._closeCalled = false;
|
|
292
316
|
this._shouldReconnect = true;
|
|
293
|
-
this._binaryType = 'blob';
|
|
294
317
|
this._messageQueue = [];
|
|
295
318
|
this._url = url;
|
|
296
319
|
this._options = new WebSocketOptions(options);
|
|
@@ -299,6 +322,7 @@ class ClientSocket extends InternalEventTarget {
|
|
|
299
322
|
}
|
|
300
323
|
this._connect();
|
|
301
324
|
}
|
|
325
|
+
/* Метод закрывает соединение и отключает автоматическое переподключение */
|
|
302
326
|
close(code = 1000, reason) {
|
|
303
327
|
this._closeCalled = true;
|
|
304
328
|
this._shouldReconnect = false;
|
|
@@ -311,7 +335,8 @@ class ClientSocket extends InternalEventTarget {
|
|
|
311
335
|
}
|
|
312
336
|
this._websocket.close(code, reason);
|
|
313
337
|
}
|
|
314
|
-
|
|
338
|
+
/* Метод принудительно переподключает WebSocket и сбрасывает счетчик переподключений */
|
|
339
|
+
reconnect(code = 1000, reason) {
|
|
315
340
|
this._shouldReconnect = true;
|
|
316
341
|
this._closeCalled = false;
|
|
317
342
|
this._reconnectCount = 0;
|
|
@@ -321,6 +346,7 @@ class ClientSocket extends InternalEventTarget {
|
|
|
321
346
|
this._disconnect(code, reason);
|
|
322
347
|
this._connect();
|
|
323
348
|
}
|
|
349
|
+
/* Метод отправляет сообщение. При невозможности отправки добавляет его в очередь */
|
|
324
350
|
send(data) {
|
|
325
351
|
this._options.logger('Send message', data);
|
|
326
352
|
try {
|
|
@@ -371,10 +397,6 @@ class ClientSocket extends InternalEventTarget {
|
|
|
371
397
|
if (this._websocket.readyState === this.OPEN || this._websocket.readyState === this.CONNECTING) {
|
|
372
398
|
this._websocket.close(code, reason);
|
|
373
399
|
}
|
|
374
|
-
if (reason === "[CONNECTION TIMEOUT]" /* ErrorReason.ConnectionTimeout */ || reason === "[PONG TIMEOUT]" /* ErrorReason.PongTimeout */) {
|
|
375
|
-
this.dispatchEvent(new SocketTimeoutEvent(reason));
|
|
376
|
-
code = 3008 /* ErrorCode.Timeout */;
|
|
377
|
-
}
|
|
378
400
|
this._closeHandler(new SocketCloseEvent(code, reason));
|
|
379
401
|
}
|
|
380
402
|
catch { }
|
|
@@ -401,7 +423,7 @@ class ClientSocket extends InternalEventTarget {
|
|
|
401
423
|
});
|
|
402
424
|
}
|
|
403
425
|
_openHandler(event) {
|
|
404
|
-
this._options.logger('Open event', event);
|
|
426
|
+
this._options.logger('🚀 Open event', event);
|
|
405
427
|
clearTimeout(this._connectTimeoutId);
|
|
406
428
|
this._uptimeTimeoutId = setTimeout(() => this._clearReconnectionCount(), this._options.minUptime);
|
|
407
429
|
if (!isWebSocket(this._websocket)) {
|
|
@@ -415,7 +437,7 @@ class ClientSocket extends InternalEventTarget {
|
|
|
415
437
|
this.dispatchEvent(new SocketOpenEvent());
|
|
416
438
|
}
|
|
417
439
|
_closeHandler(event) {
|
|
418
|
-
this._options.logger('Close event', event);
|
|
440
|
+
this._options.logger('❌ Close event', event);
|
|
419
441
|
this._clearTimeouts();
|
|
420
442
|
if (this._shouldReconnect) {
|
|
421
443
|
this._connect();
|
|
@@ -423,20 +445,26 @@ class ClientSocket extends InternalEventTarget {
|
|
|
423
445
|
this.dispatchEvent(new SocketCloseEvent(event.code, event.reason));
|
|
424
446
|
}
|
|
425
447
|
_errorHandler(event) {
|
|
426
|
-
this._options.logger('Error event', event);
|
|
427
|
-
|
|
448
|
+
this._options.logger('🚨 Error event', event);
|
|
449
|
+
let disconnectCode;
|
|
450
|
+
if ("[PONG TIMEOUT]" /* ErrorReason.PongTimeout */ === event.message || "[CONNECTION TIMEOUT]" /* ErrorReason.ConnectionTimeout */ === event.message) {
|
|
451
|
+
disconnectCode = 3008 /* ErrorCode.Timeout */;
|
|
452
|
+
}
|
|
453
|
+
this._disconnect(disconnectCode, event.message);
|
|
428
454
|
this.dispatchEvent(new SocketErrorEvent(event.error));
|
|
429
455
|
this._connect();
|
|
430
456
|
}
|
|
431
457
|
_messageHandler(event) {
|
|
432
|
-
this._options.logger('Message event', event);
|
|
433
458
|
try {
|
|
434
459
|
const deserialized = this._options.deserialize(event.data);
|
|
435
460
|
if (this._options.isPongMessage(deserialized)) {
|
|
436
461
|
this._clearPongTimeout();
|
|
437
|
-
this.
|
|
462
|
+
if (this._options.skipPongMessage) {
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
438
465
|
}
|
|
439
|
-
this.
|
|
466
|
+
this._options.logger('✉️ Message event', { message: deserialized });
|
|
467
|
+
this.dispatchEvent(new SocketMessageEvent(deserialized, event));
|
|
440
468
|
}
|
|
441
469
|
catch (error) {
|
|
442
470
|
if (error instanceof Error) {
|
|
@@ -477,7 +505,7 @@ class ClientSocket extends InternalEventTarget {
|
|
|
477
505
|
}, this._options.pingInterval);
|
|
478
506
|
}
|
|
479
507
|
_maxRetriesHandler() {
|
|
480
|
-
this._options.logger('Max retries reached', {
|
|
508
|
+
this._options.logger('🚫 Max retries reached', {
|
|
481
509
|
maxRetries: this._options.maxRetries,
|
|
482
510
|
reconnectCount: this._reconnectCount,
|
|
483
511
|
});
|
|
@@ -534,5 +562,5 @@ class ClientSocket extends InternalEventTarget {
|
|
|
534
562
|
* Generated bundle index. Do not edit.
|
|
535
563
|
*/
|
|
536
564
|
|
|
537
|
-
export {
|
|
565
|
+
export { SocketClient, SocketCloseEvent, SocketErrorEvent, SocketMessageEvent, SocketOpenEvent, SocketPermanentCloseEvent };
|
|
538
566
|
//# sourceMappingURL=sevtech-client-websocket.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sevtech-client-websocket.mjs","sources":["../../../projects/client-websocket/src/lib/events.ts","../../../projects/client-websocket/src/lib/helpers.ts","../../../projects/client-websocket/src/lib/websocket-options.ts","../../../projects/client-websocket/src/lib/websocket.ts","../../../projects/client-websocket/src/public-api.ts","../../../projects/client-websocket/src/sevtech-client-websocket.ts"],"sourcesContent":["const enum EventName {\n Open = 'open',\n Error = 'error',\n Close = 'close',\n Message = 'message',\n Timeout = 'timeout',\n PermanentClose = 'permanentClose',\n}\n\ninterface EventsMap<T = unknown> {\n [EventName.Open]: SocketOpenEvent;\n [EventName.Error]: SocketErrorEvent;\n [EventName.Close]: SocketCloseEvent;\n [EventName.Message]: SocketMessageEvent<T>;\n [EventName.Timeout]: SocketTimeoutEvent;\n [EventName.PermanentClose]: SocketPermanentCloseEvent;\n}\n\nexport class SocketOpenEvent extends Event {\n constructor() {\n super(EventName.Open);\n }\n}\n\nexport class SocketCloseEvent extends CloseEvent {\n constructor(code: number, reason?: string) {\n super(EventName.Close, {\n code,\n reason,\n wasClean: true\n });\n }\n}\n\nexport class SocketErrorEvent extends Event {\n readonly error?: Error;\n readonly message?: string;\n\n constructor(error?: Error) {\n super(EventName.Error);\n this.error = error;\n this.message = error?.message ?? '[UNKNOWN ERROR]';\n }\n}\n\nexport class SocketMessageEvent<T> extends Event implements Omit<MessageEventInit<T>, 'data'> {\n readonly message: T;\n readonly lastEventId?: string\n readonly origin?: string\n readonly ports?: MessagePort[]\n readonly source?: MessageEventSource | null\n\n constructor(message: T, options: Omit<MessageEventInit<T>, 'data'>) {\n super(EventName.Message);\n\n this.message = message;\n this.ports = options.ports;\n this.source = options.source\n this.origin = options.origin;\n this.lastEventId = options.lastEventId;\n }\n}\n\nexport class SocketTimeoutEvent extends Event {\n reason?: string;\n constructor(reason: string) {\n super(EventName.Timeout);\n this.reason = reason;\n }\n}\n\nexport class SocketPermanentCloseEvent extends Event {\n constructor() {\n super(EventName.PermanentClose);\n }\n}\n\nexport class InternalEventTarget<T, E extends EventsMap<T> = EventsMap<T>> extends EventTarget {\n // @ts-ignore\n override addEventListener<K extends keyof E>(\n type: `${K & string}`,\n callback: (event: E[K]) => void,\n options?: AddEventListenerOptions | boolean\n ): void {\n super.addEventListener(type, callback as EventListener, options);\n }\n\n // @ts-ignore\n removeEventListener<K extends keyof E>(\n type: `${K & string}`,\n callback: (event: E[K]) => void,\n options?: boolean | AddEventListenerOptions\n ): void {\n super.removeEventListener(type, callback as EventListener, options);\n }\n}\n","import { ProtocolsProvider, ReceiveMessage, UrlProvider } from './types';\n\nexport function selectNextProtocols(provider: ProtocolsProvider | null): Promise<string | string[] | null> {\n if (!provider) {\n return Promise.resolve(null);\n }\n\n if (typeof provider === 'string' || Array.isArray(provider)) {\n return Promise.resolve(provider);\n }\n\n if (typeof provider === 'function') {\n const protocols = provider();\n\n if (protocols instanceof Promise) {\n return protocols;\n }\n\n return selectNextProtocols(protocols);\n }\n\n throw Error('Invalid protocols');\n}\n\nexport function selectNextUrl(provider: UrlProvider): Promise<string> {\n if (typeof provider === 'string') {\n return Promise.resolve(provider);\n }\n\n if (typeof provider === 'function') {\n const url = provider();\n\n if (url instanceof Promise) {\n return url;\n }\n\n return selectNextUrl(url);\n }\n\n throw Error('Invalid URL');\n}\n\nexport function calcBytesSize(messages: ReceiveMessage[]): number {\n return messages.reduce((acc, message) => {\n switch (true) {\n case typeof message === 'string':\n return acc + message.length;\n case message instanceof Blob:\n return acc + message.size;\n default:\n return acc + message.byteLength;\n }\n }, 0);\n}\n\nexport function isWebSocket(data: unknown): data is WebSocket {\n return data instanceof WebSocket;\n}\n\nexport function isAbortController(data: unknown): data is AbortController {\n return data instanceof AbortController\n}\n","import { BufferedMessage, Options, ProtocolsProvider, ReceiveMessage } from './types';\n\nconst PONG_MESSAGE = 'pong';\nconst PING_MESSAGE = 'ping';\n\nconst OPTIONS = {\n debug: false,\n pingPong: false,\n minUptime: 5000,\n pongTimeout: 5000,\n pingInterval: 1000,\n startClosed: false,\n connectionTimeout: 4000,\n maxReconnectionDelay: 10_000,\n reconnectionDelayGrowFactor: 1.3,\n maxRetries: Number.POSITIVE_INFINITY,\n maxEnqueuedMessages: Number.POSITIVE_INFINITY,\n minReconnectionDelay: 1000 + Math.random() * 4000,\n} as const satisfies Options;\n\ntype RequiredOptions = Required<Pick<Options, keyof typeof OPTIONS>>;\n\nexport class WebSocketOptions<Send = unknown, Receive = unknown> implements Options<Send, Receive> {\n private readonly _options?: Options<Send, Receive>;\n\n get debug(): boolean {\n return this.getOption('debug');\n }\n\n get pingPong(): boolean {\n return this.getOption('pingPong');\n }\n\n get minUptime(): number {\n return this.getOption('minUptime');\n }\n\n get maxRetries(): number {\n return this.getOption('maxRetries');\n }\n\n get pongTimeout(): number {\n return this.getOption('pongTimeout');\n }\n\n get startClosed(): boolean {\n return this.getOption('startClosed');\n }\n\n get pingInterval(): number {\n return this.getOption('pingInterval');\n }\n\n get connectionTimeout(): number {\n return this.getOption('connectionTimeout');\n }\n\n get maxEnqueuedMessages(): number {\n return this.getOption('maxEnqueuedMessages');\n }\n\n get minReconnectionDelay(): number {\n return this.getOption('minReconnectionDelay');\n }\n\n get maxReconnectionDelay(): number {\n return this.getOption('maxReconnectionDelay');\n }\n\n get reconnectionDelayGrowFactor(): number {\n return this.getOption('minReconnectionDelay');\n }\n\n get pingMessage(): ReceiveMessage {\n if (this._options?.pingMessage instanceof Function) {\n return this._options.pingMessage()\n }\n\n return this._options?.pingMessage ?? PING_MESSAGE;\n }\n\n get protocols(): ProtocolsProvider | null {\n return this._options?.protocols ?? null;\n };\n\n constructor(options?: Options<Send, Receive>) {\n if (options) {\n this._options = options;\n }\n }\n\n serialize(message: Send): ReceiveMessage {\n if (this._options?.serialize instanceof Function) {\n return this._options.serialize(message);\n }\n\n if (isBufferedData(message)) {\n return message;\n }\n\n return typeof message !== 'string'\n ? JSON.stringify(message)\n : message;\n }\n\n deserialize(message?: ReceiveMessage): Receive | BufferedMessage {\n if (this._options?.deserialize instanceof Function) {\n return this._options.deserialize(message);\n }\n\n return message as Receive | BufferedMessage;\n }\n\n isPongMessage(message: unknown): boolean {\n if (!this.pingPong) {\n return false;\n }\n\n if (this._options?.isPongMessage instanceof Function) {\n return this._options.isPongMessage(message);\n }\n\n return message === PONG_MESSAGE;\n }\n\n logger(message: string, ...args: unknown[]): void {\n if (!this.debug) {\n return;\n }\n\n if (this._options?.logger instanceof Function) {\n this._options.logger(message, ...args);\n }\n\n const label = ['%c[WS]:', 'color: #0094FF', message];\n\n if (args.length === 0) {\n return console.info(...label);\n }\n\n console.groupCollapsed(...label);\n console.info(...args)\n console.groupEnd();\n }\n\n private getOption<K extends keyof RequiredOptions>(key: K): RequiredOptions[K] {\n return (this._options?.[key] ?? OPTIONS[key]) as RequiredOptions[K];\n }\n}\n\nfunction isBufferedData(value: unknown): value is ArrayBuffer | Blob | ArrayBufferView {\n return value instanceof ArrayBuffer || value instanceof Blob || (ArrayBuffer.isView(value) && value !== null);\n}\n","import {\n InternalEventTarget, SocketCloseEvent, SocketErrorEvent, SocketMessageEvent, SocketOpenEvent,\n SocketPermanentCloseEvent, SocketTimeoutEvent,\n} from './events';\nimport { calcBytesSize, isAbortController, isWebSocket, selectNextProtocols, selectNextUrl } from './helpers';\nimport { ErrorCode, ErrorReason, Options, ReceiveMessage, UrlProvider } from './types';\nimport { WebSocketOptions } from './websocket-options';\n\nexport class ClientSocket<Send = unknown, Receive = unknown> extends InternalEventTarget<Receive> {\n static get CONNECTING(): typeof WebSocket.CONNECTING {\n return WebSocket.CONNECTING;\n }\n\n static get OPEN(): typeof WebSocket.OPEN {\n return WebSocket.OPEN;\n }\n\n static get CLOSING(): typeof WebSocket.CLOSING {\n return WebSocket.CLOSING;\n }\n\n static get CLOSED(): typeof WebSocket.CLOSED {\n return WebSocket.CLOSED;\n }\n\n private readonly _url: UrlProvider;\n private readonly _options: WebSocketOptions<Send, Receive>;\n\n private _websocket?: WebSocket;\n private _abortController?: AbortController;\n private _uptimeTimeoutId: ReturnType<typeof setTimeout> | undefined;\n private _connectTimeoutId: ReturnType<typeof setTimeout> | undefined;\n private _pongTimeoutId: ReturnType<typeof setTimeout> | undefined;\n private _pingIntervalId: ReturnType<typeof setInterval> | undefined;\n\n private _reconnectCount = 0;\n private _connectLock = false;\n private _closeCalled = false;\n private _shouldReconnect = true;\n private _binaryType: BinaryType = 'blob';\n private _messageQueue: ReceiveMessage[] = [];\n\n get CONNECTING(): typeof ClientSocket.CONNECTING {\n return ClientSocket.CONNECTING;\n }\n\n get OPEN(): typeof ClientSocket.OPEN {\n return ClientSocket.OPEN;\n }\n\n get CLOSING(): typeof ClientSocket.CLOSING {\n return ClientSocket.CLOSING;\n }\n\n get CLOSED(): typeof ClientSocket.CLOSED {\n return ClientSocket.CLOSED;\n }\n\n set binaryType(type: BinaryType) {\n this._binaryType = type;\n\n if (isWebSocket(this._websocket)) {\n this._websocket.binaryType = type;\n }\n }\n\n get binaryType() {\n return isWebSocket(this._websocket) ? this._websocket.binaryType : this._binaryType;\n }\n\n get url(): string {\n return isWebSocket(this._websocket) ? this._websocket.url : '';\n }\n\n get extensions(): string {\n return isWebSocket(this._websocket) ? this._websocket.extensions : '';\n }\n\n get protocol(): string {\n return isWebSocket(this._websocket) ? this._websocket.protocol : '';\n }\n\n get retryCount(): number {\n return Math.max(this._reconnectCount, 0);\n }\n\n get shouldReconnect(): boolean {\n return this._shouldReconnect;\n }\n\n get readyState(): number {\n if (isWebSocket(this._websocket)) {\n return this._websocket.readyState;\n }\n\n return this._options.startClosed\n ? ClientSocket.CLOSED\n : ClientSocket.CONNECTING;\n }\n\n get bufferedAmount(): number {\n return calcBytesSize(this._messageQueue) + (\n isWebSocket(this._websocket)\n ? this._websocket.bufferedAmount\n : 0\n );\n }\n\n private get _nextDelay(): number {\n if (this._reconnectCount <= 0) {\n return 0;\n }\n\n return Math.min(\n Math.pow(\n this._options.minReconnectionDelay * this._options.reconnectionDelayGrowFactor,\n this._reconnectCount - 1\n ),\n this._options.maxReconnectionDelay);\n }\n\n constructor(url: UrlProvider, options?: Options<Send, Receive>) {\n super();\n this._url = url;\n this._options = new WebSocketOptions<Send, Receive>(options);\n\n if (this._options.startClosed) {\n this._shouldReconnect = false;\n }\n\n this._connect();\n }\n\n close(code = 1000, reason?: string): void {\n this._closeCalled = true;\n this._shouldReconnect = false;\n this._clearTimeouts();\n\n if (!isWebSocket(this._websocket)) {\n return this._options.logger('Cannot close WebSocket. No instance');\n }\n\n if (this._websocket.readyState === this.CLOSED) {\n return this._options.logger('Close. WebSocket already closed');\n }\n\n this._websocket.close(code, reason);\n }\n\n reconnect(code?: number, reason?: string): void {\n this._shouldReconnect = true;\n this._closeCalled = false;\n this._reconnectCount = 0;\n\n if (!isWebSocket(this._websocket) || this._websocket.readyState === this.CLOSED) {\n return this._connect();\n }\n\n this._disconnect(code, reason);\n this._connect();\n }\n\n send(data: Send): void {\n this._options.logger('Send message', data);\n\n try {\n const serialized = this._options.serialize(data);\n\n if (isWebSocket(this._websocket) && this._websocket.readyState === this.OPEN) {\n return this._websocket.send(serialized);\n }\n\n if (this._messageQueue.length < this._options.maxEnqueuedMessages) {\n this._options.logger('Enqueue message', data);\n this._messageQueue.push(serialized);\n }\n } catch (error) {\n if (error instanceof Error) {\n this.dispatchEvent(new SocketErrorEvent(error));\n }\n }\n }\n\n private _connect(): void {\n if (this._connectLock || !this._shouldReconnect) {\n return;\n }\n\n this._connectLock = true;\n\n if (this._reconnectCount >= this._options.maxRetries) {\n return this._maxRetriesHandler();\n }\n\n this._reconnectCount += 1;\n this._options.logger('Connection', { reconnectCount: this._reconnectCount });\n this._removeListeners();\n\n this._waitConnection()\n .then(() => Promise.all([\n selectNextUrl(this._url),\n selectNextProtocols(this._options.protocols)\n ]))\n .then(([url, protocols]) =>\n this._connectionHandler(url, protocols)\n )\n .catch((error: Error) => {\n this._connectLock = false;\n this._errorHandler(new SocketErrorEvent(Error(error.message)));\n });\n }\n\n private _disconnect(code = 1000, reason?: string): void {\n this._clearTimeouts();\n\n if (!isWebSocket(this._websocket)) {\n return;\n }\n\n this._removeListeners();\n\n try {\n if (this._websocket.readyState === this.OPEN || this._websocket.readyState === this.CONNECTING) {\n this._websocket.close(code, reason);\n }\n\n if (reason === ErrorReason.ConnectionTimeout || reason === ErrorReason.PongTimeout) {\n this.dispatchEvent(new SocketTimeoutEvent(reason));\n code = ErrorCode.Timeout;\n }\n\n this._closeHandler(new SocketCloseEvent(code, reason));\n } catch {}\n }\n\n private _connectionHandler(url: string, protocols: string | string[] | null): void {\n if (this._closeCalled) {\n this._connectLock = false;\n return;\n }\n\n this._options.logger('Connect', { url, protocols });\n this._websocket = new WebSocket(url, protocols ?? undefined);\n\n this._websocket.binaryType = this._binaryType;\n this._connectLock = false;\n this._setupListeners();\n\n this._connectTimeoutId = setTimeout(\n () => this._handleConnectionTimeout(),\n this._options.connectionTimeout\n );\n }\n\n private _handleConnectionTimeout(): void {\n this._options.logger('Connection timeout');\n this._errorHandler(new SocketErrorEvent(\n Error(ErrorReason.ConnectionTimeout)\n ));\n }\n\n private _waitConnection(): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, this._nextDelay);\n });\n }\n\n private _openHandler(event: Event): void {\n this._options.logger('Open event', event);\n clearTimeout(this._connectTimeoutId);\n\n this._uptimeTimeoutId = setTimeout(\n () => this._clearReconnectionCount(),\n this._options.minUptime\n );\n\n if (!isWebSocket(this._websocket)) {\n throw new Error('WebSocket not supported');\n }\n\n this._websocket.binaryType = this._binaryType;\n\n this._sendQueue();\n\n if (this._options.pingPong) {\n this._startPing();\n }\n\n this.dispatchEvent(new SocketOpenEvent());\n }\n\n private _closeHandler(event: SocketCloseEvent): void {\n this._options.logger('Close event', event);\n this._clearTimeouts();\n\n if (this._shouldReconnect) {\n this._connect();\n }\n\n this.dispatchEvent(new SocketCloseEvent(event.code, event.reason));\n }\n\n private _errorHandler(event: SocketErrorEvent): void {\n this._options.logger('Error event', event);\n\n this._disconnect(undefined, event.message);\n\n this.dispatchEvent(new SocketErrorEvent(event.error));\n this._connect();\n }\n\n private _messageHandler(event: MessageEventInit<ReceiveMessage>): void {\n this._options.logger('Message event', event);\n try {\n const deserialized = this._options.deserialize(event.data);\n\n if (this._options.isPongMessage(deserialized)) {\n this._clearPongTimeout();\n this._clearReconnectionCount();\n }\n\n this.dispatchEvent(new SocketMessageEvent(event.data, event));\n } catch (error) {\n if (error instanceof Error) {\n this.dispatchEvent(new SocketErrorEvent(error));\n }\n }\n }\n\n private _sendQueue(): void {\n if (!isWebSocket(this._websocket) || this._messageQueue.length === 0) {\n return;\n }\n\n this._options.logger('Send queue messages', {\n messages: this._messageQueue,\n });\n\n for (const message of this._messageQueue) {\n this._websocket.send(message)\n }\n\n this._messageQueue = [];\n }\n\n private _startPing(): void {\n const message = this._options.pingMessage;\n\n if (isWebSocket(this._websocket) && this._websocket?.readyState === this.OPEN) {\n this._websocket.send(message);\n }\n this._options.logger('Start ping', { message });\n this._pingIntervalId = setInterval(() => {\n if (!isWebSocket(this._websocket)) {\n return;\n }\n\n this._websocket.send(message);\n\n if (this._pongTimeoutId) {\n return;\n }\n\n this._pongTimeoutId = setTimeout(\n () => {\n this._options.logger('Pong timeout');\n this._errorHandler(new SocketErrorEvent(\n Error(ErrorReason.PongTimeout)\n ));\n },\n this._options.pongTimeout,\n );\n }, this._options.pingInterval);\n }\n\n private _maxRetriesHandler(): void {\n this._options.logger('Max retries reached' , {\n maxRetries: this._options.maxRetries,\n reconnectCount: this._reconnectCount,\n });\n\n this.dispatchEvent(new SocketPermanentCloseEvent());\n }\n\n private _clearReconnectionCount(): void {\n this._options.logger('Clear reconnection count');\n if (!this._pongTimeoutId) {\n this._reconnectCount = 0;\n }\n }\n\n private _removeListeners(): void {\n if (!isAbortController(this._abortController)) {\n return;\n }\n\n this._options.logger('Remove native listeners');\n this._abortController.abort();\n }\n\n private _setupListeners(): void {\n if (!isWebSocket(this._websocket)) { return; }\n\n this._options.logger('Setup native listeners');\n\n this._abortController = new AbortController();\n\n const options: AddEventListenerOptions = {\n signal: this._abortController.signal,\n };\n\n this._websocket.addEventListener('open', this._openHandler.bind(this), options);\n this._websocket.addEventListener('close', this._closeHandler.bind(this), options);\n this._websocket.addEventListener('error', this._errorHandler.bind(this), options);\n this._websocket.addEventListener('message', this._messageHandler.bind(this), options);\n }\n\n private _clearTimeouts(): void {\n clearTimeout(this._connectTimeoutId);\n clearTimeout(this._uptimeTimeoutId);\n this._clearPongTimeout();\n this._clearPingInterval();\n }\n\n private _clearPongTimeout(): void {\n clearTimeout(this._pongTimeoutId);\n this._pongTimeoutId = undefined;\n }\n\n private _clearPingInterval(): void {\n clearInterval(this._pingIntervalId);\n this._pingIntervalId = undefined;\n }\n}\n","/*\n * Public API Surface of client-websocket\n */\n\nexport {\n ClientSocket,\n} from './lib/websocket';\n\nexport {\n SocketErrorEvent,\n SocketMessageEvent,\n SocketOpenEvent,\n SocketPermanentCloseEvent,\n SocketTimeoutEvent,\n SocketCloseEvent,\n} from './lib/events';\n\nexport type {\n Options as SocketOptions,\n UrlProvider as SocketUrlProvider,\n ProtocolsProvider as SocketProtocolsProvider,\n} from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sevtech-client-websocket.mjs","sources":["../../../projects/client-websocket/src/lib/helpers.ts","../../../projects/client-websocket/src/lib/base-socket.ts","../../../projects/client-websocket/src/lib/websocket-options.ts","../../../projects/client-websocket/src/lib/events.ts","../../../projects/client-websocket/src/lib/websocket.ts","../../../projects/client-websocket/src/public-api.ts","../../../projects/client-websocket/src/sevtech-client-websocket.ts"],"sourcesContent":["import { ProtocolsProvider, Message, UrlProvider } from './types';\n\nexport function selectNextProtocols(provider: ProtocolsProvider | null): Promise<string | string[] | null> {\n if (!provider) {\n return Promise.resolve(null);\n }\n\n if (typeof provider === 'string' || Array.isArray(provider)) {\n return Promise.resolve(provider);\n }\n\n if (typeof provider === 'function') {\n const protocols = provider();\n\n if (protocols instanceof Promise) {\n return protocols;\n }\n\n return selectNextProtocols(protocols);\n }\n\n throw Error('Invalid protocols');\n}\n\nexport function selectNextUrl(provider: UrlProvider): Promise<string> {\n if (typeof provider === 'string') {\n return Promise.resolve(provider);\n }\n\n if (typeof provider === 'function') {\n const url = provider();\n\n if (url instanceof Promise) {\n return url;\n }\n\n return selectNextUrl(url);\n }\n\n throw Error('Invalid URL');\n}\n\nexport function calcBytesSize(messages: Message[]): number {\n return messages.reduce((acc, message) => {\n switch (true) {\n case typeof message === 'string':\n return acc + message.length;\n case message instanceof Blob:\n return acc + message.size;\n default:\n return acc + message.byteLength;\n }\n }, 0);\n}\n\nexport function isWebSocket(data: unknown): data is WebSocket {\n return data instanceof WebSocket;\n}\n\nexport function isAbortController(data: unknown): data is AbortController {\n return data instanceof AbortController\n}\n","import { Message } from './types';\nimport { EventsMap } from './events';\nimport { calcBytesSize, isWebSocket } from './helpers';\n\nexport abstract class BaseSocket<Send = Message, Receive = Message> extends EventTarget {\n /* Соединение ещё не установлено */\n static get CONNECTING(): typeof WebSocket.CONNECTING {\n return WebSocket.CONNECTING;\n }\n\n /* Соединение открыто и готово к обмену данными */\n static get OPEN(): typeof WebSocket.OPEN {\n return WebSocket.OPEN;\n }\n\n /* Соединение в процессе закрытия */\n static get CLOSING(): typeof WebSocket.CLOSING {\n return WebSocket.CLOSING;\n }\n\n /* Соединение закрыто или не может быть открыто */\n static get CLOSED(): typeof WebSocket.CLOSED {\n return WebSocket.CLOSED;\n }\n\n protected abstract _websocket?: WebSocket;\n protected abstract _messageQueue: Message[];\n\n protected _binaryType: BinaryType = 'blob';\n\n abstract readyState: number;\n\n /* Соединение ещё не установлено */\n get CONNECTING(): typeof BaseSocket.CONNECTING {\n return BaseSocket.CONNECTING;\n }\n\n /* Соединение открыто и готово к обмену данными */\n get OPEN(): typeof BaseSocket.OPEN {\n return BaseSocket.OPEN;\n }\n\n /* Соединение в процессе закрытия */\n get CLOSING(): typeof BaseSocket.CLOSING {\n return BaseSocket.CLOSING;\n }\n\n /* Соединение закрыто или не может быть открыто */\n get CLOSED(): typeof BaseSocket.CLOSED {\n return BaseSocket.CLOSED;\n }\n\n /* Тип бинарных данных (blob или arraybuffer) */\n set binaryType(type: BinaryType) {\n this._binaryType = type;\n\n if (isWebSocket(this._websocket)) {\n this._websocket.binaryType = type;\n }\n }\n\n /* Тип бинарных данных (blob или arraybuffer) */\n get binaryType(): BinaryType {\n return isWebSocket(this._websocket) ? this._websocket.binaryType : this._binaryType;\n }\n\n /* URL соединения */\n get url(): string {\n return isWebSocket(this._websocket) ? this._websocket.url : '';\n }\n\n /* Согласованные расширения */\n get extensions(): string {\n return isWebSocket(this._websocket) ? this._websocket.extensions : '';\n }\n\n /* Выбранный подпротокол соединения */\n get protocol(): string {\n return isWebSocket(this._websocket) ? this._websocket.protocol : '';\n }\n\n /* Объём данных в очереди отправки */\n get bufferedAmount(): number {\n return calcBytesSize(this._messageQueue) + (\n isWebSocket(this._websocket)\n ? this._websocket.bufferedAmount\n : 0\n );\n }\n\n abstract send(data: Send): void;\n abstract close(code?: number, reason?: string): void;\n abstract reconnect(code?: number, reason?: string): void;\n\n override addEventListener<K extends keyof EventsMap>(\n type: `${K & string}`,\n listener: (event: EventsMap<Receive>[K]) => void,\n options?: boolean | AddEventListenerOptions\n ): void;\n override addEventListener(\n type: string,\n listener: (event: unknown) => void,\n options?: boolean | AddEventListenerOptions): void\n override addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions): void {\n super.addEventListener(type, listener, options);\n };\n\n override removeEventListener<K extends keyof EventsMap>(\n type: `${K & string}`,\n listener: (event: EventsMap<Receive>[K]) => void,\n options?: boolean | EventListenerOptions\n ): void;\n override removeEventListener(\n type: string,\n listener: (event: unknown) => void,\n options?: boolean | AddEventListenerOptions\n ): void\n override removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions\n ): void {\n super.removeEventListener(type, listener, options);\n }\n}\n","import { Options, ProtocolsProvider, Message } from './types';\n\nconst PONG_MESSAGE = 'pong';\nconst PING_MESSAGE = 'ping';\n\nconst OPTIONS = {\n debug: false,\n pingPong: false,\n minUptime: 5000,\n pongTimeout: 5000,\n pingInterval: 1000,\n startClosed: false,\n connectionTimeout: 4000,\n skipPongMessage: false,\n maxReconnectionDelay: 10_000,\n reconnectionDelayGrowFactor: 1.3,\n maxRetries: Number.POSITIVE_INFINITY,\n maxEnqueuedMessages: Number.POSITIVE_INFINITY,\n minReconnectionDelay: 1000 + Math.random() * 4000,\n} as const satisfies Options;\n\ntype RequiredOptions = Required<Pick<Options, keyof typeof OPTIONS>>;\n\nexport class WebSocketOptions<Send = Message, Receive = Message> implements Options<Send, Receive> {\n private readonly _options?: Options<Send, Receive>;\n\n get debug(): boolean {\n return this.getOption('debug');\n }\n\n get pingPong(): boolean {\n return this.getOption('pingPong');\n }\n\n get minUptime(): number {\n return this.getOption('minUptime');\n }\n\n get maxRetries(): number {\n return this.getOption('maxRetries');\n }\n\n get pongTimeout(): number {\n return this.getOption('pongTimeout');\n }\n\n get startClosed(): boolean {\n return this.getOption('startClosed');\n }\n\n get pingInterval(): number {\n return this.getOption('pingInterval');\n }\n\n get skipPongMessage(): boolean {\n return this.getOption('skipPongMessage');\n }\n\n get connectionTimeout(): number {\n return this.getOption('connectionTimeout');\n }\n\n get maxEnqueuedMessages(): number {\n return this.getOption('maxEnqueuedMessages');\n }\n\n get minReconnectionDelay(): number {\n return this.getOption('minReconnectionDelay');\n }\n\n get maxReconnectionDelay(): number {\n return this.getOption('maxReconnectionDelay');\n }\n\n get reconnectionDelayGrowFactor(): number {\n return this.getOption('minReconnectionDelay');\n }\n\n get pingMessage(): Message {\n if (this._options?.pingMessage instanceof Function) {\n return this._options.pingMessage()\n }\n\n return this._options?.pingMessage ?? PING_MESSAGE;\n }\n\n get protocols(): ProtocolsProvider | null {\n return this._options?.protocols ?? null;\n };\n\n constructor(options?: Options<Send, Receive>) {\n if (options) {\n this._options = options;\n }\n }\n\n serialize(message: Send): Message {\n if (this._options?.serialize instanceof Function) {\n return this._options.serialize(message);\n }\n\n if (isBufferedData(message)) {\n return message;\n }\n\n return typeof message === 'string'\n ? JSON.stringify(message)\n : message as string;\n }\n\n deserialize(message: Message): Receive | null {\n if (this._options?.deserialize instanceof Function) {\n return this._options.deserialize(message);\n }\n\n return message as Receive;\n }\n\n isPongMessage(message: Receive | null): boolean {\n if (!this.pingPong) {\n return false;\n }\n\n if (this._options?.isPongMessage instanceof Function) {\n return this._options.isPongMessage(message);\n }\n\n return message === PONG_MESSAGE;\n }\n\n logger(message: string, ...args: unknown[]): void {\n if (!this.debug) {\n return;\n }\n\n if (this._options?.logger instanceof Function) {\n this._options.logger(message, ...args);\n }\n\n const label = ['%c[WS]:', 'color: #0094FF', message];\n\n if (args.length === 0) {\n return console.info(...label);\n }\n\n console.groupCollapsed(...label);\n console.info(...args)\n console.groupEnd();\n }\n\n private getOption<K extends keyof RequiredOptions>(key: K): RequiredOptions[K] {\n return (this._options?.[key] ?? OPTIONS[key]) as RequiredOptions[K];\n }\n}\n\nfunction isBufferedData(value: unknown): value is ArrayBuffer | Blob | ArrayBufferView {\n return value instanceof ArrayBuffer || value instanceof Blob || (ArrayBuffer.isView(value) && value !== null);\n}\n","import { EventName } from './types';\n\nexport interface EventsMap<T = unknown> {\n [EventName.Open]: SocketOpenEvent;\n [EventName.Error]: SocketErrorEvent;\n [EventName.Close]: SocketCloseEvent;\n [EventName.Message]: SocketMessageEvent<T>;\n [EventName.PermanentClose]: SocketPermanentCloseEvent;\n}\n\n/* Событие успешного установления WebSocket-соединения */\nexport class SocketOpenEvent extends Event {\n constructor() {\n super(EventName.Open);\n }\n}\n\n/* Событие закрытия WebSocket-соединения */\nexport class SocketCloseEvent extends CloseEvent {\n constructor(code: number, reason?: string) {\n super(EventName.Close, {\n code,\n reason,\n wasClean: true\n });\n }\n}\n\n/* Событие ошибки в WebSocket-соединении */\nexport class SocketErrorEvent extends Event {\n readonly error?: Error;\n readonly message?: string;\n\n constructor(error?: Error) {\n super(EventName.Error);\n this.error = error;\n this.message = error?.message ?? '[UNKNOWN ERROR]';\n }\n}\n\n/* Событие получения сообщения в WebSocket-соединении */\nexport class SocketMessageEvent<T> extends Event implements MessageEventInit {\n readonly message: T;\n readonly lastEventId?: string\n readonly origin?: string\n readonly ports?: MessagePort[]\n readonly source?: MessageEventSource | null\n\n constructor(message: T, options?: MessageEventInit) {\n super(EventName.Message);\n\n this.message = message;\n this.ports = options?.ports;\n this.source = options?.source\n this.origin = options?.origin;\n this.lastEventId = options?.lastEventId;\n }\n}\n\n/* Событие превышения лимита переподключение WebSocket-соединения */\nexport class SocketPermanentCloseEvent extends Event {\n constructor() {\n super(EventName.PermanentClose);\n }\n}\n","import { BaseSocket } from './base-socket';\nimport { WebSocketOptions } from './websocket-options';\nimport { ErrorCode, ErrorReason, Options, Message, UrlProvider } from './types';\nimport { isAbortController, isWebSocket, selectNextProtocols, selectNextUrl } from './helpers';\nimport { SocketCloseEvent, SocketErrorEvent, SocketMessageEvent, SocketOpenEvent, SocketPermanentCloseEvent } from './events';\n\nexport class SocketClient<Send = Message, Receive = Message> extends BaseSocket<Send, Receive> {\n private readonly _url: UrlProvider;\n private readonly _options: WebSocketOptions<Send, Receive>;\n\n private _abortController?: AbortController;\n private _uptimeTimeoutId: ReturnType<typeof setTimeout> | undefined;\n private _connectTimeoutId: ReturnType<typeof setTimeout> | undefined;\n private _pongTimeoutId: ReturnType<typeof setTimeout> | undefined;\n private _pingIntervalId: ReturnType<typeof setInterval> | undefined;\n\n private _reconnectCount = 0;\n private _connectLock = false;\n private _closeCalled = false;\n private _shouldReconnect = true;\n\n protected _websocket?: WebSocket;\n protected _messageQueue: Message[] = [];\n\n /* Количество попыток переподключения */\n get retryCount(): number {\n return Math.max(this._reconnectCount, 0);\n }\n\n /* Флаг автоматического переподключения */\n get shouldReconnect(): boolean {\n return this._shouldReconnect;\n }\n\n /* Состояние подключения */\n get readyState(): number {\n if (isWebSocket(this._websocket)) {\n return this._websocket.readyState;\n }\n\n return this._options.startClosed\n ? SocketClient.CLOSED\n : SocketClient.CONNECTING;\n }\n\n private get _nextDelay(): number {\n if (this._reconnectCount <= 0) {\n return 0;\n }\n\n return Math.min(\n Math.pow(\n this._options.minReconnectionDelay * this._options.reconnectionDelayGrowFactor,\n this._reconnectCount - 1\n ),\n this._options.maxReconnectionDelay);\n }\n\n constructor(url: UrlProvider, options?: Options<Send, Receive>) {\n super();\n this._url = url;\n this._options = new WebSocketOptions<Send, Receive>(options);\n\n if (this._options.startClosed) {\n this._shouldReconnect = false;\n }\n\n this._connect();\n }\n\n /* Метод закрывает соединение и отключает автоматическое переподключение */\n close(code = 1000, reason?: string): void {\n this._closeCalled = true;\n this._shouldReconnect = false;\n this._clearTimeouts();\n\n if (!isWebSocket(this._websocket)) {\n return this._options.logger('Cannot close WebSocket. No instance');\n }\n\n if (this._websocket.readyState === this.CLOSED) {\n return this._options.logger('Close. WebSocket already closed');\n }\n\n this._websocket.close(code, reason);\n }\n\n /* Метод принудительно переподключает WebSocket и сбрасывает счетчик переподключений */\n reconnect(code = 1000, reason?: string): void {\n this._shouldReconnect = true;\n this._closeCalled = false;\n this._reconnectCount = 0;\n\n if (!isWebSocket(this._websocket) || this._websocket.readyState === this.CLOSED) {\n return this._connect();\n }\n\n this._disconnect(code, reason);\n this._connect();\n }\n\n /* Метод отправляет сообщение. При невозможности отправки добавляет его в очередь */\n send(data: Send): void {\n this._options.logger('Send message', data);\n\n try {\n const serialized = this._options.serialize(data);\n\n if (isWebSocket(this._websocket) && this._websocket.readyState === this.OPEN) {\n return this._websocket.send(serialized);\n }\n\n if (this._messageQueue.length < this._options.maxEnqueuedMessages) {\n this._options.logger('Enqueue message', data);\n this._messageQueue.push(serialized);\n }\n } catch (error) {\n if (error instanceof Error) {\n this.dispatchEvent(new SocketErrorEvent(error));\n }\n }\n }\n\n private _connect(): void {\n if (this._connectLock || !this._shouldReconnect) {\n return;\n }\n\n this._connectLock = true;\n\n if (this._reconnectCount >= this._options.maxRetries) {\n return this._maxRetriesHandler();\n }\n\n this._reconnectCount += 1;\n this._options.logger('Connection', { reconnectCount: this._reconnectCount });\n this._removeListeners();\n\n this._waitConnection()\n .then(() => Promise.all([\n selectNextUrl(this._url),\n selectNextProtocols(this._options.protocols)\n ]))\n .then(([url, protocols]) =>\n this._connectionHandler(url, protocols)\n )\n .catch((error: Error) => {\n this._connectLock = false;\n this._errorHandler(new SocketErrorEvent(Error(error.message)));\n });\n }\n\n private _disconnect(code = 1000, reason?: string): void {\n this._clearTimeouts();\n\n if (!isWebSocket(this._websocket)) {\n return;\n }\n\n this._removeListeners();\n\n try {\n if (this._websocket.readyState === this.OPEN || this._websocket.readyState === this.CONNECTING) {\n this._websocket.close(code, reason);\n }\n\n this._closeHandler(new SocketCloseEvent(code, reason));\n } catch {}\n }\n\n private _connectionHandler(url: string, protocols: string | string[] | null): void {\n if (this._closeCalled) {\n this._connectLock = false;\n return;\n }\n\n this._options.logger('Connect', { url, protocols });\n this._websocket = new WebSocket(url, protocols ?? undefined);\n\n this._websocket.binaryType = this._binaryType;\n this._connectLock = false;\n this._setupListeners();\n\n this._connectTimeoutId = setTimeout(\n () => this._handleConnectionTimeout(),\n this._options.connectionTimeout\n );\n }\n\n private _handleConnectionTimeout(): void {\n this._options.logger('Connection timeout');\n this._errorHandler(new SocketErrorEvent(\n Error(ErrorReason.ConnectionTimeout)\n ));\n }\n\n private _waitConnection(): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, this._nextDelay);\n });\n }\n\n private _openHandler(event: Event): void {\n this._options.logger('🚀 Open event', event);\n clearTimeout(this._connectTimeoutId);\n\n this._uptimeTimeoutId = setTimeout(\n () => this._clearReconnectionCount(),\n this._options.minUptime\n );\n\n if (!isWebSocket(this._websocket)) {\n throw new Error('WebSocket not supported');\n }\n\n this._websocket.binaryType = this._binaryType;\n\n this._sendQueue();\n\n if (this._options.pingPong) {\n this._startPing();\n }\n\n this.dispatchEvent(new SocketOpenEvent());\n }\n\n private _closeHandler(event: SocketCloseEvent): void {\n this._options.logger('❌ Close event', event);\n this._clearTimeouts();\n\n if (this._shouldReconnect) {\n this._connect();\n }\n\n this.dispatchEvent(new SocketCloseEvent(event.code, event.reason));\n }\n\n private _errorHandler(event: SocketErrorEvent): void {\n this._options.logger('🚨 Error event', event);\n let disconnectCode: number | undefined;\n\n if (ErrorReason.PongTimeout === event.message || ErrorReason.ConnectionTimeout === event.message) {\n disconnectCode = ErrorCode.Timeout;\n }\n\n this._disconnect(disconnectCode, event.message);\n\n this.dispatchEvent(new SocketErrorEvent(event.error));\n this._connect();\n }\n\n private _messageHandler(event: MessageEventInit<Message>): void {\n try {\n const deserialized = this._options.deserialize(event.data!);\n\n if (this._options.isPongMessage(deserialized)) {\n this._clearPongTimeout();\n\n if (this._options.skipPongMessage) {\n return;\n }\n }\n\n this._options.logger('✉️ Message event', { message: deserialized });\n this.dispatchEvent(new SocketMessageEvent(deserialized, event));\n } catch (error) {\n if (error instanceof Error) {\n this.dispatchEvent(new SocketErrorEvent(error));\n }\n }\n }\n\n private _sendQueue(): void {\n if (!isWebSocket(this._websocket) || this._messageQueue.length === 0) {\n return;\n }\n\n this._options.logger('Send queue messages', {\n messages: this._messageQueue,\n });\n\n for (const message of this._messageQueue) {\n this._websocket.send(message)\n }\n\n this._messageQueue = [];\n }\n\n private _startPing(): void {\n const message = this._options.pingMessage;\n\n if (isWebSocket(this._websocket) && this._websocket?.readyState === this.OPEN) {\n this._websocket.send(message);\n }\n this._options.logger('Start ping', { message });\n this._pingIntervalId = setInterval(() => {\n if (!isWebSocket(this._websocket)) {\n return;\n }\n\n this._websocket.send(message);\n\n if (this._pongTimeoutId) {\n return;\n }\n\n this._pongTimeoutId = setTimeout(\n () => {\n this._options.logger('Pong timeout');\n this._errorHandler(new SocketErrorEvent(\n Error(ErrorReason.PongTimeout)\n ));\n },\n this._options.pongTimeout,\n );\n }, this._options.pingInterval);\n }\n\n private _maxRetriesHandler(): void {\n this._options.logger('🚫 Max retries reached' , {\n maxRetries: this._options.maxRetries,\n reconnectCount: this._reconnectCount,\n });\n\n this.dispatchEvent(new SocketPermanentCloseEvent());\n }\n\n private _clearReconnectionCount(): void {\n this._options.logger('Clear reconnection count');\n if (!this._pongTimeoutId) {\n this._reconnectCount = 0;\n }\n }\n\n private _removeListeners(): void {\n if (!isAbortController(this._abortController)) {\n return;\n }\n\n this._options.logger('Remove native listeners');\n this._abortController.abort();\n }\n\n private _setupListeners(): void {\n if (!isWebSocket(this._websocket)) { return; }\n\n this._options.logger('Setup native listeners');\n\n this._abortController = new AbortController();\n\n const options: AddEventListenerOptions = {\n signal: this._abortController.signal,\n };\n\n this._websocket.addEventListener('open', this._openHandler.bind(this), options);\n this._websocket.addEventListener('close', this._closeHandler.bind(this), options);\n this._websocket.addEventListener('error', this._errorHandler.bind(this), options);\n this._websocket.addEventListener('message', this._messageHandler.bind(this), options);\n }\n\n private _clearTimeouts(): void {\n clearTimeout(this._connectTimeoutId);\n clearTimeout(this._uptimeTimeoutId);\n this._clearPongTimeout();\n this._clearPingInterval();\n }\n\n private _clearPongTimeout(): void {\n clearTimeout(this._pongTimeoutId);\n this._pongTimeoutId = undefined;\n }\n\n private _clearPingInterval(): void {\n clearInterval(this._pingIntervalId);\n this._pingIntervalId = undefined;\n }\n}\n","/*\n * Public API Surface of client-websocket\n */\n\nexport { SocketClient } from './lib/websocket';\n\nexport {\n SocketErrorEvent,\n SocketMessageEvent,\n SocketOpenEvent,\n SocketPermanentCloseEvent,\n SocketCloseEvent,\n} from './lib/events';\n\nexport type {\n Message as SocketMessage,\n Options as SocketOptions,\n UrlProvider as SocketUrlProvider,\n ProtocolsProvider as SocketProtocolsProvider,\n} from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Message } from './types';
|
|
2
|
+
import { EventsMap } from './events';
|
|
3
|
+
export declare abstract class BaseSocket<Send = Message, Receive = Message> extends EventTarget {
|
|
4
|
+
static get CONNECTING(): typeof WebSocket.CONNECTING;
|
|
5
|
+
static get OPEN(): typeof WebSocket.OPEN;
|
|
6
|
+
static get CLOSING(): typeof WebSocket.CLOSING;
|
|
7
|
+
static get CLOSED(): typeof WebSocket.CLOSED;
|
|
8
|
+
protected abstract _websocket?: WebSocket;
|
|
9
|
+
protected abstract _messageQueue: Message[];
|
|
10
|
+
protected _binaryType: BinaryType;
|
|
11
|
+
abstract readyState: number;
|
|
12
|
+
get CONNECTING(): typeof BaseSocket.CONNECTING;
|
|
13
|
+
get OPEN(): typeof BaseSocket.OPEN;
|
|
14
|
+
get CLOSING(): typeof BaseSocket.CLOSING;
|
|
15
|
+
get CLOSED(): typeof BaseSocket.CLOSED;
|
|
16
|
+
set binaryType(type: BinaryType);
|
|
17
|
+
get binaryType(): BinaryType;
|
|
18
|
+
get url(): string;
|
|
19
|
+
get extensions(): string;
|
|
20
|
+
get protocol(): string;
|
|
21
|
+
get bufferedAmount(): number;
|
|
22
|
+
abstract send(data: Send): void;
|
|
23
|
+
abstract close(code?: number, reason?: string): void;
|
|
24
|
+
abstract reconnect(code?: number, reason?: string): void;
|
|
25
|
+
addEventListener<K extends keyof EventsMap>(type: `${K & string}`, listener: (event: EventsMap<Receive>[K]) => void, options?: boolean | AddEventListenerOptions): void;
|
|
26
|
+
addEventListener(type: string, listener: (event: unknown) => void, options?: boolean | AddEventListenerOptions): void;
|
|
27
|
+
removeEventListener<K extends keyof EventsMap>(type: `${K & string}`, listener: (event: EventsMap<Receive>[K]) => void, options?: boolean | EventListenerOptions): void;
|
|
28
|
+
removeEventListener(type: string, listener: (event: unknown) => void, options?: boolean | AddEventListenerOptions): void;
|
|
29
|
+
}
|
package/lib/events.d.ts
CHANGED
|
@@ -1,17 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Error = "error",
|
|
4
|
-
Close = "close",
|
|
5
|
-
Message = "message",
|
|
6
|
-
Timeout = "timeout",
|
|
7
|
-
PermanentClose = "permanentClose"
|
|
8
|
-
}
|
|
9
|
-
interface EventsMap<T = unknown> {
|
|
1
|
+
import { EventName } from './types';
|
|
2
|
+
export interface EventsMap<T = unknown> {
|
|
10
3
|
[EventName.Open]: SocketOpenEvent;
|
|
11
4
|
[EventName.Error]: SocketErrorEvent;
|
|
12
5
|
[EventName.Close]: SocketCloseEvent;
|
|
13
6
|
[EventName.Message]: SocketMessageEvent<T>;
|
|
14
|
-
[EventName.Timeout]: SocketTimeoutEvent;
|
|
15
7
|
[EventName.PermanentClose]: SocketPermanentCloseEvent;
|
|
16
8
|
}
|
|
17
9
|
export declare class SocketOpenEvent extends Event {
|
|
@@ -25,23 +17,14 @@ export declare class SocketErrorEvent extends Event {
|
|
|
25
17
|
readonly message?: string;
|
|
26
18
|
constructor(error?: Error);
|
|
27
19
|
}
|
|
28
|
-
export declare class SocketMessageEvent<T> extends Event implements
|
|
20
|
+
export declare class SocketMessageEvent<T> extends Event implements MessageEventInit {
|
|
29
21
|
readonly message: T;
|
|
30
22
|
readonly lastEventId?: string;
|
|
31
23
|
readonly origin?: string;
|
|
32
24
|
readonly ports?: MessagePort[];
|
|
33
25
|
readonly source?: MessageEventSource | null;
|
|
34
|
-
constructor(message: T, options
|
|
35
|
-
}
|
|
36
|
-
export declare class SocketTimeoutEvent extends Event {
|
|
37
|
-
reason?: string;
|
|
38
|
-
constructor(reason: string);
|
|
26
|
+
constructor(message: T, options?: MessageEventInit);
|
|
39
27
|
}
|
|
40
28
|
export declare class SocketPermanentCloseEvent extends Event {
|
|
41
29
|
constructor();
|
|
42
30
|
}
|
|
43
|
-
export declare class InternalEventTarget<T, E extends EventsMap<T> = EventsMap<T>> extends EventTarget {
|
|
44
|
-
addEventListener<K extends keyof E>(type: `${K & string}`, callback: (event: E[K]) => void, options?: AddEventListenerOptions | boolean): void;
|
|
45
|
-
removeEventListener<K extends keyof E>(type: `${K & string}`, callback: (event: E[K]) => void, options?: boolean | AddEventListenerOptions): void;
|
|
46
|
-
}
|
|
47
|
-
export {};
|
package/lib/helpers.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ProtocolsProvider,
|
|
1
|
+
import { ProtocolsProvider, Message, UrlProvider } from './types';
|
|
2
2
|
export declare function selectNextProtocols(provider: ProtocolsProvider | null): Promise<string | string[] | null>;
|
|
3
3
|
export declare function selectNextUrl(provider: UrlProvider): Promise<string>;
|
|
4
|
-
export declare function calcBytesSize(messages:
|
|
4
|
+
export declare function calcBytesSize(messages: Message[]): number;
|
|
5
5
|
export declare function isWebSocket(data: unknown): data is WebSocket;
|
|
6
6
|
export declare function isAbortController(data: unknown): data is AbortController;
|
package/lib/types.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
export declare const enum EventName {
|
|
2
|
+
Open = "open",
|
|
3
|
+
Error = "error",
|
|
4
|
+
Close = "close",
|
|
5
|
+
Message = "message",
|
|
6
|
+
PermanentClose = "permanentClose"
|
|
7
|
+
}
|
|
1
8
|
export declare const enum ErrorCode {
|
|
2
9
|
Timeout = 3008
|
|
3
10
|
}
|
|
@@ -5,29 +12,30 @@ export declare const enum ErrorReason {
|
|
|
5
12
|
PongTimeout = "[PONG TIMEOUT]",
|
|
6
13
|
ConnectionTimeout = "[CONNECTION TIMEOUT]"
|
|
7
14
|
}
|
|
8
|
-
type WSUrl = `${'ws' | 'wss'}
|
|
15
|
+
type WSUrl = `${'ws' | 'wss'}:/*${string}` & string;
|
|
9
16
|
export type UrlProvider = WSUrl | (() => WSUrl) | (() => Promise<WSUrl>);
|
|
10
17
|
export type ProtocolsProvider = null | string | string[] | (() => string | string[] | null) | (() => Promise<string | string[] | null>);
|
|
11
18
|
export type BufferedMessage = ArrayBuffer | Blob | ArrayBufferView;
|
|
12
|
-
export type
|
|
13
|
-
export interface Options<Send =
|
|
19
|
+
export type Message = string | BufferedMessage;
|
|
20
|
+
export interface Options<Send = Message, Receive = Message> {
|
|
14
21
|
debug?: boolean;
|
|
15
22
|
pingPong?: boolean;
|
|
23
|
+
startClosed?: boolean;
|
|
16
24
|
minUptime?: number;
|
|
17
|
-
maxRetries?: number;
|
|
18
25
|
pongTimeout?: number;
|
|
19
|
-
startClosed?: boolean;
|
|
20
26
|
pingInterval?: number;
|
|
21
27
|
connectionTimeout?: number;
|
|
22
|
-
|
|
28
|
+
maxRetries?: number;
|
|
23
29
|
minReconnectionDelay?: number;
|
|
24
30
|
maxReconnectionDelay?: number;
|
|
25
|
-
protocols?: ProtocolsProvider;
|
|
26
31
|
reconnectionDelayGrowFactor?: number;
|
|
32
|
+
maxEnqueuedMessages?: number;
|
|
33
|
+
skipPongMessage?: boolean;
|
|
34
|
+
protocols?: ProtocolsProvider;
|
|
27
35
|
logger?: (message: string, ...args: unknown[]) => void;
|
|
28
|
-
serialize?: (value: Send) =>
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
pingMessage?: (() =>
|
|
36
|
+
serialize?: (value: Send) => Message;
|
|
37
|
+
deserialize?: (message: Message) => Receive | null;
|
|
38
|
+
isPongMessage?: (message: Receive | null) => boolean;
|
|
39
|
+
pingMessage?: (() => Message) | Message;
|
|
32
40
|
}
|
|
33
41
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare class WebSocketOptions<Send =
|
|
1
|
+
import { Options, ProtocolsProvider, Message } from './types';
|
|
2
|
+
export declare class WebSocketOptions<Send = Message, Receive = Message> implements Options<Send, Receive> {
|
|
3
3
|
private readonly _options?;
|
|
4
4
|
get debug(): boolean;
|
|
5
5
|
get pingPong(): boolean;
|
|
@@ -8,17 +8,18 @@ export declare class WebSocketOptions<Send = unknown, Receive = unknown> impleme
|
|
|
8
8
|
get pongTimeout(): number;
|
|
9
9
|
get startClosed(): boolean;
|
|
10
10
|
get pingInterval(): number;
|
|
11
|
+
get skipPongMessage(): boolean;
|
|
11
12
|
get connectionTimeout(): number;
|
|
12
13
|
get maxEnqueuedMessages(): number;
|
|
13
14
|
get minReconnectionDelay(): number;
|
|
14
15
|
get maxReconnectionDelay(): number;
|
|
15
16
|
get reconnectionDelayGrowFactor(): number;
|
|
16
|
-
get pingMessage():
|
|
17
|
+
get pingMessage(): Message;
|
|
17
18
|
get protocols(): ProtocolsProvider | null;
|
|
18
19
|
constructor(options?: Options<Send, Receive>);
|
|
19
|
-
serialize(message: Send):
|
|
20
|
-
deserialize(message
|
|
21
|
-
isPongMessage(message:
|
|
20
|
+
serialize(message: Send): Message;
|
|
21
|
+
deserialize(message: Message): Receive | null;
|
|
22
|
+
isPongMessage(message: Receive | null): boolean;
|
|
22
23
|
logger(message: string, ...args: unknown[]): void;
|
|
23
24
|
private getOption;
|
|
24
25
|
}
|
package/lib/websocket.d.ts
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Options, UrlProvider } from './types';
|
|
3
|
-
export declare class
|
|
4
|
-
static get CONNECTING(): typeof WebSocket.CONNECTING;
|
|
5
|
-
static get OPEN(): typeof WebSocket.OPEN;
|
|
6
|
-
static get CLOSING(): typeof WebSocket.CLOSING;
|
|
7
|
-
static get CLOSED(): typeof WebSocket.CLOSED;
|
|
1
|
+
import { BaseSocket } from './base-socket';
|
|
2
|
+
import { Options, Message, UrlProvider } from './types';
|
|
3
|
+
export declare class SocketClient<Send = Message, Receive = Message> extends BaseSocket<Send, Receive> {
|
|
8
4
|
private readonly _url;
|
|
9
5
|
private readonly _options;
|
|
10
|
-
private _websocket?;
|
|
11
6
|
private _abortController?;
|
|
12
7
|
private _uptimeTimeoutId;
|
|
13
8
|
private _connectTimeoutId;
|
|
@@ -17,21 +12,11 @@ export declare class ClientSocket<Send = unknown, Receive = unknown> extends Int
|
|
|
17
12
|
private _connectLock;
|
|
18
13
|
private _closeCalled;
|
|
19
14
|
private _shouldReconnect;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
get CONNECTING(): typeof ClientSocket.CONNECTING;
|
|
23
|
-
get OPEN(): typeof ClientSocket.OPEN;
|
|
24
|
-
get CLOSING(): typeof ClientSocket.CLOSING;
|
|
25
|
-
get CLOSED(): typeof ClientSocket.CLOSED;
|
|
26
|
-
set binaryType(type: BinaryType);
|
|
27
|
-
get binaryType(): BinaryType;
|
|
28
|
-
get url(): string;
|
|
29
|
-
get extensions(): string;
|
|
30
|
-
get protocol(): string;
|
|
15
|
+
protected _websocket?: WebSocket;
|
|
16
|
+
protected _messageQueue: Message[];
|
|
31
17
|
get retryCount(): number;
|
|
32
18
|
get shouldReconnect(): boolean;
|
|
33
19
|
get readyState(): number;
|
|
34
|
-
get bufferedAmount(): number;
|
|
35
20
|
private get _nextDelay();
|
|
36
21
|
constructor(url: UrlProvider, options?: Options<Send, Receive>);
|
|
37
22
|
close(code?: number, reason?: string): void;
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { SocketErrorEvent, SocketMessageEvent, SocketOpenEvent, SocketPermanentCloseEvent,
|
|
3
|
-
export type { Options as SocketOptions, UrlProvider as SocketUrlProvider, ProtocolsProvider as SocketProtocolsProvider, } from './lib/types';
|
|
1
|
+
export { SocketClient } from './lib/websocket';
|
|
2
|
+
export { SocketErrorEvent, SocketMessageEvent, SocketOpenEvent, SocketPermanentCloseEvent, SocketCloseEvent, } from './lib/events';
|
|
3
|
+
export type { Message as SocketMessage, Options as SocketOptions, UrlProvider as SocketUrlProvider, ProtocolsProvider as SocketProtocolsProvider, } from './lib/types';
|