extra-native-websocket 0.3.1 → 0.4.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 (56) hide show
  1. package/README.md +1 -1
  2. package/lib/{es2015/extra-native-websocket.d.ts → extra-native-websocket.d.ts} +4 -2
  3. package/lib/{es2015/extra-native-websocket.js → extra-native-websocket.js} +12 -16
  4. package/lib/extra-native-websocket.js.map +1 -0
  5. package/lib/index.d.ts +3 -0
  6. package/lib/index.js +4 -0
  7. package/lib/index.js.map +1 -0
  8. package/lib/{es2015/utils → utils}/auto-reconnect-with-exponential-back-off.d.ts +1 -1
  9. package/lib/{es2018/utils → utils}/auto-reconnect-with-exponential-back-off.js +10 -14
  10. package/lib/utils/auto-reconnect-with-exponential-back-off.js.map +1 -0
  11. package/lib/{es2015/utils → utils}/auto-reconnect.d.ts +1 -1
  12. package/lib/utils/auto-reconnect.js +34 -0
  13. package/lib/utils/auto-reconnect.js.map +1 -0
  14. package/lib/utils/index.d.ts +2 -0
  15. package/lib/utils/index.js +3 -0
  16. package/lib/utils/index.js.map +1 -0
  17. package/lib/websocket-error.js +14 -0
  18. package/lib/websocket-error.js.map +1 -0
  19. package/package.json +39 -36
  20. package/src/extra-native-websocket.ts +139 -0
  21. package/src/index.ts +3 -0
  22. package/src/utils/auto-reconnect-with-exponential-back-off.ts +60 -0
  23. package/src/utils/auto-reconnect.ts +36 -0
  24. package/src/utils/index.ts +2 -0
  25. package/src/websocket-error.ts +17 -0
  26. package/lib/es2015/extra-native-websocket.js.map +0 -1
  27. package/lib/es2015/index.d.ts +0 -3
  28. package/lib/es2015/index.js +0 -20
  29. package/lib/es2015/index.js.map +0 -1
  30. package/lib/es2015/utils/auto-reconnect-with-exponential-back-off.js +0 -59
  31. package/lib/es2015/utils/auto-reconnect-with-exponential-back-off.js.map +0 -1
  32. package/lib/es2015/utils/auto-reconnect.js +0 -49
  33. package/lib/es2015/utils/auto-reconnect.js.map +0 -1
  34. package/lib/es2015/utils/index.d.ts +0 -2
  35. package/lib/es2015/utils/index.js +0 -19
  36. package/lib/es2015/utils/index.js.map +0 -1
  37. package/lib/es2015/websocket-error.js +0 -18
  38. package/lib/es2015/websocket-error.js.map +0 -1
  39. package/lib/es2018/extra-native-websocket.d.ts +0 -29
  40. package/lib/es2018/extra-native-websocket.js +0 -118
  41. package/lib/es2018/extra-native-websocket.js.map +0 -1
  42. package/lib/es2018/index.d.ts +0 -3
  43. package/lib/es2018/index.js +0 -20
  44. package/lib/es2018/index.js.map +0 -1
  45. package/lib/es2018/utils/auto-reconnect-with-exponential-back-off.d.ts +0 -7
  46. package/lib/es2018/utils/auto-reconnect-with-exponential-back-off.js.map +0 -1
  47. package/lib/es2018/utils/auto-reconnect.d.ts +0 -2
  48. package/lib/es2018/utils/auto-reconnect.js +0 -38
  49. package/lib/es2018/utils/auto-reconnect.js.map +0 -1
  50. package/lib/es2018/utils/index.d.ts +0 -2
  51. package/lib/es2018/utils/index.js +0 -19
  52. package/lib/es2018/utils/index.js.map +0 -1
  53. package/lib/es2018/websocket-error.d.ts +0 -6
  54. package/lib/es2018/websocket-error.js +0 -18
  55. package/lib/es2018/websocket-error.js.map +0 -1
  56. /package/lib/{es2015/websocket-error.d.ts → websocket-error.d.ts} +0 -0
package/README.md CHANGED
@@ -48,7 +48,7 @@ class ExtraNativeWebSocket extends Emitter<{
48
48
  */
49
49
  connect(): Promise<void>
50
50
  close(code?: number, reason?: string): Promise<void>
51
- send(data: unknown): void
51
+ send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void
52
52
  }
