websocket-ts 1.1.1 → 2.1.2

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 (181) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +157 -93
  3. package/dist/cjs/src/backoff/backoff.d.ts +24 -0
  4. package/dist/cjs/src/backoff/backoff.d.ts.map +1 -0
  5. package/{lib → dist/cjs/src}/backoff/backoff.js.map +1 -1
  6. package/dist/cjs/src/backoff/constantbackoff.d.ts +18 -0
  7. package/dist/cjs/src/backoff/constantbackoff.d.ts.map +1 -0
  8. package/dist/cjs/src/backoff/constantbackoff.js +43 -0
  9. package/dist/cjs/src/backoff/constantbackoff.js.map +1 -0
  10. package/dist/cjs/src/backoff/exponentialbackoff.d.ts +48 -0
  11. package/dist/cjs/src/backoff/exponentialbackoff.d.ts.map +1 -0
  12. package/dist/cjs/src/backoff/exponentialbackoff.js +81 -0
  13. package/dist/cjs/src/backoff/exponentialbackoff.js.map +1 -0
  14. package/dist/cjs/src/backoff/linearbackoff.d.ts +51 -0
  15. package/dist/cjs/src/backoff/linearbackoff.d.ts.map +1 -0
  16. package/dist/cjs/src/backoff/linearbackoff.js +89 -0
  17. package/dist/cjs/src/backoff/linearbackoff.js.map +1 -0
  18. package/dist/cjs/src/index.d.ts +14 -0
  19. package/dist/cjs/src/index.d.ts.map +1 -0
  20. package/dist/cjs/src/index.js +20 -0
  21. package/dist/cjs/src/index.js.map +1 -0
  22. package/dist/cjs/src/queue/array_queue.d.ts +17 -0
  23. package/dist/cjs/src/queue/array_queue.d.ts.map +1 -0
  24. package/dist/cjs/src/queue/array_queue.js +36 -0
  25. package/dist/cjs/src/queue/array_queue.js.map +1 -0
  26. package/dist/cjs/src/queue/queue.d.ts +41 -0
  27. package/dist/cjs/src/queue/queue.d.ts.map +1 -0
  28. package/{lib/buffer/buffer.js → dist/cjs/src/queue/queue.js} +1 -1
  29. package/dist/cjs/src/queue/queue.js.map +1 -0
  30. package/dist/cjs/src/queue/ring_queue.d.ts +20 -0
  31. package/dist/cjs/src/queue/ring_queue.d.ts.map +1 -0
  32. package/dist/cjs/src/queue/ring_queue.js +57 -0
  33. package/dist/cjs/src/queue/ring_queue.js.map +1 -0
  34. package/dist/cjs/src/websocket.d.ts +206 -0
  35. package/dist/cjs/src/websocket.d.ts.map +1 -0
  36. package/dist/cjs/src/websocket.js +434 -0
  37. package/dist/cjs/src/websocket.js.map +1 -0
  38. package/dist/cjs/src/websocket_buffer.d.ts +16 -0
  39. package/dist/cjs/src/websocket_buffer.d.ts.map +1 -0
  40. package/dist/cjs/src/websocket_buffer.js +3 -0
  41. package/dist/cjs/src/websocket_buffer.js.map +1 -0
  42. package/dist/cjs/src/websocket_builder.d.ts +147 -0
  43. package/dist/cjs/src/websocket_builder.d.ts.map +1 -0
  44. package/dist/cjs/src/websocket_builder.js +263 -0
  45. package/dist/cjs/src/websocket_builder.js.map +1 -0
  46. package/dist/cjs/src/websocket_event.d.ts +67 -0
  47. package/dist/cjs/src/websocket_event.d.ts.map +1 -0
  48. package/dist/cjs/src/websocket_event.js +22 -0
  49. package/dist/cjs/src/websocket_event.js.map +1 -0
  50. package/dist/cjs/src/websocket_options.d.ts +21 -0
  51. package/dist/cjs/src/websocket_options.d.ts.map +1 -0
  52. package/dist/cjs/src/websocket_options.js +3 -0
  53. package/dist/cjs/src/websocket_options.js.map +1 -0
  54. package/dist/cjs/src/websocket_retry_options.d.ts +20 -0
  55. package/dist/cjs/src/websocket_retry_options.d.ts.map +1 -0
  56. package/dist/cjs/src/websocket_retry_options.js +3 -0
  57. package/dist/cjs/src/websocket_retry_options.js.map +1 -0
  58. package/dist/esm/src/backoff/backoff.d.ts +24 -0
  59. package/dist/esm/src/backoff/backoff.d.ts.map +1 -0
  60. package/dist/esm/src/backoff/backoff.js +2 -0
  61. package/dist/esm/src/backoff/backoff.js.map +1 -0
  62. package/dist/esm/src/backoff/constantbackoff.d.ts +18 -0
  63. package/dist/esm/src/backoff/constantbackoff.d.ts.map +1 -0
  64. package/dist/esm/src/backoff/constantbackoff.js +30 -0
  65. package/dist/esm/src/backoff/constantbackoff.js.map +1 -0
  66. package/dist/esm/src/backoff/exponentialbackoff.d.ts +48 -0
  67. package/dist/esm/src/backoff/exponentialbackoff.d.ts.map +1 -0
  68. package/dist/esm/src/backoff/exponentialbackoff.js +68 -0
  69. package/dist/esm/src/backoff/exponentialbackoff.js.map +1 -0
  70. package/dist/esm/src/backoff/linearbackoff.d.ts +51 -0
  71. package/dist/esm/src/backoff/linearbackoff.d.ts.map +1 -0
  72. package/dist/esm/src/backoff/linearbackoff.js +76 -0
  73. package/dist/esm/src/backoff/linearbackoff.js.map +1 -0
  74. package/dist/esm/src/index.d.ts +14 -0
  75. package/dist/esm/src/index.d.ts.map +1 -0
  76. package/dist/esm/src/index.js +9 -0
  77. package/dist/esm/src/index.js.map +1 -0
  78. package/dist/esm/src/queue/array_queue.d.ts +17 -0
  79. package/dist/esm/src/queue/array_queue.d.ts.map +1 -0
  80. package/dist/esm/src/queue/array_queue.js +31 -0
  81. package/dist/esm/src/queue/array_queue.js.map +1 -0
  82. package/dist/esm/src/queue/queue.d.ts +41 -0
  83. package/dist/esm/src/queue/queue.d.ts.map +1 -0
  84. package/dist/esm/src/queue/queue.js +2 -0
  85. package/dist/esm/src/queue/queue.js.map +1 -0
  86. package/dist/esm/src/queue/ring_queue.d.ts +20 -0
  87. package/dist/esm/src/queue/ring_queue.d.ts.map +1 -0
  88. package/dist/esm/src/queue/ring_queue.js +52 -0
  89. package/dist/esm/src/queue/ring_queue.js.map +1 -0
  90. package/dist/esm/src/websocket.d.ts +206 -0
  91. package/dist/esm/src/websocket.d.ts.map +1 -0
  92. package/dist/esm/src/websocket.js +356 -0
  93. package/dist/esm/src/websocket.js.map +1 -0
  94. package/dist/esm/src/websocket_buffer.d.ts +16 -0
  95. package/dist/esm/src/websocket_buffer.d.ts.map +1 -0
  96. package/dist/esm/src/websocket_buffer.js +2 -0
  97. package/dist/esm/src/websocket_buffer.js.map +1 -0
  98. package/dist/esm/src/websocket_builder.d.ts +147 -0
  99. package/dist/esm/src/websocket_builder.d.ts.map +1 -0
  100. package/dist/esm/src/websocket_builder.js +213 -0
  101. package/dist/esm/src/websocket_builder.js.map +1 -0
  102. package/dist/esm/src/websocket_event.d.ts +67 -0
  103. package/dist/esm/src/websocket_event.d.ts.map +1 -0
  104. package/dist/esm/src/websocket_event.js +19 -0
  105. package/dist/esm/src/websocket_event.js.map +1 -0
  106. package/dist/esm/src/websocket_options.d.ts +21 -0
  107. package/dist/esm/src/websocket_options.d.ts.map +1 -0
  108. package/dist/esm/src/websocket_options.js +2 -0
  109. package/dist/esm/src/websocket_options.js.map +1 -0
  110. package/dist/esm/src/websocket_retry_options.d.ts +20 -0
  111. package/dist/esm/src/websocket_retry_options.d.ts.map +1 -0
  112. package/dist/esm/src/websocket_retry_options.js +2 -0
  113. package/dist/esm/src/websocket_retry_options.js.map +1 -0
  114. package/package.json +27 -14
  115. package/src/backoff/backoff.ts +21 -13
  116. package/src/backoff/constantbackoff.ts +29 -11
  117. package/src/backoff/exponentialbackoff.ts +68 -28
  118. package/src/backoff/linearbackoff.ts +77 -26
  119. package/src/index.ts +23 -9
  120. package/src/queue/array_queue.ts +41 -0
  121. package/src/queue/queue.ts +46 -0
  122. package/src/queue/ring_queue.ts +69 -0
  123. package/src/websocket.ts +463 -138
  124. package/src/websocket_buffer.ts +18 -0
  125. package/src/websocket_builder.ts +274 -0
  126. package/src/websocket_event.ts +88 -0
  127. package/src/websocket_options.ts +23 -0
  128. package/src/websocket_retry_options.ts +22 -0
  129. package/{tsconfig.json → tsconfig.cjs.json} +8 -8
  130. package/tsconfig.esm.json +71 -0
  131. package/jest.config.js +0 -9
  132. package/lib/backoff/backoff.d.ts +0 -18
  133. package/lib/backoff/backoff.d.ts.map +0 -1
  134. package/lib/backoff/constantbackoff.d.ts +0 -11
  135. package/lib/backoff/constantbackoff.d.ts.map +0 -1
  136. package/lib/backoff/constantbackoff.js +0 -20
  137. package/lib/backoff/constantbackoff.js.map +0 -1
  138. package/lib/backoff/exponentialbackoff.d.ts +0 -22
  139. package/lib/backoff/exponentialbackoff.d.ts.map +0 -1
  140. package/lib/backoff/exponentialbackoff.js +0 -35
  141. package/lib/backoff/exponentialbackoff.js.map +0 -1
  142. package/lib/backoff/linearbackoff.d.ts +0 -19
  143. package/lib/backoff/linearbackoff.d.ts.map +0 -1
  144. package/lib/backoff/linearbackoff.js +0 -34
  145. package/lib/backoff/linearbackoff.js.map +0 -1
  146. package/lib/buffer/buffer.d.ts +0 -41
  147. package/lib/buffer/buffer.d.ts.map +0 -1
  148. package/lib/buffer/buffer.js.map +0 -1
  149. package/lib/buffer/lrubuffer.d.ts +0 -24
  150. package/lib/buffer/lrubuffer.d.ts.map +0 -1
  151. package/lib/buffer/lrubuffer.js +0 -76
  152. package/lib/buffer/lrubuffer.js.map +0 -1
  153. package/lib/buffer/timebuffer.d.ts +0 -25
  154. package/lib/buffer/timebuffer.d.ts.map +0 -1
  155. package/lib/buffer/timebuffer.js +0 -92
  156. package/lib/buffer/timebuffer.js.map +0 -1
  157. package/lib/index.d.ts +0 -10
  158. package/lib/index.d.ts.map +0 -1
  159. package/lib/index.js +0 -22
  160. package/lib/index.js.map +0 -1
  161. package/lib/websocket.d.ts +0 -47
  162. package/lib/websocket.d.ts.map +0 -1
  163. package/lib/websocket.js +0 -120
  164. package/lib/websocket.js.map +0 -1
  165. package/lib/websocketBuilder.d.ts +0 -32
  166. package/lib/websocketBuilder.d.ts.map +0 -1
  167. package/lib/websocketBuilder.js +0 -68
  168. package/lib/websocketBuilder.js.map +0 -1
  169. package/src/buffer/buffer.ts +0 -45
  170. package/src/buffer/lrubuffer.ts +0 -80
  171. package/src/buffer/timebuffer.ts +0 -105
  172. package/src/websocketBuilder.ts +0 -98
  173. package/test/backoff/constantbackoff.test.ts +0 -21
  174. package/test/backoff/exponentialbackoff.test.ts +0 -13
  175. package/test/backoff/linearbackoff.test.ts +0 -32
  176. package/test/buffer/common.ts +0 -10
  177. package/test/buffer/lrubuffer.test.ts +0 -128
  178. package/test/buffer/timebuffer.test.ts +0 -115
  179. package/test/websocket.test.ts +0 -341
  180. package/test/websocketBuilder.test.ts +0 -36
  181. /package/{lib → dist/cjs/src}/backoff/backoff.js +0 -0
