qws-browser 2.0.0 → 2.1.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/README.md +19 -0
- package/dist/browser/messageencode.d.ts.map +1 -1
- package/dist/browser/messageencode.js +3 -1
- package/dist/browser/messageencode.js.map +1 -1
- package/dist/browser/wrappedws.d.ts +23 -1
- package/dist/browser/wrappedws.d.ts.map +1 -1
- package/dist/browser/wrappedws.js +44 -1
- package/dist/browser/wrappedws.js.map +1 -1
- package/dist/common/message.d.ts +16 -3
- package/dist/common/message.d.ts.map +1 -1
- package/dist/common/queuews.d.ts +30 -2
- package/dist/common/queuews.d.ts.map +1 -1
- package/dist/common/queuews.js +85 -2
- package/dist/common/queuews.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,9 +9,28 @@ Safe queueing with auto-reconnect for WebSockets
|
|
|
9
9
|
- Automatic two-way acknowledgment stream of messages - all messages are retained in-memory until acknowledgment is provided
|
|
10
10
|
- Configurable headers per message, even when body is binary
|
|
11
11
|
- Simple message routing (via [route-recognizer](https://github.com/tildeio/route-recognizer))
|
|
12
|
+
- Heartbeats detecting dead connections
|
|
13
|
+
- Waiting for the acknowledgment of a given message
|
|
12
14
|
|
|
13
15
|
Since version 2, `qws-browser` is an ES module only (no CommonJS build), meant to be consumed via a bundler such as Vite.
|
|
14
16
|
|
|
17
|
+
# Heartbeats
|
|
18
|
+
|
|
19
|
+
Every `heartbeatIntervalMillis` (default 25s, `0` disables), a connection sends a heartbeat. If nothing arrives, not even the answer, until the next one, the connection is considered dead and is terminated, which triggers the usual close/reconnect logic. This catches connections that died silently (sleeping devices, network switches), on which no close event would arrive for minutes.
|
|
20
|
+
|
|
21
|
+
- Node uses protocol-level pings, which every WebSocket peer (including browsers) answers.
|
|
22
|
+
- Browsers can't send protocol-level pings, so they send qws `ping` messages, answered with `pong` by qws 2.1+ peers. Until the first `pong` arrives on a connection, a missing answer is not treated as a dead connection, so older servers keep working.
|
|
23
|
+
- `QWebSocketServer` takes the options of the connections it creates as second argument: `new QWebSocketServer({ port }, { heartbeatIntervalMillis: 10_000 })`.
|
|
24
|
+
|
|
25
|
+
# Waiting for acknowledgment
|
|
26
|
+
|
|
27
|
+
`send`/`sendToRoute` return the message index. `waitForAck(idx)` resolves once the other side acknowledged that message (after its handler finished), and rejects if the connection closes for good before that. Reconnecting connections keep and resend unacknowledged messages, so they don't reject on a reconnect.
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
const idx = qws.sendToRoute('handout', message);
|
|
31
|
+
await qws.waitForAck(idx);
|
|
32
|
+
```
|
|
33
|
+
|
|
15
34
|
# Examples
|
|
16
35
|
|
|
17
36
|
TODO
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageencode.d.ts","sourceRoot":"","sources":["../../src/browser/messageencode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAoC,MAAM,sBAAsB,CAAC;AAwBpF;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAiDxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"messageencode.d.ts","sourceRoot":"","sources":["../../src/browser/messageencode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAoC,MAAM,sBAAsB,CAAC;AAwBpF;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAiDxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAkC1D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageencode.js","sourceRoot":"","sources":["../../src/browser/messageencode.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"messageencode.js","sourceRoot":"","sources":["../../src/browser/messageencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { QwsMessage, AckQwsMessage, BinaryQwsMessage, ErrorQwsMessage, JsonQwsMessage, ReadyQwsMessage } from '../common/message.js';
|
|
1
|
+
import { QwsMessage, AckQwsMessage, BinaryQwsMessage, ErrorQwsMessage, HeartbeatQwsMessage, JsonQwsMessage, ReadyQwsMessage } from '../common/message.js';
|
|
2
2
|
import { Binary } from '../common/discriminator.js';
|
|
3
3
|
/**
|
|
4
4
|
* Wrapper around WebSocket, built to serialize/deserialize
|
|
@@ -12,8 +12,17 @@ export default class WrappedWebSocket {
|
|
|
12
12
|
ready?: (message: ReadyQwsMessage) => void;
|
|
13
13
|
ack?: (message: AckQwsMessage) => void;
|
|
14
14
|
err?: (message: ErrorQwsMessage) => void;
|
|
15
|
+
ping?: (message: HeartbeatQwsMessage) => void;
|
|
16
|
+
pong?: (message: HeartbeatQwsMessage) => void;
|
|
15
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Time of the last message or heartbeat answer received, to detect dead connections
|
|
20
|
+
*/
|
|
21
|
+
lastActivity: number;
|
|
22
|
+
private closeCallbacks;
|
|
23
|
+
private closed;
|
|
16
24
|
constructor(wsOrUrl: WebSocket | string);
|
|
25
|
+
private fireClose;
|
|
17
26
|
/**
|
|
18
27
|
* Proxy callbacks
|
|
19
28
|
*/
|
|
@@ -33,11 +42,24 @@ export default class WrappedWebSocket {
|
|
|
33
42
|
onReady(callback: (message: ReadyQwsMessage) => void): void;
|
|
34
43
|
onAck(callback: (message: AckQwsMessage) => void): void;
|
|
35
44
|
onErr(callback: (message: ErrorQwsMessage) => void): void;
|
|
45
|
+
onPing(callback: (message: HeartbeatQwsMessage) => void): void;
|
|
46
|
+
onPong(callback: (message: HeartbeatQwsMessage) => void): void;
|
|
36
47
|
/**
|
|
37
48
|
* Proxy methods
|
|
38
49
|
*/
|
|
39
50
|
send(message: QwsMessage): void;
|
|
40
51
|
sendRaw(data: Binary): void;
|
|
41
52
|
close(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Browsers can't send protocol-level pings, so heartbeats are qws ping messages,
|
|
55
|
+
* answered only by peers that know them (qws 2.1+)
|
|
56
|
+
*/
|
|
57
|
+
readonly heartbeatAnsweredByProtocol = false;
|
|
58
|
+
sendHeartbeat(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Give up on the connection right away: on a dead connection the closing handshake
|
|
61
|
+
* can take minutes before the close event fires
|
|
62
|
+
*/
|
|
63
|
+
terminate(): void;
|
|
42
64
|
}
|
|
43
65
|
//# sourceMappingURL=wrappedws.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrappedws.d.ts","sourceRoot":"","sources":["../../src/browser/wrappedws.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,EAAE,EAAE,SAAS,CAAC;IAEd,SAAS,EAAE;QACT,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;QACzC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;QAC3C,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;QACvC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"wrappedws.d.ts","sourceRoot":"","sources":["../../src/browser/wrappedws.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,EAAE,EAAE,SAAS,CAAC;IAEd,SAAS,EAAE;QACT,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;QACzC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;QAC3C,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;QACvC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;QACzC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;QAC9C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;KAC/C,CAAC;IAEF;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAU;gBAEZ,OAAO,EAAE,SAAS,GAAG,MAAM;IAgCvC,OAAO,CAAC,SAAS;IAUjB;;OAEG;IAEH,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIpC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIrC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAIjD;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED;;OAEG;IAEH,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI;IAI1D,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;IAIzD,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAI3D,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI;IAIvD,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAIzD,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI;IAI9D,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI;IAI9D;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAM/B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,QAAQ,CAAC,2BAA2B,SAAS;IAE7C,aAAa,IAAI,IAAI;IAIrB;;;OAGG;IACH,SAAS,IAAI,IAAI;CAIlB"}
|
|
@@ -6,7 +6,15 @@ import { deserializeMessage, serializeMessage } from './messageencode.js';
|
|
|
6
6
|
*/
|
|
7
7
|
export default class WrappedWebSocket {
|
|
8
8
|
constructor(wsOrUrl) {
|
|
9
|
+
/**
|
|
10
|
+
* Browsers can't send protocol-level pings, so heartbeats are qws ping messages,
|
|
11
|
+
* answered only by peers that know them (qws 2.1+)
|
|
12
|
+
*/
|
|
13
|
+
this.heartbeatAnsweredByProtocol = false;
|
|
9
14
|
this.callbacks = {};
|
|
15
|
+
this.lastActivity = Date.now();
|
|
16
|
+
this.closeCallbacks = [];
|
|
17
|
+
this.closed = false;
|
|
10
18
|
if (wsOrUrl instanceof WebSocket || wsOrUrl?.constructor?.name === 'WebSocket') {
|
|
11
19
|
this.ws = wsOrUrl;
|
|
12
20
|
}
|
|
@@ -14,13 +22,31 @@ export default class WrappedWebSocket {
|
|
|
14
22
|
this.ws = new WebSocket(wsOrUrl);
|
|
15
23
|
}
|
|
16
24
|
this.ws.addEventListener('message', async (event) => {
|
|
25
|
+
// terminated sockets may still deliver, those messages belong to a connection we gave up on
|
|
26
|
+
if (this.closed) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
this.lastActivity = Date.now();
|
|
17
30
|
const message = await deserializeMessage(event.data);
|
|
18
31
|
// logger.info('WRAPPER received', message);
|
|
19
32
|
const callback = this.callbacks[message.headers.type];
|
|
20
33
|
callback?.(message);
|
|
21
34
|
});
|
|
35
|
+
this.ws.addEventListener('close', () => {
|
|
36
|
+
this.fireClose();
|
|
37
|
+
});
|
|
22
38
|
autoBind(this);
|
|
23
39
|
}
|
|
40
|
+
// close callbacks fire once, either on the close event or on terminate()
|
|
41
|
+
fireClose() {
|
|
42
|
+
if (this.closed) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.closed = true;
|
|
46
|
+
for (const callback of this.closeCallbacks) {
|
|
47
|
+
callback();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
24
50
|
/**
|
|
25
51
|
* Proxy callbacks
|
|
26
52
|
*/
|
|
@@ -28,7 +54,7 @@ export default class WrappedWebSocket {
|
|
|
28
54
|
this.ws.addEventListener('open', callback);
|
|
29
55
|
}
|
|
30
56
|
onWsClose(callback) {
|
|
31
|
-
this.
|
|
57
|
+
this.closeCallbacks.push(callback);
|
|
32
58
|
}
|
|
33
59
|
onWsError(callback) {
|
|
34
60
|
this.ws.addEventListener('error', callback);
|
|
@@ -60,6 +86,12 @@ export default class WrappedWebSocket {
|
|
|
60
86
|
onErr(callback) {
|
|
61
87
|
this.callbacks.err = callback;
|
|
62
88
|
}
|
|
89
|
+
onPing(callback) {
|
|
90
|
+
this.callbacks.ping = callback;
|
|
91
|
+
}
|
|
92
|
+
onPong(callback) {
|
|
93
|
+
this.callbacks.pong = callback;
|
|
94
|
+
}
|
|
63
95
|
/**
|
|
64
96
|
* Proxy methods
|
|
65
97
|
*/
|
|
@@ -75,5 +107,16 @@ export default class WrappedWebSocket {
|
|
|
75
107
|
close() {
|
|
76
108
|
this.ws.close();
|
|
77
109
|
}
|
|
110
|
+
sendHeartbeat() {
|
|
111
|
+
this.send({ headers: { type: 'ping' } });
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Give up on the connection right away: on a dead connection the closing handshake
|
|
115
|
+
* can take minutes before the close event fires
|
|
116
|
+
*/
|
|
117
|
+
terminate() {
|
|
118
|
+
this.ws.close(4000, 'Heartbeat timeout');
|
|
119
|
+
this.fireClose();
|
|
120
|
+
}
|
|
78
121
|
}
|
|
79
122
|
//# sourceMappingURL=wrappedws.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrappedws.js","sourceRoot":"","sources":["../../src/browser/wrappedws.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"wrappedws.js","sourceRoot":"","sources":["../../src/browser/wrappedws.ts"],"names":[],"mappings":"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"}
|
package/dist/common/message.d.ts
CHANGED
|
@@ -12,8 +12,10 @@ import { Binary } from './discriminator.js';
|
|
|
12
12
|
* 'ready' - ready message sent after connection and setup
|
|
13
13
|
* 'ack' - acknowledgment message for a payload message received from other side
|
|
14
14
|
* 'err' - error
|
|
15
|
+
* 'ping' - heartbeat request, answered by a 'pong' from the other side
|
|
16
|
+
* 'pong' - heartbeat answer
|
|
15
17
|
*/
|
|
16
|
-
export type QwsMessageType = 'bin' | 'json' | 'ready' | 'ack' | 'err';
|
|
18
|
+
export type QwsMessageType = 'bin' | 'json' | 'ready' | 'ack' | 'err' | 'ping' | 'pong';
|
|
17
19
|
/**
|
|
18
20
|
* Headers are sent in base64(json) format.
|
|
19
21
|
*/
|
|
@@ -106,10 +108,21 @@ export type ErrorQwsMessageHeaders = {
|
|
|
106
108
|
export type ErrorQwsMessage = {
|
|
107
109
|
headers: ErrorQwsMessageHeaders;
|
|
108
110
|
};
|
|
111
|
+
/**
|
|
112
|
+
* Heartbeat messages
|
|
113
|
+
* Used where protocol-level pings are not available (the browser).
|
|
114
|
+
* Peers that don't know these types ignore them.
|
|
115
|
+
*/
|
|
116
|
+
export type HeartbeatQwsMessageHeaders = {
|
|
117
|
+
type: 'ping' | 'pong';
|
|
118
|
+
};
|
|
119
|
+
export type HeartbeatQwsMessage = {
|
|
120
|
+
headers: HeartbeatQwsMessageHeaders;
|
|
121
|
+
};
|
|
109
122
|
/**
|
|
110
123
|
* Common names for WSQ message
|
|
111
124
|
*/
|
|
112
125
|
export type PayloadQwsMessage = BinaryQwsMessage | JsonQwsMessage;
|
|
113
|
-
export type QwsMessage = BinaryQwsMessage | JsonQwsMessage | ReadyQwsMessage | AckQwsMessage | ErrorQwsMessage;
|
|
114
|
-
export type QwsMessageHeader = BinaryQwsMessageHeaders | JsonQwsMessageHeaders | ReadyQwsMessageHeaders | AckQwsMessageHeaders | ErrorQwsMessageHeaders;
|
|
126
|
+
export type QwsMessage = BinaryQwsMessage | JsonQwsMessage | ReadyQwsMessage | AckQwsMessage | ErrorQwsMessage | HeartbeatQwsMessage;
|
|
127
|
+
export type QwsMessageHeader = BinaryQwsMessageHeaders | JsonQwsMessageHeaders | ReadyQwsMessageHeaders | AckQwsMessageHeaders | ErrorQwsMessageHeaders | HeartbeatQwsMessageHeaders;
|
|
115
128
|
//# sourceMappingURL=message.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/common/message.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/common/message.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAExF;;GAEG;AAEH,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7D;;GAEG;AAEH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C;;GAEG;AAEH;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,GAAG;IAC7D,IAAI,EAAE,KAAK,CAAC;IACZ;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,uBAAuB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;GAGG;AAEH,MAAM,MAAM,qBAAqB,GAAG,sBAAsB,GAAG;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,qBAAqB,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAAC;AAEF;;;;GAIG;AAEH,MAAM,MAAM,sBAAsB,GAAG,sBAAsB,GAAG;IAC5D,IAAI,EAAE,OAAO,CAAC;IAEd;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,sBAAsB,CAAC;CACjC,CAAC;AAEF;;;GAGG;AAEH,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,KAAK,CAAC;IAEZ;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,KAAK,CAAC;IAEZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,sBAAsB,CAAC;CACjC,CAAC;AAEF;;;;GAIG;AAEH,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,0BAA0B,CAAC;CACrC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAClE,MAAM,MAAM,UAAU,GACpB,gBAAgB,GAAG,cAAc,GAAG,eAAe,GAAG,aAAa,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAC9G,MAAM,MAAM,gBAAgB,GACxB,uBAAuB,GACvB,qBAAqB,GACrB,sBAAsB,GACtB,oBAAoB,GACpB,sBAAsB,GACtB,0BAA0B,CAAC"}
|
package/dist/common/queuews.d.ts
CHANGED
|
@@ -13,12 +13,17 @@ export type ReadyCallback = (headers?: ReadyQwsMessageHeaders) => void | Promise
|
|
|
13
13
|
/**
|
|
14
14
|
* Connection options
|
|
15
15
|
*/
|
|
16
|
-
type QWebSocketOptions = {
|
|
16
|
+
export type QWebSocketOptions = {
|
|
17
17
|
name?: string;
|
|
18
18
|
extraConnectArgs?: Record<string, unknown>;
|
|
19
19
|
reconnect?: boolean;
|
|
20
20
|
reconnectNumTries?: number;
|
|
21
21
|
reconnectIntervalMillis?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Interval of heartbeats detecting dead connections, 0 disables them.
|
|
24
|
+
* A connection is terminated if nothing arrives during a whole interval after a heartbeat.
|
|
25
|
+
*/
|
|
26
|
+
heartbeatIntervalMillis?: number;
|
|
22
27
|
};
|
|
23
28
|
/**
|
|
24
29
|
* Actual queued WebSocket
|
|
@@ -32,6 +37,14 @@ export default class QWebSocket {
|
|
|
32
37
|
needed: boolean;
|
|
33
38
|
wws: WrappedWebSocket;
|
|
34
39
|
ready: boolean;
|
|
40
|
+
closed: boolean;
|
|
41
|
+
heartbeatTimer?: ReturnType<typeof setInterval>;
|
|
42
|
+
heartbeatSentAt: number;
|
|
43
|
+
heartbeatConfirmed: boolean;
|
|
44
|
+
pendingAcks: Map<number, {
|
|
45
|
+
resolve: () => void;
|
|
46
|
+
reject: (error: Error) => void;
|
|
47
|
+
}>;
|
|
35
48
|
callbacks: {
|
|
36
49
|
onConnect?: ConnectCallback;
|
|
37
50
|
onBin: RouteRecognizer;
|
|
@@ -58,6 +71,22 @@ export default class QWebSocket {
|
|
|
58
71
|
* Main logic
|
|
59
72
|
*/
|
|
60
73
|
setUp(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Heartbeat: if nothing (not even its answer) arrived since the previous heartbeat,
|
|
76
|
+
* the connection is dead and is terminated, which triggers the usual close/reconnect logic.
|
|
77
|
+
* Checking per tick instead of measuring time since the last message
|
|
78
|
+
* tolerates throttled timers in background browser tabs.
|
|
79
|
+
*/
|
|
80
|
+
private startHeartbeat;
|
|
81
|
+
private stopHeartbeat;
|
|
82
|
+
/**
|
|
83
|
+
* Resolves once the other side acknowledged the message with the given index (returned by send/sendToRoute).
|
|
84
|
+
* Rejects if the connection is closed for good before that.
|
|
85
|
+
* Reconnecting connections keep and resend their unacknowledged messages, so they don't reject on reconnect.
|
|
86
|
+
*/
|
|
87
|
+
waitForAck(idx: number): Promise<void>;
|
|
88
|
+
private acknowledge;
|
|
89
|
+
private rejectPendingAcks;
|
|
61
90
|
flush(): void;
|
|
62
91
|
send(body: Binary | Record<string, unknown>, extraHeaders?: QwsMessageExtraHeaders): number;
|
|
63
92
|
sendToRoute(route: string | undefined, body: Binary | Record<string, unknown>, extraHeaders?: QwsMessageExtraHeaders): number;
|
|
@@ -67,5 +96,4 @@ export default class QWebSocket {
|
|
|
67
96
|
*/
|
|
68
97
|
close(): Promise<void>;
|
|
69
98
|
}
|
|
70
|
-
export {};
|
|
71
99
|
//# sourceMappingURL=queuews.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queuews.d.ts","sourceRoot":"","sources":["../../src/common/queuews.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAOL,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,qBAAqB,MAAM,YAAY,CAAC;AAC/C,OAAO,gBAAgB,MAAM,yBAAyB,CAAC;AAcvD;;GAEG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AACpF,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACxH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACrH,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvF;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"queuews.d.ts","sourceRoot":"","sources":["../../src/common/queuews.ts"],"names":[],"mappings":"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"}
|
package/dist/common/queuews.js
CHANGED
|
@@ -18,6 +18,7 @@ const defaultOpts = {
|
|
|
18
18
|
reconnect: true,
|
|
19
19
|
reconnectNumTries: 12,
|
|
20
20
|
reconnectIntervalMillis: 5000,
|
|
21
|
+
heartbeatIntervalMillis: 25_000,
|
|
21
22
|
};
|
|
22
23
|
/**
|
|
23
24
|
* Actual queued WebSocket
|
|
@@ -38,6 +39,10 @@ export default class QWebSocket {
|
|
|
38
39
|
this.reconnectionAttempts = 0;
|
|
39
40
|
this.needed = true;
|
|
40
41
|
this.ready = false;
|
|
42
|
+
this.closed = false;
|
|
43
|
+
this.heartbeatSentAt = 0;
|
|
44
|
+
this.heartbeatConfirmed = false;
|
|
45
|
+
this.pendingAcks = new Map();
|
|
41
46
|
autoBind(this);
|
|
42
47
|
this.setUp();
|
|
43
48
|
}
|
|
@@ -85,6 +90,7 @@ export default class QWebSocket {
|
|
|
85
90
|
if (reconnect && this.reconnectionAttempts > reconnectNumTries) {
|
|
86
91
|
logger.error(`${this.name}: Connection timed out, should re-connect entirely`);
|
|
87
92
|
void this.callbacks.onError?.(`WS connection timeout, max tries (${reconnectNumTries}) exceeded`);
|
|
93
|
+
this.rejectPendingAcks();
|
|
88
94
|
return;
|
|
89
95
|
}
|
|
90
96
|
/**
|
|
@@ -102,6 +108,13 @@ export default class QWebSocket {
|
|
|
102
108
|
});
|
|
103
109
|
this.wws = new WrappedWebSocket(connectUrl);
|
|
104
110
|
}
|
|
111
|
+
this.wws.onPing(() => {
|
|
112
|
+
this.wws.send({ headers: { type: 'pong' } });
|
|
113
|
+
});
|
|
114
|
+
this.wws.onPong(() => {
|
|
115
|
+
// peer knows qws heartbeats, missing answers may now be treated as a dead connection
|
|
116
|
+
this.heartbeatConfirmed = true;
|
|
117
|
+
});
|
|
105
118
|
this.wws.onWsError(async (event) => {
|
|
106
119
|
// ws error will prompt reconnection which can time out, don't reject instantly
|
|
107
120
|
const message = decodeErrorMessage(event);
|
|
@@ -115,6 +128,7 @@ export default class QWebSocket {
|
|
|
115
128
|
});
|
|
116
129
|
this.wws.onWsOpen(async () => {
|
|
117
130
|
this.reconnectionAttempts = 0;
|
|
131
|
+
this.startHeartbeat();
|
|
118
132
|
logger.info(reconnect
|
|
119
133
|
? `${this.name}: Connection established after ${this.reconnectionAttempts} tries`
|
|
120
134
|
: `${this.name}: Connection established`);
|
|
@@ -145,7 +159,7 @@ export default class QWebSocket {
|
|
|
145
159
|
logger.info(`${this.name}: Socket ready to send${readyIdx ? `from chunk ${readyIdx}` : ''}`);
|
|
146
160
|
// if server sent chunk index to resume from, move queue cursors appropriately
|
|
147
161
|
if (readyIdx !== undefined) {
|
|
148
|
-
this.
|
|
162
|
+
this.acknowledge(readyIdx - 1);
|
|
149
163
|
this.queue.revert(readyIdx);
|
|
150
164
|
}
|
|
151
165
|
this.ready = true;
|
|
@@ -227,7 +241,7 @@ export default class QWebSocket {
|
|
|
227
241
|
});
|
|
228
242
|
this.wws.onAck((message) => {
|
|
229
243
|
// acknowledgment received
|
|
230
|
-
this.
|
|
244
|
+
this.acknowledge(message.headers.ackIdx);
|
|
231
245
|
if (!this.queue.numUnackMessages && !this.needed) {
|
|
232
246
|
this.wws.close();
|
|
233
247
|
}
|
|
@@ -238,6 +252,7 @@ export default class QWebSocket {
|
|
|
238
252
|
await this.callbacks.onError?.(message.headers.error);
|
|
239
253
|
});
|
|
240
254
|
this.wws.onWsClose(async () => {
|
|
255
|
+
this.stopHeartbeat();
|
|
241
256
|
if (reconnect && this.needed) {
|
|
242
257
|
// if locally closed, needed should be false
|
|
243
258
|
// if it's true, it means we lost the connection and should try to re-connect
|
|
@@ -256,14 +271,82 @@ export default class QWebSocket {
|
|
|
256
271
|
logger.info(`${this.name}: Closed with messages still in queue`);
|
|
257
272
|
await this.callbacks.onError?.('Closed with messages still in queue');
|
|
258
273
|
await this.callbacks.onClose?.();
|
|
274
|
+
this.rejectPendingAcks();
|
|
259
275
|
}
|
|
260
276
|
else {
|
|
261
277
|
// all is well
|
|
262
278
|
logger.info(`${this.name}: Closed correctly`);
|
|
263
279
|
await this.callbacks.onClose?.();
|
|
280
|
+
this.rejectPendingAcks();
|
|
264
281
|
}
|
|
265
282
|
});
|
|
266
283
|
}
|
|
284
|
+
/**
|
|
285
|
+
* Heartbeat: if nothing (not even its answer) arrived since the previous heartbeat,
|
|
286
|
+
* the connection is dead and is terminated, which triggers the usual close/reconnect logic.
|
|
287
|
+
* Checking per tick instead of measuring time since the last message
|
|
288
|
+
* tolerates throttled timers in background browser tabs.
|
|
289
|
+
*/
|
|
290
|
+
startHeartbeat() {
|
|
291
|
+
this.stopHeartbeat();
|
|
292
|
+
const { heartbeatIntervalMillis } = this.options;
|
|
293
|
+
if (!heartbeatIntervalMillis) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const { wws } = this;
|
|
297
|
+
this.heartbeatConfirmed = wws.heartbeatAnsweredByProtocol;
|
|
298
|
+
this.heartbeatSentAt = 0;
|
|
299
|
+
this.heartbeatTimer = setInterval(() => {
|
|
300
|
+
if (wws.readyState !== WebSocket.OPEN) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (this.heartbeatConfirmed && this.heartbeatSentAt && wws.lastActivity < this.heartbeatSentAt) {
|
|
304
|
+
logger.warn(`${this.name}: No answer to heartbeat in ${heartbeatIntervalMillis}ms, terminating connection`);
|
|
305
|
+
this.stopHeartbeat();
|
|
306
|
+
wws.terminate();
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
this.heartbeatSentAt = Date.now();
|
|
310
|
+
wws.sendHeartbeat();
|
|
311
|
+
}, heartbeatIntervalMillis);
|
|
312
|
+
}
|
|
313
|
+
stopHeartbeat() {
|
|
314
|
+
clearInterval(this.heartbeatTimer);
|
|
315
|
+
this.heartbeatTimer = undefined;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Resolves once the other side acknowledged the message with the given index (returned by send/sendToRoute).
|
|
319
|
+
* Rejects if the connection is closed for good before that.
|
|
320
|
+
* Reconnecting connections keep and resend their unacknowledged messages, so they don't reject on reconnect.
|
|
321
|
+
*/
|
|
322
|
+
waitForAck(idx) {
|
|
323
|
+
if (idx < this.queue.ackIdx) {
|
|
324
|
+
return Promise.resolve();
|
|
325
|
+
}
|
|
326
|
+
if (this.closed) {
|
|
327
|
+
return Promise.reject(new Error(`${this.name}: Connection closed, message ${idx} will not be acknowledged`));
|
|
328
|
+
}
|
|
329
|
+
return new Promise((resolve, reject) => {
|
|
330
|
+
this.pendingAcks.set(idx, { resolve, reject });
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
acknowledge(idx) {
|
|
334
|
+
this.queue.acknowledge(idx);
|
|
335
|
+
for (const [pendingIdx, { resolve }] of this.pendingAcks) {
|
|
336
|
+
if (pendingIdx > idx) {
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
this.pendingAcks.delete(pendingIdx);
|
|
340
|
+
resolve();
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
rejectPendingAcks() {
|
|
344
|
+
this.closed = true;
|
|
345
|
+
for (const [idx, { reject }] of this.pendingAcks) {
|
|
346
|
+
reject(new Error(`${this.name}: Connection closed, message ${idx} will not be acknowledged`));
|
|
347
|
+
}
|
|
348
|
+
this.pendingAcks.clear();
|
|
349
|
+
}
|
|
267
350
|
flush() {
|
|
268
351
|
// connection is not open
|
|
269
352
|
if (this.wws.readyState !== WebSocket.OPEN || !this.ready) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queuews.js","sourceRoot":"","sources":["../../src/common/queuews.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,eAAe,MAAM,aAAa,CAAC;AAe1C,OAAO,qBAAqB,MAAM,YAAY,CAAC;AAC/C,OAAO,gBAAgB,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAU,EAAE;IACpD,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAyB,CAAC;IAC1D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,oDAAoD;IACpD,gEAAgE;IAChE,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;AACjD,CAAC,CAAC;AAsBF,MAAM,WAAW,GAA+B;IAC9C,gBAAgB,EAAE,EAAE;IACpB,SAAS,EAAE,IAAI;IACf,iBAAiB,EAAE,EAAE;IACrB,uBAAuB,EAAE,IAAI;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAqB7B,YAAY,OAA2B,EAAE,UAA6B,EAAE;QACtE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG;YACb,GAAG,WAAW;YACd,GAAG,OAAO;SACX,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG;YACf,KAAK,EAAE,IAAI,eAAe,EAAE;YAC5B,MAAM,EAAE,IAAI,eAAe,EAAE;SAC9B,CAAC;QAEF,IAAI,CAAC,KAAK,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACzC,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED;;OAEG;IAEH,SAAS,CAAC,QAAyB;QACjC,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,QAAQ,CAAC;IACtC,CAAC;IAED,UAAU,CAAC,YAAoB,EAAE,QAAqB;QACpD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,QAAqB;QACzB,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,WAAW,CAAI,YAAoB,EAAE,QAAyB;QAC5D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,CAAI,QAAyB;QACjC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,QAAuB;QAC7B,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC;IACpC,CAAC;IAED,qBAAqB,CAAC,QAAoB;QACxC,IAAI,CAAC,SAAS,CAAC,qBAAqB,GAAG,QAAQ,CAAC;IAClD,CAAC;IAED,OAAO,CAAC,QAAmC;QACzC,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,QAAoB;QAC1B,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC;IACpC,CAAC;IAED;;OAEG;IAEH,kDAAkD;IAClD,KAAK;QACH,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;QAC/B,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAEjG,6CAA6C;QAC7C,IAAI,SAAS,IAAI,IAAI,CAAC,oBAAoB,GAAG,iBAAkB,EAAE,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,oDAAoD,CAAC,CAAC;YAC/E,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,qCAAqC,iBAAiB,YAAY,CAAC,CAAC;YAClG,OAAO;QACT,CAAC;QAED;;WAEG;QACH,IAAI,IAAI,CAAC,OAAO,YAAY,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;YACzF,MAAM,EAAE,GAAG,IAAI,CAAC,OAAoB,CAAC;YACrC,IAAI,CAAC,GAAG,GAAG,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACpC,+FAA+F;QACjG,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE;gBACnD,GAAG,gBAAgB;gBACnB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;aACvB,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACjC,+EAA+E;YAC/E,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,wBAAwB,OAAO,EAAE,CAAC,CAAC;YAE5D,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,OAAO,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC3B,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CACT,SAAS;gBACP,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,kCAAkC,IAAI,CAAC,oBAAoB,QAAQ;gBACjF,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,0BAA0B,CAC3C,CAAC;YAEF,IAAI,CAAC;gBACH,oEAAoE;gBACpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC;gBAEpD,0BAA0B;gBAC1B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,OAAO;wBACb,QAAQ;qBACT;iBACiB,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,wFAAwF;gBACxF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC;qBACjC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAwB,EAAE,EAAE;YAClD,kDAAkD;YAClD,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,yBAAyB,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7F,8EAA8E;YAC9E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,wCAAwC;YACxC,IAAI,CAAC,KAAK,EAAE,CAAC;YAEb,IAAI,CAAC;gBACH,yBAAyB;gBACzB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,wFAAwF;gBACxF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC;qBACjC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;YACjD,0BAA0B;YAC1B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YAElC,IAAI,CAAC;gBACH,iBAAiB;gBACjB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACzE,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,OAAO,GAAG,KAAK,CAAC,OAAsB,CAAC;oBAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAmB,CAAC;oBACzC,MAAM,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBACzC,CAAC;gBAED,2BAA2B;gBAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,KAAK;wBACX,MAAM,EAAE,OAAO,CAAC,GAAG;qBACpB;iBACe,CAAC,CAAC;YACtB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,8DAA8D;gBAC9D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC;qBACjC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;YAChD,0BAA0B;YAC1B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YAElC,IAAI,CAAC;gBACH,iBAAiB;gBACjB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC1E,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,OAAO,GAAG,KAAK,CAAC,OAAgC,CAAC;oBACvD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAmB,CAAC;oBACzC,MAAM,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBACzC,CAAC;gBAED,2BAA2B;gBAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,KAAK;wBACX,MAAM,EAAE,OAAO,CAAC,GAAG;qBACpB;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,4DAA4D;gBAC5D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC;qBACjC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAsB,EAAE,EAAE;YACxC,0BAA0B;YAC1B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,OAAwB,EAAE,EAAE;YAChD,eAAe;YACf,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,qBAAqB,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACvE,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC5B,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7B,4CAA4C;gBAC5C,6EAA6E;gBAC7E,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,oDAAoD,uBAAuB,OAAO,CAAC,CAAC;gBAC5G,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAC;gBACxD,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,qBAAqB,CAAC,CAAC;YACtE,CAAC;iBAAM,IAAI,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBACpD,sEAAsE;gBACtE,MAAM,CAAC,IAAI,CACT,GAAG,IAAI,CAAC,IAAI,0DAA0D,uBAAuB,OAAO,CACrG,CAAC;gBACF,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAC;gBACxD,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,qCAAqC,CAAC,CAAC;YACtF,CAAC;iBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBACvC,2EAA2E;gBAC3E,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,uCAAuC,CAAC,CAAC;gBACjE,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,qCAAqC,CAAC,CAAC;gBACtE,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,cAAc;gBACd,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,oBAAoB,CAAC,CAAC;gBAC9C,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,yBAAyB;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;YACjC,gBAAgB;YAChB,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,mBAAmB,GAAG,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM,CAAC,KAAK,CACV,GAAG,IAAI,CAAC,IAAI,0BAA0B,IAAI,CAAC,KAAK,CAAC,iBAAiB,eAAe,IAAI,CAAC,KAAK,CAAC,cAAc,QAAQ,CACnH,CAAC;YACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,+CAA+C,CAAC,CAAC;YAC1E,8CAA8C;YAC9C,6DAA6D;YAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAsC,EAAE,eAAuC,EAAE;QACpF,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IACzD,CAAC;IAED,WAAW,CACT,KAAyB,EACzB,IAAsC,EACtC,eAAuC,EAAE;QAEzC,iDAAiD;QACjD,IAAI,OAA0B,CAAC;QAE/B,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;YACzB,OAAO,GAAG;gBACR,OAAO,EAAE;oBACP,IAAI,EAAE,KAAK;oBACX,KAAK;oBACL,GAAG,YAAY;iBAChB;gBACD,IAAI;aACL,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,GAAG;gBACR,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,KAAK;oBACL,GAAG,YAAY;iBAChB;gBACD,IAAI;aACa,CAAC;QACtB,CAAC;QAED,4BAA4B;QAC5B,MAAM,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAExC,mFAAmF;QACnF,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC/E,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAEpB,gDAAgD;YAChD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,KAAK,IAAI,EAAE;gBAClC,MAAM,OAAO,EAAE,EAAE,CAAC;gBAClB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YAEF,iCAAiC;YACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"queuews.js","sourceRoot":"","sources":["../../src/common/queuews.ts"],"names":[],"mappings":"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"}
|