@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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +291 -0
  3. package/dist/client.d.ts +123 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +297 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/connection.d.ts +70 -0
  8. package/dist/connection.d.ts.map +1 -0
  9. package/dist/connection.js +157 -0
  10. package/dist/connection.js.map +1 -0
  11. package/dist/events/emitter.d.ts +82 -0
  12. package/dist/events/emitter.d.ts.map +1 -0
  13. package/dist/events/emitter.js +132 -0
  14. package/dist/events/emitter.js.map +1 -0
  15. package/dist/events/types.d.ts +283 -0
  16. package/dist/events/types.d.ts.map +1 -0
  17. package/dist/events/types.js +5 -0
  18. package/dist/events/types.js.map +1 -0
  19. package/dist/index.d.ts +27 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +34 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/models/bridge.d.ts +102 -0
  24. package/dist/models/bridge.d.ts.map +1 -0
  25. package/dist/models/bridge.js +186 -0
  26. package/dist/models/bridge.js.map +1 -0
  27. package/dist/models/channel.d.ts +166 -0
  28. package/dist/models/channel.d.ts.map +1 -0
  29. package/dist/models/channel.js +278 -0
  30. package/dist/models/channel.js.map +1 -0
  31. package/dist/models/index.d.ts +8 -0
  32. package/dist/models/index.d.ts.map +1 -0
  33. package/dist/models/index.js +8 -0
  34. package/dist/models/index.js.map +1 -0
  35. package/dist/models/playback.d.ts +82 -0
  36. package/dist/models/playback.d.ts.map +1 -0
  37. package/dist/models/playback.js +146 -0
  38. package/dist/models/playback.js.map +1 -0
  39. package/dist/models/recording.d.ts +104 -0
  40. package/dist/models/recording.d.ts.map +1 -0
  41. package/dist/models/recording.js +191 -0
  42. package/dist/models/recording.js.map +1 -0
  43. package/dist/pool.d.ts +57 -0
  44. package/dist/pool.d.ts.map +1 -0
  45. package/dist/pool.js +111 -0
  46. package/dist/pool.js.map +1 -0
  47. package/dist/queue.d.ts +85 -0
  48. package/dist/queue.d.ts.map +1 -0
  49. package/dist/queue.js +208 -0
  50. package/dist/queue.js.map +1 -0
  51. package/dist/resources/applications.d.ts +37 -0
  52. package/dist/resources/applications.d.ts.map +1 -0
  53. package/dist/resources/applications.js +45 -0
  54. package/dist/resources/applications.js.map +1 -0
  55. package/dist/resources/asterisk.d.ts +71 -0
  56. package/dist/resources/asterisk.d.ts.map +1 -0
  57. package/dist/resources/asterisk.js +94 -0
  58. package/dist/resources/asterisk.js.map +1 -0
  59. package/dist/resources/base.d.ts +18 -0
  60. package/dist/resources/base.d.ts.map +1 -0
  61. package/dist/resources/base.js +21 -0
  62. package/dist/resources/base.js.map +1 -0
  63. package/dist/resources/bridges.d.ts +66 -0
  64. package/dist/resources/bridges.d.ts.map +1 -0
  65. package/dist/resources/bridges.js +109 -0
  66. package/dist/resources/bridges.js.map +1 -0
  67. package/dist/resources/channels.d.ts +130 -0
  68. package/dist/resources/channels.d.ts.map +1 -0
  69. package/dist/resources/channels.js +228 -0
  70. package/dist/resources/channels.js.map +1 -0
  71. package/dist/resources/devicestates.d.ts +30 -0
  72. package/dist/resources/devicestates.d.ts.map +1 -0
  73. package/dist/resources/devicestates.js +37 -0
  74. package/dist/resources/devicestates.js.map +1 -0
  75. package/dist/resources/endpoints.d.ts +38 -0
  76. package/dist/resources/endpoints.d.ts.map +1 -0
  77. package/dist/resources/endpoints.js +61 -0
  78. package/dist/resources/endpoints.js.map +1 -0
  79. package/dist/resources/mailboxes.d.ts +30 -0
  80. package/dist/resources/mailboxes.d.ts.map +1 -0
  81. package/dist/resources/mailboxes.js +38 -0
  82. package/dist/resources/mailboxes.js.map +1 -0
  83. package/dist/resources/playbacks.d.ts +27 -0
  84. package/dist/resources/playbacks.d.ts.map +1 -0
  85. package/dist/resources/playbacks.js +31 -0
  86. package/dist/resources/playbacks.js.map +1 -0
  87. package/dist/resources/recordings.d.ts +76 -0
  88. package/dist/resources/recordings.d.ts.map +1 -0
  89. package/dist/resources/recordings.js +105 -0
  90. package/dist/resources/recordings.js.map +1 -0
  91. package/dist/resources/sounds.d.ts +22 -0
  92. package/dist/resources/sounds.d.ts.map +1 -0
  93. package/dist/resources/sounds.js +26 -0
  94. package/dist/resources/sounds.js.map +1 -0
  95. package/dist/types/api.d.ts +331 -0
  96. package/dist/types/api.d.ts.map +1 -0
  97. package/dist/types/api.js +5 -0
  98. package/dist/types/api.js.map +1 -0
  99. package/dist/types/options.d.ts +77 -0
  100. package/dist/types/options.d.ts.map +1 -0
  101. package/dist/types/options.js +23 -0
  102. package/dist/types/options.js.map +1 -0
  103. package/dist/version.d.ts +86 -0
  104. package/dist/version.d.ts.map +1 -0
  105. package/dist/version.js +122 -0
  106. package/dist/version.js.map +1 -0
  107. package/dist/websocket.d.ts +70 -0
  108. package/dist/websocket.d.ts.map +1 -0
  109. package/dist/websocket.js +195 -0
  110. package/dist/websocket.js.map +1 -0
  111. package/package.json +59 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Per Moeller
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,291 @@
1
+ # @per_moeller/asterisk-ari
2
+
3
+ Modern TypeScript client for Asterisk ARI (Asterisk REST Interface). A drop-in replacement for the outdated `ari-client` package with full TypeScript support, aggressive WebSocket reconnection, and support for Asterisk 16-23.
4
+
5
+ ## Features
6
+
7
+ - **Modern TypeScript** - Full type definitions, async/await, Promises
8
+ - **Asterisk 16-23 support** - Automatic version detection with compatibility layer
9
+ - **Complete ARI API** - All 11 REST resources with 100+ endpoints
10
+ - **Robust WebSocket** - Aggressive reconnection with exponential backoff
11
+ - **Event system** - Listen to events on resource instances (like ari-client)
12
+ - **Connection pooling** - Built-in pool for high-throughput scenarios
13
+ - **Request queue** - Automatic retry with circuit breaker pattern
14
+ - **Node.js 20+** - Uses native fetch, no external HTTP dependencies
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install @per_moeller/asterisk-ari
20
+ ```
21
+
22
+ ## Quick Start
23
+
24
+ ```typescript
25
+ import { connect } from '@per_moeller/asterisk-ari';
26
+
27
+ const client = await connect({
28
+ url: 'http://localhost:8088',
29
+ username: 'asterisk',
30
+ password: 'asterisk',
31
+ app: 'my-app',
32
+ });
33
+
34
+ console.log('Connected to', client.version.toString());
35
+
36
+ // Create a channel instance
37
+ const channel = client.Channel();
38
+
39
+ // Register events BEFORE originating
40
+ channel.on('StasisStart', async (event, ch) => {
41
+ console.log('Channel started:', ch.name);
42
+ await ch.answer();
43
+ await ch.play({ media: 'sound:hello-world' });
44
+ });
45
+
46
+ channel.on('StasisEnd', () => {
47
+ console.log('Channel ended');
48
+ client.stop();
49
+ });
50
+
51
+ // Originate the call
52
+ await channel.originate({
53
+ endpoint: 'PJSIP/1000',
54
+ app: 'my-app',
55
+ });
56
+ ```
57
+
58
+ ## Connection Options
59
+
60
+ ```typescript
61
+ const client = await connect({
62
+ // Required
63
+ url: 'http://localhost:8088',
64
+ username: 'asterisk',
65
+ password: 'asterisk',
66
+ app: 'my-app',
67
+
68
+ // Optional
69
+ subscribeAll: false, // Subscribe to all Asterisk events
70
+ reconnect: true, // Enable auto-reconnect
71
+ reconnectInterval: 1000, // Initial reconnect delay (ms)
72
+ maxReconnectInterval: 30000, // Max reconnect delay (ms)
73
+ reconnectBackoffMultiplier: 1.5, // Backoff multiplier
74
+ pingInterval: 30000, // WebSocket ping interval (ms)
75
+ pingTimeout: 5000, // Ping response timeout (ms)
76
+ requestTimeout: 30000, // HTTP request timeout (ms)
77
+ });
78
+ ```
79
+
80
+ ## API Resources
81
+
82
+ All ARI resources are available on the client:
83
+
84
+ ```typescript
85
+ // Channels
86
+ const channels = await client.channels.list();
87
+ const channel = await client.channels.get('channel-id');
88
+ await client.channels.hangup('channel-id');
89
+
90
+ // Bridges
91
+ const bridges = await client.bridges.list();
92
+ const bridge = await client.bridges.create({ type: 'mixing' });
93
+ await client.bridges.addChannel(bridge.id, { channel: 'channel-id' });
94
+
95
+ // Endpoints
96
+ const endpoints = await client.endpoints.list();
97
+ const endpoint = await client.endpoints.get('PJSIP', '1000');
98
+
99
+ // Applications
100
+ const apps = await client.applications.list();
101
+ await client.applications.subscribe('my-app', 'channel:channel-id');
102
+
103
+ // Playbacks
104
+ const playback = await client.playbacks.get('playback-id');
105
+ await client.playbacks.control('playback-id', 'pause');
106
+
107
+ // Recordings
108
+ const recordings = await client.recordings.stored.list();
109
+ await client.recordings.live.stop('recording-name');
110
+
111
+ // Sounds
112
+ const sounds = await client.sounds.list({ lang: 'en' });
113
+
114
+ // Mailboxes
115
+ const mailboxes = await client.mailboxes.list();
116
+
117
+ // Device States
118
+ const states = await client.deviceStates.list();
119
+
120
+ // Asterisk
121
+ const info = await client.asterisk.getInfo();
122
+ ```
123
+
124
+ ## Resource Instances
125
+
126
+ Create instances to receive events and call methods:
127
+
128
+ ### Channel
129
+
130
+ ```typescript
131
+ const channel = client.Channel();
132
+
133
+ channel.on('StasisStart', async (event, ch) => {
134
+ await ch.answer();
135
+ await ch.play({ media: 'sound:hello-world' });
136
+ });
137
+
138
+ channel.on('ChannelDtmfReceived', (event, ch) => {
139
+ console.log('DTMF:', event.digit);
140
+ });
141
+
142
+ channel.on('StasisEnd', (event, ch) => {
143
+ ch.removeAllListeners();
144
+ });
145
+
146
+ await channel.originate({
147
+ endpoint: 'PJSIP/1000',
148
+ app: 'my-app',
149
+ });
150
+ ```
151
+
152
+ ### Bridge
153
+
154
+ ```typescript
155
+ const bridge = client.Bridge();
156
+
157
+ bridge.on('ChannelEnteredBridge', (event, br) => {
158
+ console.log('Channel entered:', event.channel.name);
159
+ });
160
+
161
+ bridge.on('ChannelLeftBridge', (event, br) => {
162
+ if (br.channels.length === 0) {
163
+ br.destroy();
164
+ }
165
+ });
166
+
167
+ await bridge.create({ type: 'mixing' });
168
+ await bridge.addChannel({ channel: channel.id });
169
+ ```
170
+
171
+ ### Playback
172
+
173
+ ```typescript
174
+ const playback = await channel.play({ media: 'sound:hello-world' });
175
+
176
+ playback.on('PlaybackFinished', () => {
177
+ console.log('Playback done');
178
+ });
179
+
180
+ // Control playback
181
+ await playback.pause();
182
+ await playback.unpause();
183
+ await playback.stop();
184
+ ```
185
+
186
+ ### Recording
187
+
188
+ ```typescript
189
+ const recording = await channel.record({
190
+ name: 'my-recording',
191
+ format: 'wav',
192
+ });
193
+
194
+ recording.on('RecordingFinished', () => {
195
+ console.log('Recording saved');
196
+ });
197
+
198
+ await recording.pause();
199
+ await recording.unpause();
200
+ await recording.stop();
201
+ ```
202
+
203
+ ## Global Events
204
+
205
+ Listen to all events on the client:
206
+
207
+ ```typescript
208
+ // All events
209
+ client.on('*', (event) => {
210
+ console.log('Event:', event.type);
211
+ });
212
+
213
+ // Specific events
214
+ client.on('StasisStart', (event) => {
215
+ console.log('New channel:', event.channel.name);
216
+ });
217
+
218
+ client.on('ChannelDestroyed', (event) => {
219
+ console.log('Channel destroyed:', event.channel.id);
220
+ });
221
+ ```
222
+
223
+ ## Connection Pool
224
+
225
+ For high-throughput scenarios:
226
+
227
+ ```typescript
228
+ import { createPool } from '@per_moeller/asterisk-ari';
229
+
230
+ const pool = await createPool({
231
+ url: 'http://localhost:8088',
232
+ username: 'asterisk',
233
+ password: 'asterisk',
234
+ app: 'pool-app',
235
+ poolSize: 5,
236
+ });
237
+
238
+ // Get connection (round-robin)
239
+ const client = pool.getConnection();
240
+
241
+ // Use the client
242
+ const channel = client.Channel();
243
+ await channel.originate({ endpoint: 'PJSIP/1000', app: 'pool-app' });
244
+
245
+ // Cleanup
246
+ await pool.stop();
247
+ ```
248
+
249
+ ## Request Queue
250
+
251
+ For automatic retry and circuit breaker:
252
+
253
+ ```typescript
254
+ import { RequestQueue } from '@per_moeller/asterisk-ari';
255
+
256
+ const queue = new RequestQueue({
257
+ maxConcurrent: 10,
258
+ maxRetries: 3,
259
+ retryDelay: 1000,
260
+ circuitBreakerThreshold: 5,
261
+ circuitBreakerTimeout: 30000,
262
+ });
263
+
264
+ // Enqueue requests
265
+ const result = await queue.enqueue(() => client.channels.list());
266
+ ```
267
+
268
+ ## Version Compatibility
269
+
270
+ The client automatically detects the Asterisk version and adjusts API calls:
271
+
272
+ ```typescript
273
+ console.log(client.version.toString()); // "Asterisk 20 (ARI 8.0.0)"
274
+ console.log(client.version.asteriskVersion); // 20
275
+ console.log(client.version.hasExternalMedia); // true (Asterisk 18+)
276
+ console.log(client.version.hasProtocolId); // true (Asterisk 20+)
277
+ ```
278
+
279
+ ## Event Types
280
+
281
+ Full TypeScript types for all 30+ event types:
282
+
283
+ - Channel: `StasisStart`, `StasisEnd`, `ChannelCreated`, `ChannelDestroyed`, `ChannelStateChange`, `ChannelDtmfReceived`, `ChannelHangupRequest`, `ChannelVarset`, `ChannelHold`, `ChannelUnhold`, `ChannelTalkingStarted`, `ChannelTalkingFinished`, `ChannelConnectedLine`, `ChannelDialplan`, `ChannelCallerId`, `ChannelToneDetected`
284
+ - Bridge: `BridgeCreated`, `BridgeDestroyed`, `BridgeMerged`, `BridgeVideoSourceChanged`, `BridgeBlindTransfer`, `BridgeAttendedTransfer`, `ChannelEnteredBridge`, `ChannelLeftBridge`
285
+ - Playback: `PlaybackStarted`, `PlaybackContinuing`, `PlaybackFinished`
286
+ - Recording: `RecordingStarted`, `RecordingFinished`, `RecordingFailed`
287
+ - Other: `EndpointStateChange`, `PeerStatusChange`, `ContactStatusChange`, `DeviceStateChanged`, `TextMessageReceived`, `Dial`, `ApplicationReplaced`, `ApplicationMoveFailed`
288
+
289
+ ## License
290
+
291
+ MIT
@@ -0,0 +1,123 @@
1
+ /**
2
+ * ARI Client - Main entry point for Asterisk REST Interface
3
+ */
4
+ import { HttpConnection } from './connection.js';
5
+ import { WebSocketManager } from './websocket.js';
6
+ import { VersionCompat } from './version.js';
7
+ import { AriEventEmitter } from './events/emitter.js';
8
+ import type { ConnectOptions, ResolvedOptions } from './types/options.js';
9
+ import { ChannelsResource } from './resources/channels.js';
10
+ import { BridgesResource } from './resources/bridges.js';
11
+ import { EndpointsResource } from './resources/endpoints.js';
12
+ import { ApplicationsResource } from './resources/applications.js';
13
+ import { AsteriskResource } from './resources/asterisk.js';
14
+ import { PlaybacksResource } from './resources/playbacks.js';
15
+ import { RecordingsResource } from './resources/recordings.js';
16
+ import { SoundsResource } from './resources/sounds.js';
17
+ import { MailboxesResource } from './resources/mailboxes.js';
18
+ import { DeviceStatesResource } from './resources/devicestates.js';
19
+ import { ChannelInstance } from './models/channel.js';
20
+ import { BridgeInstance } from './models/bridge.js';
21
+ import { PlaybackInstance } from './models/playback.js';
22
+ import { LiveRecordingInstance, StoredRecordingInstance } from './models/recording.js';
23
+ import type { Channel, Bridge, Playback, LiveRecording } from './types/api.js';
24
+ /**
25
+ * ARI Client for interacting with Asterisk
26
+ */
27
+ export declare class AriClient extends AriEventEmitter {
28
+ private readonly options;
29
+ private readonly http;
30
+ private readonly ws;
31
+ private readonly versionCompat;
32
+ private readonly channelInstances;
33
+ private readonly bridgeInstances;
34
+ private readonly playbackInstances;
35
+ private readonly recordingInstances;
36
+ readonly channels: ChannelsResource;
37
+ readonly bridges: BridgesResource;
38
+ readonly endpoints: EndpointsResource;
39
+ readonly applications: ApplicationsResource;
40
+ readonly asterisk: AsteriskResource;
41
+ readonly playbacks: PlaybacksResource;
42
+ readonly recordings: RecordingsResource;
43
+ readonly sounds: SoundsResource;
44
+ readonly mailboxes: MailboxesResource;
45
+ readonly deviceStates: DeviceStatesResource;
46
+ /**
47
+ * @internal - Use connect() function instead
48
+ */
49
+ constructor(options: ResolvedOptions, http: HttpConnection, ws: WebSocketManager, versionCompat: VersionCompat);
50
+ /**
51
+ * Set up WebSocket event handlers
52
+ */
53
+ private setupWebSocketEvents;
54
+ /**
55
+ * Handle an incoming ARI event
56
+ */
57
+ private handleEvent;
58
+ /**
59
+ * Route event to appropriate instance listeners
60
+ */
61
+ private routeEventToInstances;
62
+ /**
63
+ * Create a Channel instance
64
+ */
65
+ Channel(id?: string, data?: Partial<Channel>): ChannelInstance;
66
+ /**
67
+ * Create a Bridge instance
68
+ */
69
+ Bridge(id?: string, data?: Partial<Bridge>): BridgeInstance;
70
+ /**
71
+ * Create a Playback instance
72
+ */
73
+ Playback(id?: string, data?: Partial<Playback>): PlaybackInstance;
74
+ /**
75
+ * Create a LiveRecording instance
76
+ */
77
+ LiveRecording(name: string, data?: Partial<LiveRecording>): LiveRecordingInstance;
78
+ /**
79
+ * Create a StoredRecording instance (no events, just convenience methods)
80
+ */
81
+ StoredRecording(name: string): StoredRecordingInstance;
82
+ /** @internal */
83
+ _registerChannelInstance(id: string, instance: ChannelInstance): void;
84
+ /** @internal */
85
+ _unregisterChannelInstance(id: string): void;
86
+ /** @internal */
87
+ _registerBridgeInstance(id: string, instance: BridgeInstance): void;
88
+ /** @internal */
89
+ _unregisterBridgeInstance(id: string): void;
90
+ /** @internal */
91
+ _registerPlaybackInstance(id: string, instance: PlaybackInstance): void;
92
+ /** @internal */
93
+ _unregisterPlaybackInstance(id: string): void;
94
+ /** @internal */
95
+ _registerRecordingInstance(name: string, instance: LiveRecordingInstance): void;
96
+ /** @internal */
97
+ _unregisterRecordingInstance(name: string): void;
98
+ /**
99
+ * Get the detected ARI/Asterisk version
100
+ */
101
+ get version(): VersionCompat;
102
+ /**
103
+ * Check if WebSocket is connected
104
+ */
105
+ isConnected(): boolean;
106
+ /**
107
+ * Stop the client and disconnect
108
+ */
109
+ stop(): void;
110
+ /**
111
+ * Reconnect the WebSocket
112
+ */
113
+ reconnect(): Promise<void>;
114
+ /**
115
+ * Get the application name
116
+ */
117
+ get app(): string;
118
+ }
119
+ /**
120
+ * Connect to Asterisk ARI
121
+ */
122
+ export declare function connect(options: ConnectOptions): Promise<AriClient>;
123
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}