53
53
  ```
54
54
 
@@ -9,6 +9,7 @@ export declare enum State {
9
9
  Connected = 2,
10
10
  Closing = 3
11
11
  }
12
+ type Data = string | ArrayBufferLike | Blob | ArrayBufferView;
12
13
  export declare class ExtraNativeWebSocket extends Emitter<{
13
14
  open: [event: Event];
14
15
  message: [event: MessageEvent];
@@ -18,12 +19,13 @@ export declare class ExtraNativeWebSocket extends Emitter<{
18
19
  private createWebSocket;
19
20
  private instance?;
20
21
  private binaryType;
21
- protected unsentMessages: Queue<string | ArrayBufferLike | ArrayBufferView | Blob>;
22
+ protected unsentMessages: Queue<Data>;
22
23
  constructor(createWebSocket: () => WebSocket);
23
24
  getState(): State;
24
25
  getBinaryType(): BinaryType;
25
26
  setBinaryType(val: BinaryType): void;
26
27
  connect(): Promise<void>;
27
28
  close(code?: number, reason?: string): Promise<void>;
28
- send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
29
+ send(data: Data): void;
29
30
  }
31
+ export {};
@@ -1,21 +1,18 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ExtraNativeWebSocket = exports.State = exports.BinaryType = void 0;
4
- const prelude_1 = require("@blackglory/prelude");
5
- const websocket_error_1 = require("./websocket-error");
6
- const structures_1 = require("@blackglory/structures");
7
- var BinaryType;
1
+ import { assert } from '@blackglory/prelude';
2
+ import { WebSocketError } from './websocket-error.js';
3
+ import { Queue, Emitter } from '@blackglory/structures';
4
+ export var BinaryType;
8
5
  (function (BinaryType) {
9
6
  BinaryType[BinaryType["Blob"] = 0] = "Blob";
10
7
  BinaryType[BinaryType["ArrayBuffer"] = 1] = "ArrayBuffer";
11
- })(BinaryType = exports.BinaryType || (exports.BinaryType = {}));
12
- var State;
8
+ })(BinaryType || (BinaryType = {}));
9
+ export var State;
13
10
  (function (State) {
14
11
  State[State["Closed"] = 0] = "Closed";
15
12
  State[State["Connecting"] = 1] = "Connecting";
16
13
  State[State["Connected"] = 2] = "Connected";
17
14
  State[State["Closing"] = 3] = "Closing";
18
- })(State = exports.State || (exports.State = {}));
15
+ })(State || (State = {}));
19
16
  var ReadyState;
20
17
  (function (ReadyState) {
21
18
  ReadyState[ReadyState["CONNECTING"] = 0] = "CONNECTING";
@@ -23,12 +20,12 @@ var ReadyState;
23
20
  ReadyState[ReadyState["CLOSING"] = 2] = "CLOSING";
24
21
  ReadyState[ReadyState["CLOSED"] = 3] = "CLOSED";
25
22
  })(ReadyState || (ReadyState = {}));
26
- class ExtraNativeWebSocket extends structures_1.Emitter {
23
+ export class ExtraNativeWebSocket extends Emitter {
27
24
  constructor(createWebSocket) {
28
25
  super();
29
26
  this.createWebSocket = createWebSocket;
30
27
  this.binaryType = BinaryType.Blob;
31
- this.unsentMessages = new structures_1.Queue();
28
+ this.unsentMessages = new Queue();
32
29
  }
33
30
  getState() {
34
31
  if (this.instance) {
@@ -63,7 +60,7 @@ class ExtraNativeWebSocket extends structures_1.Emitter {
63
60
  }
64
61
  connect() {
65
62
  return new Promise((resolve, reject) => {
66
- (0, prelude_1.assert)(this.getState() === State.Closed, 'WebSocket is not closed');
63
+ assert(this.getState() === State.Closed, 'WebSocket is not closed');
67
64
  const self = this;
68
65
  const ws = this.instance = this.createWebSocket();
69
66
  ws.addEventListener('error', errorListener, { once: true });
@@ -77,7 +74,7 @@ class ExtraNativeWebSocket extends structures_1.Emitter {
77
74
  ws.addEventListener('close', closeListener, { once: true });
78
75
  }
79
76
  function closeListener(event) {
80
- reject(new websocket_error_1.WebSocketError(event.code, event.reason));
77
+ reject(new WebSocketError(event.code, event.reason));
81
78
  }
82
79
  function openListener(event) {
83
80
  ws.removeEventListener('error', errorListener);
@@ -91,7 +88,7 @@ class ExtraNativeWebSocket extends structures_1.Emitter {
91
88
  }
92
89
  close(code, reason) {
93
90
  return new Promise(resolve => {
94
- (0, prelude_1.assert)(this.instance, 'WebSocket is not created');
91
+ assert(this.instance, 'WebSocket is not created');
95
92
  switch (this.getState()) {
96
93
  case State.Closed:
97
94
  resolve();
@@ -114,5 +111,4 @@ class ExtraNativeWebSocket extends structures_1.Emitter {
114
111
  }
115
112
  }
116
113
  }
117
- exports.ExtraNativeWebSocket = ExtraNativeWebSocket;
118
114
  //# sourceMappingURL=extra-native-websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extra-native-websocket.js","sourceRoot":"","sources":["../src/extra-native-websocket.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './extra-native-websocket.js';
2
+ export * from './websocket-error.js';
3
+ export * from './utils/index.js';
package/lib/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from './extra-native-websocket.js';
2
+ export * from './websocket-error.js';
3
+ export * from './utils/index.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,kBAAkB,CAAA"}
@@ -1,4 +1,4 @@
1
- import { ExtraNativeWebSocket } from "../extra-native-websocket";
1
+ import { ExtraNativeWebSocket } from "../extra-native-websocket.js";
2
2
  export declare function autoReconnectWithExponentialBackOff(ws: ExtraNativeWebSocket, { baseTimeout, maxTimeout, factor, jitter }: {
3
3
  baseTimeout: number;
4
4
  maxTimeout?: number;
@@ -1,14 +1,11 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.autoReconnectWithExponentialBackOff = void 0;
4
- const extra_native_websocket_1 = require("../extra-native-websocket");
5
- const extra_timers_1 = require("extra-timers");
6
- const prelude_1 = require("@blackglory/prelude");
7
- const extra_promise_1 = require("extra-promise");
8
- const wait_for_1 = require("@blackglory/wait-for");
9
- function autoReconnectWithExponentialBackOff(ws, { baseTimeout, maxTimeout = Infinity, factor = 2, jitter = true }) {
1
+ import { State } from "../extra-native-websocket.js";
2
+ import { calculateExponentialBackoffTimeout } from 'extra-timers';
3
+ import { pass } from '@blackglory/prelude';
4
+ import { delay } from 'extra-promise';
5
+ import { waitForFunction } from '@blackglory/wait-for';
6
+ export function autoReconnectWithExponentialBackOff(ws, { baseTimeout, maxTimeout = Infinity, factor = 2, jitter = true }) {
10
7
  const controller = new AbortController();
11
- const removeErrorListener = ws.on('error', prelude_1.pass);
8
+ const removeErrorListener = ws.on('error', pass);
12
9
  let removeCloseListener = ws.once('close', closeListener);
13
10
  return () => {
14
11
  controller.abort();
@@ -20,7 +17,7 @@ function autoReconnectWithExponentialBackOff(ws, { baseTimeout, maxTimeout = Inf
20
17
  while (true) {
21
18
  if (controller.signal.aborted)
22
19
  return;
23
- await (0, extra_promise_1.delay)((0, extra_timers_1.calculateExponentialBackoffTimeout)({
20
+ await delay(calculateExponentialBackoffTimeout({
24
21
  retries,
25
22
  baseTimeout,
26
23
  maxTimeout,
@@ -30,7 +27,7 @@ function autoReconnectWithExponentialBackOff(ws, { baseTimeout, maxTimeout = Inf
30
27
  if (controller.signal.aborted)
31
28
  return;
32
29
  try {
33
- await (0, wait_for_1.waitForFunction)(() => ws.getState() === extra_native_websocket_1.State.Closed);
30
+ await waitForFunction(() => ws.getState() === State.Closed);
34
31
  await ws.connect();
35
32
  if (controller.signal.aborted)
36
33
  return;
@@ -39,10 +36,9 @@ function autoReconnectWithExponentialBackOff(ws, { baseTimeout, maxTimeout = Inf
39
36
  }
40
37
  catch (_a) {
41
38
  retries++;
42
- (0, prelude_1.pass)();
39
+ pass();
43
40
  }
44
41
  }
45
42
  }
46
43
  }
47
- exports.autoReconnectWithExponentialBackOff = autoReconnectWithExponentialBackOff;
48
44
  //# sourceMappingURL=auto-reconnect-with-exponential-back-off.js.map
@@ -0,0 +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;AAEtD,MAAM,UAAU,mCAAmC,CACjD,EAAwB,EACxB,EACE,WAAW,EACX,UAAU,GAAG,QAAQ,EACrB,MAAM,GAAG,CAAC,EACV,MAAM,GAAG,IAAI,EAMd;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IAGxC,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;QAClB,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;gBACX,UAAU;gBACV,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,EAAE,CAAA;gBAClB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAM;gBAErC,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;gBACrD,MAAK;YACP,CAAC;YAAC,WAAM,CAAC;gBACP,OAAO,EAAE,CAAA;gBACT,IAAI,EAAE,CAAA;YACR,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,2 +1,2 @@
1
- import { ExtraNativeWebSocket } from "../extra-native-websocket";
1
+ import { ExtraNativeWebSocket } from "../extra-native-websocket.js";
2
2
  export declare function autoReconnect(ws: ExtraNativeWebSocket, timeout?: number): () => void;
@@ -0,0 +1,34 @@
1
+ import { State } from "../extra-native-websocket.js";
2
+ import { delay } from 'extra-promise';
3
+ import { AbortController } from 'extra-abort';
4
+ import { pass } from '@blackglory/prelude';
5
+ import { waitForFunction } from '@blackglory/wait-for';
6
+ export function autoReconnect(ws, timeout = 0) {
7
+ const controller = new AbortController();
8
+ let removeCloseListener = ws.once('close', closeListener);
9
+ return () => {
10
+ controller.abort();
11
+ removeCloseListener();
12
+ };
13
+ async function closeListener() {
14
+ while (true) {
15
+ if (controller.signal.aborted)
16
+ return;
17
+ await delay(timeout);
18
+ if (controller.signal.aborted)
19
+ return;
20
+ try {
21
+ await waitForFunction(() => ws.getState() === State.Closed);
22
+ await ws.connect();
23
+ if (controller.signal.aborted)
24
+ return;
25
+ removeCloseListener = ws.once('close', closeListener);
26
+ break;
27
+ }
28
+ catch (_a) {
29
+ pass();
30
+ }
31
+ }
32
+ }
33
+ }
34
+ //# sourceMappingURL=auto-reconnect.js.map
@@ -0,0 +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,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,MAAM,UAAU,aAAa,CAAC,EAAwB,EAAE,UAAkB,CAAC;IACzE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IAExC,IAAI,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAEzD,OAAO,GAAG,EAAE;QACV,UAAU,CAAC,KAAK,EAAE,CAAA;QAClB,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,OAAO,CAAC,CAAA;YACpB,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,EAAE,CAAA;gBAClB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAM;gBAErC,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;gBACrD,MAAK;YACP,CAAC;YAAC,WAAM,CAAC;gBACP,IAAI,EAAE,CAAA;YACR,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './auto-reconnect.js';
2
+ export * from './auto-reconnect-with-exponential-back-off.js';
@@ -0,0 +1,3 @@
1
+ export * from './auto-reconnect.js';
2
+ export * from './auto-reconnect-with-exponential-back-off.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,+CAA+C,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { CustomError } from '@blackglory/errors';
2
+ export class WebSocketError extends CustomError {
3
+ constructor(code, reason) {
4
+ if (reason) {
5
+ super(`${code}: ${reason}`);
6
+ }
7
+ else {
8
+ super(`${code}`);
9
+ }
10
+ this.code = code;
11
+ this.reason = reason;
12
+ }
13
+ }
14
+ //# sourceMappingURL=websocket-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-error.js","sourceRoot":"","sources":["../src/websocket-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,MAAM,OAAO,cAAe,SAAQ,WAAW;IAI7C,YAAY,IAAY,EAAE,MAAc;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;QAClB,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF"}
package/package.json CHANGED
@@ -1,66 +1,69 @@
1
1
  {
2
2
  "name": "extra-native-websocket",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "files": [
7
7
  "lib",
8
- "dist"
8
+ "src"
9
9
  ],
10
- "main": "lib/es2018/index.js",
11
- "types": "lib/es2018/index.d.ts",
10
+ "type": "module",
11
+ "main": "lib/index.js",
12
+ "types": "lib/index.d.ts",
12
13
  "repository": "git@github.com:BlackGlory/extra-native-websocket.git",
13
14
  "author": "BlackGlory <woshenmedoubuzhidao@blackglory.me>",
14
15
  "license": "MIT",
15
16
  "sideEffects": false,
17
+ "engines": {
18
+ "node": ">=18.17.0"
19
+ },
16
20
  "scripts": {
17
21
  "prepare": "ts-patch install -s",
18
22
  "lint": "eslint --ext .js,.jsx,.ts,.tsx --quiet src __tests__",
19
- "test": "jest --runInBand --no-cache --config jest.config.js",
20
- "test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand",
21
- "test:coverage": "jest --coverage --config jest.config.js",
23
+ "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --runInBand --config jest.config.cjs",
24
+ "test:debug": "cross-env NODE_OPTIONS=--experimental-vm-modules node --inspect-brk node_modules/.bin/jest --runInBand --config jest.config.cjs",
22
25
  "prepublishOnly": "run-s prepare clean build",
23
- "clean": "run-p clean:*",
24
- "clean:build": "rimraf lib",
25
- "build": "run-p build:*",
26
- "build:es2015": "tsc --project tsconfig.build.json --module commonjs --target es2015 --outDir lib/es2015",
27
- "build:es2018": "tsc --project tsconfig.build.json --module commonjs --target es2018 --outDir lib/es2018",
26
+ "clean": "rimraf lib",
27
+ "build": "tsc --project tsconfig.build.json --outDir lib",
28
28
  "release": "standard-version"
29
29
  },
30
30
  "husky": {
31
31
  "hooks": {
32
- "pre-commit": "run-s prepare lint build",
32
+ "pre-commit": "run-s prepare lint test build",
33
33
  "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
34
34
  }
35
35
  },
36
36
  "devDependencies": {
37
- "@commitlint/cli": "^17.0.2",
38
- "@commitlint/config-conventional": "^17.0.2",
39
- "@types/jest": "^27.5.1",
40
- "@types/ws": "^8.5.3",
41
- "@typescript-eslint/eslint-plugin": "^5.27.1",
42
- "@typescript-eslint/parser": "^5.27.1",
43
- "eslint": "^8.17.0",
37
+ "@blackglory/jest-resolver": "^0.3.1",
38
+ "@commitlint/cli": "^18.4.3",
39
+ "@commitlint/config-conventional": "^18.4.3",
40
+ "@types/jest": "^29.5.11",
41
+ "@types/ws": "^8.5.10",
42
+ "@typescript-eslint/eslint-plugin": "^6.13.2",
43
+ "@typescript-eslint/parser": "^6.13.2",
44
+ "cross-env": "^7.0.3",
45
+ "eslint": "^8.55.0",
44
46
  "husky": "4",
45
- "jest": "^28.1.1",
46
- "jest-environment-jsdom": "^28.1.1",
47
+ "jest": "^29.7.0",
48
+ "jest-environment-jsdom": "^29.7.0",
49
+ "jest-resolve": "^29.7.0",
47
50
  "npm-run-all": "^4.1.5",
48
- "return-style": "^1.0.0",
49
- "rimraf": "^3.0.2",
51
+ "return-style": "^3.0.1",
52
+ "rimraf": "^5.0.5",
50
53
  "standard-version": "^9.5.0",
51
- "ts-jest": "^28.0.4",
52
- "ts-patch": "^2.0.1",
53
- "tslib": "^2.4.0",
54
- "typescript": "^4.7.3",
55
- "typescript-transform-paths": "^3.3.1",
56
- "ws": "^8.7.0"
54
+ "ts-jest": "^29.1.1",
55
+ "ts-patch": "^3.1.1",
56
+ "tslib": "^2.6.2",
57
+ "typescript": "^5.3.3",
58
+ "typescript-transform-paths": "^3.4.6",
59
+ "ws": "^8.14.2"
57
60
  },
58
61
  "dependencies": {
59
- "@blackglory/errors": "^2.2.1",
60
- "@blackglory/prelude": "^0.1.1",
61
- "@blackglory/structures": "^0.6.0",
62
- "@blackglory/wait-for": "^0.5.0",
63
- "extra-abort": "^0.1.2",
64
- "extra-promise": "^2.0.0"
62
+ "@blackglory/errors": "^3.0.3",
63
+ "@blackglory/prelude": "^0.3.4",
64
+ "@blackglory/structures": "^0.13.4",
65
+ "@blackglory/wait-for": "^0.7.4",
66
+ "extra-abort": "^0.3.7",
67
+ "extra-promise": "^6.0.8"
65
68
  }
66
69
  }
@@ -0,0 +1,139 @@
1
+ import { assert } from '@blackglory/prelude'
2
+ import { WebSocketError } from './websocket-error.js'
3
+ import { Queue, Emitter } from '@blackglory/structures'
4
+
5
+ export enum BinaryType {
6
+ Blob
7
+ , ArrayBuffer
8
+ }
9
+
10
+ export enum State {
11
+ Closed
12
+ , Connecting
13
+ , Connected
14
+ , Closing
15
+ }
16
+
17
+ enum ReadyState {
18
+ CONNECTING = 0
19
+ , OPEN = 1
20
+ , CLOSING = 2
21
+ , CLOSED = 3
22
+ }
23
+
24
+ type Data = string | ArrayBufferLike | Blob | ArrayBufferView
25
+
26
+ export class ExtraNativeWebSocket extends Emitter<{
27
+ open: [event: Event]
28
+ message: [event: MessageEvent]
29
+ error: [event: Event]
30
+ close: [event: CloseEvent]
31
+ }> {
32
+ private instance?: WebSocket
33
+ private binaryType: BinaryType = BinaryType.Blob
34
+ protected unsentMessages = new Queue<Data>()
35
+
36
+ constructor(private createWebSocket: () => WebSocket) {
37
+ super()
38
+ }
39
+
40
+ getState(): State {
41
+ if (this.instance) {
42
+ switch (this.instance.readyState) {
43
+ case ReadyState.CONNECTING: return State.Connecting
44
+ case ReadyState.OPEN: return State.Connected
45
+ case ReadyState.CLOSING: return State.Closing
46
+ case ReadyState.CLOSED: return State.Closed
47
+ default: throw new Error('Unknown state')
48
+ }
49
+ } else {
50
+ return State.Closed
51
+ }
52
+ }
53
+
54
+ getBinaryType(): BinaryType {
55
+ return this.binaryType
56
+ }
57
+
58
+ setBinaryType(val: BinaryType): void {
59
+ this.binaryType = val
60
+
61
+ if (this.instance) {
62
+ switch (val) {
63
+ case BinaryType.Blob:
64
+ this.instance.binaryType = 'blob'
65
+ break
66
+ case BinaryType.ArrayBuffer:
67
+ this.instance.binaryType = 'arraybuffer'
68
+ break
69
+ default: throw new Error('Unknown binary type')
70
+ }
71
+ }
72
+ }
73
+
74
+ /**
75
+ * @throws {WebSocketError}
76
+ */
77
+ connect(): Promise<void> {
78
+ return new Promise((resolve, reject) => {
79
+ assert(this.getState() === State.Closed, 'WebSocket is not closed')
80
+
81
+ const self = this
82
+ const ws = this.instance = this.createWebSocket()
83
+
84
+ ws.addEventListener('error', errorListener, { once: true })
85
+
86
+ ws.addEventListener('open', event => this.emit('open', event))
87
+ ws.addEventListener('message', event => this.emit('message', event))
88
+ ws.addEventListener('error', event => this.emit('error', event))
89
+ ws.addEventListener('close', event => this.emit('close', event))
90
+
91
+ this.setBinaryType(this.binaryType)
92
+
93
+ ws.addEventListener('open', openListener, { once: true })
94
+
95
+ function errorListener(event: Event): void {
96
+ ws.addEventListener('close', closeListener, { once: true })
97
+ }
98
+
99
+ function closeListener(event: CloseEvent): void {
100
+ reject(new WebSocketError(event.code, event.reason))
101
+ }
102
+
103
+ function openListener(event: Event): void {
104
+ ws.removeEventListener('error', errorListener)
105
+ ws.removeEventListener('close', closeListener)
106
+ for (let size = self.unsentMessages.size; size--;) {
107
+ self.send(self.unsentMessages.dequeue()!)
108
+ }
109
+ resolve()
110
+ }
111
+ })
112
+ }
113
+
114
+ close(code?: number, reason?: string): Promise<void> {
115
+ return new Promise<void>(resolve => {
116
+ assert(this.instance, 'WebSocket is not created')
117
+
118
+ switch (this.getState()) {
119
+ case State.Closed:
120
+ resolve()
121
+ break
122
+ case State.Closing:
123
+ this.instance.addEventListener('close', () => resolve(), { once: true })
124
+ break
125
+ default:
126
+ this.instance.addEventListener('close', () => resolve(), { once: true })
127
+ this.instance.close(code, reason)
128
+ }
129
+ })
130
+ }
131
+
132
+ send(data: Data): void {
133
+ if (this.getState() === State.Connected) {
134
+ this.instance!.send(data)
135
+ } else {
136
+ this.unsentMessages.enqueue(data)
137
+ }
138
+ }
139
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './extra-native-websocket.js'
2
+ export * from './websocket-error.js'
3
+ export * from './utils/index.js'
@@ -0,0 +1,60 @@
1
+ import { ExtraNativeWebSocket, State } from '@src/extra-native-websocket.js'
2
+ import { calculateExponentialBackoffTimeout } from 'extra-timers'
3
+ import { pass } from '@blackglory/prelude'
4
+ import { delay } from 'extra-promise'
5
+ import { waitForFunction } from '@blackglory/wait-for'
6
+
7
+ export function autoReconnectWithExponentialBackOff(
8
+ ws: ExtraNativeWebSocket
9
+ , {
10
+ baseTimeout
11
+ , maxTimeout = Infinity
12
+ , factor = 2
13
+ , jitter = true
14
+ }: {
15
+ baseTimeout: number
16
+ maxTimeout?: number
17
+ factor?: number
18
+ jitter?: boolean
19
+ }
20
+ ): () => void {
21
+ const controller = new AbortController()
22
+
23
+ // Make sure the error listener is added, prevent crashes due to uncaught errors.
24
+ const removeErrorListener = ws.on('error', pass)
25
+ let removeCloseListener = ws.once('close', closeListener)
26
+
27
+ return () => {
28
+ controller.abort()
29
+ removeCloseListener()
30
+ removeErrorListener()
31
+ }
32
+
33
+ async function closeListener(): Promise<void> {
34
+ let retries = 0
35
+ while (true) {
36
+ if (controller.signal.aborted) return
37
+
38
+ await delay(calculateExponentialBackoffTimeout({
39
+ retries
40
+ , baseTimeout
41
+ , maxTimeout
42
+ , factor
43
+ , jitter
44
+ }))
45
+ if (controller.signal.aborted) return
46
+
47
+ try {
48
+ await waitForFunction(() => ws.getState() === State.Closed)
49
+ await ws.connect()
50
+ if (controller.signal.aborted) return
51
+
52
+ removeCloseListener = ws.once('close', closeListener)
53
+ break
54
+ } catch {
55
+ retries++
56
+ pass()
57
+ }
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,36 @@
1
+ import { ExtraNativeWebSocket, State } from '@src/extra-native-websocket.js'
2
+ import { delay } from 'extra-promise'
3
+ import { AbortController } from 'extra-abort'
4
+ import { pass } from '@blackglory/prelude'
5
+ import { waitForFunction } from '@blackglory/wait-for'
6
+
7
+ export function autoReconnect(ws: ExtraNativeWebSocket, timeout: number = 0): () => void {
8
+ const controller = new AbortController()
9
+
10
+ let removeCloseListener = ws.once('close', closeListener)
11
+
12
+ return () => {
13
+ controller.abort()
14
+ removeCloseListener()
15
+ }
16
+
17
+ async function closeListener(): Promise<void> {
18
+ while (true) {
19
+ if (controller.signal.aborted) return
20
+
21
+ await delay(timeout)
22
+ if (controller.signal.aborted) return
23
+
24
+ try {
25
+ await waitForFunction(() => ws.getState() === State.Closed)
26
+ await ws.connect()
27
+ if (controller.signal.aborted) return
28
+
29
+ removeCloseListener = ws.once('close', closeListener)
30
+ break
31
+ } catch {
32
+ pass()
33
+ }
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,2 @@
1
+ export * from './auto-reconnect.js'
2
+ export * from './auto-reconnect-with-exponential-back-off.js'
@@ -0,0 +1,17 @@
1
+ import { CustomError } from '@blackglory/errors'
2
+
3
+ export class WebSocketError extends CustomError {
4
+ readonly code: number
5
+ readonly reason: string
6
+
7
+ constructor(code: number, reason: string) {
8
+ if (reason) {
9
+ super(`${code}: ${reason}`)
10
+ } else {
11
+ super(`${code}`)
12
+ }
13
+
14
+ this.code = code
15
+ this.reason = reason
16
+ }
17
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"extra-native-websocket.js","sourceRoot":"","sources":["../../src/extra-native-websocket.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export * from './extra-native-websocket';
2
- export * from './websocket-error';
3
- export * from './utils';
@@ -1,20 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./extra-native-websocket"), exports);
18
- __exportStar(require("./websocket-error"), exports);
19
- __exportStar(require("./utils"), exports);
20
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAwC;AACxC,oDAAiC;AACjC,0CAAuB"}
@@ -1,59 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.autoReconnectWithExponentialBackOff = void 0;
13
- const extra_native_websocket_1 = require("../extra-native-websocket");
14
- const extra_timers_1 = require("extra-timers");
15
- const prelude_1 = require("@blackglory/prelude");
16
- const extra_promise_1 = require("extra-promise");
17
- const wait_for_1 = require("@blackglory/wait-for");
18
- function autoReconnectWithExponentialBackOff(ws, { baseTimeout, maxTimeout = Infinity, factor = 2, jitter = true }) {
19
- const controller = new AbortController();
20
- const removeErrorListener = ws.on('error', prelude_1.pass);
21
- let removeCloseListener = ws.once('close', closeListener);
22
- return () => {
23
- controller.abort();
24
- removeCloseListener();
25
- removeErrorListener();
26
- };
27
- function closeListener() {
28
- return __awaiter(this, void 0, void 0, function* () {
29
- let retries = 0;
30
- while (true) {
31
- if (controller.signal.aborted)
32
- return;
33
- yield (0, extra_promise_1.delay)((0, extra_timers_1.calculateExponentialBackoffTimeout)({
34
- retries,
35
- baseTimeout,
36
- maxTimeout,
37
- factor,
38
- jitter
39
- }));
40
- if (controller.signal.aborted)
41
- return;
42
- try {
43
- yield (0, wait_for_1.waitForFunction)(() => ws.getState() === extra_native_websocket_1.State.Closed);
44
- yield ws.connect();
45
- if (controller.signal.aborted)
46
- return;
47
- removeCloseListener = ws.once('close', closeListener);
48
- break;
49
- }
50
- catch (_a) {
51
- retries++;
52
- (0, prelude_1.pass)();
53
- }
54
- }
55
- });
56
- }
57
- }
58
- exports.autoReconnectWithExponentialBackOff = autoReconnectWithExponentialBackOff;
59
- //# sourceMappingURL=auto-reconnect-with-exponential-back-off.js.map
@@ -1 +0,0 @@
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,sEAAyE;AACzE,+CAAiE;AACjE,iDAA0C;AAC1C,iDAAqC;AACrC,mDAAsD;AAEtD,SAAgB,mCAAmC,CACjD,EAAwB,EACxB,EACE,WAAW,EACX,UAAU,GAAG,QAAQ,EACrB,MAAM,GAAG,CAAC,EACV,MAAM,GAAG,IAAI,EAMd;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IAGxC,MAAM,mBAAmB,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,cAAI,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;QAClB,mBAAmB,EAAE,CAAA;QACrB,mBAAmB,EAAE,CAAA;IACvB,CAAC,CAAA;IAED,SAAe,aAAa;;YAC1B,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,OAAO,IAAI,EAAE;gBACX,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAM;gBAErC,MAAM,IAAA,qBAAK,EAAC,IAAA,iDAAkC,EAAC;oBAC7C,OAAO;oBACP,WAAW;oBACX,UAAU;oBACV,MAAM;oBACN,MAAM;iBACP,CAAC,CAAC,CAAA;gBACH,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAM;gBAErC,IAAI;oBACF,MAAM,IAAA,0BAAe,EAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,8BAAK,CAAC,MAAM,CAAC,CAAA;oBAC3D,MAAM,EAAE,CAAC,OAAO,EAAE,CAAA;oBAClB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;wBAAE,OAAM;oBAErC,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;oBACrD,MAAK;iBACN;gBAAC,WAAM;oBACN,OAAO,EAAE,CAAA;oBACT,IAAA,cAAI,GAAE,CAAA;iBACP;aACF;QACH,CAAC;KAAA;AACH,CAAC;AArDD,kFAqDC"}
@@ -1,49 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.autoReconnect = void 0;
13
- const extra_native_websocket_1 = require("../extra-native-websocket");
14
- const extra_promise_1 = require("extra-promise");
15
- const extra_abort_1 = require("extra-abort");
16
- const prelude_1 = require("@blackglory/prelude");
17
- const wait_for_1 = require("@blackglory/wait-for");
18
- function autoReconnect(ws, timeout = 0) {
19
- const controller = new extra_abort_1.AbortController();
20
- let removeCloseListener = ws.once('close', closeListener);
21
- return () => {
22
- controller.abort();
23
- removeCloseListener();
24
- };
25
- function closeListener() {
26
- return __awaiter(this, void 0, void 0, function* () {
27
- while (true) {
28
- if (controller.signal.aborted)
29
- return;
30
- yield (0, extra_promise_1.delay)(timeout);
31
- if (controller.signal.aborted)
32
- return;
33
- try {
34
- yield (0, wait_for_1.waitForFunction)(() => ws.getState() === extra_native_websocket_1.State.Closed);
35
- yield ws.connect();
36
- if (controller.signal.aborted)
37
- return;
38
- removeCloseListener = ws.once('close', closeListener);
39
- break;
40
- }
41
- catch (_a) {
42
- (0, prelude_1.pass)();
43
- }
44
- }
45
- });
46
- }
47
- }
48
- exports.autoReconnect = autoReconnect;
49
- //# sourceMappingURL=auto-reconnect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-reconnect.js","sourceRoot":"","sources":["../../../src/utils/auto-reconnect.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sEAAyE;AACzE,iDAAqC;AACrC,6CAA6C;AAC7C,iDAA0C;AAC1C,mDAAsD;AAEtD,SAAgB,aAAa,CAAC,EAAwB,EAAE,UAAkB,CAAC;IACzE,MAAM,UAAU,GAAG,IAAI,6BAAe,EAAE,CAAA;IAExC,IAAI,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAEzD,OAAO,GAAG,EAAE;QACV,UAAU,CAAC,KAAK,EAAE,CAAA;QAClB,mBAAmB,EAAE,CAAA;IACvB,CAAC,CAAA;IAED,SAAe,aAAa;;YAC1B,OAAO,IAAI,EAAE;gBACX,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAM;gBAErC,MAAM,IAAA,qBAAK,EAAC,OAAO,CAAC,CAAA;gBACpB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAM;gBAErC,IAAI;oBACF,MAAM,IAAA,0BAAe,EAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,8BAAK,CAAC,MAAM,CAAC,CAAA;oBAC3D,MAAM,EAAE,CAAC,OAAO,EAAE,CAAA;oBAClB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;wBAAE,OAAM;oBAErC,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;oBACrD,MAAK;iBACN;gBAAC,WAAM;oBACN,IAAA,cAAI,GAAE,CAAA;iBACP;aACF;QACH,CAAC;KAAA;AACH,CAAC;AA7BD,sCA6BC"}
@@ -1,2 +0,0 @@
1
- export * from './auto-reconnect';
2
- export * from './auto-reconnect-with-exponential-back-off';
@@ -1,19 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./auto-reconnect"), exports);
18
- __exportStar(require("./auto-reconnect-with-exponential-back-off"), exports);
19
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAgC;AAChC,6EAA0D"}
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WebSocketError = void 0;
4
- const errors_1 = require("@blackglory/errors");
5
- class WebSocketError extends errors_1.CustomError {
6
- constructor(code, reason) {
7
- if (reason) {
8
- super(`${code}: ${reason}`);
9
- }
10
- else {
11
- super(`${code}`);
12
- }
13
- this.code = code;
14
- this.reason = reason;
15
- }
16
- }
17
- exports.WebSocketError = WebSocketError;
18
- //# sourceMappingURL=websocket-error.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-error.js","sourceRoot":"","sources":["../../src/websocket-error.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAEhD,MAAa,cAAe,SAAQ,oBAAW;IAI7C,YAAY,IAAY,EAAE,MAAc;QACtC,IAAI,MAAM,EAAE;YACV,KAAK,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAA;SAC5B;aAAM;YACL,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;SACjB;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAdD,wCAcC"}
@@ -1,29 +0,0 @@
1
- import { Queue, Emitter } from '@blackglory/structures';
2
- export declare enum BinaryType {
3
- Blob = 0,
4
- ArrayBuffer = 1
5
- }
6
- export declare enum State {
7
- Closed = 0,
8
- Connecting = 1,
9
- Connected = 2,
10
- Closing = 3
11
- }
12
- export declare class ExtraNativeWebSocket extends Emitter<{
13
- open: [event: Event];
14
- message: [event: MessageEvent];
15
- error: [event: Event];
16
- close: [event: CloseEvent];
17
- }> {
18
- private createWebSocket;
19
- private instance?;
20
- private binaryType;
21
- protected unsentMessages: Queue<string | ArrayBufferLike | ArrayBufferView | Blob>;
22
- constructor(createWebSocket: () => WebSocket);
23
- getState(): State;
24
- getBinaryType(): BinaryType;
25
- setBinaryType(val: BinaryType): void;
26
- connect(): Promise<void>;
27
- close(code?: number, reason?: string): Promise<void>;
28
- send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
29
- }
@@ -1,118 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ExtraNativeWebSocket = exports.State = exports.BinaryType = void 0;
4
- const prelude_1 = require("@blackglory/prelude");
5
- const websocket_error_1 = require("./websocket-error");
6
- const structures_1 = require("@blackglory/structures");
7
- var BinaryType;
8
- (function (BinaryType) {
9
- BinaryType[BinaryType["Blob"] = 0] = "Blob";
10
- BinaryType[BinaryType["ArrayBuffer"] = 1] = "ArrayBuffer";
11
- })(BinaryType = exports.BinaryType || (exports.BinaryType = {}));
12
- var State;
13
- (function (State) {
14
- State[State["Closed"] = 0] = "Closed";
15
- State[State["Connecting"] = 1] = "Connecting";
16
- State[State["Connected"] = 2] = "Connected";
17
- State[State["Closing"] = 3] = "Closing";
18
- })(State = exports.State || (exports.State = {}));
19
- var ReadyState;
20
- (function (ReadyState) {
21
- ReadyState[ReadyState["CONNECTING"] = 0] = "CONNECTING";
22
- ReadyState[ReadyState["OPEN"] = 1] = "OPEN";
23
- ReadyState[ReadyState["CLOSING"] = 2] = "CLOSING";
24
- ReadyState[ReadyState["CLOSED"] = 3] = "CLOSED";
25
- })(ReadyState || (ReadyState = {}));
26
- class ExtraNativeWebSocket extends structures_1.Emitter {
27
- constructor(createWebSocket) {
28
- super();
29
- this.createWebSocket = createWebSocket;
30
- this.binaryType = BinaryType.Blob;
31
- this.unsentMessages = new structures_1.Queue();
32
- }
33
- getState() {
34
- if (this.instance) {
35
- switch (this.instance.readyState) {
36
- case ReadyState.CONNECTING: return State.Connecting;
37
- case ReadyState.OPEN: return State.Connected;
38
- case ReadyState.CLOSING: return State.Closing;
39
- case ReadyState.CLOSED: return State.Closed;
40
- default: throw new Error('Unknown state');
41
- }
42
- }
43
- else {
44
- return State.Closed;
45
- }
46
- }
47
- getBinaryType() {
48
- return this.binaryType;
49
- }
50
- setBinaryType(val) {
51
- this.binaryType = val;
52
- if (this.instance) {
53
- switch (val) {
54
- case BinaryType.Blob:
55
- this.instance.binaryType = 'blob';
56
- break;
57
- case BinaryType.ArrayBuffer:
58
- this.instance.binaryType = 'arraybuffer';
59
- break;
60
- default: throw new Error('Unknown binary type');
61
- }
62
- }
63
- }
64
- connect() {
65
- return new Promise((resolve, reject) => {
66
- (0, prelude_1.assert)(this.getState() === State.Closed, 'WebSocket is not closed');
67
- const self = this;
68
- const ws = this.instance = this.createWebSocket();
69
- ws.addEventListener('error', errorListener, { once: true });
70
- ws.addEventListener('open', event => this.emit('open', event));
71
- ws.addEventListener('message', event => this.emit('message', event));
72
- ws.addEventListener('error', event => this.emit('error', event));
73
- ws.addEventListener('close', event => this.emit('close', event));
74
- this.setBinaryType(this.binaryType);
75
- ws.addEventListener('open', openListener, { once: true });
76
- function errorListener(event) {
77
- ws.addEventListener('close', closeListener, { once: true });
78
- }
79
- function closeListener(event) {
80
- reject(new websocket_error_1.WebSocketError(event.code, event.reason));
81
- }
82
- function openListener(event) {
83
- ws.removeEventListener('error', errorListener);
84
- ws.removeEventListener('close', closeListener);
85
- for (let size = self.unsentMessages.size; size--;) {
86
- self.send(self.unsentMessages.dequeue());
87
- }
88
- resolve();
89
- }
90
- });
91
- }
92
- close(code, reason) {
93
- return new Promise(resolve => {
94
- (0, prelude_1.assert)(this.instance, 'WebSocket is not created');
95
- switch (this.getState()) {
96
- case State.Closed:
97
- resolve();
98
- break;
99
- case State.Closing:
100
- this.instance.addEventListener('close', () => resolve(), { once: true });
101
- break;
102
- default:
103
- this.instance.addEventListener('close', () => resolve(), { once: true });
104
- this.instance.close(code, reason);
105
- }
106
- });
107
- }
108
- send(data) {
109
- if (this.getState() === State.Connected) {
110
- this.instance.send(data);
111
- }
112
- else {
113
- this.unsentMessages.enqueue(data);
114
- }
115
- }
116
- }
117
- exports.ExtraNativeWebSocket = ExtraNativeWebSocket;
118
- //# sourceMappingURL=extra-native-websocket.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extra-native-websocket.js","sourceRoot":"","sources":["../../src/extra-native-websocket.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export * from './extra-native-websocket';
2
- export * from './websocket-error';
3
- export * from './utils';
@@ -1,20 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./extra-native-websocket"), exports);
18
- __exportStar(require("./websocket-error"), exports);
19
- __exportStar(require("./utils"), exports);
20
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAwC;AACxC,oDAAiC;AACjC,0CAAuB"}
@@ -1,7 +0,0 @@
1
- import { ExtraNativeWebSocket } from "../extra-native-websocket";
2
- export declare function autoReconnectWithExponentialBackOff(ws: ExtraNativeWebSocket, { baseTimeout, maxTimeout, factor, jitter }: {
3
- baseTimeout: number;
4
- maxTimeout?: number;
5
- factor?: number;
6
- jitter?: boolean;
7
- }): () => void;
@@ -1 +0,0 @@
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,sEAAyE;AACzE,+CAAiE;AACjE,iDAA0C;AAC1C,iDAAqC;AACrC,mDAAsD;AAEtD,SAAgB,mCAAmC,CACjD,EAAwB,EACxB,EACE,WAAW,EACX,UAAU,GAAG,QAAQ,EACrB,MAAM,GAAG,CAAC,EACV,MAAM,GAAG,IAAI,EAMd;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IAGxC,MAAM,mBAAmB,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,cAAI,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;QAClB,mBAAmB,EAAE,CAAA;QACrB,mBAAmB,EAAE,CAAA;IACvB,CAAC,CAAA;IAED,KAAK,UAAU,aAAa;QAC1B,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,EAAE;YACX,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YAErC,MAAM,IAAA,qBAAK,EAAC,IAAA,iDAAkC,EAAC;gBAC7C,OAAO;gBACP,WAAW;gBACX,UAAU;gBACV,MAAM;gBACN,MAAM;aACP,CAAC,CAAC,CAAA;YACH,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YAErC,IAAI;gBACF,MAAM,IAAA,0BAAe,EAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,8BAAK,CAAC,MAAM,CAAC,CAAA;gBAC3D,MAAM,EAAE,CAAC,OAAO,EAAE,CAAA;gBAClB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAM;gBAErC,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;gBACrD,MAAK;aACN;YAAC,WAAM;gBACN,OAAO,EAAE,CAAA;gBACT,IAAA,cAAI,GAAE,CAAA;aACP;SACF;IACH,CAAC;AACH,CAAC;AArDD,kFAqDC"}
@@ -1,2 +0,0 @@
1
- import { ExtraNativeWebSocket } from "../extra-native-websocket";
2
- export declare function autoReconnect(ws: ExtraNativeWebSocket, timeout?: number): () => void;
@@ -1,38 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.autoReconnect = void 0;
4
- const extra_native_websocket_1 = require("../extra-native-websocket");
5
- const extra_promise_1 = require("extra-promise");
6
- const extra_abort_1 = require("extra-abort");
7
- const prelude_1 = require("@blackglory/prelude");
8
- const wait_for_1 = require("@blackglory/wait-for");
9
- function autoReconnect(ws, timeout = 0) {
10
- const controller = new extra_abort_1.AbortController();
11
- let removeCloseListener = ws.once('close', closeListener);
12
- return () => {
13
- controller.abort();
14
- removeCloseListener();
15
- };
16
- async function closeListener() {
17
- while (true) {
18
- if (controller.signal.aborted)
19
- return;
20
- await (0, extra_promise_1.delay)(timeout);
21
- if (controller.signal.aborted)
22
- return;
23
- try {
24
- await (0, wait_for_1.waitForFunction)(() => ws.getState() === extra_native_websocket_1.State.Closed);
25
- await ws.connect();
26
- if (controller.signal.aborted)
27
- return;
28
- removeCloseListener = ws.once('close', closeListener);
29
- break;
30
- }
31
- catch (_a) {
32
- (0, prelude_1.pass)();
33
- }
34
- }
35
- }
36
- }
37
- exports.autoReconnect = autoReconnect;
38
- //# sourceMappingURL=auto-reconnect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-reconnect.js","sourceRoot":"","sources":["../../../src/utils/auto-reconnect.ts"],"names":[],"mappings":";;;AAAA,sEAAyE;AACzE,iDAAqC;AACrC,6CAA6C;AAC7C,iDAA0C;AAC1C,mDAAsD;AAEtD,SAAgB,aAAa,CAAC,EAAwB,EAAE,UAAkB,CAAC;IACzE,MAAM,UAAU,GAAG,IAAI,6BAAe,EAAE,CAAA;IAExC,IAAI,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAEzD,OAAO,GAAG,EAAE;QACV,UAAU,CAAC,KAAK,EAAE,CAAA;QAClB,mBAAmB,EAAE,CAAA;IACvB,CAAC,CAAA;IAED,KAAK,UAAU,aAAa;QAC1B,OAAO,IAAI,EAAE;YACX,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YAErC,MAAM,IAAA,qBAAK,EAAC,OAAO,CAAC,CAAA;YACpB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YAErC,IAAI;gBACF,MAAM,IAAA,0BAAe,EAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,8BAAK,CAAC,MAAM,CAAC,CAAA;gBAC3D,MAAM,EAAE,CAAC,OAAO,EAAE,CAAA;gBAClB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAM;gBAErC,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;gBACrD,MAAK;aACN;YAAC,WAAM;gBACN,IAAA,cAAI,GAAE,CAAA;aACP;SACF;IACH,CAAC;AACH,CAAC;AA7BD,sCA6BC"}
@@ -1,2 +0,0 @@
1
- export * from './auto-reconnect';
2
- export * from './auto-reconnect-with-exponential-back-off';
@@ -1,19 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./auto-reconnect"), exports);
18
- __exportStar(require("./auto-reconnect-with-exponential-back-off"), exports);
19
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAgC;AAChC,6EAA0D"}
@@ -1,6 +0,0 @@
1
- import { CustomError } from '@blackglory/errors';
2
- export declare class WebSocketError extends CustomError {
3
- readonly code: number;
4
- readonly reason: string;
5
- constructor(code: number, reason: string);
6
- }
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WebSocketError = void 0;
4
- const errors_1 = require("@blackglory/errors");
5
- class WebSocketError extends errors_1.CustomError {
6
- constructor(code, reason) {
7
- if (reason) {
8
- super(`${code}: ${reason}`);
9
- }
10
- else {
11
- super(`${code}`);
12
- }
13
- this.code = code;
14
- this.reason = reason;
15
- }
16
- }
17
- exports.WebSocketError = WebSocketError;
18
- //# sourceMappingURL=websocket-error.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-error.js","sourceRoot":"","sources":["../../src/websocket-error.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAEhD,MAAa,cAAe,SAAQ,oBAAW;IAI7C,YAAY,IAAY,EAAE,MAAc;QACtC,IAAI,MAAM,EAAE;YACV,KAAK,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAA;SAC5B;aAAM;YACL,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;SACjB;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAdD,wCAcC"}