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.
- package/LICENSE +21 -21
- package/README.md +211 -138
- package/package.json +46 -33
- package/src/backoff/backoff.ts +26 -18
- package/src/backoff/constantbackoff.ts +38 -20
- package/src/backoff/exponentialbackoff.ts +78 -38
- package/src/backoff/linearbackoff.ts +88 -37
- package/src/index.ts +23 -9
- package/src/queue/array_queue.ts +41 -0
- package/src/queue/queue.ts +46 -0
- package/src/queue/ring_queue.ts +69 -0
- package/src/websocket.ts +487 -162
- package/src/websocket_buffer.ts +18 -0
- package/src/websocket_builder.ts +274 -0
- package/src/websocket_event.ts +88 -0
- package/src/websocket_options.ts +23 -0
- package/src/websocket_retry_options.ts +22 -0
- package/{tsconfig.json → tsconfig.cjs.json} +71 -71
- package/tsconfig.esm.json +71 -0
- package/jest.config.js +0 -8
- package/lib/backoff/backoff.d.ts +0 -18
- package/lib/backoff/backoff.d.ts.map +0 -1
- package/lib/backoff/backoff.js +0 -3
- package/lib/backoff/backoff.js.map +0 -1
- package/lib/backoff/constantbackoff.d.ts +0 -11
- package/lib/backoff/constantbackoff.d.ts.map +0 -1
- package/lib/backoff/constantbackoff.js +0 -20
- package/lib/backoff/constantbackoff.js.map +0 -1
- package/lib/backoff/exponentialbackoff.d.ts +0 -22
- package/lib/backoff/exponentialbackoff.d.ts.map +0 -1
- package/lib/backoff/exponentialbackoff.js +0 -35
- package/lib/backoff/exponentialbackoff.js.map +0 -1
- package/lib/backoff/linearbackoff.d.ts +0 -19
- package/lib/backoff/linearbackoff.d.ts.map +0 -1
- package/lib/backoff/linearbackoff.js +0 -34
- package/lib/backoff/linearbackoff.js.map +0 -1
- package/lib/buffer/buffer.d.ts +0 -41
- package/lib/buffer/buffer.d.ts.map +0 -1
- package/lib/buffer/buffer.js +0 -3
- package/lib/buffer/buffer.js.map +0 -1
- package/lib/buffer/lrubuffer.d.ts +0 -24
- package/lib/buffer/lrubuffer.d.ts.map +0 -1
- package/lib/buffer/lrubuffer.js +0 -76
- package/lib/buffer/lrubuffer.js.map +0 -1
- package/lib/buffer/timebuffer.d.ts +0 -25
- package/lib/buffer/timebuffer.d.ts.map +0 -1
- package/lib/buffer/timebuffer.js +0 -92
- package/lib/buffer/timebuffer.js.map +0 -1
- package/lib/index.d.ts +0 -10
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -22
- package/lib/index.js.map +0 -1
- package/lib/websocket.d.ts +0 -47
- package/lib/websocket.d.ts.map +0 -1
- package/lib/websocket.js +0 -120
- package/lib/websocket.js.map +0 -1
- package/lib/websocketBuilder.d.ts +0 -32
- package/lib/websocketBuilder.d.ts.map +0 -1
- package/lib/websocketBuilder.js +0 -68
- package/lib/websocketBuilder.js.map +0 -1
- package/lib/wsbuilder.d.ts +0 -29
- package/lib/wsbuilder.d.ts.map +0 -1
- package/lib/wsbuilder.js +0 -88
- package/lib/wsbuilder.js.map +0 -1
- package/src/buffer/buffer.ts +0 -45
- package/src/buffer/lrubuffer.ts +0 -80
- package/src/buffer/timebuffer.ts +0 -105
- package/src/websocketBuilder.ts +0 -98
- package/test/backoff/constantbackoff.test.ts +0 -21
- package/test/backoff/exponentialbackoff.test.ts +0 -13
- package/test/backoff/linearbackoff.test.ts +0 -32
- package/test/buffer/common.ts +0 -10
- package/test/buffer/lrubuffer.test.ts +0 -128
- package/test/buffer/timebuffer.test.ts +0 -115
- package/test/websocket.test.ts +0 -341
- package/test/websocketBuilder.test.ts +0 -36
package/src/websocketBuilder.ts
DELETED
|
@@ -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
|
-
})
|
package/test/buffer/common.ts
DELETED
|
@@ -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
|
-
}
|