@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/dist/client.js ADDED
@@ -0,0 +1,297 @@
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 { fetchAriVersion, VersionCompat } from './version.js';
7
+ import { AriEventEmitter } from './events/emitter.js';
8
+ import { resolveOptions } from './types/options.js';
9
+ // Resources
10
+ import { ChannelsResource } from './resources/channels.js';
11
+ import { BridgesResource } from './resources/bridges.js';
12
+ import { EndpointsResource } from './resources/endpoints.js';
13
+ import { ApplicationsResource } from './resources/applications.js';
14
+ import { AsteriskResource } from './resources/asterisk.js';
15
+ import { PlaybacksResource } from './resources/playbacks.js';
16
+ import { RecordingsResource } from './resources/recordings.js';
17
+ import { SoundsResource } from './resources/sounds.js';
18
+ import { MailboxesResource } from './resources/mailboxes.js';
19
+ import { DeviceStatesResource } from './resources/devicestates.js';
20
+ // Models
21
+ import { ChannelInstance } from './models/channel.js';
22
+ import { BridgeInstance } from './models/bridge.js';
23
+ import { PlaybackInstance } from './models/playback.js';
24
+ import { LiveRecordingInstance, StoredRecordingInstance } from './models/recording.js';
25
+ /**
26
+ * ARI Client for interacting with Asterisk
27
+ */
28
+ export class AriClient extends AriEventEmitter {
29
+ options;
30
+ http;
31
+ ws;
32
+ versionCompat;
33
+ // Instance registries for event routing
34
+ channelInstances = new Map();
35
+ bridgeInstances = new Map();
36
+ playbackInstances = new Map();
37
+ recordingInstances = new Map();
38
+ // API Resources
39
+ channels;
40
+ bridges;
41
+ endpoints;
42
+ applications;
43
+ asterisk;
44
+ playbacks;
45
+ recordings;
46
+ sounds;
47
+ mailboxes;
48
+ deviceStates;
49
+ /**
50
+ * @internal - Use connect() function instead
51
+ */
52
+ constructor(options, http, ws, versionCompat) {
53
+ super();
54
+ this.options = options;
55
+ this.http = http;
56
+ this.ws = ws;
57
+ this.versionCompat = versionCompat;
58
+ // Initialize API resources
59
+ this.channels = new ChannelsResource(http, versionCompat);
60
+ this.bridges = new BridgesResource(http, versionCompat);
61
+ this.endpoints = new EndpointsResource(http, versionCompat);
62
+ this.applications = new ApplicationsResource(http, versionCompat);
63
+ this.asterisk = new AsteriskResource(http, versionCompat);
64
+ this.playbacks = new PlaybacksResource(http, versionCompat);
65
+ this.recordings = new RecordingsResource(http, versionCompat);
66
+ this.sounds = new SoundsResource(http, versionCompat);
67
+ this.mailboxes = new MailboxesResource(http, versionCompat);
68
+ this.deviceStates = new DeviceStatesResource(http, versionCompat);
69
+ // Set up WebSocket event handling
70
+ this.setupWebSocketEvents();
71
+ }
72
+ /**
73
+ * Set up WebSocket event handlers
74
+ */
75
+ setupWebSocketEvents() {
76
+ this.ws.on('message', (data) => {
77
+ const event = data;
78
+ this.handleEvent(event);
79
+ });
80
+ this.ws.on('reconnecting', (info) => {
81
+ console.log(`ARI reconnecting (attempt ${info.attempt}, delay ${info.delay}ms)`);
82
+ });
83
+ this.ws.on('reconnected', () => {
84
+ console.log('ARI reconnected');
85
+ });
86
+ this.ws.on('error', (error) => {
87
+ console.error('ARI WebSocket error:', error);
88
+ });
89
+ }
90
+ /**
91
+ * Handle an incoming ARI event
92
+ */
93
+ handleEvent(event) {
94
+ // Emit to global listeners
95
+ this.emit(event.type, event);
96
+ // Route to specific instances based on event type
97
+ this.routeEventToInstances(event);
98
+ }
99
+ /**
100
+ * Route event to appropriate instance listeners
101
+ */
102
+ routeEventToInstances(event) {
103
+ // Channel events
104
+ if ('channel' in event && event.channel) {
105
+ const channelId = event.channel.id;
106
+ const instance = this.channelInstances.get(channelId);
107
+ if (instance) {
108
+ instance.updateData(event.channel);
109
+ instance._emit(event.type, event);
110
+ }
111
+ }
112
+ // Bridge events
113
+ if ('bridge' in event && event.bridge) {
114
+ const bridgeId = event.bridge.id;
115
+ const instance = this.bridgeInstances.get(bridgeId);
116
+ if (instance) {
117
+ instance.updateData(event.bridge);
118
+ instance._emit(event.type, event);
119
+ }
120
+ }
121
+ // Playback events
122
+ if ('playback' in event && event.playback) {
123
+ const playbackId = event.playback.id;
124
+ const instance = this.playbackInstances.get(playbackId);
125
+ if (instance) {
126
+ instance.updateData(event.playback);
127
+ instance._emit(event.type, event);
128
+ }
129
+ }
130
+ // Recording events
131
+ if ('recording' in event && event.recording) {
132
+ const recordingName = event.recording.name;
133
+ const instance = this.recordingInstances.get(recordingName);
134
+ if (instance) {
135
+ instance.updateData(event.recording);
136
+ instance._emit(event.type, event);
137
+ }
138
+ }
139
+ }
140
+ // ============================================================================
141
+ // Instance Factory Methods (like ari-client)
142
+ // ============================================================================
143
+ /**
144
+ * Create a Channel instance
145
+ */
146
+ Channel(id, data) {
147
+ const existingId = id || data?.id;
148
+ if (existingId) {
149
+ const existing = this.channelInstances.get(existingId);
150
+ if (existing) {
151
+ if (data)
152
+ existing.updateData(data);
153
+ return existing;
154
+ }
155
+ }
156
+ return new ChannelInstance(this, id, data);
157
+ }
158
+ /**
159
+ * Create a Bridge instance
160
+ */
161
+ Bridge(id, data) {
162
+ const existingId = id || data?.id;
163
+ if (existingId) {
164
+ const existing = this.bridgeInstances.get(existingId);
165
+ if (existing) {
166
+ if (data)
167
+ existing.updateData(data);
168
+ return existing;
169
+ }
170
+ }
171
+ return new BridgeInstance(this, id, data);
172
+ }
173
+ /**
174
+ * Create a Playback instance
175
+ */
176
+ Playback(id, data) {
177
+ const existingId = id || data?.id;
178
+ if (existingId) {
179
+ const existing = this.playbackInstances.get(existingId);
180
+ if (existing) {
181
+ if (data)
182
+ existing.updateData(data);
183
+ return existing;
184
+ }
185
+ }
186
+ return new PlaybackInstance(this, id, data);
187
+ }
188
+ /**
189
+ * Create a LiveRecording instance
190
+ */
191
+ LiveRecording(name, data) {
192
+ const existing = this.recordingInstances.get(name);
193
+ if (existing) {
194
+ if (data)
195
+ existing.updateData(data);
196
+ return existing;
197
+ }
198
+ return new LiveRecordingInstance(this, name, data);
199
+ }
200
+ /**
201
+ * Create a StoredRecording instance (no events, just convenience methods)
202
+ */
203
+ StoredRecording(name) {
204
+ return new StoredRecordingInstance(this, name);
205
+ }
206
+ // ============================================================================
207
+ // Instance Registration (internal use by model instances)
208
+ // ============================================================================
209
+ /** @internal */
210
+ _registerChannelInstance(id, instance) {
211
+ this.channelInstances.set(id, instance);
212
+ }
213
+ /** @internal */
214
+ _unregisterChannelInstance(id) {
215
+ this.channelInstances.delete(id);
216
+ }
217
+ /** @internal */
218
+ _registerBridgeInstance(id, instance) {
219
+ this.bridgeInstances.set(id, instance);
220
+ }
221
+ /** @internal */
222
+ _unregisterBridgeInstance(id) {
223
+ this.bridgeInstances.delete(id);
224
+ }
225
+ /** @internal */
226
+ _registerPlaybackInstance(id, instance) {
227
+ this.playbackInstances.set(id, instance);
228
+ }
229
+ /** @internal */
230
+ _unregisterPlaybackInstance(id) {
231
+ this.playbackInstances.delete(id);
232
+ }
233
+ /** @internal */
234
+ _registerRecordingInstance(name, instance) {
235
+ this.recordingInstances.set(name, instance);
236
+ }
237
+ /** @internal */
238
+ _unregisterRecordingInstance(name) {
239
+ this.recordingInstances.delete(name);
240
+ }
241
+ // ============================================================================
242
+ // Connection State
243
+ // ============================================================================
244
+ /**
245
+ * Get the detected ARI/Asterisk version
246
+ */
247
+ get version() {
248
+ return this.versionCompat;
249
+ }
250
+ /**
251
+ * Check if WebSocket is connected
252
+ */
253
+ isConnected() {
254
+ return this.ws.isConnected();
255
+ }
256
+ /**
257
+ * Stop the client and disconnect
258
+ */
259
+ stop() {
260
+ this.ws.disconnect();
261
+ this.channelInstances.clear();
262
+ this.bridgeInstances.clear();
263
+ this.playbackInstances.clear();
264
+ this.recordingInstances.clear();
265
+ }
266
+ /**
267
+ * Reconnect the WebSocket
268
+ */
269
+ async reconnect() {
270
+ this.ws.disconnect();
271
+ await this.ws.connect();
272
+ }
273
+ /**
274
+ * Get the application name
275
+ */
276
+ get app() {
277
+ return this.options.app;
278
+ }
279
+ }
280
+ /**
281
+ * Connect to Asterisk ARI
282
+ */
283
+ export async function connect(options) {
284
+ const resolved = resolveOptions(options);
285
+ // Create HTTP connection
286
+ const http = new HttpConnection(resolved);
287
+ // Fetch and parse ARI version
288
+ const ariVersion = await fetchAriVersion(http);
289
+ const versionCompat = new VersionCompat(ariVersion);
290
+ console.log(`Connecting to ${versionCompat}`);
291
+ // Create and connect WebSocket
292
+ const ws = new WebSocketManager(resolved);
293
+ await ws.connect();
294
+ // Create and return client
295
+ return new AriClient(resolved, http, ws, versionCompat);
296
+ }
297
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * HTTP connection manager using native fetch
3
+ */
4
+ import type { ResolvedOptions } from './types/options.js';
5
+ /**
6
+ * ARI-specific HTTP error
7
+ */
8
+ export declare class AriHttpError extends Error {
9
+ statusCode: number;
10
+ response?: unknown | undefined;
11
+ constructor(message: string, statusCode: number, response?: unknown | undefined);
12
+ }
13
+ /**
14
+ * Query parameter type
15
+ */
16
+ export type QueryParams = Record<string, string | number | boolean | string[] | undefined>;
17
+ /**
18
+ * Convert any object to query params
19
+ */
20
+ export declare function toQueryParams(obj?: object): QueryParams | undefined;
21
+ /**
22
+ * Request options for HTTP calls
23
+ */
24
+ export interface RequestOptions {
25
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
26
+ body?: unknown;
27
+ query?: QueryParams;
28
+ timeout?: number;
29
+ }
30
+ /**
31
+ * HTTP connection manager for ARI REST API
32
+ */
33
+ export declare class HttpConnection {
34
+ private readonly baseUrl;
35
+ private readonly authHeader;
36
+ private readonly defaultTimeout;
37
+ constructor(options: ResolvedOptions);
38
+ /**
39
+ * Make an HTTP request to the ARI API
40
+ */
41
+ request<T>(path: string, options?: RequestOptions): Promise<T>;
42
+ /**
43
+ * GET request
44
+ */
45
+ get<T>(path: string, query?: RequestOptions['query']): Promise<T>;
46
+ /**
47
+ * POST request
48
+ */
49
+ post<T>(path: string, body?: unknown, query?: RequestOptions['query']): Promise<T>;
50
+ /**
51
+ * PUT request
52
+ */
53
+ put<T>(path: string, body?: unknown, query?: RequestOptions['query']): Promise<T>;
54
+ /**
55
+ * DELETE request
56
+ */
57
+ delete<T>(path: string, query?: RequestOptions['query']): Promise<T>;
58
+ /**
59
+ * Get the base URL (for WebSocket connection)
60
+ */
61
+ getBaseUrl(): string;
62
+ /**
63
+ * Get the auth credentials (for WebSocket connection)
64
+ */
65
+ getCredentials(): {
66
+ username: string;
67
+ password: string;
68
+ };
69
+ }
70
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IAG5B,UAAU,EAAE,MAAM;IAClB,QAAQ,CAAC,EAAE,OAAO;gBAFzB,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,OAAO,YAAA;CAK5B;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAE3F;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAGnE;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,OAAO,EAAE,eAAe;IAQpC;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IAuFxE;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvE;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxF;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvF;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1E;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,cAAc,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAOzD"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * HTTP connection manager using native fetch
3
+ */
4
+ /**
5
+ * ARI-specific HTTP error
6
+ */
7
+ export class AriHttpError extends Error {
8
+ statusCode;
9
+ response;
10
+ constructor(message, statusCode, response) {
11
+ super(message);
12
+ this.statusCode = statusCode;
13
+ this.response = response;
14
+ this.name = 'AriHttpError';
15
+ }
16
+ }
17
+ /**
18
+ * Convert any object to query params
19
+ */
20
+ export function toQueryParams(obj) {
21
+ if (!obj)
22
+ return undefined;
23
+ return obj;
24
+ }
25
+ /**
26
+ * HTTP connection manager for ARI REST API
27
+ */
28
+ export class HttpConnection {
29
+ baseUrl;
30
+ authHeader;
31
+ defaultTimeout;
32
+ constructor(options) {
33
+ // Ensure URL doesn't have trailing slash
34
+ this.baseUrl = options.url.replace(/\/$/, '');
35
+ // Create Basic auth header
36
+ this.authHeader = 'Basic ' + Buffer.from(`${options.username}:${options.password}`).toString('base64');
37
+ this.defaultTimeout = options.requestTimeout;
38
+ }
39
+ /**
40
+ * Make an HTTP request to the ARI API
41
+ */
42
+ async request(path, options = {}) {
43
+ const { method = 'GET', body, query, timeout = this.defaultTimeout } = options;
44
+ // Build URL with query parameters
45
+ let url = `${this.baseUrl}/ari${path}`;
46
+ if (query) {
47
+ const params = new URLSearchParams();
48
+ for (const [key, value] of Object.entries(query)) {
49
+ if (value !== undefined) {
50
+ if (Array.isArray(value)) {
51
+ // Handle array parameters (e.g., channel=[id1,id2])
52
+ params.append(key, value.join(','));
53
+ }
54
+ else {
55
+ params.append(key, String(value));
56
+ }
57
+ }
58
+ }
59
+ const queryString = params.toString();
60
+ if (queryString) {
61
+ url += `?${queryString}`;
62
+ }
63
+ }
64
+ // Set up abort controller for timeout
65
+ const controller = new AbortController();
66
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
67
+ try {
68
+ const response = await fetch(url, {
69
+ method,
70
+ headers: {
71
+ 'Authorization': this.authHeader,
72
+ 'Content-Type': 'application/json',
73
+ 'Accept': 'application/json',
74
+ },
75
+ body: body ? JSON.stringify(body) : undefined,
76
+ signal: controller.signal,
77
+ });
78
+ clearTimeout(timeoutId);
79
+ // Handle error responses
80
+ if (!response.ok) {
81
+ let errorBody;
82
+ try {
83
+ errorBody = await response.json();
84
+ }
85
+ catch {
86
+ errorBody = await response.text();
87
+ }
88
+ throw new AriHttpError(`ARI request failed: ${response.status} ${response.statusText}`, response.status, errorBody);
89
+ }
90
+ // Handle empty responses (204 No Content)
91
+ if (response.status === 204) {
92
+ return undefined;
93
+ }
94
+ // Parse JSON response
95
+ const contentType = response.headers.get('content-type');
96
+ if (contentType?.includes('application/json')) {
97
+ return await response.json();
98
+ }
99
+ // Return text for non-JSON responses
100
+ return await response.text();
101
+ }
102
+ catch (error) {
103
+ clearTimeout(timeoutId);
104
+ if (error instanceof AriHttpError) {
105
+ throw error;
106
+ }
107
+ if (error instanceof Error) {
108
+ if (error.name === 'AbortError') {
109
+ throw new AriHttpError(`Request timeout after ${timeout}ms`, 0);
110
+ }
111
+ throw new AriHttpError(error.message, 0);
112
+ }
113
+ throw new AriHttpError('Unknown error', 0);
114
+ }
115
+ }
116
+ /**
117
+ * GET request
118
+ */
119
+ async get(path, query) {
120
+ return this.request(path, { method: 'GET', query });
121
+ }
122
+ /**
123
+ * POST request
124
+ */
125
+ async post(path, body, query) {
126
+ return this.request(path, { method: 'POST', body, query });
127
+ }
128
+ /**
129
+ * PUT request
130
+ */
131
+ async put(path, body, query) {
132
+ return this.request(path, { method: 'PUT', body, query });
133
+ }
134
+ /**
135
+ * DELETE request
136
+ */
137
+ async delete(path, query) {
138
+ return this.request(path, { method: 'DELETE', query });
139
+ }
140
+ /**
141
+ * Get the base URL (for WebSocket connection)
142
+ */
143
+ getBaseUrl() {
144
+ return this.baseUrl;
145
+ }
146
+ /**
147
+ * Get the auth credentials (for WebSocket connection)
148
+ */
149
+ getCredentials() {
150
+ // Decode from auth header
151
+ const base64 = this.authHeader.replace('Basic ', '');
152
+ const decoded = Buffer.from(base64, 'base64').toString('utf-8');
153
+ const [username, password] = decoded.split(':');
154
+ return { username: username, password: password };
155
+ }
156
+ }
157
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Type-safe event emitter for ARI events
3
+ */
4
+ import type { AriEventMap, AriEventType } from './types.js';
5
+ type EventListener<T> = (event: T, ...args: unknown[]) => void | Promise<void>;
6
+ /**
7
+ * Typed event emitter with support for wildcard listeners
8
+ */
9
+ export declare class TypedEventEmitter<TEventMap extends object> {
10
+ private emitter;
11
+ private wildcardListeners;
12
+ constructor();
13
+ /**
14
+ * Add an event listener
15
+ */
16
+ on<K extends keyof TEventMap>(event: K, listener: EventListener<TEventMap[K]>): this;
17
+ /**
18
+ * Add a one-time event listener
19
+ */
20
+ once<K extends keyof TEventMap>(event: K, listener: EventListener<TEventMap[K]>): this;
21
+ /**
22
+ * Remove an event listener
23
+ */
24
+ off<K extends keyof TEventMap>(event: K, listener: EventListener<TEventMap[K]>): this;
25
+ /**
26
+ * Emit an event
27
+ */
28
+ emit<K extends keyof TEventMap>(event: K, data: TEventMap[K], ...args: unknown[]): boolean;
29
+ /**
30
+ * Remove all listeners for an event
31
+ */
32
+ removeAllListeners<K extends keyof TEventMap>(event?: K): this;
33
+ /**
34
+ * Get listener count for an event
35
+ */
36
+ listenerCount<K extends keyof TEventMap>(event: K): number;
37
+ /**
38
+ * Set max listeners
39
+ */
40
+ setMaxListeners(n: number): this;
41
+ }
42
+ /**
43
+ * ARI Event emitter with typed events
44
+ */
45
+ export declare class AriEventEmitter extends TypedEventEmitter<AriEventMap> {
46
+ /**
47
+ * Add a listener for a specific event type
48
+ */
49
+ on<K extends AriEventType | '*'>(event: K, listener: EventListener<AriEventMap[K]>): this;
50
+ /**
51
+ * Add a one-time listener for a specific event type
52
+ */
53
+ once<K extends AriEventType | '*'>(event: K, listener: EventListener<AriEventMap[K]>): this;
54
+ /**
55
+ * Remove a listener for a specific event type
56
+ */
57
+ off<K extends AriEventType | '*'>(event: K, listener: EventListener<AriEventMap[K]>): this;
58
+ }
59
+ /**
60
+ * Connection event map
61
+ */
62
+ export interface ConnectionEventMap {
63
+ connected: void;
64
+ disconnected: {
65
+ intentional: boolean;
66
+ error?: Error;
67
+ };
68
+ reconnecting: {
69
+ attempt: number;
70
+ delay: number;
71
+ };
72
+ reconnected: void;
73
+ error: Error;
74
+ message: unknown;
75
+ }
76
+ /**
77
+ * Connection event emitter
78
+ */
79
+ export declare class ConnectionEventEmitter extends TypedEventEmitter<ConnectionEventMap> {
80
+ }
81
+ export {};
82
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/events/emitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE/E;;GAEG;AACH,qBAAa,iBAAiB,CAAC,SAAS,SAAS,MAAM;IACrD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,iBAAiB,CAA0C;;IAMnE;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,SAAS,EAC1B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GACpC,IAAI;IASP;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,SAAS,EAC5B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GACpC,IAAI;IAaP;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,SAAS,EAC3B,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GACpC,IAAI;IASP;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO;IAgB1F;;OAEG;IACH,kBAAkB,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;IAY9D;;OAEG;IACH,aAAa,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;IAO1D;;OAEG;IACH,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;CAIjC;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,iBAAiB,CAAC,WAAW,CAAC;IACjE;;OAEG;IACM,EAAE,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EACtC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACtC,IAAI;IAIP;;OAEG;IACM,IAAI,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EACxC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACtC,IAAI;IAIP;;OAEG;IACM,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,GAAG,EACvC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACtC,IAAI;CAGR;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC;IACtD,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,WAAW,EAAE,IAAI,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,iBAAiB,CAAC,kBAAkB,CAAC;CAAG"}