@@ -1,37 +1,88 @@
1
- import {Backoff} from "./backoff";
1
+ import { Backoff } from "./backoff";
2
2
 
3
3
  /**
4
- * LinearBackoff increases the backoff-time by a constant number with
5
- * every step. An optional maximum can be provided as an upper bound
4
+ * LinearBackoff returns a backoff-time that is incremented by a fixed amount
5
+ * with every step/retry. An optional maximum can be provided as an upper bound
6
6
  * to the returned backoff.
7
7
  *
8
- * Example: for initial=0, increment=2000, maximum=8000 the Linear-
9
- * Backoff will produce the series [0, 2000, 4000, 6000, 8000].
8
+ * The series can be described as ('i' is the current step/retry):
9
+ * backoff = initial + increment * i | without bound
10
+ * backoff = initial + increment * min(i, max) | with bound
11
+ *
12
+ * Example:
13
+ *
14
+ * 1) Without bound:
15
+ * initial = 1000, increment = 1000
16
+ * backoff = 1000 + 1000 * 0 = 1000 // first retry
17
+ * backoff = 1000 + 1000 * 1 = 2000 // second retry
18
+ * backoff = 1000 + 1000 * 2 = 3000 // ...increases by 'increment' with every retry
19
+ * backoff = 1000 + 1000 * 3 = 4000
20
+ * backoff = 1000 + 1000 * 4 = 5000
21
+ * ... // and so on
22
+ *
23
+ * 2) With bound:
24
+ * initial = 1000, increment = 1000, max = 5000
25
+ * backoff = 1000 + 1000 * 0 = 1000 // first retry
26
+ * backoff = 1000 + 1000 * 1 = 2000 // second retry
27
+ * backoff = 1000 + 1000 * 2 = 3000 // third retry
28
+ * backoff = 1000 + 1000 * 3 = 4000 // fourth retry
29
+ * backoff = 1000 + 1000 * 4 = 5000 // maximum reached, don't increase further
30
+ * backoff = 1000 + 1000 * 4 = 5000
31
+ * backoff = 1000 + 1000 * 4 = 5000
32
+ * ... // and so on
10
33
  */
