qws-browser 1.1.1 → 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 +21 -0
- package/dist/browser/messageencode.d.ts +2 -1
- package/dist/browser/messageencode.d.ts.map +1 -0
- package/dist/browser/messageencode.js +32 -25
- package/dist/browser/messageencode.js.map +1 -0
- package/dist/browser/wrappedws.d.ts +25 -2
- package/dist/browser/wrappedws.d.ts.map +1 -0
- package/dist/browser/wrappedws.js +57 -20
- package/dist/browser/wrappedws.js.map +1 -0
- package/dist/common/discriminator.d.ts +2 -1
- package/dist/common/discriminator.d.ts.map +1 -0
- package/dist/common/discriminator.js +2 -2
- package/dist/common/discriminator.js.map +1 -0
- package/dist/common/logger.d.ts +11 -10
- package/dist/common/logger.d.ts.map +1 -0
- package/dist/common/logger.js +8 -13
- package/dist/common/logger.js.map +1 -0
- package/dist/common/message.d.ts +31 -27
- package/dist/common/message.d.ts.map +1 -0
- package/dist/common/message.js +2 -2
- package/dist/common/message.js.map +1 -0
- package/dist/common/queryparser.d.ts +1 -4
- package/dist/common/queryparser.d.ts.map +1 -0
- package/dist/common/queryparser.js +6 -82
- package/dist/common/queryparser.js.map +1 -0
- package/dist/common/queue.d.ts +4 -3
- package/dist/common/queue.d.ts.map +1 -0
- package/dist/common/queue.js +10 -12
- package/dist/common/queue.js.map +1 -0
- package/dist/common/queuews.d.ts +41 -12
- package/dist/common/queuews.d.ts.map +1 -0
- package/dist/common/queuews.js +153 -83
- package/dist/common/queuews.js.map +1 -0
- package/dist/common/router.d.ts +9 -0
- package/dist/common/router.d.ts.map +1 -0
- package/dist/common/router.js +8 -0
- package/dist/common/router.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -25
- package/dist/index.js.map +1 -0
- package/package.json +29 -30
|
@@ -1,85 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.toUrlParams = exports.addQueryParameters = exports.addQueryParamsToUrl = exports.parseQuery = exports.parseUrl = void 0;
|
|
4
|
-
// parse query parameters from URL
|
|
5
|
-
const parseUrl = (urlString) => {
|
|
1
|
+
// add query parameters to URL
|
|
2
|
+
export const addQueryParamsToUrl = (urlString, params) => {
|
|
6
3
|
const url = new URL(urlString);
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
query[key] = val;
|
|
10
|
-
});
|
|
11
|
-
return query;
|
|
12
|
-
};
|
|
13
|
-
exports.parseUrl = parseUrl;
|
|
14
|
-
// parse query parameters from location
|
|
15
|
-
const parseQuery = (search) => {
|
|
16
|
-
const params = new URLSearchParams(search);
|
|
17
|
-
const query = {};
|
|
18
|
-
params.forEach((val, key) => {
|
|
19
|
-
query[key] = val;
|
|
20
|
-
});
|
|
21
|
-
return query;
|
|
22
|
-
};
|
|
23
|
-
exports.parseQuery = parseQuery;
|
|
24
|
-
// parse query parameters from URL
|
|
25
|
-
const addQueryParamsToUrl = (urlString, params) => {
|
|
26
|
-
const url = new URL(urlString);
|
|
27
|
-
Object.entries(params).forEach(([key, val]) => {
|
|
28
|
-
url.searchParams.set(key, `${val}`);
|
|
29
|
-
});
|
|
30
|
-
return url.toString();
|
|
31
|
-
};
|
|
32
|
-
exports.addQueryParamsToUrl = addQueryParamsToUrl;
|
|
33
|
-
// add extra query parameters to location
|
|
34
|
-
const addQueryParameters = (search, params = {}, defaultParams = {}) => {
|
|
35
|
-
const query = (0, exports.parseQuery)(search);
|
|
36
|
-
let changed = false;
|
|
37
|
-
Object.entries(params).forEach(([key, val]) => {
|
|
38
|
-
if (key in defaultParams) {
|
|
39
|
-
// has default
|
|
40
|
-
if (val !== defaultParams[key]) {
|
|
41
|
-
query[key] = `${val}`;
|
|
42
|
-
changed = true;
|
|
43
|
-
}
|
|
44
|
-
else if (key in query) {
|
|
45
|
-
delete query[key];
|
|
46
|
-
changed = true;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
// no default
|
|
51
|
-
// eslint-disable-next-line no-lonely-if
|
|
52
|
-
if (val !== undefined && val !== null && val !== '') {
|
|
53
|
-
query[key] = `${val}`;
|
|
54
|
-
changed = true;
|
|
55
|
-
}
|
|
56
|
-
else if (key in query) {
|
|
57
|
-
delete query[key];
|
|
58
|
-
changed = true;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
if (!changed) {
|
|
63
|
-
return search;
|
|
4
|
+
for (const [key, val] of Object.entries(params)) {
|
|
5
|
+
url.searchParams.set(key, String(val));
|
|
64
6
|
}
|
|
65
|
-
return
|
|
66
|
-
};
|
|
67
|
-
exports.addQueryParameters = addQueryParameters;
|
|
68
|
-
// parse into URLParams
|
|
69
|
-
const toUrlParams = (query = {}, defaultParams = {}) => {
|
|
70
|
-
const params = {};
|
|
71
|
-
Object.entries(query).forEach(([key, val]) => {
|
|
72
|
-
// omit default values
|
|
73
|
-
if (key in defaultParams && defaultParams[key] === val) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
if (Array.isArray(val)) {
|
|
77
|
-
params[key] = val.join(',');
|
|
78
|
-
}
|
|
79
|
-
else if (val !== undefined && val !== null && val !== '' && !Number.isNaN(val)) {
|
|
80
|
-
params[key] = `${val}`;
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
return new URLSearchParams(params).toString();
|
|
7
|
+
return url.href;
|
|
84
8
|
};
|
|
85
|
-
|
|
9
|
+
//# sourceMappingURL=queryparser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryparser.js","sourceRoot":"","sources":["../../src/common/queryparser.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAiB,EAAE,MAA+B,EAAU,EAAE;IAChG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAE/B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC,CAAC"}
|
package/dist/common/queue.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { PayloadQwsMessage } from './message';
|
|
2
|
-
import { Binary } from './discriminator';
|
|
1
|
+
import { PayloadQwsMessage } from './message.js';
|
|
2
|
+
import { Binary } from './discriminator.js';
|
|
3
3
|
/**
|
|
4
4
|
* FIFO data structure implementation for outgoing qws messages
|
|
5
5
|
* Implements acknowledgment system, so no messages are deleted until acknowledged,
|
|
6
6
|
* but new messages may be added while waiting for ack.
|
|
7
7
|
*/
|
|
8
8
|
export default class QwsMessageQueue {
|
|
9
|
-
messages:
|
|
9
|
+
messages: Map<number, Binary>;
|
|
10
10
|
readIdx: number;
|
|
11
11
|
ackIdx: number;
|
|
12
12
|
writeIdx: number;
|
|
@@ -33,3 +33,4 @@ export default class QwsMessageQueue {
|
|
|
33
33
|
*/
|
|
34
34
|
revert(idx: number): void;
|
|
35
35
|
}
|
|
36
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/common/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IAEjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;;IActB;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM;IAe3C;;;OAGG;IACH,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;IAU3B;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAS9B;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAO1B"}
|
package/dist/common/queue.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const messageencode_1 = require("../browser/messageencode");
|
|
1
|
+
import { serializeMessage } from '../browser/messageencode.js';
|
|
4
2
|
/**
|
|
5
3
|
* FIFO data structure implementation for outgoing qws messages
|
|
6
4
|
* Implements acknowledgment system, so no messages are deleted until acknowledged,
|
|
7
5
|
* but new messages may be added while waiting for ack.
|
|
8
6
|
*/
|
|
9
|
-
class QwsMessageQueue {
|
|
7
|
+
export default class QwsMessageQueue {
|
|
10
8
|
constructor() {
|
|
11
|
-
this.messages =
|
|
9
|
+
this.messages = new Map();
|
|
12
10
|
this.readIdx = 0;
|
|
13
11
|
this.ackIdx = 0;
|
|
14
12
|
this.writeIdx = 0;
|
|
@@ -23,8 +21,8 @@ class QwsMessageQueue {
|
|
|
23
21
|
produce(message) {
|
|
24
22
|
const idx = this.writeIdx;
|
|
25
23
|
message.headers.idx = idx;
|
|
26
|
-
const data =
|
|
27
|
-
this.messages
|
|
24
|
+
const data = serializeMessage(message);
|
|
25
|
+
this.messages.set(idx, data);
|
|
28
26
|
this.numUnsentMessages += 1;
|
|
29
27
|
this.numUnsentBytes += data.size;
|
|
30
28
|
this.numUnackMessages += 1;
|
|
@@ -38,7 +36,7 @@ class QwsMessageQueue {
|
|
|
38
36
|
*/
|
|
39
37
|
consume() {
|
|
40
38
|
const idx = this.readIdx;
|
|
41
|
-
const ret = this.messages
|
|
39
|
+
const ret = this.messages.get(idx);
|
|
42
40
|
this.numUnsentMessages -= 1;
|
|
43
41
|
this.numUnsentBytes -= ret.size;
|
|
44
42
|
this.readIdx += 1;
|
|
@@ -50,8 +48,8 @@ class QwsMessageQueue {
|
|
|
50
48
|
acknowledge(idx) {
|
|
51
49
|
while (this.ackIdx <= idx) {
|
|
52
50
|
this.numUnackMessages -= 1;
|
|
53
|
-
this.numUnackBytes -= this.messages
|
|
54
|
-
|
|
51
|
+
this.numUnackBytes -= this.messages.get(this.ackIdx).size;
|
|
52
|
+
this.messages.delete(this.ackIdx);
|
|
55
53
|
this.ackIdx += 1;
|
|
56
54
|
}
|
|
57
55
|
}
|
|
@@ -62,8 +60,8 @@ class QwsMessageQueue {
|
|
|
62
60
|
while (this.readIdx > idx) {
|
|
63
61
|
this.readIdx -= 1;
|
|
64
62
|
this.numUnsentMessages += 1;
|
|
65
|
-
this.numUnsentBytes += this.messages
|
|
63
|
+
this.numUnsentBytes += this.messages.get(this.readIdx).size;
|
|
66
64
|
}
|
|
67
65
|
}
|
|
68
66
|
}
|
|
69
|
-
|
|
67
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/common/queue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,eAAe;IAWlC;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAElB,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAA0B;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1B,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;QAC1B,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC;QAEhC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QAEpC,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,GAAW;QACrB,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC;YAC3D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;YAClB,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC;QAC/D,CAAC;IACH,CAAC;CACF"}
|
package/dist/common/queuews.d.ts
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
|
-
import RouteRecognizer from '
|
|
2
|
-
import { Binary } from './discriminator';
|
|
3
|
-
import { QwsMessageExtraHeaders, BinaryQwsMessageHeaders, JsonQwsMessageHeaders, ReadyQwsMessageHeaders, QwsParams } from './message';
|
|
4
|
-
import WebSocketMessageQueue from './queue';
|
|
5
|
-
import WrappedWebSocket from '../browser/wrappedws';
|
|
1
|
+
import RouteRecognizer from './router.js';
|
|
2
|
+
import { Binary } from './discriminator.js';
|
|
3
|
+
import { QwsMessageExtraHeaders, BinaryQwsMessageHeaders, JsonQwsMessageHeaders, ReadyQwsMessageHeaders, QwsParams } from './message.js';
|
|
4
|
+
import WebSocketMessageQueue from './queue.js';
|
|
5
|
+
import WrappedWebSocket from '../browser/wrappedws.js';
|
|
6
6
|
/**
|
|
7
7
|
* Callback types
|
|
8
8
|
*/
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export
|
|
9
|
+
export type ConnectCallback = () => void | number | Promise<void> | Promise<number>;
|
|
10
|
+
export type BinCallback = (body: Binary, headers?: BinaryQwsMessageHeaders, params?: QwsParams) => void | Promise<void>;
|
|
11
|
+
export type JsonCallback<T> = (body: T, headers?: JsonQwsMessageHeaders, params?: QwsParams) => void | Promise<void>;
|
|
12
|
+
export type ReadyCallback = (headers?: ReadyQwsMessageHeaders) => void | Promise<void>;
|
|
13
13
|
/**
|
|
14
14
|
* Connection options
|
|
15
15
|
*/
|
|
16
|
-
|
|
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,13 +71,29 @@ 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
|
-
sendToRoute(route: string, body: Binary | Record<string, unknown>, extraHeaders?: QwsMessageExtraHeaders): number;
|
|
92
|
+
sendToRoute(route: string | undefined, body: Binary | Record<string, unknown>, extraHeaders?: QwsMessageExtraHeaders): number;
|
|
64
93
|
/**
|
|
65
94
|
* Closes WS and sets promise resolution as callback.
|
|
66
95
|
* Overwrites any manually set up callback for onClose.
|
|
67
96
|
*/
|
|
68
97
|
close(): Promise<void>;
|
|
69
98
|
}
|
|
70
|
-
|
|
99
|
+
//# sourceMappingURL=queuews.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queuews.d.ts","sourceRoot":"","sources":["../../src/common/queuews.ts"],"names":[],"mappings":"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"}
|