websocket-ts 1.1.0 → 2.1.1

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 (76) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +211 -138
  3. package/package.json +46 -33
  4. package/src/backoff/backoff.ts +26 -18
  5. package/src/backoff/constantbackoff.ts +38 -20
  6. package/src/backoff/exponentialbackoff.ts +78 -38
  7. package/src/backoff/linearbackoff.ts +88 -37
  8. package/src/index.ts +23 -9
  9. package/src/queue/array_queue.ts +41 -0
  10. package/src/queue/queue.ts +46 -0
  11. package/src/queue/ring_queue.ts +69 -0
  12. package/src/websocket.ts +487 -162
  13. package/src/websocket_buffer.ts +18 -0
  14. package/src/websocket_builder.ts +274 -0
  15. package/src/websocket_event.ts +88 -0
  16. package/src/websocket_options.ts +23 -0
  17. package/src/websocket_retry_options.ts +22 -0
  18. package/{tsconfig.json → tsconfig.cjs.json} +71 -71
  19. package/tsconfig.esm.json +71 -0
  20. package/jest.config.js +0 -8
  21. package/lib/backoff/backoff.d.ts +0 -18
  22. package/lib/backoff/backoff.d.ts.map +0 -1
  23. package/lib/backoff/backoff.js +0 -3
  24. package/lib/backoff/backoff.js.map +0 -1
  25. package/lib/backoff/constantbackoff.d.ts +0 -11
  26. package/lib/backoff/constantbackoff.d.ts.map +0 -1
  27. package/lib/backoff/constantbackoff.js +0 -20
  28. package/lib/backoff/constantbackoff.js.map +0 -1
  29. package/lib/backoff/exponentialbackoff.d.ts +0 -22
  30. package/lib/backoff/exponentialbackoff.d.ts.map +0 -1
  31. package/lib/backoff/exponentialbackoff.js +0 -35
  32. package/lib/backoff/exponentialbackoff.js.map +0 -1
  33. package/lib/backoff/linearbackoff.d.ts +0 -19
  34. package/lib/backoff/linearbackoff.d.ts.map +0 -1
  35. package/lib/backoff/linearbackoff.js +0 -34
  36. package/lib/backoff/linearbackoff.js.map +0 -1
  37. package/lib/buffer/buffer.d.ts +0 -41
  38. package/lib/buffer/buffer.d.ts.map +0 -1
  39. package/lib/buffer/buffer.js +0 -3
  40. package/lib/buffer/buffer.js.map +0 -1
  41. package/lib/buffer/lrubuffer.d.ts +0 -24
  42. package/lib/buffer/lrubuffer.d.ts.map +0 -1
  43. package/lib/buffer/lrubuffer.js +0 -76
  44. package/lib/buffer/lrubuffer.js.map +0 -1
  45. package/lib/buffer/timebuffer.d.ts +0 -25
  46. package/lib/buffer/timebuffer.d.ts.map +0 -1
  47. package/lib/buffer/timebuffer.js +0 -92
  48. package/lib/buffer/timebuffer.js.map +0 -1
  49. package/lib/index.d.ts +0 -10
  50. package/lib/index.d.ts.map +0 -1
  51. package/lib/index.js +0 -22
  52. package/lib/index.js.map +0 -1
  53. package/lib/websocket.d.ts +0 -47
  54. package/lib/websocket.d.ts.map +0 -1
  55. package/lib/websocket.js +0 -120
  56. package/lib/websocket.js.map +0 -1
  57. package/lib/websocketBuilder.d.ts +0 -32
  58. package/lib/websocketBuilder.d.ts.map +0 -1
  59. package/lib/websocketBuilder.js +0 -68
  60. package/lib/websocketBuilder.js.map +0 -1
  61. package/lib/wsbuilder.d.ts +0 -29
  62. package/lib/wsbuilder.d.ts.map +0 -1
  63. package/lib/wsbuilder.js +0 -88
  64. package/lib/wsbuilder.js.map +0 -1
  65. package/src/buffer/buffer.ts +0 -45
  66. package/src/buffer/lrubuffer.ts +0 -80
  67. package/src/buffer/timebuffer.ts +0 -105
  68. package/src/websocketBuilder.ts +0 -98
  69. package/test/backoff/constantbackoff.test.ts +0 -21
  70. package/test/backoff/exponentialbackoff.test.ts +0 -13
  71. package/test/backoff/linearbackoff.test.ts +0 -32
  72. package/test/buffer/common.ts +0 -10
  73. package/test/buffer/lrubuffer.test.ts +0 -128
  74. package/test/buffer/timebuffer.test.ts +0 -115
  75. package/test/websocket.test.ts +0 -341
  76. package/test/websocketBuilder.test.ts +0 -36