11
34
  export class LinearBackoff implements Backoff {
12
- private readonly initial: number;
13
- private readonly increment: number;
14
- private readonly maximum?: number;
15
- private current: number;
35
+ private readonly initial: number;
36
+ private readonly increment: number;
37
+ private readonly max?: number;
38
+ private i: number = 0;
39
+ private _retries: number = 0;
16
40
 
17
- constructor(initial: number, increment: number, maximum?: number) {
18
- this.initial = initial;
19
- this.increment = increment;
20
- this.maximum = maximum;
21
- this.current = this.initial;
41
+ /**
42
+ * Creates a new LinearBackoff.
43
+ * @param initial the initial backoff-time in milliseconds
44
+ * @param increment the amount to increment the backoff-time with every step (in milliseconds)
45
+ * @param max the maximum backoff-time (in milliseconds), no bound if undefined
46
+ */
47
+ constructor(initial: number, increment: number, max?: number) {
48
+ if (initial < 0) {
49
+ throw new Error("Initial must be a positive number or zero");
22
50
  }
23
-
24
- next() {
25
- const backoff = this.current;
26
- const next = this.current + this.increment;
27
- if (this.maximum === undefined)
28
- this.current = next;
29
- else if (next <= this.maximum)
30
- this.current = next;
31
- return backoff;
51
+ if (increment < 0) {
52
+ throw new Error("Increment must be a positive number or zero");
32
53
  }
33
-
34
- reset() {
35
- this.current = this.initial;
54
+ if (max !== undefined && max < 0) {
55
+ throw new Error("Max must be undefined, a positive number or zero");
56
+ }
57
+ if (max !== undefined && max < initial) {
58
+ throw new Error(
59
+ "Max must be undefined or greater than or equal to initial",
60
+ );
36
61
  }
62
+
63
+ this.initial = initial;
64
+ this.increment = increment;
65
+ this.max = max;
66
+ }
67
+
68
+ get retries() {
69
+ return this._retries;
70
+ }
71
+
72
+ get current(): number {
73
+ return this.max === undefined
74
+ ? this.initial + this.increment * this.i
75
+ : Math.min(this.initial + this.increment * this.i, this.max);
76
+ }
77
+
78
+ next(): number {
79
+ this._retries++;
80
+ this.i++;
81
+ return this.current;
82
+ }
83
+
84
+ reset(): void {
85
+ this._retries = 0;
86
+ this.i = 0;
87
+ }
37
88
  }
package/src/index.ts CHANGED
@@ -1,9 +1,23 @@
1
- export * from './backoff/backoff';
2
- export * from './backoff/constantbackoff'
3
- export * from './backoff/exponentialbackoff'
4
- export * from './backoff/linearbackoff'
5
- export * from './buffer/buffer';
6
- export * from './buffer/lrubuffer'
7
- export * from './buffer/timebuffer'
8
- export * from './websocket';
9
- export * from './websocketBuilder';
1
+ export { Backoff } from "./backoff/backoff";
2
+ export { ConstantBackoff } from "./backoff/constantbackoff";
3
+ export { ExponentialBackoff } from "./backoff/exponentialbackoff";
4
+ export { LinearBackoff } from "./backoff/linearbackoff";
5
+ export { Queue } from "./queue/queue";
6
+ export { ArrayQueue } from "./queue/array_queue";
7
+ export { RingQueue } from "./queue/ring_queue";
8
+ export { Websocket } from "./websocket";
9
+ export { WebsocketBuffer } from "./websocket_buffer";
10
+ export { WebsocketBuilder } from "./websocket_builder";
11
+ export {
12
+ WebsocketEvent,
13
+ RetryEventDetail,
14
+ ReconnectEventDetail,
15
+ WebsocketEventMap,
16
+ WebsocketEventListener,
17
+ WebsocketEventListenerParams,
18
+ WebsocketEventListenerOptions,
19
+ WebsocketEventListenerWithOptions,
20
+ WebsocketEventListeners,
21
+ } from "./websocket_event";
22
+ export { WebsocketOptions } from "./websocket_options";
23
+ export { WebsocketConnectionRetryOptions } from "./websocket_retry_options";
@@ -0,0 +1,41 @@
1
+ import { Queue } from "./queue";
2
+
3
+ /**
4
+ * An array queue is a queue that has an unbounded capacity. Reading from an array queue
5
+ * will return the oldest element and effectively remove it from the queue.
6
+ */
7
+ export class ArrayQueue<E> implements Queue<E> {
8
+ private readonly elements: E[];
9
+
10
+ constructor() {
11
+ this.elements = [];
12
+ }
13
+
14
+ add(element: E): void {
15
+ this.elements.push(element);
16
+ }
17
+
18
+ clear() {
19
+ this.elements.length = 0;
20
+ }
21
+
22
+ forEach(fn: (element: E) => unknown) {
23
+ this.elements.forEach(fn);
24
+ }
25
+
26
+ length(): number {
27
+ return this.elements.length;
28
+ }
29
+
30
+ isEmpty(): boolean {
31
+ return this.elements.length === 0;
32
+ }
33
+
34
+ peek(): E | undefined {
35
+ return this.elements[0];
36
+ }
37
+
38
+ read(): E | undefined {
39
+ return this.elements.shift();
40
+ }
41
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * A queue holds elements until they are read. The order in which elements are
3
+ * read is determined by the implementation of the queue.
4
+ */
5
+ export interface Queue<E> {
6
+ /**
7
+ * Adds an element to the queue.
8
+ * @param element the element to add
9
+ */
10
+ add(element: E): void;
11
+
12
+ /**
13
+ * Clears the queue, removing all elements.
14
+ */
15
+ clear(): void;
16
+
17
+ /**
18
+ * Calls the given function for each element in the queue.
19
+ * @param fn the function to call
20
+ */
21
+ forEach(fn: (element: E) => unknown): void;
22
+
23
+ /**
24
+ * Number of elements in the queue.
25
+ * @return the number of elements in the queue
26
+ */
27
+ length(): number;
28
+
29
+ /**
30
+ * Whether the queue is empty.
31
+ * @return true if the queue is empty, false otherwise
32
+ */
33
+ isEmpty(): boolean;
34
+
35
+ /**
36
+ * Returns the next element in the queue without removing it.
37
+ * @return the next element in the queue, or undefined if the queue is empty
38
+ */
39
+ peek(): E | undefined;
40
+
41
+ /**
42
+ * Removes and returns the next element in the queue.
43
+ * @return the next element in the queue, or undefined if the queue is empty
44
+ */
45
+ read(): E | undefined;
46
+ }
@@ -0,0 +1,69 @@
1
+ import { Queue } from "./queue";
2
+
3
+ /**
4
+ * A ring queue is a queue that has a fixed capacity. When the queue is full, the oldest element is
5
+ * removed to make room for the new element. Reading from a ring queue will return the oldest
6
+ * element and effectively remove it from the queue.
7
+ */
8
+ export class RingQueue<E> implements Queue<E> {
9
+ private readonly elements: E[];
10
+ private head: number; // index of the next position to write to
11
+ private tail: number; // index of the next position to read from
12
+
13
+ constructor(capacity: number) {
14
+ if (!Number.isInteger(capacity) || capacity <= 0) {
15
+ throw new Error("Capacity must be a positive integer");
16
+ }
17
+
18
+ this.elements = new Array<E>(capacity + 1); // +1 to distinguish between full and empty
19
+ this.head = 0;
20
+ this.tail = 0;
21
+ }
22
+
23
+ add(element: E): void {
24
+ this.elements[this.head] = element;
25
+ this.head = (this.head + 1) % this.elements.length;
26
+ if (this.head === this.tail) {
27
+ this.tail = (this.tail + 1) % this.elements.length;
28
+ }
29
+ }
30
+
31
+ clear() {
32
+ this.head = 0;
33
+ this.tail = 0;
34
+ }
35
+
36
+ forEach(fn: (element: E) => unknown) {
37
+ for (
38
+ let i = this.tail;
39
+ i !== this.head;
40
+ i = (i + 1) % this.elements.length
41
+ ) {
42
+ fn(this.elements[i]);
43
+ }
44
+ }
45
+
46
+ length(): number {
47
+ return this.tail === this.head
48
+ ? 0
49
+ : this.tail < this.head
50
+ ? this.head - this.tail
51
+ : this.elements.length - this.tail + this.head;
52
+ }
53
+
54
+ isEmpty(): boolean {
55
+ return this.head === this.tail;
56
+ }
57
+
58
+ peek(): E | undefined {
59
+ return this.isEmpty() ? undefined : this.elements[this.tail];
60
+ }
61
+
62
+ read(): E | undefined {
63
+ const e = this.peek();
64
+ if (e !== undefined) {
65
+ this.tail = (this.tail + 1) % this.elements.length;
66
+ }
67
+ return e;
68
+ }
69
+ }