@per_moeller/asterisk-ari 1.0.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.
- package/LICENSE +21 -0
- package/README.md +291 -0
- package/dist/client.d.ts +123 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +297 -0
- package/dist/client.js.map +1 -0
- package/dist/connection.d.ts +70 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +157 -0
- package/dist/connection.js.map +1 -0
- package/dist/events/emitter.d.ts +82 -0
- package/dist/events/emitter.d.ts.map +1 -0
- package/dist/events/emitter.js +132 -0
- package/dist/events/emitter.js.map +1 -0
- package/dist/events/types.d.ts +283 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +5 -0
- package/dist/events/types.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/models/bridge.d.ts +102 -0
- package/dist/models/bridge.d.ts.map +1 -0
- package/dist/models/bridge.js +186 -0
- package/dist/models/bridge.js.map +1 -0
- package/dist/models/channel.d.ts +166 -0
- package/dist/models/channel.d.ts.map +1 -0
- package/dist/models/channel.js +278 -0
- package/dist/models/channel.js.map +1 -0
- package/dist/models/index.d.ts +8 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +8 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/playback.d.ts +82 -0
- package/dist/models/playback.d.ts.map +1 -0
- package/dist/models/playback.js +146 -0
- package/dist/models/playback.js.map +1 -0
- package/dist/models/recording.d.ts +104 -0
- package/dist/models/recording.d.ts.map +1 -0
- package/dist/models/recording.js +191 -0
- package/dist/models/recording.js.map +1 -0
- package/dist/pool.d.ts +57 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +111 -0
- package/dist/pool.js.map +1 -0
- package/dist/queue.d.ts +85 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +208 -0
- package/dist/queue.js.map +1 -0
- package/dist/resources/applications.d.ts +37 -0
- package/dist/resources/applications.d.ts.map +1 -0
- package/dist/resources/applications.js +45 -0
- package/dist/resources/applications.js.map +1 -0
- package/dist/resources/asterisk.d.ts +71 -0
- package/dist/resources/asterisk.d.ts.map +1 -0
- package/dist/resources/asterisk.js +94 -0
- package/dist/resources/asterisk.js.map +1 -0
- package/dist/resources/base.d.ts +18 -0
- package/dist/resources/base.d.ts.map +1 -0
- package/dist/resources/base.js +21 -0
- package/dist/resources/base.js.map +1 -0
- package/dist/resources/bridges.d.ts +66 -0
- package/dist/resources/bridges.d.ts.map +1 -0
- package/dist/resources/bridges.js +109 -0
- package/dist/resources/bridges.js.map +1 -0
- package/dist/resources/channels.d.ts +130 -0
- package/dist/resources/channels.d.ts.map +1 -0
- package/dist/resources/channels.js +228 -0
- package/dist/resources/channels.js.map +1 -0
- package/dist/resources/devicestates.d.ts +30 -0
- package/dist/resources/devicestates.d.ts.map +1 -0
- package/dist/resources/devicestates.js +37 -0
- package/dist/resources/devicestates.js.map +1 -0
- package/dist/resources/endpoints.d.ts +38 -0
- package/dist/resources/endpoints.d.ts.map +1 -0
- package/dist/resources/endpoints.js +61 -0
- package/dist/resources/endpoints.js.map +1 -0
- package/dist/resources/mailboxes.d.ts +30 -0
- package/dist/resources/mailboxes.d.ts.map +1 -0
- package/dist/resources/mailboxes.js +38 -0
- package/dist/resources/mailboxes.js.map +1 -0
- package/dist/resources/playbacks.d.ts +27 -0
- package/dist/resources/playbacks.d.ts.map +1 -0
- package/dist/resources/playbacks.js +31 -0
- package/dist/resources/playbacks.js.map +1 -0
- package/dist/resources/recordings.d.ts +76 -0
- package/dist/resources/recordings.d.ts.map +1 -0
- package/dist/resources/recordings.js +105 -0
- package/dist/resources/recordings.js.map +1 -0
- package/dist/resources/sounds.d.ts +22 -0
- package/dist/resources/sounds.d.ts.map +1 -0
- package/dist/resources/sounds.js +26 -0
- package/dist/resources/sounds.js.map +1 -0
- package/dist/types/api.d.ts +331 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +5 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/options.d.ts +77 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +23 -0
- package/dist/types/options.js.map +1 -0
- package/dist/version.d.ts +86 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +122 -0
- package/dist/version.js.map +1 -0
- package/dist/websocket.d.ts +70 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +195 -0
- package/dist/websocket.js.map +1 -0
- package/package.json +59 -0
package/dist/pool.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection pool for high-throughput scenarios
|
|
3
|
+
*/
|
|
4
|
+
import { connect } from './client.js';
|
|
5
|
+
/**
|
|
6
|
+
* Connection pool for distributing load across multiple ARI connections
|
|
7
|
+
*/
|
|
8
|
+
export class ConnectionPool {
|
|
9
|
+
connections = [];
|
|
10
|
+
currentIndex = 0;
|
|
11
|
+
options;
|
|
12
|
+
poolSize;
|
|
13
|
+
initialized = false;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.options = options;
|
|
16
|
+
this.poolSize = options.poolSize ?? 5;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Initialize the connection pool
|
|
20
|
+
*/
|
|
21
|
+
async initialize() {
|
|
22
|
+
if (this.initialized) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const connectionPromises = [];
|
|
26
|
+
for (let i = 0; i < this.poolSize; i++) {
|
|
27
|
+
connectionPromises.push(connect(this.options));
|
|
28
|
+
}
|
|
29
|
+
this.connections = await Promise.all(connectionPromises);
|
|
30
|
+
this.initialized = true;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get a connection from the pool (round-robin)
|
|
34
|
+
*/
|
|
35
|
+
getConnection() {
|
|
36
|
+
if (!this.initialized || this.connections.length === 0) {
|
|
37
|
+
throw new Error('Connection pool not initialized. Call initialize() first.');
|
|
38
|
+
}
|
|
39
|
+
const client = this.connections[this.currentIndex];
|
|
40
|
+
this.currentIndex = (this.currentIndex + 1) % this.connections.length;
|
|
41
|
+
return client;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get a connection that is currently connected
|
|
45
|
+
*/
|
|
46
|
+
getConnectedConnection() {
|
|
47
|
+
if (!this.initialized) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
// Try round-robin first
|
|
51
|
+
const startIndex = this.currentIndex;
|
|
52
|
+
do {
|
|
53
|
+
const client = this.connections[this.currentIndex];
|
|
54
|
+
this.currentIndex = (this.currentIndex + 1) % this.connections.length;
|
|
55
|
+
if (client.isConnected()) {
|
|
56
|
+
return client;
|
|
57
|
+
}
|
|
58
|
+
} while (this.currentIndex !== startIndex);
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get all connections in the pool
|
|
63
|
+
*/
|
|
64
|
+
getConnections() {
|
|
65
|
+
return this.connections;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the number of connections in the pool
|
|
69
|
+
*/
|
|
70
|
+
get size() {
|
|
71
|
+
return this.connections.length;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get the number of connected clients
|
|
75
|
+
*/
|
|
76
|
+
get connectedCount() {
|
|
77
|
+
return this.connections.filter(c => c.isConnected()).length;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Stop all connections in the pool
|
|
81
|
+
*/
|
|
82
|
+
async stop() {
|
|
83
|
+
const stopPromises = this.connections.map(c => c.stop());
|
|
84
|
+
await Promise.all(stopPromises);
|
|
85
|
+
this.connections = [];
|
|
86
|
+
this.currentIndex = 0;
|
|
87
|
+
this.initialized = false;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check if the pool is initialized
|
|
91
|
+
*/
|
|
92
|
+
isInitialized() {
|
|
93
|
+
return this.initialized;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Execute a function with a pooled connection
|
|
97
|
+
*/
|
|
98
|
+
async withConnection(fn) {
|
|
99
|
+
const client = this.getConnection();
|
|
100
|
+
return fn(client);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Create and initialize a connection pool
|
|
105
|
+
*/
|
|
106
|
+
export async function createPool(options) {
|
|
107
|
+
const pool = new ConnectionPool(options);
|
|
108
|
+
await pool.initialize();
|
|
109
|
+
return pool;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=pool.js.map
|
package/dist/pool.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"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"}
|
package/dist/queue.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request queue with retry and circuit breaker
|
|
3
|
+
*/
|
|
4
|
+
import type { QueueOptions } from './types/options.js';
|
|
5
|
+
type CircuitState = 'closed' | 'open' | 'half-open';
|
|
6
|
+
/**
|
|
7
|
+
* Error thrown when circuit breaker is open
|
|
8
|
+
*/
|
|
9
|
+
export declare class CircuitBreakerOpenError extends Error {
|
|
10
|
+
constructor();
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Request queue with automatic retry and circuit breaker pattern
|
|
14
|
+
*/
|
|
15
|
+
export declare class RequestQueue {
|
|
16
|
+
private queue;
|
|
17
|
+
private activeCount;
|
|
18
|
+
private failureCount;
|
|
19
|
+
private circuitState;
|
|
20
|
+
private circuitOpenTime;
|
|
21
|
+
private readonly maxConcurrent;
|
|
22
|
+
private readonly maxRetries;
|
|
23
|
+
private readonly retryDelay;
|
|
24
|
+
private readonly circuitBreakerThreshold;
|
|
25
|
+
private readonly circuitBreakerTimeout;
|
|
26
|
+
constructor(options?: QueueOptions);
|
|
27
|
+
/**
|
|
28
|
+
* Enqueue a request
|
|
29
|
+
*/
|
|
30
|
+
enqueue<T>(request: () => Promise<T>): Promise<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Process the queue
|
|
33
|
+
*/
|
|
34
|
+
private processQueue;
|
|
35
|
+
/**
|
|
36
|
+
* Execute a single request with retry logic
|
|
37
|
+
*/
|
|
38
|
+
private executeRequest;
|
|
39
|
+
/**
|
|
40
|
+
* Check if an error is retryable
|
|
41
|
+
*/
|
|
42
|
+
private isRetryable;
|
|
43
|
+
/**
|
|
44
|
+
* Called on successful request
|
|
45
|
+
*/
|
|
46
|
+
private onSuccess;
|
|
47
|
+
/**
|
|
48
|
+
* Called on failed request
|
|
49
|
+
*/
|
|
50
|
+
private onFailure;
|
|
51
|
+
/**
|
|
52
|
+
* Update circuit breaker state based on timeout
|
|
53
|
+
*/
|
|
54
|
+
private updateCircuitState;
|
|
55
|
+
/**
|
|
56
|
+
* Delay helper
|
|
57
|
+
*/
|
|
58
|
+
private delay;
|
|
59
|
+
/**
|
|
60
|
+
* Get current queue length
|
|
61
|
+
*/
|
|
62
|
+
get length(): number;
|
|
63
|
+
/**
|
|
64
|
+
* Get current active request count
|
|
65
|
+
*/
|
|
66
|
+
get active(): number;
|
|
67
|
+
/**
|
|
68
|
+
* Get current circuit breaker state
|
|
69
|
+
*/
|
|
70
|
+
get state(): CircuitState;
|
|
71
|
+
/**
|
|
72
|
+
* Get failure count
|
|
73
|
+
*/
|
|
74
|
+
get failures(): number;
|
|
75
|
+
/**
|
|
76
|
+
* Reset the circuit breaker
|
|
77
|
+
*/
|
|
78
|
+
reset(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Clear the queue (reject all pending requests)
|
|
81
|
+
*/
|
|
82
|
+
clear(): void;
|
|
83
|
+
}
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASvD,KAAK,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAEpD;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;;CAKjD;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,eAAe,CAAK;IAE5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;gBAEnC,OAAO,GAAE,YAAiB;IAQtC;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAmBvD;;OAEG;YACW,YAAY;IAuB1B;;OAEG;YACW,cAAc;IA0B5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAyBnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAQjB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,YAAY,CAGxB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd"}
|
package/dist/queue.js
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request queue with retry and circuit breaker
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Error thrown when circuit breaker is open
|
|
6
|
+
*/
|
|
7
|
+
export class CircuitBreakerOpenError extends Error {
|
|
8
|
+
constructor() {
|
|
9
|
+
super('Circuit breaker is open - requests are being rejected');
|
|
10
|
+
this.name = 'CircuitBreakerOpenError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Request queue with automatic retry and circuit breaker pattern
|
|
15
|
+
*/
|
|
16
|
+
export class RequestQueue {
|
|
17
|
+
queue = [];
|
|
18
|
+
activeCount = 0;
|
|
19
|
+
failureCount = 0;
|
|
20
|
+
circuitState = 'closed';
|
|
21
|
+
circuitOpenTime = 0;
|
|
22
|
+
maxConcurrent;
|
|
23
|
+
maxRetries;
|
|
24
|
+
retryDelay;
|
|
25
|
+
circuitBreakerThreshold;
|
|
26
|
+
circuitBreakerTimeout;
|
|
27
|
+
constructor(options = {}) {
|
|
28
|
+
this.maxConcurrent = options.maxConcurrent ?? 10;
|
|
29
|
+
this.maxRetries = options.maxRetries ?? 3;
|
|
30
|
+
this.retryDelay = options.retryDelay ?? 1000;
|
|
31
|
+
this.circuitBreakerThreshold = options.circuitBreakerThreshold ?? 5;
|
|
32
|
+
this.circuitBreakerTimeout = options.circuitBreakerTimeout ?? 30000;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Enqueue a request
|
|
36
|
+
*/
|
|
37
|
+
async enqueue(request) {
|
|
38
|
+
// Check circuit breaker state
|
|
39
|
+
this.updateCircuitState();
|
|
40
|
+
if (this.circuitState === 'open') {
|
|
41
|
+
throw new CircuitBreakerOpenError();
|
|
42
|
+
}
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
this.queue.push({
|
|
45
|
+
request: request,
|
|
46
|
+
resolve: resolve,
|
|
47
|
+
reject,
|
|
48
|
+
retries: 0,
|
|
49
|
+
});
|
|
50
|
+
this.processQueue();
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Process the queue
|
|
55
|
+
*/
|
|
56
|
+
async processQueue() {
|
|
57
|
+
while (this.queue.length > 0 && this.activeCount < this.maxConcurrent) {
|
|
58
|
+
// Check circuit state before processing
|
|
59
|
+
this.updateCircuitState();
|
|
60
|
+
if (this.circuitState === 'open') {
|
|
61
|
+
// Reject all pending requests
|
|
62
|
+
while (this.queue.length > 0) {
|
|
63
|
+
const item = this.queue.shift();
|
|
64
|
+
item.reject(new CircuitBreakerOpenError());
|
|
65
|
+
}
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const item = this.queue.shift();
|
|
69
|
+
this.activeCount++;
|
|
70
|
+
this.executeRequest(item).finally(() => {
|
|
71
|
+
this.activeCount--;
|
|
72
|
+
this.processQueue();
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Execute a single request with retry logic
|
|
78
|
+
*/
|
|
79
|
+
async executeRequest(item) {
|
|
80
|
+
try {
|
|
81
|
+
const result = await item.request();
|
|
82
|
+
this.onSuccess();
|
|
83
|
+
item.resolve(result);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (item.retries < this.maxRetries && this.isRetryable(error)) {
|
|
87
|
+
item.retries++;
|
|
88
|
+
await this.delay(this.retryDelay * item.retries);
|
|
89
|
+
// Re-check circuit state before retry
|
|
90
|
+
this.updateCircuitState();
|
|
91
|
+
if (this.circuitState === 'open') {
|
|
92
|
+
item.reject(new CircuitBreakerOpenError());
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Re-queue for retry
|
|
96
|
+
this.queue.unshift(item);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.onFailure();
|
|
100
|
+
item.reject(error instanceof Error ? error : new Error(String(error)));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if an error is retryable
|
|
106
|
+
*/
|
|
107
|
+
isRetryable(error) {
|
|
108
|
+
if (error instanceof Error) {
|
|
109
|
+
// Retry on network errors and 5xx server errors
|
|
110
|
+
const message = error.message.toLowerCase();
|
|
111
|
+
if (message.includes('network') ||
|
|
112
|
+
message.includes('timeout') ||
|
|
113
|
+
message.includes('econnrefused') ||
|
|
114
|
+
message.includes('econnreset') ||
|
|
115
|
+
message.includes('socket')) {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
// Check for HTTP status codes
|
|
119
|
+
const statusMatch = message.match(/(\d{3})/);
|
|
120
|
+
if (statusMatch) {
|
|
121
|
+
const status = parseInt(statusMatch[1], 10);
|
|
122
|
+
// Retry on 5xx errors and 429 (rate limited)
|
|
123
|
+
return status >= 500 || status === 429;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Called on successful request
|
|
130
|
+
*/
|
|
131
|
+
onSuccess() {
|
|
132
|
+
this.failureCount = 0;
|
|
133
|
+
if (this.circuitState === 'half-open') {
|
|
134
|
+
this.circuitState = 'closed';
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Called on failed request
|
|
139
|
+
*/
|
|
140
|
+
onFailure() {
|
|
141
|
+
this.failureCount++;
|
|
142
|
+
if (this.failureCount >= this.circuitBreakerThreshold) {
|
|
143
|
+
this.circuitState = 'open';
|
|
144
|
+
this.circuitOpenTime = Date.now();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Update circuit breaker state based on timeout
|
|
149
|
+
*/
|
|
150
|
+
updateCircuitState() {
|
|
151
|
+
if (this.circuitState === 'open') {
|
|
152
|
+
const elapsed = Date.now() - this.circuitOpenTime;
|
|
153
|
+
if (elapsed >= this.circuitBreakerTimeout) {
|
|
154
|
+
this.circuitState = 'half-open';
|
|
155
|
+
this.failureCount = 0;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Delay helper
|
|
161
|
+
*/
|
|
162
|
+
delay(ms) {
|
|
163
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get current queue length
|
|
167
|
+
*/
|
|
168
|
+
get length() {
|
|
169
|
+
return this.queue.length;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get current active request count
|
|
173
|
+
*/
|
|
174
|
+
get active() {
|
|
175
|
+
return this.activeCount;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get current circuit breaker state
|
|
179
|
+
*/
|
|
180
|
+
get state() {
|
|
181
|
+
this.updateCircuitState();
|
|
182
|
+
return this.circuitState;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Get failure count
|
|
186
|
+
*/
|
|
187
|
+
get failures() {
|
|
188
|
+
return this.failureCount;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Reset the circuit breaker
|
|
192
|
+
*/
|
|
193
|
+
reset() {
|
|
194
|
+
this.failureCount = 0;
|
|
195
|
+
this.circuitState = 'closed';
|
|
196
|
+
this.circuitOpenTime = 0;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Clear the queue (reject all pending requests)
|
|
200
|
+
*/
|
|
201
|
+
clear() {
|
|
202
|
+
while (this.queue.length > 0) {
|
|
203
|
+
const item = this.queue.shift();
|
|
204
|
+
item.reject(new Error('Queue cleared'));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applications API resource
|
|
3
|
+
*/
|
|
4
|
+
import { BaseResource } from './base.js';
|
|
5
|
+
import type { HttpConnection } from '../connection.js';
|
|
6
|
+
import type { VersionCompat } from '../version.js';
|
|
7
|
+
import type { Application } from '../types/api.js';
|
|
8
|
+
/**
|
|
9
|
+
* Applications API - Manage Stasis applications
|
|
10
|
+
*/
|
|
11
|
+
export declare class ApplicationsResource extends BaseResource {
|
|
12
|
+
constructor(http: HttpConnection, version: VersionCompat);
|
|
13
|
+
/**
|
|
14
|
+
* List all applications
|
|
15
|
+
*/
|
|
16
|
+
list(): Promise<Application[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Get a specific application
|
|
19
|
+
*/
|
|
20
|
+
get(applicationName: string): Promise<Application>;
|
|
21
|
+
/**
|
|
22
|
+
* Subscribe to events for specific resources
|
|
23
|
+
*/
|
|
24
|
+
subscribe(applicationName: string, eventSource: string | string[]): Promise<Application>;
|
|
25
|
+
/**
|
|
26
|
+
* Unsubscribe from events for specific resources
|
|
27
|
+
*/
|
|
28
|
+
unsubscribe(applicationName: string, eventSource: string | string[]): Promise<Application>;
|
|
29
|
+
/**
|
|
30
|
+
* Filter application events for a specific event type
|
|
31
|
+
*/
|
|
32
|
+
filter(applicationName: string, filter?: {
|
|
33
|
+
allowed?: string[];
|
|
34
|
+
disallowed?: string[];
|
|
35
|
+
}): Promise<Application>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=applications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applications.d.ts","sourceRoot":"","sources":["../../src/resources/applications.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;gBACxC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa;IAIxD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAIpC;;OAEG;IACG,GAAG,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIxD;;OAEG;IACG,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAU9F;;OAEG;IACG,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAShG;;OAEG;IACG,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC;CAMpH"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applications API resource
|
|
3
|
+
*/
|
|
4
|
+
import { BaseResource } from './base.js';
|
|
5
|
+
/**
|
|
6
|
+
* Applications API - Manage Stasis applications
|
|
7
|
+
*/
|
|
8
|
+
export class ApplicationsResource extends BaseResource {
|
|
9
|
+
constructor(http, version) {
|
|
10
|
+
super(http, version);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* List all applications
|
|
14
|
+
*/
|
|
15
|
+
async list() {
|
|
16
|
+
return this.http.get('/applications');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get a specific application
|
|
20
|
+
*/
|
|
21
|
+
async get(applicationName) {
|
|
22
|
+
return this.http.get(`/applications/${encodeURIComponent(applicationName)}`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Subscribe to events for specific resources
|
|
26
|
+
*/
|
|
27
|
+
async subscribe(applicationName, eventSource) {
|
|
28
|
+
const sources = Array.isArray(eventSource) ? eventSource : [eventSource];
|
|
29
|
+
return this.http.post(`/applications/${encodeURIComponent(applicationName)}/subscription`, undefined, { eventSource: sources });
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Unsubscribe from events for specific resources
|
|
33
|
+
*/
|
|
34
|
+
async unsubscribe(applicationName, eventSource) {
|
|
35
|
+
const sources = Array.isArray(eventSource) ? eventSource : [eventSource];
|
|
36
|
+
return this.http.delete(`/applications/${encodeURIComponent(applicationName)}/subscription`, { eventSource: sources });
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Filter application events for a specific event type
|
|
40
|
+
*/
|
|
41
|
+
async filter(applicationName, filter) {
|
|
42
|
+
return this.http.put(`/applications/${encodeURIComponent(applicationName)}/eventFilter`, filter);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=applications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applications.js","sourceRoot":"","sources":["../../src/resources/applications.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAKzC;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IACpD,YAAY,IAAoB,EAAE,OAAsB;QACtD,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAgB,eAAe,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,eAAuB;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAc,iBAAiB,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,eAAuB,EAAE,WAA8B;QACrE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAEzE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,iBAAiB,kBAAkB,CAAC,eAAe,CAAC,eAAe,EACnE,SAAS,EACT,EAAE,WAAW,EAAE,OAAO,EAAE,CACzB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,eAAuB,EAAE,WAA8B;QACvE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAEzE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CACrB,iBAAiB,kBAAkB,CAAC,eAAe,CAAC,eAAe,EACnE,EAAE,WAAW,EAAE,OAAO,EAAE,CACzB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,eAAuB,EAAE,MAAsD;QAC1F,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,iBAAiB,kBAAkB,CAAC,eAAe,CAAC,cAAc,EAClE,MAAM,CACP,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asterisk system API resource
|
|
3
|
+
*/
|
|
4
|
+
import { BaseResource } from './base.js';
|
|
5
|
+
import type { HttpConnection } from '../connection.js';
|
|
6
|
+
import type { VersionCompat } from '../version.js';
|
|
7
|
+
import type { AsteriskInfo, Module, LogChannel } from '../types/api.js';
|
|
8
|
+
export type AsteriskInfoFilter = 'build' | 'system' | 'config' | 'status';
|
|
9
|
+
/**
|
|
10
|
+
* Asterisk API - Manage Asterisk system resources
|
|
11
|
+
*/
|
|
12
|
+
export declare class AsteriskResource extends BaseResource {
|
|
13
|
+
constructor(http: HttpConnection, version: VersionCompat);
|
|
14
|
+
/**
|
|
15
|
+
* Get Asterisk system information
|
|
16
|
+
*/
|
|
17
|
+
getInfo(only?: AsteriskInfoFilter[]): Promise<AsteriskInfo>;
|
|
18
|
+
/**
|
|
19
|
+
* List Asterisk modules
|
|
20
|
+
*/
|
|
21
|
+
listModules(): Promise<Module[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Get a specific Asterisk module
|
|
24
|
+
*/
|
|
25
|
+
getModule(moduleName: string): Promise<Module>;
|
|
26
|
+
/**
|
|
27
|
+
* Load an Asterisk module
|
|
28
|
+
*/
|
|
29
|
+
loadModule(moduleName: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Unload an Asterisk module
|
|
32
|
+
*/
|
|
33
|
+
unloadModule(moduleName: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Reload an Asterisk module
|
|
36
|
+
*/
|
|
37
|
+
reloadModule(moduleName: string): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* List logging channels
|
|
40
|
+
*/
|
|
41
|
+
listLogChannels(): Promise<LogChannel[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Add a logging channel
|
|
44
|
+
*/
|
|
45
|
+
addLogChannel(logChannelName: string, configuration: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Delete a logging channel
|
|
48
|
+
*/
|
|
49
|
+
deleteLogChannel(logChannelName: string): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Rotate a log channel
|
|
52
|
+
*/
|
|
53
|
+
rotateLogChannel(logChannelName: string): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Get a global variable
|
|
56
|
+
*/
|
|
57
|
+
getGlobalVariable(variable: string): Promise<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Set a global variable
|
|
60
|
+
*/
|
|
61
|
+
setGlobalVariable(variable: string, value?: string): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Ping Asterisk
|
|
64
|
+
*/
|
|
65
|
+
ping(): Promise<{
|
|
66
|
+
ping: string;
|
|
67
|
+
timestamp: string;
|
|
68
|
+
asterisk_id: string;
|
|
69
|
+
}>;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=asterisk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asterisk.d.ts","sourceRoot":"","sources":["../../src/resources/asterisk.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElF,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1E;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;gBACpC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa;IAIxD;;OAEG;IACG,OAAO,CAAC,IAAI,CAAC,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAMjE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAItC;;OAEG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpD;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAI9C;;OAEG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjF;;OAEG;IACG,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;OAEG;IACG,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1D;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxE;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAGhF"}
|