@@ -1,98 +0,0 @@
1
- import {Backoff} from "./backoff/backoff";
2
- import {Buffer} from "./buffer/buffer";
3
- import {RetryEventDetails, Websocket, WebsocketEvents} from "./websocket";
4
-
5
- /**
6
- * Used to build Websocket-instances.
7
- */
8
- export class WebsocketBuilder {
9
- private readonly url: string;
10
- private ws: Websocket | null = null;
11
- private protocols?: string | string[];
12
- private backoff?: Backoff;
13
- private buffer?: Buffer<string | ArrayBufferLike | Blob | ArrayBufferView>;
14
- private onOpenListeners: ({
15
- listener: (instance: Websocket, ev: Event) => any,
16
- options?: boolean | EventListenerOptions
17
- })[] = [];
18
- private onCloseListeners: ({
19
- listener: (instance: Websocket, ev: CloseEvent) => any,
20
- options?: boolean | EventListenerOptions
21
- })[] = [];
22
- private onErrorListeners: ({
23
- listener: (instance: Websocket, ev: Event) => any,
24
- options?: boolean | EventListenerOptions
25
- })[] = [];
26
- private onMessageListeners: ({
27
- listener: (instance: Websocket, ev: MessageEvent) => any,
28
- options?: boolean | EventListenerOptions
29
- })[] = [];
30
- private onRetryListeners: ({
31
- listener: (instance: Websocket, ev: CustomEvent<RetryEventDetails>) => any,
32
- options?: boolean | EventListenerOptions
33
- })[] = [];
34
-
35
- constructor(url: string) {
36
- this.url = url;
37
- }
38
-
39
- public withProtocols(p: string | string[]): WebsocketBuilder {
40
- this.protocols = p;
41
- return this;
42
- }
43
-
44
- public withBackoff(backoff: Backoff): WebsocketBuilder {
45
- this.backoff = backoff;
46
- return this;
47
- }
48
-
49
- public withBuffer(buffer: Buffer<any>): WebsocketBuilder {
50
- this.buffer = buffer;
51
- return this;
52
- }
53
-
54
- public onOpen(listener: (instance: Websocket, ev: Event) => any,
55
- options?: boolean | EventListenerOptions): WebsocketBuilder {
56
- this.onOpenListeners.push({listener, options});
57
- return this;
58
- }
59
-
60
- public onClose(listener: (instance: Websocket, ev: CloseEvent) => any,
61
- options?: boolean | EventListenerOptions): WebsocketBuilder {
62
- this.onCloseListeners.push({listener, options});
63
- return this;
64
- }
65
-
66
- public onError(listener: (instance: Websocket, ev: Event) => any,
67
- options?: boolean | EventListenerOptions): WebsocketBuilder {
68
- this.onErrorListeners.push({listener, options});
69
- return this;
70
- }
71
-
72
- public onMessage(listener: (instance: Websocket, ev: MessageEvent) => any,
73
- options?: boolean | EventListenerOptions): WebsocketBuilder {
74
- this.onMessageListeners.push({listener, options});
75
- return this;
76
- }
77
-
78
- public onRetry(listener: (instance: Websocket, ev: CustomEvent<RetryEventDetails>) => any,
79
- options?: boolean | EventListenerOptions): WebsocketBuilder {
80
- this.onRetryListeners.push({listener, options});
81
- return this;
82
- }
83
-
84
- /**
85
- * Multiple calls to build() will always return the same websocket-instance.
86
- */
87
- public build(): Websocket {
88
- if (this.ws !== null)
89
- return this.ws;
90
- this.ws = new Websocket(this.url, this.protocols, this.buffer, this.backoff);
91
- this.onOpenListeners.forEach(h => this.ws?.addEventListener(WebsocketEvents.open, h.listener, h.options));
92
- this.onCloseListeners.forEach(h => this.ws?.addEventListener(WebsocketEvents.close, h.listener, h.options));
93
- this.onErrorListeners.forEach(h => this.ws?.addEventListener(WebsocketEvents.error, h.listener, h.options));
94
- this.onMessageListeners.forEach(h => this.ws?.addEventListener(WebsocketEvents.message, h.listener, h.options));
95
- this.onRetryListeners.forEach(h => this.ws?.addEventListener(WebsocketEvents.retry, h.listener, h.options));
96
- return this.ws;
97
- }
98
- }
@@ -1,21 +0,0 @@
1
- import {ConstantBackoff} from "../../src";
2
-
3
- describe("Testsuite for ConstantBackoff", () => {
4
- test("ConstantBackoff should always return the same value 0", () => {
5
- const sut = new ConstantBackoff(0);
6
- for (let i = 0; i < 10; i++)
7
- expect(sut.next()).toBe(0);
8
- sut.reset();
9
- for (let i = 0; i < 10; i++)
10
- expect(sut.next()).toBe(0);
11
- });
12
-
13
- test("ConstantBackoff should always return the same value 1000", () => {
14
- const sut = new ConstantBackoff(1000);
15
- for (let i = 0; i < 10; i++)
16
- expect(sut.next()).toBe(1000);
17
- sut.reset();
18
- for (let i = 0; i < 10; i++)
19
- expect(sut.next()).toBe(1000);
20
- });
21
- })
@@ -1,13 +0,0 @@
1
- import {ExponentialBackoff} from "../../src/";
2
-
3
- describe("Testsuite for ExponentialBackoff", () => {
4
- test("ExponentialBackoff should produce an exponentially increasing series", () => {
5
- const sut = new ExponentialBackoff(100, 7);
6
- const expected = [100, 200, 400, 800, 1600, 3200, 6400, 6400, 6400, 6400];
7
- for (let i = 0; i < expected.length; i++)
8
- expect(sut.next()).toBe(expected[i]);
9
- sut.reset()
10
- for (let i = 0; i < expected.length; i++)
11
- expect(sut.next()).toBe(expected[i]);
12
- });
13
- });
@@ -1,32 +0,0 @@
1
- import {LinearBackoff} from "../../src";
2
-
3
- describe("Testsuite for LinearBackoff", () => {
4
- test("LinearBackoff should produce a linearly increasing series starting with 0", () => {
5
- const sut = new LinearBackoff(0, 2000, 8000);
6
- const expected = [0, 2000, 4000, 6000, 8000, 8000, 8000, 8000, 8000, 8000];
7
- for (let i = 0; i < 10; i++)
8
- expect(sut.next()).toBe(expected[i]);
9
- sut.reset();
10
- for (let i = 0; i < 10; i++)
11
- expect(sut.next()).toBe(expected[i]);
12
- });
13
-
14
- test("LinearBackoff should produce a linearly increasing series starting with 1000", () => {
15
- const sut = new LinearBackoff(1000, 3000, 10000);
16
- const expected = [1000, 4000, 7000, 10000, 10000, 10000, 10000, 10000, 10000, 10000];
17
- for (let i = 0; i < 10; i++)
18
- expect(sut.next()).toBe(expected[i]);
19
- sut.reset();
20
- for (let i = 0; i < 10; i++)
21
- expect(sut.next()).toBe(expected[i]);
22
- });
23
-
24
- test("LinearBackoff with undefined maximum should increase without bounds", () => {
25
- const sut = new LinearBackoff(1000, 1000);
26
- for (let i = 0; i < 100; i++)
27
- expect(sut.next()).toBe(1000 + 1000 * i);
28
- sut.reset();
29
- for (let i = 0; i < 100; i++)
30
- expect(sut.next()).toBe(1000 + 1000 * i);
31
- })
32
- })
@@ -1,10 +0,0 @@
1
- export const createEmptyArray = (len: number): Array<number> => {
2
- return new Array<number>(len);
3
- }
4
-
5
- export const createSequentialArray = (len: number): Array<number> => {
6
- const arr = new Array<number>(len);
7
- for (let i = 0; i < arr.length; i++)
8
- arr[i] = i;
9
- return arr;
10
- }
@@ -1,128 +0,0 @@
1
- import {LRUBuffer} from "../../src";
2
-
3
- describe("Testsuite for LRUBuffer", () => {
4
- const capacity = 5;
5
-
6
- test("LRUBuffer should return correct capacity", () => {
7
- const sut = new LRUBuffer<number>(capacity);
8
- expect(sut.cap()).toBe(capacity);
9
- })
10
-
11
- test("LRUBuffer should return correct length", () => {
12
- const sut = new LRUBuffer<number>(capacity);
13
- expect(sut.len()).toBe(0);
14
- for (let i = 0; i <= 2 * capacity; i++) {
15
- expect(sut.write([i])).toBe(1);
16
- expect(sut.len()).toBe(i >= capacity ? capacity : i + 1);
17
- }
18
- });
19
-
20
- test("LRUBuffer read/write zero elements", () => {
21
- const sut1 = new LRUBuffer<number>(capacity);
22
- const writeArr1 = createSequentialArray(0);
23
- const readArr1 = createEmptyArray(0);
24
- expect(sut1.write(writeArr1)).toBe(writeArr1.length);
25
- expect(sut1.len()).toBe(writeArr1.length);
26
- expect(sut1.read(readArr1)).toBe(writeArr1.length);
27
- expect(readArr1).toEqual(writeArr1);
28
- });
29
-
30
- test("LRUBuffer read/write single elements", () => {
31
- const sut = new LRUBuffer<number>(capacity)
32
- const expected = [] as number[];
33
- for (let i = 0; i < capacity * 3 + 2; i++) {
34
- // write new element to buffer
35
- expect(sut.write([i])).toBe(1);
36
- expected.push(i);
37
-
38
- // drop the last written element from expected if we exceed capacity
39
- if (i > capacity - 1)
40
- expected.shift();
41
-
42
- // read actual elements
43
- const r = createEmptyArray(i);
44
- expect(sut.read(r)).toBe(i > capacity ? capacity : i);
45
- for (let j = 0; j < i; j++) {
46
- if (j > capacity - 1)
47
- expect(r[j]).toBeUndefined();
48
- else
49
- expect(r[j]).toBe(expected[j]);
50
- }
51
- }
52
- });
53
-
54
- test("LRUBuffer read/write multiple elements", () => {
55
- for (let i = 0; i < 2 * capacity; i++) {
56
- const sut = new LRUBuffer<number>(capacity);
57
- const writeArr = createSequentialArray(i);
58
- const readArr = createEmptyArray(i);
59
- expect(sut.write(writeArr)).toBe(i);
60
- expect(sut.read(readArr)).toBe(i > capacity ? capacity : i);
61
- for (let j = 0; j < i; j++) {
62
- if (j > capacity - 1)
63
- expect(readArr[j]).toBeUndefined();
64
- else
65
- expect(readArr[j]).toBe(writeArr[i > capacity ? j - (capacity - i) : j]);
66
- }
67
- }
68
- });
69
-
70
- test("LRUBuffer read/write on buffer with zero capacity should always return zero", () => {
71
- const sut = new LRUBuffer<number>(0);
72
- expect(sut.write([1])).toBe(0);
73
- expect(sut.read([0])).toBe(0);
74
- });
75
-
76
- test("LRUBuffer read from empty buffer should return zero elements", () => {
77
- const sut = new LRUBuffer<number>(capacity);
78
- const readArr = new Array<number>(capacity);
79
- expect(sut.read(readArr)).toBe(0);
80
- });
81
-
82
- test("LRUBuffer forEach should apply function to every element in the buffer", () => {
83
- const sut = new LRUBuffer<number>(capacity);
84
- const es = [] as number[];
85
- sut.write([0]);
86
- sut.forEach(e => es.push(e));
87
- expect(es).toEqual([0]);
88
-
89
- const es2 = [] as number[];
90
- sut.write([1, 2, 3, 4]);
91
- sut.forEach(e => es2.push(e));
92
- expect(es2).toEqual([0, 1, 2, 3, 4]);
93
-
94
- const es3 = [] as number[];
95
- sut.write([5, 6]);
96
- sut.forEach(e => es3.push(e));
97
- expect(es3).toEqual([2, 3, 4, 5, 6]);
98
- });
99
-
100
- test("LRUBuffer forEach on empty buffer should do nothing", () => {
101
- const sut = new LRUBuffer<number>(capacity);
102
- const es = [] as number[];
103
- sut.forEach(e => es.push(e));
104
- expect(es.length).toBe(0);
105
- });
106
-
107
- test("LRUBuffer should contain zero items when cleared", () => {
108
- const sut = new LRUBuffer<number>(capacity);
109
- const writeArr = createSequentialArray(capacity);
110
- const readArr = createEmptyArray(capacity);
111
- sut.write(writeArr);
112
- sut.clear();
113
- expect(sut.len()).toBe(0);
114
- expect(sut.read(readArr)).toBe(0);
115
- expect(readArr).toEqual(createEmptyArray(capacity));
116
- });
117
- });
118
-
119
- const createEmptyArray = (len: number): Array<number> => {
120
- return new Array<number>(len);
121
- }
122
-
123
- const createSequentialArray = (len: number): Array<number> => {
124
- const arr = new Array<number>(len);
125
- for (let i = 0; i < arr.length; i++)
126
- arr[i] = i;
127
- return arr;
128
- }
@@ -1,115 +0,0 @@
1
- import {TimeBuffer} from "../../src";
2
- import {createEmptyArray, createSequentialArray} from "./common";
3
-
4
- describe("Testsuite for TimeBuffer", () => {
5
- const maxAge = 1000;
6
- let tb: TimeBuffer<number>;
7
-
8
- beforeEach(() => {
9
- tb = new TimeBuffer<number>(maxAge); // no older than 1000 ms
10
- });
11
-
12
- test("TimeBuffer length", async () => {
13
- expect(tb.len()).toBe(0);
14
- for (let i = 0; i < 10; i++) {
15
- expect(tb.write([i])).toBe(1);
16
- expect(tb.len()).toBe(i + 1);
17
- }
18
-
19
- await delay(maxAge + 500).then(() => {
20
- expect(tb.len()).toBe(0);
21
- });
22
- });
23
-
24
- test("TimeBuffer capacity", () => {
25
- expect(tb.cap()).toBe(Number.POSITIVE_INFINITY);
26
- });
27
-
28
- test("TimeBuffer elements should expire when they reach their maxAge", async () => {
29
- // add 10 items
30
- for (let i = 0; i < 10; i++) {
31
- expect(tb.write([i])).toBe(1);
32
- expect(tb.len()).toBe(i + 1);
33
- }
34
-
35
- // give elements some time to "age"
36
- await delay(500).then(() => {
37
-
38
- // all items should still be in range
39
- expect(tb.len()).toBe(10);
40
-
41
- // add 10 more items
42
- for (let i = 0; i < 5; i++) {
43
- expect(tb.write([i])).toBe(1);
44
- expect(tb.len()).toBe(10 + i + 1);
45
- }
46
- });
47
-
48
- // the first 10 items should now be removed, there are 5 items remaining
49
- await delay(800).then(() => {
50
- expect(tb.len()).toBe(5);
51
- });
52
- });
53
-
54
- test("TimeBuffer read should return items up to maxAge ", async () => {
55
- const w1 = createSequentialArray(10);
56
- expect(tb.write(w1)).toBe(10);
57
- const r1 = createEmptyArray(10);
58
- expect(tb.read(r1)).toBe(10);
59
- for (let i = 0; i < 10; i++)
60
- expect(w1[i]).toBe(r1[i]);
61
-
62
- await delay(500).then(() => {
63
- const r2 = createEmptyArray(10);
64
- expect(tb.read(r2)).toBe(10);
65
- for (let i = 0; i < 10; i++)
66
- expect(w1[i]).toBe(r2[i]);
67
-
68
- const w2 = createSequentialArray(5);
69
- expect(tb.write(w2)).toBe(5);
70
- const r3 = createEmptyArray(15);
71
- expect(tb.read(r3)).toBe(15);
72
- for (let i = 0; i < 15; i++)
73
- if (i < 10)
74
- expect(r3[i]).toBe(w1[i]);
75
- else
76
- expect(r3[i]).toBe(w2[i - 10]);
77
- });
78
- });
79
-
80
- test("TimeBuffer read on empty should return no item", () => {
81
- const r1 = createEmptyArray(10);
82
- expect(tb.read(r1)).toBe(0);
83
- expect(tb.read([])).toBe(0);
84
- });
85
-
86
- test("TimeBuffer forEach() should only be invoked on valid items", async () => {
87
- const w1 = createSequentialArray(10);
88
- expect(tb.write(w1)).toBe(10);
89
- const r2 = [] as number[];
90
- tb.forEach(e => r2.push(e));
91
- expect(r2.length).toBe(10);
92
-
93
- await delay(500).then(() => {
94
- const w2 = createSequentialArray(5);
95
- expect(tb.write(w2)).toBe(5);
96
- const r3 = [] as number[]
97
- tb.forEach(e => r3.push(e));
98
- expect(r3.length).toBe(15);
99
- });
100
-
101
- await delay(800).then(() => {
102
- const r4 = [] as number[];
103
- tb.forEach(e => r4.push(e));
104
- expect(r4.length).toBe(5);
105
- })
106
- })
107
- });
108
-
109
- function delay(ms: number): Promise<void> {
110
- return new Promise<void>(resolve => {
111
- setTimeout(() => {
112
- resolve();
113
- }, ms);
114
- })
115
- }