@per_moeller/asterisk-ari 1.0.2 → 1.0.4
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/dist/client.d.ts +363 -21
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +395 -24
- package/dist/client.js.map +1 -1
- package/dist/connection.d.ts +132 -12
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +121 -10
- package/dist/connection.js.map +1 -1
- package/dist/events/emitter.d.ts +235 -24
- package/dist/events/emitter.d.ts.map +1 -1
- package/dist/events/emitter.js +248 -22
- package/dist/events/emitter.js.map +1 -1
- package/dist/events/types.d.ts +389 -1
- package/dist/events/types.d.ts.map +1 -1
- package/dist/events/types.js +5 -0
- package/dist/events/types.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/models/channel.d.ts +349 -32
- package/dist/models/channel.d.ts.map +1 -1
- package/dist/models/channel.js +348 -34
- package/dist/models/channel.js.map +1 -1
- package/dist/pool.d.ts +152 -11
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +152 -11
- package/dist/pool.js.map +1 -1
- package/dist/queue.d.ts +130 -16
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +123 -16
- package/dist/queue.js.map +1 -1
- package/dist/types/api.d.ts +655 -1
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/api.js +5 -0
- package/dist/types/api.js.map +1 -1
- package/dist/version.d.ts +163 -26
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +143 -22
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
package/dist/queue.js
CHANGED
|
@@ -1,8 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Request queue with retry and circuit breaker
|
|
3
|
+
*
|
|
4
|
+
* This module provides a request queue that handles automatic retries
|
|
5
|
+
* and implements the circuit breaker pattern for fault tolerance.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
3
8
|
*/
|
|
4
9
|
/**
|
|
5
|
-
* Error thrown when circuit breaker is open
|
|
10
|
+
* Error thrown when the circuit breaker is open.
|
|
11
|
+
*
|
|
12
|
+
* This error is thrown immediately when attempting to enqueue a request
|
|
13
|
+
* while the circuit breaker is in the open state, without attempting
|
|
14
|
+
* the actual request.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* try {
|
|
19
|
+
* await queue.enqueue(() => client.channels.list());
|
|
20
|
+
* } catch (error) {
|
|
21
|
+
* if (error instanceof CircuitBreakerOpenError) {
|
|
22
|
+
* console.log('Service temporarily unavailable');
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
6
26
|
*/
|
|
7
27
|
export class CircuitBreakerOpenError extends Error {
|
|
8
28
|
constructor() {
|
|
@@ -11,7 +31,44 @@ export class CircuitBreakerOpenError extends Error {
|
|
|
11
31
|
}
|
|
12
32
|
}
|
|
13
33
|
/**
|
|
14
|
-
* Request queue with automatic retry and circuit breaker pattern
|
|
34
|
+
* Request queue with automatic retry and circuit breaker pattern.
|
|
35
|
+
*
|
|
36
|
+
* Provides controlled request execution with:
|
|
37
|
+
* - Concurrent request limiting
|
|
38
|
+
* - Automatic retry with exponential backoff
|
|
39
|
+
* - Circuit breaker to prevent cascading failures
|
|
40
|
+
*
|
|
41
|
+
* @remarks
|
|
42
|
+
* The circuit breaker pattern helps prevent overwhelming a failing service.
|
|
43
|
+
* After a threshold of failures, the circuit "opens" and rejects requests
|
|
44
|
+
* immediately. After a timeout, it enters "half-open" state to test if the
|
|
45
|
+
* service has recovered.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* import { RequestQueue } from '@per_moeller/asterisk-ari';
|
|
50
|
+
*
|
|
51
|
+
* const queue = new RequestQueue({
|
|
52
|
+
* maxConcurrent: 10,
|
|
53
|
+
* maxRetries: 3,
|
|
54
|
+
* retryDelay: 1000,
|
|
55
|
+
* circuitBreakerThreshold: 5,
|
|
56
|
+
* circuitBreakerTimeout: 30000
|
|
57
|
+
* });
|
|
58
|
+
*
|
|
59
|
+
* // Enqueue requests
|
|
60
|
+
* const result = await queue.enqueue(async () => {
|
|
61
|
+
* return fetch('https://api.example.com/data');
|
|
62
|
+
* });
|
|
63
|
+
*
|
|
64
|
+
* // Check circuit breaker state
|
|
65
|
+
* if (queue.state === 'open') {
|
|
66
|
+
* console.log('Circuit breaker is open, requests will fail fast');
|
|
67
|
+
* }
|
|
68
|
+
*
|
|
69
|
+
* // Reset if needed
|
|
70
|
+
* queue.reset();
|
|
71
|
+
* ```
|
|
15
72
|
*/
|
|
16
73
|
export class RequestQueue {
|
|
17
74
|
queue = [];
|
|
@@ -24,6 +81,11 @@ export class RequestQueue {
|
|
|
24
81
|
retryDelay;
|
|
25
82
|
circuitBreakerThreshold;
|
|
26
83
|
circuitBreakerTimeout;
|
|
84
|
+
/**
|
|
85
|
+
* Create a new request queue.
|
|
86
|
+
*
|
|
87
|
+
* @param options - Queue configuration options
|
|
88
|
+
*/
|
|
27
89
|
constructor(options = {}) {
|
|
28
90
|
this.maxConcurrent = options.maxConcurrent ?? 10;
|
|
29
91
|
this.maxRetries = options.maxRetries ?? 3;
|
|
@@ -32,7 +94,24 @@ export class RequestQueue {
|
|
|
32
94
|
this.circuitBreakerTimeout = options.circuitBreakerTimeout ?? 30000;
|
|
33
95
|
}
|
|
34
96
|
/**
|
|
35
|
-
* Enqueue a request
|
|
97
|
+
* Enqueue a request for execution.
|
|
98
|
+
*
|
|
99
|
+
* The request will be executed when a slot is available (based on
|
|
100
|
+
* maxConcurrent). If the request fails, it will be automatically
|
|
101
|
+
* retried up to maxRetries times with exponential backoff.
|
|
102
|
+
*
|
|
103
|
+
* @typeParam T - Return type of the request
|
|
104
|
+
* @param request - Async function that performs the request
|
|
105
|
+
* @returns Promise resolving to the request result
|
|
106
|
+
* @throws {CircuitBreakerOpenError} If the circuit breaker is open
|
|
107
|
+
* @throws {Error} If the request fails after all retries
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* const channels = await queue.enqueue(async () => {
|
|
112
|
+
* return client.channels.list();
|
|
113
|
+
* });
|
|
114
|
+
* ```
|
|
36
115
|
*/
|
|
37
116
|
async enqueue(request) {
|
|
38
117
|
// Check circuit breaker state
|
|
@@ -51,7 +130,8 @@ export class RequestQueue {
|
|
|
51
130
|
});
|
|
52
131
|
}
|
|
53
132
|
/**
|
|
54
|
-
* Process the queue
|
|
133
|
+
* Process the queue by executing pending requests.
|
|
134
|
+
* @internal
|
|
55
135
|
*/
|
|
56
136
|
async processQueue() {
|
|
57
137
|
while (this.queue.length > 0 && this.activeCount < this.maxConcurrent) {
|
|
@@ -74,7 +154,8 @@ export class RequestQueue {
|
|
|
74
154
|
}
|
|
75
155
|
}
|
|
76
156
|
/**
|
|
77
|
-
* Execute a single request with retry logic
|
|
157
|
+
* Execute a single request with retry logic.
|
|
158
|
+
* @internal
|
|
78
159
|
*/
|
|
79
160
|
async executeRequest(item) {
|
|
80
161
|
try {
|
|
@@ -102,7 +183,8 @@ export class RequestQueue {
|
|
|
102
183
|
}
|
|
103
184
|
}
|
|
104
185
|
/**
|
|
105
|
-
* Check if an error is retryable
|
|
186
|
+
* Check if an error is retryable.
|
|
187
|
+
* @internal
|
|
106
188
|
*/
|
|
107
189
|
isRetryable(error) {
|
|
108
190
|
if (error instanceof Error) {
|
|
@@ -126,7 +208,8 @@ export class RequestQueue {
|
|
|
126
208
|
return false;
|
|
127
209
|
}
|
|
128
210
|
/**
|
|
129
|
-
* Called on successful request
|
|
211
|
+
* Called on successful request to reset failure count.
|
|
212
|
+
* @internal
|
|
130
213
|
*/
|
|
131
214
|
onSuccess() {
|
|
132
215
|
this.failureCount = 0;
|
|
@@ -135,7 +218,8 @@ export class RequestQueue {
|
|
|
135
218
|
}
|
|
136
219
|
}
|
|
137
220
|
/**
|
|
138
|
-
* Called on failed request
|
|
221
|
+
* Called on failed request to track failures.
|
|
222
|
+
* @internal
|
|
139
223
|
*/
|
|
140
224
|
onFailure() {
|
|
141
225
|
this.failureCount++;
|
|
@@ -145,7 +229,8 @@ export class RequestQueue {
|
|
|
145
229
|
}
|
|
146
230
|
}
|
|
147
231
|
/**
|
|
148
|
-
* Update circuit breaker state based on timeout
|
|
232
|
+
* Update circuit breaker state based on timeout.
|
|
233
|
+
* @internal
|
|
149
234
|
*/
|
|
150
235
|
updateCircuitState() {
|
|
151
236
|
if (this.circuitState === 'open') {
|
|
@@ -157,38 +242,51 @@ export class RequestQueue {
|
|
|
157
242
|
}
|
|
158
243
|
}
|
|
159
244
|
/**
|
|
160
|
-
* Delay helper
|
|
245
|
+
* Delay helper for retry backoff.
|
|
246
|
+
* @internal
|
|
161
247
|
*/
|
|
162
248
|
delay(ms) {
|
|
163
249
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
164
250
|
}
|
|
165
251
|
/**
|
|
166
|
-
* Get current queue length
|
|
252
|
+
* Get the current queue length (pending requests).
|
|
167
253
|
*/
|
|
168
254
|
get length() {
|
|
169
255
|
return this.queue.length;
|
|
170
256
|
}
|
|
171
257
|
/**
|
|
172
|
-
* Get current active
|
|
258
|
+
* Get the current number of active (executing) requests.
|
|
173
259
|
*/
|
|
174
260
|
get active() {
|
|
175
261
|
return this.activeCount;
|
|
176
262
|
}
|
|
177
263
|
/**
|
|
178
|
-
* Get current circuit breaker state
|
|
264
|
+
* Get the current circuit breaker state.
|
|
265
|
+
*
|
|
266
|
+
* @returns Current state: 'closed', 'open', or 'half-open'
|
|
179
267
|
*/
|
|
180
268
|
get state() {
|
|
181
269
|
this.updateCircuitState();
|
|
182
270
|
return this.circuitState;
|
|
183
271
|
}
|
|
184
272
|
/**
|
|
185
|
-
* Get failure count
|
|
273
|
+
* Get the current consecutive failure count.
|
|
186
274
|
*/
|
|
187
275
|
get failures() {
|
|
188
276
|
return this.failureCount;
|
|
189
277
|
}
|
|
190
278
|
/**
|
|
191
|
-
* Reset the circuit breaker
|
|
279
|
+
* Reset the circuit breaker to closed state.
|
|
280
|
+
*
|
|
281
|
+
* This clears the failure count and allows requests to proceed normally.
|
|
282
|
+
* Use this after fixing the underlying issue that caused failures.
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* ```typescript
|
|
286
|
+
* // After fixing the issue
|
|
287
|
+
* queue.reset();
|
|
288
|
+
* console.log(queue.state); // 'closed'
|
|
289
|
+
* ```
|
|
192
290
|
*/
|
|
193
291
|
reset() {
|
|
194
292
|
this.failureCount = 0;
|
|
@@ -196,7 +294,16 @@ export class RequestQueue {
|
|
|
196
294
|
this.circuitOpenTime = 0;
|
|
197
295
|
}
|
|
198
296
|
/**
|
|
199
|
-
* Clear the queue
|
|
297
|
+
* Clear the queue and reject all pending requests.
|
|
298
|
+
*
|
|
299
|
+
* Active requests will continue to execute, but pending requests
|
|
300
|
+
* in the queue will be rejected with an error.
|
|
301
|
+
*
|
|
302
|
+
* @example
|
|
303
|
+
* ```typescript
|
|
304
|
+
* // Cancel all pending requests
|
|
305
|
+
* queue.clear();
|
|
306
|
+
* ```
|
|
200
307
|
*/
|
|
201
308
|
clear() {
|
|
202
309
|
while (this.queue.length > 0) {
|
package/dist/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
|