extra-native-websocket 0.5.0 → 0.5.2
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/lib/extra-native-websocket.js +28 -10
- package/lib/extra-native-websocket.js.map +1 -1
- package/lib/utils/auto-reconnect-with-exponential-back-off.js +6 -7
- package/lib/utils/auto-reconnect-with-exponential-back-off.js.map +1 -1
- package/lib/utils/auto-reconnect.js +6 -6
- package/lib/utils/auto-reconnect.js.map +1 -1
- package/package.json +2 -1
- package/src/extra-native-websocket.ts +33 -10
- package/src/utils/auto-reconnect-with-exponential-back-off.ts +8 -6
- package/src/utils/auto-reconnect.ts +8 -5
|
@@ -2,6 +2,7 @@ import { assert } from '@blackglory/prelude';
|
|
|
2
2
|
import { WebSocketError } from './websocket-error.js';
|
|
3
3
|
import { Queue, Emitter } from '@blackglory/structures';
|
|
4
4
|
import { SyncDestructor } from 'extra-defer';
|
|
5
|
+
import { assertNever } from 'assert-never';
|
|
5
6
|
export var BinaryType;
|
|
6
7
|
(function (BinaryType) {
|
|
7
8
|
BinaryType[BinaryType["Blob"] = 0] = "Blob";
|
|
@@ -49,13 +50,15 @@ export class ExtraNativeWebSocket extends Emitter {
|
|
|
49
50
|
this.binaryType = val;
|
|
50
51
|
if (this.instance) {
|
|
51
52
|
switch (val) {
|
|
52
|
-
case BinaryType.Blob:
|
|
53
|
+
case BinaryType.Blob: {
|
|
53
54
|
this.instance.binaryType = 'blob';
|
|
54
55
|
break;
|
|
55
|
-
|
|
56
|
+
}
|
|
57
|
+
case BinaryType.ArrayBuffer: {
|
|
56
58
|
this.instance.binaryType = 'arraybuffer';
|
|
57
59
|
break;
|
|
58
|
-
|
|
60
|
+
}
|
|
61
|
+
default: assertNever(val, 'Unknown binary type');
|
|
59
62
|
}
|
|
60
63
|
}
|
|
61
64
|
}
|
|
@@ -99,12 +102,16 @@ export class ExtraNativeWebSocket extends Emitter {
|
|
|
99
102
|
assert(signal);
|
|
100
103
|
destructor.execute();
|
|
101
104
|
ws.close();
|
|
105
|
+
if (self.instance === ws)
|
|
106
|
+
self.instance = undefined;
|
|
102
107
|
reject(signal.reason);
|
|
103
108
|
}
|
|
104
109
|
function errorListener(event) {
|
|
105
110
|
ws.addEventListener('close', closeListener, { once: true });
|
|
106
111
|
function closeListener(event) {
|
|
107
112
|
destructor.execute();
|
|
113
|
+
if (self.instance === ws)
|
|
114
|
+
self.instance = undefined;
|
|
108
115
|
reject(new WebSocketError(event.code, event.reason));
|
|
109
116
|
}
|
|
110
117
|
}
|
|
@@ -119,17 +126,28 @@ export class ExtraNativeWebSocket extends Emitter {
|
|
|
119
126
|
}
|
|
120
127
|
close(code, reason) {
|
|
121
128
|
return new Promise(resolve => {
|
|
122
|
-
|
|
129
|
+
const self = this;
|
|
130
|
+
const ws = this.instance;
|
|
131
|
+
if (!ws)
|
|
132
|
+
return resolve();
|
|
123
133
|
switch (this.getState()) {
|
|
124
|
-
case State.Closed:
|
|
134
|
+
case State.Closed: {
|
|
125
135
|
resolve();
|
|
126
136
|
break;
|
|
127
|
-
|
|
128
|
-
|
|
137
|
+
}
|
|
138
|
+
case State.Closing: {
|
|
139
|
+
ws.addEventListener('close', closeListener, { once: true });
|
|
129
140
|
break;
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
141
|
+
}
|
|
142
|
+
default: {
|
|
143
|
+
ws.addEventListener('close', closeListener, { once: true });
|
|
144
|
+
ws.close(code, reason);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function closeListener() {
|
|
148
|
+
if (self.instance === ws)
|
|
149
|
+
self.instance = undefined;
|
|
150
|
+
resolve();
|
|
133
151
|
}
|
|
134
152
|
});
|
|
135
153
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extra-native-websocket.js","sourceRoot":"","sources":["../src/extra-native-websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"extra-native-websocket.js","sourceRoot":"","sources":["../src/extra-native-websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { calculateExponentialBackoffTimeout } from 'extra-timers';
|
|
|
3
3
|
import { pass } from '@blackglory/prelude';
|
|
4
4
|
import { delay } from 'extra-promise';
|
|
5
5
|
import { waitForFunction } from '@blackglory/wait-for';
|
|
6
|
-
import { AbortController, timeoutSignal } from 'extra-abort';
|
|
6
|
+
import { AbortController, timeoutSignal, raceAbortSignals } from 'extra-abort';
|
|
7
7
|
export function autoReconnectWithExponentialBackOff(ws, { baseInterval, maxInterval = Infinity, factor = 2, jitter = true }, connectTimeout) {
|
|
8
8
|
const controller = new AbortController();
|
|
9
9
|
// Make sure the error listener is added, prevent crashes due to uncaught errors.
|
|
@@ -30,17 +30,16 @@ export function autoReconnectWithExponentialBackOff(ws, { baseInterval, maxInter
|
|
|
30
30
|
return;
|
|
31
31
|
try {
|
|
32
32
|
await waitForFunction(() => ws.getState() === State.Closed);
|
|
33
|
-
await ws.connect(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
await ws.connect(raceAbortSignals([
|
|
34
|
+
connectTimeout && timeoutSignal(connectTimeout),
|
|
35
|
+
controller.signal
|
|
36
|
+
]));
|
|
37
|
+
removeCloseListener();
|
|
38
38
|
removeCloseListener = ws.once('close', closeListener);
|
|
39
39
|
break;
|
|
40
40
|
}
|
|
41
41
|
catch (_a) {
|
|
42
42
|
retries++;
|
|
43
|
-
pass();
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-reconnect-with-exponential-back-off.js","sourceRoot":"","sources":["../../src/utils/auto-reconnect-with-exponential-back-off.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,EAAE,qCAAsC;AAC5E,OAAO,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAA;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"auto-reconnect-with-exponential-back-off.js","sourceRoot":"","sources":["../../src/utils/auto-reconnect-with-exponential-back-off.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,EAAE,qCAAsC;AAC5E,OAAO,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAA;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9E,MAAM,UAAU,mCAAmC,CACjD,EAAwB,EACxB,EACE,YAAY,EACZ,WAAW,GAAG,QAAQ,EACtB,MAAM,GAAG,CAAC,EACV,MAAM,GAAG,IAAI,EAMd,EACD,cAAuB;IAEvB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IAExC,iFAAiF;IACjF,MAAM,mBAAmB,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAChD,IAAI,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAEzD,OAAO,GAAG,EAAE;QACV,UAAU,CAAC,KAAK,EAAE,CAAA;QAElB,mBAAmB,EAAE,CAAA;QACrB,mBAAmB,EAAE,CAAA;IACvB,CAAC,CAAA;IAED,KAAK,UAAU,aAAa;QAC1B,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YAErC,MAAM,KAAK,CAAC,kCAAkC,CAAC;gBAC7C,OAAO;gBACP,WAAW,EAAE,YAAY;gBACzB,UAAU,EAAE,WAAW;gBACvB,MAAM;gBACN,MAAM;aACP,CAAC,CAAC,CAAA;YACH,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YAErC,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAA;gBAC3D,MAAM,EAAE,CAAC,OAAO,CACd,gBAAgB,CAAC;oBACf,cAAc,IAAI,aAAa,CAAC,cAAc,CAAC;oBAC/C,UAAU,CAAC,MAAM;iBAClB,CAAC,CACH,CAAA;gBAED,mBAAmB,EAAE,CAAA;gBACrB,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;gBAErD,MAAK;YACP,CAAC;YAAC,WAAM,CAAC;gBACP,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { State } from "../extra-native-websocket.js";
|
|
2
2
|
import { delay } from 'extra-promise';
|
|
3
|
-
import { AbortController, timeoutSignal } from 'extra-abort';
|
|
3
|
+
import { AbortController, timeoutSignal, raceAbortSignals } from 'extra-abort';
|
|
4
4
|
import { pass } from '@blackglory/prelude';
|
|
5
5
|
import { waitForFunction } from '@blackglory/wait-for';
|
|
6
6
|
export function autoReconnect(ws, reconnectInterval = 0, connectTimeout) {
|
|
@@ -22,11 +22,11 @@ export function autoReconnect(ws, reconnectInterval = 0, connectTimeout) {
|
|
|
22
22
|
return;
|
|
23
23
|
try {
|
|
24
24
|
await waitForFunction(() => ws.getState() === State.Closed);
|
|
25
|
-
await ws.connect(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
await ws.connect(raceAbortSignals([
|
|
26
|
+
connectTimeout && timeoutSignal(connectTimeout),
|
|
27
|
+
controller.signal
|
|
28
|
+
]));
|
|
29
|
+
removeCloseListener();
|
|
30
30
|
removeCloseListener = ws.once('close', closeListener);
|
|
31
31
|
break;
|
|
32
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-reconnect.js","sourceRoot":"","sources":["../../src/utils/auto-reconnect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,EAAE,qCAAsC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"auto-reconnect.js","sourceRoot":"","sources":["../../src/utils/auto-reconnect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,EAAE,qCAAsC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,MAAM,UAAU,aAAa,CAC3B,EAAwB,EACxB,oBAA4B,CAAC,EAC7B,cAAuB;IAEvB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IAExC,iFAAiF;IACjF,MAAM,mBAAmB,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAChD,IAAI,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAEzD,OAAO,GAAG,EAAE;QACV,UAAU,CAAC,KAAK,EAAE,CAAA;QAElB,mBAAmB,EAAE,CAAA;QACrB,mBAAmB,EAAE,CAAA;IACvB,CAAC,CAAA;IAED,KAAK,UAAU,aAAa;QAC1B,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YAErC,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAA;YAC9B,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YAErC,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAA;gBAC3D,MAAM,EAAE,CAAC,OAAO,CACd,gBAAgB,CAAC;oBACf,cAAc,IAAI,aAAa,CAAC,cAAc,CAAC;oBAC/C,UAAU,CAAC,MAAM;iBAClB,CAAC,CACH,CAAA;gBAED,mBAAmB,EAAE,CAAA;gBACrB,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;gBAErD,MAAK;YACP,CAAC;YAAC,WAAM,CAAC;gBACP,IAAI,EAAE,CAAA;YACR,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "extra-native-websocket",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"files": [
|
|
@@ -60,6 +60,7 @@
|
|
|
60
60
|
"@blackglory/prelude": "^0.4.0",
|
|
61
61
|
"@blackglory/structures": "^0.14.10",
|
|
62
62
|
"@blackglory/wait-for": "^0.8.1",
|
|
63
|
+
"assert-never": "^1.4.0",
|
|
63
64
|
"extra-abort": "^0.4.0",
|
|
64
65
|
"extra-defer": "^0.3.1",
|
|
65
66
|
"extra-promise": "^7.0.0"
|
|
@@ -2,6 +2,7 @@ import { assert } from '@blackglory/prelude'
|
|
|
2
2
|
import { WebSocketError } from './websocket-error.js'
|
|
3
3
|
import { Queue, Emitter } from '@blackglory/structures'
|
|
4
4
|
import { SyncDestructor } from 'extra-defer'
|
|
5
|
+
import { assertNever } from 'assert-never'
|
|
5
6
|
|
|
6
7
|
export enum BinaryType {
|
|
7
8
|
Blob
|
|
@@ -61,13 +62,17 @@ export class ExtraNativeWebSocket extends Emitter<{
|
|
|
61
62
|
|
|
62
63
|
if (this.instance) {
|
|
63
64
|
switch (val) {
|
|
64
|
-
case BinaryType.Blob:
|
|
65
|
+
case BinaryType.Blob: {
|
|
65
66
|
this.instance.binaryType = 'blob'
|
|
67
|
+
|
|
66
68
|
break
|
|
67
|
-
|
|
69
|
+
}
|
|
70
|
+
case BinaryType.ArrayBuffer: {
|
|
68
71
|
this.instance.binaryType = 'arraybuffer'
|
|
72
|
+
|
|
69
73
|
break
|
|
70
|
-
|
|
74
|
+
}
|
|
75
|
+
default: assertNever(val, 'Unknown binary type')
|
|
71
76
|
}
|
|
72
77
|
}
|
|
73
78
|
}
|
|
@@ -121,6 +126,8 @@ export class ExtraNativeWebSocket extends Emitter<{
|
|
|
121
126
|
destructor.execute()
|
|
122
127
|
ws.close()
|
|
123
128
|
|
|
129
|
+
if (self.instance === ws) self.instance = undefined
|
|
130
|
+
|
|
124
131
|
reject(signal.reason)
|
|
125
132
|
}
|
|
126
133
|
|
|
@@ -130,6 +137,8 @@ export class ExtraNativeWebSocket extends Emitter<{
|
|
|
130
137
|
function closeListener(event: CloseEvent): void {
|
|
131
138
|
destructor.execute()
|
|
132
139
|
|
|
140
|
+
if (self.instance === ws) self.instance = undefined
|
|
141
|
+
|
|
133
142
|
reject(new WebSocketError(event.code, event.reason))
|
|
134
143
|
}
|
|
135
144
|
}
|
|
@@ -147,18 +156,32 @@ export class ExtraNativeWebSocket extends Emitter<{
|
|
|
147
156
|
|
|
148
157
|
close(code?: number, reason?: string): Promise<void> {
|
|
149
158
|
return new Promise<void>(resolve => {
|
|
150
|
-
|
|
159
|
+
const self = this
|
|
160
|
+
|
|
161
|
+
const ws = this.instance
|
|
162
|
+
if (!ws) return resolve()
|
|
151
163
|
|
|
152
164
|
switch (this.getState()) {
|
|
153
|
-
case State.Closed:
|
|
165
|
+
case State.Closed: {
|
|
154
166
|
resolve()
|
|
167
|
+
|
|
155
168
|
break
|
|
156
|
-
|
|
157
|
-
|
|
169
|
+
}
|
|
170
|
+
case State.Closing: {
|
|
171
|
+
ws.addEventListener('close', closeListener, { once: true })
|
|
172
|
+
|
|
158
173
|
break
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
174
|
+
}
|
|
175
|
+
default: {
|
|
176
|
+
ws.addEventListener('close', closeListener, { once: true })
|
|
177
|
+
ws.close(code, reason)
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function closeListener(): void {
|
|
182
|
+
if (self.instance === ws) self.instance = undefined
|
|
183
|
+
|
|
184
|
+
resolve()
|
|
162
185
|
}
|
|
163
186
|
})
|
|
164
187
|
}
|
|
@@ -3,7 +3,7 @@ import { calculateExponentialBackoffTimeout } from 'extra-timers'
|
|
|
3
3
|
import { pass } from '@blackglory/prelude'
|
|
4
4
|
import { delay } from 'extra-promise'
|
|
5
5
|
import { waitForFunction } from '@blackglory/wait-for'
|
|
6
|
-
import { AbortController, timeoutSignal } from 'extra-abort'
|
|
6
|
+
import { AbortController, timeoutSignal, raceAbortSignals } from 'extra-abort'
|
|
7
7
|
|
|
8
8
|
export function autoReconnectWithExponentialBackOff(
|
|
9
9
|
ws: ExtraNativeWebSocket
|
|
@@ -28,6 +28,7 @@ export function autoReconnectWithExponentialBackOff(
|
|
|
28
28
|
|
|
29
29
|
return () => {
|
|
30
30
|
controller.abort()
|
|
31
|
+
|
|
31
32
|
removeCloseListener()
|
|
32
33
|
removeErrorListener()
|
|
33
34
|
}
|
|
@@ -49,17 +50,18 @@ export function autoReconnectWithExponentialBackOff(
|
|
|
49
50
|
try {
|
|
50
51
|
await waitForFunction(() => ws.getState() === State.Closed)
|
|
51
52
|
await ws.connect(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
raceAbortSignals([
|
|
54
|
+
connectTimeout && timeoutSignal(connectTimeout)
|
|
55
|
+
, controller.signal
|
|
56
|
+
])
|
|
55
57
|
)
|
|
56
|
-
if (controller.signal.aborted) return
|
|
57
58
|
|
|
59
|
+
removeCloseListener()
|
|
58
60
|
removeCloseListener = ws.once('close', closeListener)
|
|
61
|
+
|
|
59
62
|
break
|
|
60
63
|
} catch {
|
|
61
64
|
retries++
|
|
62
|
-
pass()
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
67
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ExtraNativeWebSocket, State } from '@src/extra-native-websocket.js'
|
|
2
2
|
import { delay } from 'extra-promise'
|
|
3
|
-
import { AbortController, timeoutSignal } from 'extra-abort'
|
|
3
|
+
import { AbortController, timeoutSignal, raceAbortSignals } from 'extra-abort'
|
|
4
4
|
import { pass } from '@blackglory/prelude'
|
|
5
5
|
import { waitForFunction } from '@blackglory/wait-for'
|
|
6
6
|
|
|
@@ -17,6 +17,7 @@ export function autoReconnect(
|
|
|
17
17
|
|
|
18
18
|
return () => {
|
|
19
19
|
controller.abort()
|
|
20
|
+
|
|
20
21
|
removeCloseListener()
|
|
21
22
|
removeErrorListener()
|
|
22
23
|
}
|
|
@@ -31,13 +32,15 @@ export function autoReconnect(
|
|
|
31
32
|
try {
|
|
32
33
|
await waitForFunction(() => ws.getState() === State.Closed)
|
|
33
34
|
await ws.connect(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
raceAbortSignals([
|
|
36
|
+
connectTimeout && timeoutSignal(connectTimeout)
|
|
37
|
+
, controller.signal
|
|
38
|
+
])
|
|
37
39
|
)
|
|
38
|
-
if (controller.signal.aborted) return
|
|
39
40
|
|
|
41
|
+
removeCloseListener()
|
|
40
42
|
removeCloseListener = ws.once('close', closeListener)
|
|
43
|
+
|
|
41
44
|
break
|
|
42
45
|
} catch {
|
|
43
46
|
pass()
|