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.
Files changed (42) hide show
  1. package/README.md +21 -0
  2. package/dist/browser/messageencode.d.ts +2 -1
  3. package/dist/browser/messageencode.d.ts.map +1 -0
  4. package/dist/browser/messageencode.js +32 -25
  5. package/dist/browser/messageencode.js.map +1 -0
  6. package/dist/browser/wrappedws.d.ts +25 -2
  7. package/dist/browser/wrappedws.d.ts.map +1 -0
  8. package/dist/browser/wrappedws.js +57 -20
  9. package/dist/browser/wrappedws.js.map +1 -0
  10. package/dist/common/discriminator.d.ts +2 -1
  11. package/dist/common/discriminator.d.ts.map +1 -0
  12. package/dist/common/discriminator.js +2 -2
  13. package/dist/common/discriminator.js.map +1 -0
  14. package/dist/common/logger.d.ts +11 -10
  15. package/dist/common/logger.d.ts.map +1 -0
  16. package/dist/common/logger.js +8 -13
  17. package/dist/common/logger.js.map +1 -0
  18. package/dist/common/message.d.ts +31 -27
  19. package/dist/common/message.d.ts.map +1 -0
  20. package/dist/common/message.js +2 -2
  21. package/dist/common/message.js.map +1 -0
  22. package/dist/common/queryparser.d.ts +1 -4
  23. package/dist/common/queryparser.d.ts.map +1 -0
  24. package/dist/common/queryparser.js +6 -82
  25. package/dist/common/queryparser.js.map +1 -0
  26. package/dist/common/queue.d.ts +4 -3
  27. package/dist/common/queue.d.ts.map +1 -0
  28. package/dist/common/queue.js +10 -12
  29. package/dist/common/queue.js.map +1 -0
  30. package/dist/common/queuews.d.ts +41 -12
  31. package/dist/common/queuews.d.ts.map +1 -0
  32. package/dist/common/queuews.js +153 -83
  33. package/dist/common/queuews.js.map +1 -0
  34. package/dist/common/router.d.ts +9 -0
  35. package/dist/common/router.d.ts.map +1 -0
  36. package/dist/common/router.js +8 -0
  37. package/dist/common/router.js.map +1 -0
  38. package/dist/index.d.ts +6 -6
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +6 -25
  41. package/dist/index.js.map +1 -0
  42. package/package.json +29 -30
@@ -1,85 +1,9 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
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 query = {};
8
- url.searchParams.forEach((val, key) => {
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 `?${new URLSearchParams(query).toString()}`;
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
- exports.toUrlParams = toUrlParams;
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"}
@@ -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: Record<number, Binary>;
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"}
@@ -1,14 +1,12 @@
1
- "use strict";
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 = (0, messageencode_1.serializeMessage)(message);
27
- this.messages[idx] = data;
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[idx];
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[this.ackIdx].size;
54
- delete this.messages[this.ackIdx];
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[this.readIdx].size;
63
+ this.numUnsentBytes += this.messages.get(this.readIdx).size;
66
64
  }
67
65
  }
68
66
  }
69
- exports.default = QwsMessageQueue;
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"}
@@ -1,24 +1,29 @@
1
- import RouteRecognizer from 'route-recognizer';
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 declare type ConnectCallback = () => void | number | Promise<void> | Promise<number>;
10
- export declare type BinCallback = (body: Binary, headers?: BinaryQwsMessageHeaders, params?: QwsParams) => void | Promise<void>;
11
- export declare type JsonCallback<T> = (body: T, headers?: JsonQwsMessageHeaders, params?: QwsParams) => void | Promise<void>;
12
- export declare type ReadyCallback = (headers?: ReadyQwsMessageHeaders) => void | Promise<void>;
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
- declare 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,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
- export {};
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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"}