@sevtech/client-websocket 0.0.1 → 0.0.3
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 +453 -137
- package/fesm2022/sevtech-client-websocket.mjs.map +1 -1
- package/lib/events.d.ts +42 -15
- package/lib/helpers.d.ts +6 -0
- package/lib/types.d.ts +24 -13
- package/lib/websocket-options.d.ts +24 -0
- package/lib/websocket.d.ts +48 -25
- package/package.json +1 -4
- package/public-api.d.ts +3 -3
- package/lib/constants.d.ts +0 -16
|
@@ -1,42 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const pingPong = {
|
|
5
|
-
pingMessage: 'ping',
|
|
6
|
-
pingInterval: 1000,
|
|
7
|
-
pongMessage: 'pong',
|
|
8
|
-
pongTimeout: 5000,
|
|
9
|
-
};
|
|
10
|
-
const DEFAULT_OPTIONS = {
|
|
11
|
-
maxReconnectionDelay: 10_000,
|
|
12
|
-
minReconnectionDelay: 1000 + Math.random() * 4000,
|
|
13
|
-
minUptime: 5000,
|
|
14
|
-
reconnectionDelayGrowFactor: 1.3,
|
|
15
|
-
connectionTimeout: 4000,
|
|
16
|
-
maxRetries: Number.POSITIVE_INFINITY,
|
|
17
|
-
maxEnqueuedMessages: Number.POSITIVE_INFINITY,
|
|
18
|
-
startClosed: false,
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
class SocketMessage extends MessageEvent {
|
|
22
|
-
constructor(data) {
|
|
23
|
-
super('message', { data });
|
|
1
|
+
class SocketOpenEvent extends Event {
|
|
2
|
+
constructor() {
|
|
3
|
+
super("open" /* EventName.Open */);
|
|
24
4
|
}
|
|
25
5
|
}
|
|
26
|
-
class
|
|
27
|
-
constructor() {
|
|
28
|
-
super(
|
|
29
|
-
|
|
30
|
-
|
|
6
|
+
class SocketCloseEvent extends CloseEvent {
|
|
7
|
+
constructor(code, reason) {
|
|
8
|
+
super("close" /* EventName.Close */, {
|
|
9
|
+
code,
|
|
10
|
+
reason,
|
|
11
|
+
wasClean: true
|
|
12
|
+
});
|
|
31
13
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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;
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
|
-
class
|
|
38
|
+
class SocketPermanentCloseEvent extends Event {
|
|
39
|
+
constructor() {
|
|
40
|
+
super("permanentClose" /* EventName.PermanentClose */);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
class InternalEventTarget extends EventTarget {
|
|
40
44
|
// @ts-ignore
|
|
41
45
|
addEventListener(type, callback, options) {
|
|
42
46
|
super.addEventListener(type, callback, options);
|
|
@@ -47,166 +51,478 @@ class WebSocketEventTarget extends EventTarget {
|
|
|
47
51
|
}
|
|
48
52
|
}
|
|
49
53
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return
|
|
54
|
+
function selectNextProtocols(provider) {
|
|
55
|
+
if (!provider) {
|
|
56
|
+
return Promise.resolve(null);
|
|
57
|
+
}
|
|
58
|
+
if (typeof provider === 'string' || Array.isArray(provider)) {
|
|
59
|
+
return Promise.resolve(provider);
|
|
60
|
+
}
|
|
61
|
+
if (typeof provider === 'function') {
|
|
62
|
+
const protocols = provider();
|
|
63
|
+
if (protocols instanceof Promise) {
|
|
64
|
+
return protocols;
|
|
65
|
+
}
|
|
66
|
+
return selectNextProtocols(protocols);
|
|
67
|
+
}
|
|
68
|
+
throw Error('Invalid protocols');
|
|
69
|
+
}
|
|
70
|
+
function selectNextUrl(provider) {
|
|
71
|
+
if (typeof provider === 'string') {
|
|
72
|
+
return Promise.resolve(provider);
|
|
73
|
+
}
|
|
74
|
+
if (typeof provider === 'function') {
|
|
75
|
+
const url = provider();
|
|
76
|
+
if (url instanceof Promise) {
|
|
77
|
+
return url;
|
|
78
|
+
}
|
|
79
|
+
return selectNextUrl(url);
|
|
80
|
+
}
|
|
81
|
+
throw Error('Invalid URL');
|
|
82
|
+
}
|
|
83
|
+
function calcBytesSize(messages) {
|
|
84
|
+
return messages.reduce((acc, message) => {
|
|
85
|
+
switch (true) {
|
|
86
|
+
case typeof message === 'string':
|
|
87
|
+
return acc + message.length;
|
|
88
|
+
case message instanceof Blob:
|
|
89
|
+
return acc + message.size;
|
|
90
|
+
default:
|
|
91
|
+
return acc + message.byteLength;
|
|
92
|
+
}
|
|
93
|
+
}, 0);
|
|
94
|
+
}
|
|
95
|
+
function isWebSocket(data) {
|
|
96
|
+
return data instanceof WebSocket;
|
|
97
|
+
}
|
|
98
|
+
function isAbortController(data) {
|
|
99
|
+
return data instanceof AbortController;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const PONG_MESSAGE = 'pong';
|
|
103
|
+
const PING_MESSAGE = 'ping';
|
|
104
|
+
const OPTIONS = {
|
|
105
|
+
debug: false,
|
|
106
|
+
pingPong: false,
|
|
107
|
+
minUptime: 5000,
|
|
108
|
+
pongTimeout: 5000,
|
|
109
|
+
pingInterval: 1000,
|
|
110
|
+
startClosed: false,
|
|
111
|
+
connectionTimeout: 4000,
|
|
112
|
+
maxReconnectionDelay: 10_000,
|
|
113
|
+
reconnectionDelayGrowFactor: 1.3,
|
|
114
|
+
maxRetries: Number.POSITIVE_INFINITY,
|
|
115
|
+
maxEnqueuedMessages: Number.POSITIVE_INFINITY,
|
|
116
|
+
minReconnectionDelay: 1000 + Math.random() * 4000,
|
|
117
|
+
};
|
|
118
|
+
class WebSocketOptions {
|
|
119
|
+
get debug() {
|
|
120
|
+
return this.getOption('debug');
|
|
121
|
+
}
|
|
122
|
+
get pingPong() {
|
|
123
|
+
return this.getOption('pingPong');
|
|
124
|
+
}
|
|
125
|
+
get minUptime() {
|
|
126
|
+
return this.getOption('minUptime');
|
|
127
|
+
}
|
|
128
|
+
get maxRetries() {
|
|
129
|
+
return this.getOption('maxRetries');
|
|
130
|
+
}
|
|
131
|
+
get pongTimeout() {
|
|
132
|
+
return this.getOption('pongTimeout');
|
|
133
|
+
}
|
|
134
|
+
get startClosed() {
|
|
135
|
+
return this.getOption('startClosed');
|
|
136
|
+
}
|
|
137
|
+
get pingInterval() {
|
|
138
|
+
return this.getOption('pingInterval');
|
|
139
|
+
}
|
|
140
|
+
get connectionTimeout() {
|
|
141
|
+
return this.getOption('connectionTimeout');
|
|
53
142
|
}
|
|
54
|
-
get
|
|
55
|
-
return this.
|
|
143
|
+
get maxEnqueuedMessages() {
|
|
144
|
+
return this.getOption('maxEnqueuedMessages');
|
|
56
145
|
}
|
|
57
|
-
get
|
|
146
|
+
get minReconnectionDelay() {
|
|
147
|
+
return this.getOption('minReconnectionDelay');
|
|
148
|
+
}
|
|
149
|
+
get maxReconnectionDelay() {
|
|
150
|
+
return this.getOption('maxReconnectionDelay');
|
|
151
|
+
}
|
|
152
|
+
get reconnectionDelayGrowFactor() {
|
|
153
|
+
return this.getOption('minReconnectionDelay');
|
|
154
|
+
}
|
|
155
|
+
get pingMessage() {
|
|
58
156
|
if (this._options?.pingMessage instanceof Function) {
|
|
59
157
|
return this._options.pingMessage();
|
|
60
158
|
}
|
|
61
|
-
return this._options
|
|
159
|
+
return this._options?.pingMessage ?? PING_MESSAGE;
|
|
62
160
|
}
|
|
63
|
-
get
|
|
64
|
-
return
|
|
161
|
+
get protocols() {
|
|
162
|
+
return this._options?.protocols ?? null;
|
|
65
163
|
}
|
|
66
|
-
|
|
67
|
-
|
|
164
|
+
;
|
|
165
|
+
constructor(options) {
|
|
166
|
+
if (options) {
|
|
167
|
+
this._options = options;
|
|
168
|
+
}
|
|
68
169
|
}
|
|
69
|
-
|
|
70
|
-
|
|
170
|
+
serialize(message) {
|
|
171
|
+
if (this._options?.serialize instanceof Function) {
|
|
172
|
+
return this._options.serialize(message);
|
|
173
|
+
}
|
|
174
|
+
if (isBufferedData(message)) {
|
|
175
|
+
return message;
|
|
176
|
+
}
|
|
177
|
+
return typeof message !== 'string'
|
|
178
|
+
? JSON.stringify(message)
|
|
179
|
+
: message;
|
|
180
|
+
}
|
|
181
|
+
deserialize(message) {
|
|
182
|
+
if (this._options?.deserialize instanceof Function) {
|
|
183
|
+
return this._options.deserialize(message);
|
|
184
|
+
}
|
|
185
|
+
return message;
|
|
186
|
+
}
|
|
187
|
+
isPongMessage(message) {
|
|
188
|
+
if (!this.pingPong) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
if (this._options?.isPongMessage instanceof Function) {
|
|
192
|
+
return this._options.isPongMessage(message);
|
|
193
|
+
}
|
|
194
|
+
return message === PONG_MESSAGE;
|
|
195
|
+
}
|
|
196
|
+
logger(message, ...args) {
|
|
197
|
+
if (!this.debug) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (this._options?.logger instanceof Function) {
|
|
201
|
+
this._options.logger(message, ...args);
|
|
202
|
+
}
|
|
203
|
+
const label = ['%c[WS]:', 'color: #0094FF', message];
|
|
204
|
+
if (args.length === 0) {
|
|
205
|
+
return console.info(...label);
|
|
206
|
+
}
|
|
207
|
+
console.groupCollapsed(...label);
|
|
208
|
+
console.info(...args);
|
|
209
|
+
console.groupEnd();
|
|
210
|
+
}
|
|
211
|
+
getOption(key) {
|
|
212
|
+
return (this._options?.[key] ?? OPTIONS[key]);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function isBufferedData(value) {
|
|
216
|
+
return value instanceof ArrayBuffer || value instanceof Blob || (ArrayBuffer.isView(value) && value !== null);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
class ClientSocket extends InternalEventTarget {
|
|
220
|
+
static get CONNECTING() {
|
|
221
|
+
return WebSocket.CONNECTING;
|
|
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
|
+
}
|
|
249
|
+
}
|
|
250
|
+
get binaryType() {
|
|
251
|
+
return isWebSocket(this._websocket) ? this._websocket.binaryType : this._binaryType;
|
|
71
252
|
}
|
|
72
253
|
get url() {
|
|
73
|
-
return this.
|
|
254
|
+
return isWebSocket(this._websocket) ? this._websocket.url : '';
|
|
255
|
+
}
|
|
256
|
+
get extensions() {
|
|
257
|
+
return isWebSocket(this._websocket) ? this._websocket.extensions : '';
|
|
258
|
+
}
|
|
259
|
+
get protocol() {
|
|
260
|
+
return isWebSocket(this._websocket) ? this._websocket.protocol : '';
|
|
261
|
+
}
|
|
262
|
+
get retryCount() {
|
|
263
|
+
return Math.max(this._reconnectCount, 0);
|
|
264
|
+
}
|
|
265
|
+
get shouldReconnect() {
|
|
266
|
+
return this._shouldReconnect;
|
|
267
|
+
}
|
|
268
|
+
get readyState() {
|
|
269
|
+
if (isWebSocket(this._websocket)) {
|
|
270
|
+
return this._websocket.readyState;
|
|
271
|
+
}
|
|
272
|
+
return this._options.startClosed
|
|
273
|
+
? ClientSocket.CLOSED
|
|
274
|
+
: ClientSocket.CONNECTING;
|
|
275
|
+
}
|
|
276
|
+
get bufferedAmount() {
|
|
277
|
+
return calcBytesSize(this._messageQueue) + (isWebSocket(this._websocket)
|
|
278
|
+
? this._websocket.bufferedAmount
|
|
279
|
+
: 0);
|
|
280
|
+
}
|
|
281
|
+
get _nextDelay() {
|
|
282
|
+
if (this._reconnectCount <= 0) {
|
|
283
|
+
return 0;
|
|
284
|
+
}
|
|
285
|
+
return Math.min(Math.pow(this._options.minReconnectionDelay * this._options.reconnectionDelayGrowFactor, this._reconnectCount - 1), this._options.maxReconnectionDelay);
|
|
74
286
|
}
|
|
75
287
|
constructor(url, options) {
|
|
76
288
|
super();
|
|
77
|
-
this.
|
|
78
|
-
this.
|
|
79
|
-
this.
|
|
80
|
-
this.
|
|
289
|
+
this._reconnectCount = 0;
|
|
290
|
+
this._connectLock = false;
|
|
291
|
+
this._closeCalled = false;
|
|
292
|
+
this._shouldReconnect = true;
|
|
293
|
+
this._binaryType = 'blob';
|
|
294
|
+
this._messageQueue = [];
|
|
81
295
|
this._url = url;
|
|
82
|
-
this.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
this.
|
|
296
|
+
this._options = new WebSocketOptions(options);
|
|
297
|
+
if (this._options.startClosed) {
|
|
298
|
+
this._shouldReconnect = false;
|
|
299
|
+
}
|
|
300
|
+
this._connect();
|
|
301
|
+
}
|
|
302
|
+
close(code = 1000, reason) {
|
|
303
|
+
this._closeCalled = true;
|
|
304
|
+
this._shouldReconnect = false;
|
|
305
|
+
this._clearTimeouts();
|
|
306
|
+
if (!isWebSocket(this._websocket)) {
|
|
307
|
+
return this._options.logger('Cannot close WebSocket. No instance');
|
|
308
|
+
}
|
|
309
|
+
if (this._websocket.readyState === this.CLOSED) {
|
|
310
|
+
return this._options.logger('Close. WebSocket already closed');
|
|
311
|
+
}
|
|
312
|
+
this._websocket.close(code, reason);
|
|
313
|
+
}
|
|
314
|
+
reconnect(code, reason) {
|
|
315
|
+
this._shouldReconnect = true;
|
|
316
|
+
this._closeCalled = false;
|
|
317
|
+
this._reconnectCount = 0;
|
|
318
|
+
if (!isWebSocket(this._websocket) || this._websocket.readyState === this.CLOSED) {
|
|
319
|
+
return this._connect();
|
|
320
|
+
}
|
|
321
|
+
this._disconnect(code, reason);
|
|
322
|
+
this._connect();
|
|
87
323
|
}
|
|
88
|
-
send(
|
|
324
|
+
send(data) {
|
|
325
|
+
this._options.logger('Send message', data);
|
|
89
326
|
try {
|
|
90
|
-
|
|
91
|
-
|
|
327
|
+
const serialized = this._options.serialize(data);
|
|
328
|
+
if (isWebSocket(this._websocket) && this._websocket.readyState === this.OPEN) {
|
|
329
|
+
return this._websocket.send(serialized);
|
|
330
|
+
}
|
|
331
|
+
if (this._messageQueue.length < this._options.maxEnqueuedMessages) {
|
|
332
|
+
this._options.logger('Enqueue message', data);
|
|
333
|
+
this._messageQueue.push(serialized);
|
|
92
334
|
}
|
|
93
|
-
const serialized = this._serialize(message);
|
|
94
|
-
this._ws.send(serialized);
|
|
95
335
|
}
|
|
96
336
|
catch (error) {
|
|
97
337
|
if (error instanceof Error) {
|
|
98
|
-
this.dispatchEvent(new
|
|
338
|
+
this.dispatchEvent(new SocketErrorEvent(error));
|
|
99
339
|
}
|
|
100
340
|
}
|
|
101
341
|
}
|
|
102
|
-
|
|
103
|
-
this.
|
|
342
|
+
_connect() {
|
|
343
|
+
if (this._connectLock || !this._shouldReconnect) {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
this._connectLock = true;
|
|
347
|
+
if (this._reconnectCount >= this._options.maxRetries) {
|
|
348
|
+
return this._maxRetriesHandler();
|
|
349
|
+
}
|
|
350
|
+
this._reconnectCount += 1;
|
|
351
|
+
this._options.logger('Connection', { reconnectCount: this._reconnectCount });
|
|
352
|
+
this._removeListeners();
|
|
353
|
+
this._waitConnection()
|
|
354
|
+
.then(() => Promise.all([
|
|
355
|
+
selectNextUrl(this._url),
|
|
356
|
+
selectNextProtocols(this._options.protocols)
|
|
357
|
+
]))
|
|
358
|
+
.then(([url, protocols]) => this._connectionHandler(url, protocols))
|
|
359
|
+
.catch((error) => {
|
|
360
|
+
this._connectLock = false;
|
|
361
|
+
this._errorHandler(new SocketErrorEvent(Error(error.message)));
|
|
362
|
+
});
|
|
104
363
|
}
|
|
105
|
-
|
|
106
|
-
this.
|
|
364
|
+
_disconnect(code = 1000, reason) {
|
|
365
|
+
this._clearTimeouts();
|
|
366
|
+
if (!isWebSocket(this._websocket)) {
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
this._removeListeners();
|
|
370
|
+
try {
|
|
371
|
+
if (this._websocket.readyState === this.OPEN || this._websocket.readyState === this.CONNECTING) {
|
|
372
|
+
this._websocket.close(code, reason);
|
|
373
|
+
}
|
|
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
|
+
this._closeHandler(new SocketCloseEvent(code, reason));
|
|
379
|
+
}
|
|
380
|
+
catch { }
|
|
107
381
|
}
|
|
108
|
-
|
|
109
|
-
if (this.
|
|
110
|
-
|
|
382
|
+
_connectionHandler(url, protocols) {
|
|
383
|
+
if (this._closeCalled) {
|
|
384
|
+
this._connectLock = false;
|
|
385
|
+
return;
|
|
111
386
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
387
|
+
this._options.logger('Connect', { url, protocols });
|
|
388
|
+
this._websocket = new WebSocket(url, protocols ?? undefined);
|
|
389
|
+
this._websocket.binaryType = this._binaryType;
|
|
390
|
+
this._connectLock = false;
|
|
391
|
+
this._setupListeners();
|
|
392
|
+
this._connectTimeoutId = setTimeout(() => this._handleConnectionTimeout(), this._options.connectionTimeout);
|
|
115
393
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
394
|
+
_handleConnectionTimeout() {
|
|
395
|
+
this._options.logger('Connection timeout');
|
|
396
|
+
this._errorHandler(new SocketErrorEvent(Error("[CONNECTION TIMEOUT]" /* ErrorReason.ConnectionTimeout */)));
|
|
397
|
+
}
|
|
398
|
+
_waitConnection() {
|
|
399
|
+
return new Promise((resolve) => {
|
|
400
|
+
setTimeout(resolve, this._nextDelay);
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
_openHandler(event) {
|
|
404
|
+
this._options.logger('Open event', event);
|
|
405
|
+
clearTimeout(this._connectTimeoutId);
|
|
406
|
+
this._uptimeTimeoutId = setTimeout(() => this._clearReconnectionCount(), this._options.minUptime);
|
|
407
|
+
if (!isWebSocket(this._websocket)) {
|
|
408
|
+
throw new Error('WebSocket not supported');
|
|
119
409
|
}
|
|
120
|
-
|
|
410
|
+
this._websocket.binaryType = this._binaryType;
|
|
411
|
+
this._sendQueue();
|
|
412
|
+
if (this._options.pingPong) {
|
|
413
|
+
this._startPing();
|
|
414
|
+
}
|
|
415
|
+
this.dispatchEvent(new SocketOpenEvent());
|
|
416
|
+
}
|
|
417
|
+
_closeHandler(event) {
|
|
418
|
+
this._options.logger('Close event', event);
|
|
419
|
+
this._clearTimeouts();
|
|
420
|
+
if (this._shouldReconnect) {
|
|
421
|
+
this._connect();
|
|
422
|
+
}
|
|
423
|
+
this.dispatchEvent(new SocketCloseEvent(event.code, event.reason));
|
|
424
|
+
}
|
|
425
|
+
_errorHandler(event) {
|
|
426
|
+
this._options.logger('Error event', event);
|
|
427
|
+
this._disconnect(undefined, event.message);
|
|
428
|
+
this.dispatchEvent(new SocketErrorEvent(event.error));
|
|
429
|
+
this._connect();
|
|
121
430
|
}
|
|
122
431
|
_messageHandler(event) {
|
|
123
432
|
try {
|
|
124
|
-
const deserialized = this.
|
|
125
|
-
|
|
126
|
-
|
|
433
|
+
const deserialized = this._options.deserialize(event.data);
|
|
434
|
+
this._options.logger('Message event', { message: deserialized });
|
|
435
|
+
if (this._options.isPongMessage(deserialized)) {
|
|
436
|
+
this._clearPongTimeout();
|
|
437
|
+
this._clearReconnectionCount();
|
|
127
438
|
}
|
|
128
|
-
this.dispatchEvent(new
|
|
439
|
+
this.dispatchEvent(new SocketMessageEvent(deserialized, event));
|
|
129
440
|
}
|
|
130
441
|
catch (error) {
|
|
131
442
|
if (error instanceof Error) {
|
|
132
|
-
this.dispatchEvent(new
|
|
443
|
+
this.dispatchEvent(new SocketErrorEvent(error));
|
|
133
444
|
}
|
|
134
445
|
}
|
|
135
446
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
_openHandler(event) {
|
|
140
|
-
if (this._options.pingPong) {
|
|
141
|
-
this._startPing();
|
|
447
|
+
_sendQueue() {
|
|
448
|
+
if (!isWebSocket(this._websocket) || this._messageQueue.length === 0) {
|
|
449
|
+
return;
|
|
142
450
|
}
|
|
143
|
-
this.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
this.
|
|
147
|
-
|
|
148
|
-
if (PongTimeoutEvent.isTimeoutEvent(event)) {
|
|
149
|
-
this.dispatchEvent(new PongTimeoutEvent());
|
|
451
|
+
this._options.logger('Send queue messages', {
|
|
452
|
+
messages: this._messageQueue,
|
|
453
|
+
});
|
|
454
|
+
for (const message of this._messageQueue) {
|
|
455
|
+
this._websocket.send(message);
|
|
150
456
|
}
|
|
457
|
+
this._messageQueue = [];
|
|
151
458
|
}
|
|
152
459
|
_startPing() {
|
|
153
|
-
const
|
|
154
|
-
if (this.
|
|
155
|
-
this.
|
|
460
|
+
const message = this._options.pingMessage;
|
|
461
|
+
if (isWebSocket(this._websocket) && this._websocket?.readyState === this.OPEN) {
|
|
462
|
+
this._websocket.send(message);
|
|
156
463
|
}
|
|
464
|
+
this._options.logger('Start ping', { message });
|
|
157
465
|
this._pingIntervalId = setInterval(() => {
|
|
158
|
-
this.
|
|
466
|
+
if (!isWebSocket(this._websocket)) {
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
this._websocket.send(message);
|
|
159
470
|
if (this._pongTimeoutId) {
|
|
160
471
|
return;
|
|
161
472
|
}
|
|
162
|
-
this._pongTimeoutId = setTimeout(() =>
|
|
163
|
-
|
|
473
|
+
this._pongTimeoutId = setTimeout(() => {
|
|
474
|
+
this._options.logger('Pong timeout');
|
|
475
|
+
this._errorHandler(new SocketErrorEvent(Error("[PONG TIMEOUT]" /* ErrorReason.PongTimeout */)));
|
|
476
|
+
}, this._options.pongTimeout);
|
|
477
|
+
}, this._options.pingInterval);
|
|
164
478
|
}
|
|
165
|
-
|
|
166
|
-
this.
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
this.
|
|
171
|
-
.then(() => this._ws.reconnect(3008 /* ErrorCode.PongTimeout */, "[PONG TIMEOUT]" /* ErrorReason.PongTimeout */));
|
|
479
|
+
_maxRetriesHandler() {
|
|
480
|
+
this._options.logger('Max retries reached', {
|
|
481
|
+
maxRetries: this._options.maxRetries,
|
|
482
|
+
reconnectCount: this._reconnectCount,
|
|
483
|
+
});
|
|
484
|
+
this.dispatchEvent(new SocketPermanentCloseEvent());
|
|
172
485
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
if (this._options.isPongMessage instanceof Function) {
|
|
178
|
-
return this._options.isPongMessage(message);
|
|
486
|
+
_clearReconnectionCount() {
|
|
487
|
+
this._options.logger('Clear reconnection count');
|
|
488
|
+
if (!this._pongTimeoutId) {
|
|
489
|
+
this._reconnectCount = 0;
|
|
179
490
|
}
|
|
180
|
-
return message === pingPong.pongMessage;
|
|
181
491
|
}
|
|
182
|
-
|
|
183
|
-
if (!this.
|
|
492
|
+
_removeListeners() {
|
|
493
|
+
if (!isAbortController(this._abortController)) {
|
|
184
494
|
return;
|
|
185
495
|
}
|
|
186
|
-
|
|
187
|
-
this.
|
|
496
|
+
this._options.logger('Remove native listeners');
|
|
497
|
+
this._abortController.abort();
|
|
188
498
|
}
|
|
189
|
-
|
|
190
|
-
if (!this.
|
|
499
|
+
_setupListeners() {
|
|
500
|
+
if (!isWebSocket(this._websocket)) {
|
|
191
501
|
return;
|
|
192
502
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
503
|
+
this._options.logger('Setup native listeners');
|
|
504
|
+
this._abortController = new AbortController();
|
|
505
|
+
const options = {
|
|
506
|
+
signal: this._abortController.signal,
|
|
507
|
+
};
|
|
508
|
+
this._websocket.addEventListener('open', this._openHandler.bind(this), options);
|
|
509
|
+
this._websocket.addEventListener('close', this._closeHandler.bind(this), options);
|
|
510
|
+
this._websocket.addEventListener('error', this._errorHandler.bind(this), options);
|
|
511
|
+
this._websocket.addEventListener('message', this._messageHandler.bind(this), options);
|
|
198
512
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
return Math.min(minReconnectionDelay * reconnectionDelayGrowFactor ** (this._reconnectRetry - 1), maxReconnectionDelay);
|
|
513
|
+
_clearTimeouts() {
|
|
514
|
+
clearTimeout(this._connectTimeoutId);
|
|
515
|
+
clearTimeout(this._uptimeTimeoutId);
|
|
516
|
+
this._clearPongTimeout();
|
|
517
|
+
this._clearPingInterval();
|
|
205
518
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
519
|
+
_clearPongTimeout() {
|
|
520
|
+
clearTimeout(this._pongTimeoutId);
|
|
521
|
+
this._pongTimeoutId = undefined;
|
|
522
|
+
}
|
|
523
|
+
_clearPingInterval() {
|
|
524
|
+
clearInterval(this._pingIntervalId);
|
|
525
|
+
this._pingIntervalId = undefined;
|
|
210
526
|
}
|
|
211
527
|
}
|
|
212
528
|
|
|
@@ -218,5 +534,5 @@ class WSocket extends WebSocketEventTarget {
|
|
|
218
534
|
* Generated bundle index. Do not edit.
|
|
219
535
|
*/
|
|
220
536
|
|
|
221
|
-
export {
|
|
537
|
+
export { ClientSocket, SocketCloseEvent, SocketErrorEvent, SocketMessageEvent, SocketOpenEvent, SocketPermanentCloseEvent, SocketTimeoutEvent };
|
|
222
538
|
//# sourceMappingURL=sevtech-client-websocket.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sevtech-client-websocket.mjs","sources":["../../../projects/client-websocket/src/lib/constants.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 { WSocketOptions } from './types';\n\nexport const pingPong = {\n pingMessage: 'ping',\n pingInterval: 1000,\n\n pongMessage: 'pong',\n pongTimeout: 5000,\n} as const;\n\nexport const DEFAULT_OPTIONS = {\n maxReconnectionDelay: 10_000,\n minReconnectionDelay: 1000 + Math.random() * 4000,\n minUptime: 5000,\n reconnectionDelayGrowFactor: 1.3,\n connectionTimeout: 4000,\n maxRetries: Number.POSITIVE_INFINITY,\n maxEnqueuedMessages: Number.POSITIVE_INFINITY,\n startClosed: false,\n} as const satisfies WSocketOptions<unknown, unknown>;\n","import { WebSocketEventMap } from 'partysocket/ws';\nimport { ErrorCode, ErrorReason } from './types';\n\nexport class SocketMessage<T = unknown> extends MessageEvent<T> {\n constructor(data: T) {\n super('message', { data });\n }\n}\n\nexport class PongTimeoutEvent extends Event {\n readonly code = ErrorCode.PongTimeout;\n readonly reason = ErrorReason.PongTimeout;\n\n constructor() {\n super('pongTimeout');\n }\n\n static isTimeoutEvent(event: Event): boolean {\n if ('code' in event && 'reason' in event) {\n return event.code === ErrorCode.PongTimeout && event.reason === ErrorReason.PongTimeout\n }\n\n return false;\n }\n}\n\ninterface Events<Message> extends WebSocketEventMap {\n message: SocketMessage<Message>;\n pongTimeout: PongTimeoutEvent;\n}\n\nexport class WebSocketEventTarget<\n Message,\n EventMap extends Events<Message> = Events<Message>\n> extends EventTarget {\n // @ts-ignore\n override addEventListener<K extends keyof EventMap>(\n type: K & string,\n callback: (event: EventMap[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 EventMap>(\n type: K & string,\n callback: (event: EventMap[K]) => void,\n options?: boolean | AddEventListenerOptions\n ): void {\n super.removeEventListener(type, callback as EventListener, options);\n }\n}\n","import { WebSocket as PartySocket } from 'partysocket';\nimport { ErrorEvent, Message, UrlProvider } from 'partysocket/ws';\nimport { DEFAULT_OPTIONS, pingPong } from './constants';\nimport { PongTimeoutEvent, SocketMessage, WebSocketEventTarget } from './events';\nimport { ErrorCode, ErrorReason, WSocketOptions } from './types';\n\nexport class WSocket<Send = unknown, Receive = unknown> extends WebSocketEventTarget<Receive> {\n private readonly _ws: PartySocket;\n private _pingIntervalId: ReturnType<typeof setInterval> | null = null;\n private _pongTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\n private readonly _url: UrlProvider;\n private readonly _options: WSocketOptions<Send, Receive>;\n private _reconnectRetry: number = 0;\n\n private get _pingInterval(): number {\n return this._options?.pingInterval ?? pingPong.pingInterval;\n }\n\n private get _pongTimeout(): number {\n return this._options?.pongTimeout ?? pingPong.pongTimeout;\n }\n\n private get _pingMessage(): Message {\n if (this._options?.pingMessage instanceof Function) {\n return this._options.pingMessage()\n }\n\n return this._options.pingMessage ?? pingPong.pingMessage;\n }\n\n private get _shouldReconnect(): boolean {\n return (this._options.maxRetries ?? DEFAULT_OPTIONS.maxRetries) > this._reconnectRetry;\n }\n\n private get _isOpenState(): boolean {\n return this._ws.readyState === this._ws.OPEN;\n }\n\n get readyState(): number {\n return this._ws.readyState\n }\n\n get url(): UrlProvider {\n return this._url;\n }\n\n constructor(url: UrlProvider, options: WSocketOptions<Send, Receive>) {\n super()\n this._options = options;\n this._url = url;\n\n this._ws = new PartySocket(this._url, options?.protocols ?? null, options ?? null);\n this._ws.onopen = this._openHandler.bind(this);\n this._ws.onerror = this._errorHandler.bind(this);\n this._ws.onclose = this._closeHandler.bind(this);\n this._ws.onmessage = this._messageHandler.bind(this);\n }\n\n send(message: Send): void {\n try {\n if (!this._isOpenState) {\n return;\n }\n\n const serialized = this._serialize(message);\n this._ws.send(serialized);\n } catch (error) {\n if (error instanceof Error) {\n this.dispatchEvent(new ErrorEvent(error, this));\n }\n }\n }\n\n close(code?: number, reason?: string): void {\n this._ws.close(code, reason);\n }\n\n reconnect(code?: number, reason?: string): void {\n this._ws.reconnect(code, reason);\n }\n\n private _serialize(message: Send): Message {\n if (this._options.serialize instanceof Function) {\n return this._options.serialize(message);\n }\n\n return typeof message !== 'string'\n ? JSON.stringify(message)\n : message;\n }\n\n private _deserialize(message: Message): Receive {\n if (this._options.deserialize instanceof Function) {\n return this._options.deserialize(message);\n }\n\n return message as Receive;\n }\n\n private _messageHandler(event: MessageEvent<string>): void {\n try {\n const deserialized = this._deserialize(event.data);\n\n if (this._isPongMessage(deserialized)) {\n return this._clearPongTimeout();\n }\n\n this.dispatchEvent(new SocketMessage(deserialized));\n } catch (error) {\n if (error instanceof Error) {\n this.dispatchEvent(new ErrorEvent(error, this));\n }\n }\n }\n\n private _errorHandler(event: ErrorEvent): void {\n this.dispatchEvent(new ErrorEvent(new Error(event.message), this));\n }\n\n private _openHandler(event: Event): void {\n if (this._options.pingPong) {\n this._startPing();\n }\n\n this.dispatchEvent(new Event(event.type, event));\n }\n\n private _closeHandler(event: CloseEvent): void {\n this._clearPingInterval();\n this._clearPongTimeout();\n\n if (PongTimeoutEvent.isTimeoutEvent(event)) {\n this.dispatchEvent(new PongTimeoutEvent());\n }\n }\n\n private _startPing() {\n const ping = this._pingMessage;\n\n if (this._isOpenState) {\n this._ws.send(ping);\n }\n\n this._pingIntervalId = setInterval(() => {\n this._ws.send(ping);\n\n if (this._pongTimeoutId) { return; }\n\n this._pongTimeoutId = setTimeout(\n () => this._reconnectHandler(),\n this._pongTimeout\n );\n }, this._pingInterval);\n }\n\n private _reconnectHandler() {\n this._reconnectRetry += 1;\n\n if (!this._shouldReconnect) {\n return this._ws.close(ErrorCode.ReconnectRetry, ErrorReason.ReconnectRetry);\n }\n\n this._waitReconnect()\n .then(() => this._ws.reconnect(ErrorCode.PongTimeout, ErrorReason.PongTimeout))\n }\n\n private _isPongMessage(message: Receive | Message): boolean {\n if (!this._options.pingPong) { return false; }\n\n if (this._options.isPongMessage instanceof Function) {\n return this._options.isPongMessage(message);\n }\n\n return message === pingPong.pongMessage;\n }\n\n private _clearPingInterval() {\n if (!this._pingIntervalId) { return; }\n\n clearInterval(this._pingIntervalId);\n this._pingIntervalId = null;\n }\n\n private _clearPongTimeout() {\n if (!this._pongTimeoutId) { return; }\n\n if (this._reconnectRetry > 0 && this._isOpenState) {\n this._reconnectRetry = 0;\n }\n\n clearInterval(this._pongTimeoutId);\n this._pongTimeoutId = null;\n }\n\n private _getNextDelay() {\n const {\n reconnectionDelayGrowFactor = DEFAULT_OPTIONS.reconnectionDelayGrowFactor,\n minReconnectionDelay = DEFAULT_OPTIONS.minReconnectionDelay,\n maxReconnectionDelay = DEFAULT_OPTIONS.maxReconnectionDelay\n } = this._options;\n\n if (this._reconnectRetry <= 0) {\n return 0;\n }\n\n return Math.min(\n minReconnectionDelay * reconnectionDelayGrowFactor ** (this._reconnectRetry - 1),\n maxReconnectionDelay\n );\n }\n\n private _waitReconnect(): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, this._getNextDelay());\n });\n }\n}\n","/*\n * Public API Surface of client-websocket\n */\n\nexport {\n WSocket as ClientSocket,\n} from './lib/websocket';\n\nexport {\n PongTimeoutEvent,\n SocketMessage,\n} from './lib/events';\n\nexport type {\n WSocketOptions as SocketOptions,\n ErrorCode as SocketErrorCodes,\n ErrorReason as SocketErrorReasons,\n} from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["PartySocket"],"mappings":"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"}
|
|
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 try {\n const deserialized = this._options.deserialize(event.data as ReceiveMessage);\n this._options.logger('Message event', { message: deserialized });\n\n if (this._options.isPongMessage(deserialized)) {\n this._clearPongTimeout();\n this._clearReconnectionCount();\n }\n\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 {\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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"}
|
package/lib/events.d.ts
CHANGED
|
@@ -1,20 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
declare const enum EventName {
|
|
2
|
+
Open = "open",
|
|
3
|
+
Error = "error",
|
|
4
|
+
Close = "close",
|
|
5
|
+
Message = "message",
|
|
6
|
+
Timeout = "timeout",
|
|
7
|
+
PermanentClose = "permanentClose"
|
|
8
|
+
}
|
|
9
|
+
interface EventsMap<T = unknown> {
|
|
10
|
+
[EventName.Open]: SocketOpenEvent;
|
|
11
|
+
[EventName.Error]: SocketErrorEvent;
|
|
12
|
+
[EventName.Close]: SocketCloseEvent;
|
|
13
|
+
[EventName.Message]: SocketMessageEvent<T>;
|
|
14
|
+
[EventName.Timeout]: SocketTimeoutEvent;
|
|
15
|
+
[EventName.PermanentClose]: SocketPermanentCloseEvent;
|
|
16
|
+
}
|
|
17
|
+
export declare class SocketOpenEvent extends Event {
|
|
9
18
|
constructor();
|
|
10
|
-
static isTimeoutEvent(event: Event): boolean;
|
|
11
19
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
20
|
+
export declare class SocketCloseEvent extends CloseEvent {
|
|
21
|
+
constructor(code: number, reason?: string);
|
|
22
|
+
}
|
|
23
|
+
export declare class SocketErrorEvent extends Event {
|
|
24
|
+
readonly error?: Error;
|
|
25
|
+
readonly message?: string;
|
|
26
|
+
constructor(error?: Error);
|
|
27
|
+
}
|
|
28
|
+
export declare class SocketMessageEvent<T> extends Event implements Omit<MessageEventInit<T>, 'data'> {
|
|
29
|
+
readonly message: T;
|
|
30
|
+
readonly lastEventId?: string;
|
|
31
|
+
readonly origin?: string;
|
|
32
|
+
readonly ports?: MessagePort[];
|
|
33
|
+
readonly source?: MessageEventSource | null;
|
|
34
|
+
constructor(message: T, options: Omit<MessageEventInit<T>, 'data'>);
|
|
35
|
+
}
|
|
36
|
+
export declare class SocketTimeoutEvent extends Event {
|
|
37
|
+
reason?: string;
|
|
38
|
+
constructor(reason: string);
|
|
39
|
+
}
|
|
40
|
+
export declare class SocketPermanentCloseEvent extends Event {
|
|
41
|
+
constructor();
|
|
15
42
|
}
|
|
16
|
-
export declare class
|
|
17
|
-
addEventListener<K extends keyof
|
|
18
|
-
removeEventListener<K extends keyof
|
|
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;
|
|
19
46
|
}
|
|
20
47
|
export {};
|
package/lib/helpers.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ProtocolsProvider, ReceiveMessage, UrlProvider } from './types';
|
|
2
|
+
export declare function selectNextProtocols(provider: ProtocolsProvider | null): Promise<string | string[] | null>;
|
|
3
|
+
export declare function selectNextUrl(provider: UrlProvider): Promise<string>;
|
|
4
|
+
export declare function calcBytesSize(messages: ReceiveMessage[]): number;
|
|
5
|
+
export declare function isWebSocket(data: unknown): data is WebSocket;
|
|
6
|
+
export declare function isAbortController(data: unknown): data is AbortController;
|
package/lib/types.d.ts
CHANGED
|
@@ -1,22 +1,33 @@
|
|
|
1
|
-
import { Message, Options, ProtocolsProvider } from 'partysocket/ws';
|
|
2
1
|
export declare const enum ErrorCode {
|
|
3
|
-
|
|
4
|
-
ReconnectRetry = 3009
|
|
2
|
+
Timeout = 3008
|
|
5
3
|
}
|
|
6
4
|
export declare const enum ErrorReason {
|
|
7
5
|
PongTimeout = "[PONG TIMEOUT]",
|
|
8
|
-
|
|
6
|
+
ConnectionTimeout = "[CONNECTION TIMEOUT]"
|
|
9
7
|
}
|
|
10
|
-
type
|
|
11
|
-
type
|
|
12
|
-
export
|
|
13
|
-
|
|
8
|
+
type WSUrl = `${'ws' | 'wss'}://${string}` & string;
|
|
9
|
+
export type UrlProvider = WSUrl | (() => WSUrl) | (() => Promise<WSUrl>);
|
|
10
|
+
export type ProtocolsProvider = null | string | string[] | (() => string | string[] | null) | (() => Promise<string | string[] | null>);
|
|
11
|
+
export type BufferedMessage = ArrayBuffer | Blob | ArrayBufferView;
|
|
12
|
+
export type ReceiveMessage = string | BufferedMessage;
|
|
13
|
+
export interface Options<Send = unknown, Receive = ReceiveMessage> {
|
|
14
|
+
debug?: boolean;
|
|
14
15
|
pingPong?: boolean;
|
|
15
|
-
|
|
16
|
+
minUptime?: number;
|
|
17
|
+
maxRetries?: number;
|
|
16
18
|
pongTimeout?: number;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
startClosed?: boolean;
|
|
20
|
+
pingInterval?: number;
|
|
21
|
+
connectionTimeout?: number;
|
|
22
|
+
maxEnqueuedMessages?: number;
|
|
23
|
+
minReconnectionDelay?: number;
|
|
24
|
+
maxReconnectionDelay?: number;
|
|
25
|
+
protocols?: ProtocolsProvider;
|
|
26
|
+
reconnectionDelayGrowFactor?: number;
|
|
27
|
+
logger?: (message: string, ...args: unknown[]) => void;
|
|
28
|
+
serialize?: (value: Send) => ReceiveMessage;
|
|
29
|
+
isPongMessage?: (message: unknown) => boolean;
|
|
30
|
+
deserialize?: (message: ReceiveMessage) => Receive | BufferedMessage;
|
|
31
|
+
pingMessage?: (() => ReceiveMessage) | ReceiveMessage;
|
|
21
32
|
}
|
|
22
33
|
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BufferedMessage, Options, ProtocolsProvider, ReceiveMessage } from './types';
|
|
2
|
+
export declare class WebSocketOptions<Send = unknown, Receive = unknown> implements Options<Send, Receive> {
|
|
3
|
+
private readonly _options?;
|
|
4
|
+
get debug(): boolean;
|
|
5
|
+
get pingPong(): boolean;
|
|
6
|
+
get minUptime(): number;
|
|
7
|
+
get maxRetries(): number;
|
|
8
|
+
get pongTimeout(): number;
|
|
9
|
+
get startClosed(): boolean;
|
|
10
|
+
get pingInterval(): number;
|
|
11
|
+
get connectionTimeout(): number;
|
|
12
|
+
get maxEnqueuedMessages(): number;
|
|
13
|
+
get minReconnectionDelay(): number;
|
|
14
|
+
get maxReconnectionDelay(): number;
|
|
15
|
+
get reconnectionDelayGrowFactor(): number;
|
|
16
|
+
get pingMessage(): ReceiveMessage;
|
|
17
|
+
get protocols(): ProtocolsProvider | null;
|
|
18
|
+
constructor(options?: Options<Send, Receive>);
|
|
19
|
+
serialize(message: Send): ReceiveMessage;
|
|
20
|
+
deserialize(message: ReceiveMessage): Receive | BufferedMessage;
|
|
21
|
+
isPongMessage(message: unknown): boolean;
|
|
22
|
+
logger(message: string, ...args: unknown[]): void;
|
|
23
|
+
private getOption;
|
|
24
|
+
}
|
package/lib/websocket.d.ts
CHANGED
|
@@ -1,35 +1,58 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { InternalEventTarget } from './events';
|
|
2
|
+
import { Options, UrlProvider } from './types';
|
|
3
|
+
export declare class ClientSocket<Send = unknown, Receive = unknown> extends InternalEventTarget<Receive> {
|
|
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
8
|
private readonly _url;
|
|
9
9
|
private readonly _options;
|
|
10
|
-
private
|
|
11
|
-
private
|
|
12
|
-
private
|
|
13
|
-
private
|
|
14
|
-
private
|
|
15
|
-
private
|
|
10
|
+
private _websocket?;
|
|
11
|
+
private _abortController?;
|
|
12
|
+
private _uptimeTimeoutId;
|
|
13
|
+
private _connectTimeoutId;
|
|
14
|
+
private _pongTimeoutId;
|
|
15
|
+
private _pingIntervalId;
|
|
16
|
+
private _reconnectCount;
|
|
17
|
+
private _connectLock;
|
|
18
|
+
private _closeCalled;
|
|
19
|
+
private _shouldReconnect;
|
|
20
|
+
private _binaryType;
|
|
21
|
+
private _messageQueue;
|
|
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;
|
|
31
|
+
get retryCount(): number;
|
|
32
|
+
get shouldReconnect(): boolean;
|
|
16
33
|
get readyState(): number;
|
|
17
|
-
get
|
|
18
|
-
|
|
19
|
-
|
|
34
|
+
get bufferedAmount(): number;
|
|
35
|
+
private get _nextDelay();
|
|
36
|
+
constructor(url: UrlProvider, options?: Options<Send, Receive>);
|
|
20
37
|
close(code?: number, reason?: string): void;
|
|
21
38
|
reconnect(code?: number, reason?: string): void;
|
|
22
|
-
|
|
23
|
-
private
|
|
24
|
-
private
|
|
25
|
-
private
|
|
39
|
+
send(data: Send): void;
|
|
40
|
+
private _connect;
|
|
41
|
+
private _disconnect;
|
|
42
|
+
private _connectionHandler;
|
|
43
|
+
private _handleConnectionTimeout;
|
|
44
|
+
private _waitConnection;
|
|
26
45
|
private _openHandler;
|
|
27
46
|
private _closeHandler;
|
|
47
|
+
private _errorHandler;
|
|
48
|
+
private _messageHandler;
|
|
49
|
+
private _sendQueue;
|
|
28
50
|
private _startPing;
|
|
29
|
-
private
|
|
30
|
-
private
|
|
31
|
-
private
|
|
51
|
+
private _maxRetriesHandler;
|
|
52
|
+
private _clearReconnectionCount;
|
|
53
|
+
private _removeListeners;
|
|
54
|
+
private _setupListeners;
|
|
55
|
+
private _clearTimeouts;
|
|
32
56
|
private _clearPongTimeout;
|
|
33
|
-
private
|
|
34
|
-
private _waitReconnect;
|
|
57
|
+
private _clearPingInterval;
|
|
35
58
|
}
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export type {
|
|
1
|
+
export { ClientSocket, } from './lib/websocket';
|
|
2
|
+
export { SocketErrorEvent, SocketMessageEvent, SocketOpenEvent, SocketPermanentCloseEvent, SocketTimeoutEvent, SocketCloseEvent, } from './lib/events';
|
|
3
|
+
export type { Options as SocketOptions, UrlProvider as SocketUrlProvider, ProtocolsProvider as SocketProtocolsProvider, } from './lib/types';
|
package/lib/constants.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export declare const pingPong: {
|
|
2
|
-
readonly pingMessage: "ping";
|
|
3
|
-
readonly pingInterval: 1000;
|
|
4
|
-
readonly pongMessage: "pong";
|
|
5
|
-
readonly pongTimeout: 5000;
|
|
6
|
-
};
|
|
7
|
-
export declare const DEFAULT_OPTIONS: {
|
|
8
|
-
readonly maxReconnectionDelay: 10000;
|
|
9
|
-
readonly minReconnectionDelay: number;
|
|
10
|
-
readonly minUptime: 5000;
|
|
11
|
-
readonly reconnectionDelayGrowFactor: 1.3;
|
|
12
|
-
readonly connectionTimeout: 4000;
|
|
13
|
-
readonly maxRetries: number;
|
|
14
|
-
readonly maxEnqueuedMessages: number;
|
|
15
|
-
readonly startClosed: false;
|
|
16
|
-
};
|