@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/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":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAMvF;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,eAAe;IAC3B,OAAO,CAAkB;IACzB,IAAI,CAAiB;IACrB,EAAE,CAAmB;IACrB,aAAa,CAAgB;IAE9C,wCAAwC;IACvB,gBAAgB,GAAiC,IAAI,GAAG,EAAE,CAAC;IAC3D,eAAe,GAAgC,IAAI,GAAG,EAAE,CAAC;IACzD,iBAAiB,GAAkC,IAAI,GAAG,EAAE,CAAC;IAC7D,kBAAkB,GAAuC,IAAI,GAAG,EAAE,CAAC;IAEpF,gBAAgB;IACA,QAAQ,CAAmB;IAC3B,OAAO,CAAkB;IACzB,SAAS,CAAoB;IAC7B,YAAY,CAAuB;IACnC,QAAQ,CAAmB;IAC3B,SAAS,CAAoB;IAC7B,UAAU,CAAqB;IAC/B,MAAM,CAAiB;IACvB,SAAS,CAAoB;IAC7B,YAAY,CAAuB;IAEnD;;OAEG;IACH,YACE,OAAwB,EACxB,IAAoB,EACpB,EAAoB,EACpB,aAA4B;QAE5B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QAEnC,2BAA2B;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS,GAAG,IAAI,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAClE,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,IAAI,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAElE,kCAAkC;QAClC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,IAAgB,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;YAClC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,OAAO,WAAW,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YAC7B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC5B,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,KAAe;QACjC,2BAA2B;QAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAoB,EAAE,KAAkC,CAAC,CAAC;QAE1E,kDAAkD;QAClD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,KAAe;QAC3C,iBAAiB;QACjB,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtD,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAA4C,EAAE,KAAc,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAA4C,EAAE,KAAc,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,UAAU,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxD,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACpC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAA4C,EAAE,KAAc,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,WAAW,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAC5C,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC5D,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACrC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAA4C,EAAE,KAAc,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,6CAA6C;IAC7C,+EAA+E;IAE/E;;OAEG;IACH,OAAO,CAAC,EAAW,EAAE,IAAuB;QAC1C,MAAM,UAAU,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QAClC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,IAAI;oBAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACpC,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,EAAW,EAAE,IAAsB;QACxC,MAAM,UAAU,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QAClC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACtD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,IAAI;oBAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACpC,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,EAAW,EAAE,IAAwB;QAC5C,MAAM,UAAU,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QAClC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,IAAI;oBAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACpC,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY,EAAE,IAA6B;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,IAAI;gBAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAAY;QAC1B,OAAO,IAAI,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,+EAA+E;IAC/E,0DAA0D;IAC1D,+EAA+E;IAE/E,gBAAgB;IAChB,wBAAwB,CAAC,EAAU,EAAE,QAAyB;QAC5D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,gBAAgB;IAChB,0BAA0B,CAAC,EAAU;QACnC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,gBAAgB;IAChB,uBAAuB,CAAC,EAAU,EAAE,QAAwB;QAC1D,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,gBAAgB;IAChB,yBAAyB,CAAC,EAAU;QAClC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,gBAAgB;IAChB,yBAAyB,CAAC,EAAU,EAAE,QAA0B;QAC9D,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB;IAChB,2BAA2B,CAAC,EAAU;QACpC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,gBAAgB;IAChB,0BAA0B,CAAC,IAAY,EAAE,QAA+B;QACtE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,gBAAgB;IAChB,4BAA4B,CAAC,IAAY;QACvC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,+EAA+E;IAC/E,mBAAmB;IACnB,+EAA+E;IAE/E;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;IAC1B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAuB;IACnD,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEzC,yBAAyB;IACzB,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE1C,8BAA8B;IAC9B,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,iBAAiB,aAAa,EAAE,CAAC,CAAC;IAE9C,+BAA+B;IAC/B,MAAM,EAAE,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;IAEnB,2BAA2B;IAC3B,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -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"}
|