@per_moeller/asterisk-ari 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +360 -22
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +374 -29
- package/dist/client.js.map +1 -1
- package/dist/connection.d.ts +132 -12
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +121 -10
- package/dist/connection.js.map +1 -1
- package/dist/events/emitter.d.ts +213 -21
- package/dist/events/emitter.d.ts.map +1 -1
- package/dist/events/emitter.js +163 -17
- package/dist/events/emitter.js.map +1 -1
- package/dist/events/types.d.ts +386 -3
- package/dist/events/types.d.ts.map +1 -1
- package/dist/events/types.js +5 -0
- package/dist/events/types.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/models/bridge.d.ts +26 -3
- package/dist/models/bridge.d.ts.map +1 -1
- package/dist/models/bridge.js.map +1 -1
- package/dist/models/channel.d.ts +364 -35
- package/dist/models/channel.d.ts.map +1 -1
- package/dist/models/channel.js +348 -34
- package/dist/models/channel.js.map +1 -1
- package/dist/models/index.d.ts +4 -0
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/playback.d.ts +23 -3
- package/dist/models/playback.d.ts.map +1 -1
- package/dist/models/playback.js.map +1 -1
- package/dist/models/recording.d.ts +23 -3
- package/dist/models/recording.d.ts.map +1 -1
- package/dist/models/recording.js.map +1 -1
- package/dist/pool.d.ts +152 -11
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +152 -11
- package/dist/pool.js.map +1 -1
- package/dist/queue.d.ts +130 -16
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +123 -16
- package/dist/queue.js.map +1 -1
- package/dist/types/api.d.ts +655 -1
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/api.js +5 -0
- package/dist/types/api.js.map +1 -1
- package/dist/version.d.ts +163 -26
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +143 -22
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ARI Client - Main entry point for Asterisk REST Interface
|
|
3
|
+
*
|
|
4
|
+
* This module provides the main `AriClient` class and `connect()` function
|
|
5
|
+
* for establishing connections to Asterisk ARI.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { connect } from '@per_moeller/asterisk-ari';
|
|
12
|
+
*
|
|
13
|
+
* const client = await connect({
|
|
14
|
+
* url: 'http://localhost:8088',
|
|
15
|
+
* username: 'asterisk',
|
|
16
|
+
* password: 'secret',
|
|
17
|
+
* app: 'my-app'
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* client.on('StasisStart', async (event, channel) => {
|
|
21
|
+
* console.log(`Incoming call from ${channel.caller.number}`);
|
|
22
|
+
* await channel.answer();
|
|
23
|
+
* await channel.play({ media: 'sound:hello-world' });
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
3
26
|
*/
|
|
4
27
|
import { HttpConnection } from './connection.js';
|
|
5
28
|
import { WebSocketManager } from './websocket.js';
|
|
@@ -23,7 +46,34 @@ import { BridgeInstance } from './models/bridge.js';
|
|
|
23
46
|
import { PlaybackInstance } from './models/playback.js';
|
|
24
47
|
import { LiveRecordingInstance, StoredRecordingInstance } from './models/recording.js';
|
|
25
48
|
/**
|
|
26
|
-
* ARI Client for interacting with Asterisk
|
|
49
|
+
* Main ARI Client for interacting with Asterisk.
|
|
50
|
+
*
|
|
51
|
+
* The client provides access to all ARI resources (channels, bridges, etc.)
|
|
52
|
+
* and handles WebSocket events from Asterisk. It extends `AriEventEmitter`
|
|
53
|
+
* for type-safe event handling.
|
|
54
|
+
*
|
|
55
|
+
* @remarks
|
|
56
|
+
* Don't instantiate this class directly. Use the {@link connect} function instead.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const client = await connect({ ... });
|
|
61
|
+
*
|
|
62
|
+
* // Access API resources
|
|
63
|
+
* const channels = await client.channels.list();
|
|
64
|
+
* const bridge = await client.bridges.create({ type: 'mixing' });
|
|
65
|
+
*
|
|
66
|
+
* // Listen to events
|
|
67
|
+
* client.on('StasisStart', (event, channel) => {
|
|
68
|
+
* // Handle incoming calls
|
|
69
|
+
* });
|
|
70
|
+
*
|
|
71
|
+
* // Create model instances for event-based programming
|
|
72
|
+
* const myChannel = client.Channel('channel-id');
|
|
73
|
+
* myChannel.on('ChannelDtmfReceived', (event) => {
|
|
74
|
+
* console.log(`DTMF: ${event.digit}`);
|
|
75
|
+
* });
|
|
76
|
+
* ```
|
|
27
77
|
*/
|
|
28
78
|
export class AriClient extends AriEventEmitter {
|
|
29
79
|
options;
|
|
@@ -35,19 +85,157 @@ export class AriClient extends AriEventEmitter {
|
|
|
35
85
|
bridgeInstances = new Map();
|
|
36
86
|
playbackInstances = new Map();
|
|
37
87
|
recordingInstances = new Map();
|
|
88
|
+
// ============================================================================
|
|
38
89
|
// API Resources
|
|
90
|
+
// ============================================================================
|
|
91
|
+
/**
|
|
92
|
+
* Channels API for managing calls and channels.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* // List all channels
|
|
97
|
+
* const channels = await client.channels.list();
|
|
98
|
+
*
|
|
99
|
+
* // Originate a call
|
|
100
|
+
* const channel = await client.channels.originate({
|
|
101
|
+
* endpoint: 'PJSIP/1000',
|
|
102
|
+
* app: 'my-app'
|
|
103
|
+
* });
|
|
104
|
+
*
|
|
105
|
+
* // Answer a channel
|
|
106
|
+
* await client.channels.answer(channelId);
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
39
109
|
channels;
|
|
110
|
+
/**
|
|
111
|
+
* Bridges API for managing bridges (conferences, etc.).
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* // Create a mixing bridge
|
|
116
|
+
* const bridge = await client.bridges.create({ type: 'mixing' });
|
|
117
|
+
*
|
|
118
|
+
* // Add channels to bridge
|
|
119
|
+
* await client.bridges.addChannel(bridge.id, { channel: [channel1, channel2] });
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
40
122
|
bridges;
|
|
123
|
+
/**
|
|
124
|
+
* Endpoints API for managing endpoints.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```typescript
|
|
128
|
+
* // List all endpoints
|
|
129
|
+
* const endpoints = await client.endpoints.list();
|
|
130
|
+
*
|
|
131
|
+
* // Get PJSIP endpoints
|
|
132
|
+
* const pjsipEndpoints = await client.endpoints.listByTech('PJSIP');
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
41
135
|
endpoints;
|
|
136
|
+
/**
|
|
137
|
+
* Applications API for managing Stasis applications.
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* // Get application details
|
|
142
|
+
* const app = await client.applications.get('my-app');
|
|
143
|
+
*
|
|
144
|
+
* // Subscribe to events
|
|
145
|
+
* await client.applications.subscribe('my-app', { eventSource: 'channel:123' });
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
42
148
|
applications;
|
|
149
|
+
/**
|
|
150
|
+
* Asterisk API for system information and management.
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```typescript
|
|
154
|
+
* // Get Asterisk info
|
|
155
|
+
* const info = await client.asterisk.getInfo();
|
|
156
|
+
* console.log(info.system?.version);
|
|
157
|
+
*
|
|
158
|
+
* // Get a global variable
|
|
159
|
+
* const value = await client.asterisk.getVariable('GLOBALVAR');
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
43
162
|
asterisk;
|
|
163
|
+
/**
|
|
164
|
+
* Playbacks API for controlling media playback.
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```typescript
|
|
168
|
+
* // Control a playback
|
|
169
|
+
* await client.playbacks.control(playbackId, 'pause');
|
|
170
|
+
* await client.playbacks.control(playbackId, 'unpause');
|
|
171
|
+
* await client.playbacks.stop(playbackId);
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
44
174
|
playbacks;
|
|
175
|
+
/**
|
|
176
|
+
* Recordings API for managing live and stored recordings.
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* // List stored recordings
|
|
181
|
+
* const recordings = await client.recordings.listStored();
|
|
182
|
+
*
|
|
183
|
+
* // Get a stored recording
|
|
184
|
+
* const recording = await client.recordings.getStored('my-recording');
|
|
185
|
+
* ```
|
|
186
|
+
*/
|
|
45
187
|
recordings;
|
|
188
|
+
/**
|
|
189
|
+
* Sounds API for listing available sound files.
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```typescript
|
|
193
|
+
* // List all sounds
|
|
194
|
+
* const sounds = await client.sounds.list();
|
|
195
|
+
*
|
|
196
|
+
* // Get sounds for a specific language
|
|
197
|
+
* const englishSounds = await client.sounds.list({ lang: 'en' });
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
46
200
|
sounds;
|
|
201
|
+
/**
|
|
202
|
+
* Mailboxes API for managing voicemail mailboxes.
|
|
203
|
+
*
|
|
204
|
+
* @example
|
|
205
|
+
* ```typescript
|
|
206
|
+
* // List mailboxes
|
|
207
|
+
* const mailboxes = await client.mailboxes.list();
|
|
208
|
+
*
|
|
209
|
+
* // Update message counts
|
|
210
|
+
* await client.mailboxes.update('1000@default', {
|
|
211
|
+
* oldMessages: 5,
|
|
212
|
+
* newMessages: 2
|
|
213
|
+
* });
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
47
216
|
mailboxes;
|
|
217
|
+
/**
|
|
218
|
+
* Device States API for managing custom device states.
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```typescript
|
|
222
|
+
* // Set a device state
|
|
223
|
+
* await client.deviceStates.update('Stasis:mydevice', 'INUSE');
|
|
224
|
+
*
|
|
225
|
+
* // Get a device state
|
|
226
|
+
* const state = await client.deviceStates.get('Stasis:mydevice');
|
|
227
|
+
* ```
|
|
228
|
+
*/
|
|
48
229
|
deviceStates;
|
|
49
230
|
/**
|
|
50
|
-
*
|
|
231
|
+
* Creates a new ARI client.
|
|
232
|
+
*
|
|
233
|
+
* @internal - Use the {@link connect} function instead of instantiating directly.
|
|
234
|
+
*
|
|
235
|
+
* @param options - Resolved connection options
|
|
236
|
+
* @param http - HTTP connection instance
|
|
237
|
+
* @param ws - WebSocket manager instance
|
|
238
|
+
* @param versionCompat - Version compatibility checker
|
|
51
239
|
*/
|
|
52
240
|
constructor(options, http, ws, versionCompat) {
|
|
53
241
|
super();
|
|
@@ -71,6 +259,7 @@ export class AriClient extends AriEventEmitter {
|
|
|
71
259
|
}
|
|
72
260
|
/**
|
|
73
261
|
* Set up WebSocket event handlers
|
|
262
|
+
* @internal
|
|
74
263
|
*/
|
|
75
264
|
setupWebSocketEvents() {
|
|
76
265
|
this.ws.on('message', (data) => {
|
|
@@ -89,6 +278,7 @@ export class AriClient extends AriEventEmitter {
|
|
|
89
278
|
}
|
|
90
279
|
/**
|
|
91
280
|
* Handle an incoming ARI event
|
|
281
|
+
* @internal
|
|
92
282
|
*/
|
|
93
283
|
handleEvent(event) {
|
|
94
284
|
// Emit to global listeners with convenience argument (ari-client compatibility)
|
|
@@ -98,32 +288,40 @@ export class AriClient extends AriEventEmitter {
|
|
|
98
288
|
this.routeEventToInstances(event);
|
|
99
289
|
}
|
|
100
290
|
/**
|
|
101
|
-
* Extract convenience argument from event for ari-client style callbacks
|
|
291
|
+
* Extract convenience instance argument from event for ari-client style callbacks.
|
|
292
|
+
* Returns instance types (ChannelInstance, BridgeInstance, etc.) with methods.
|
|
293
|
+
* @internal
|
|
102
294
|
*/
|
|
103
295
|
getConvenienceArg(event) {
|
|
104
296
|
if ('channel' in event && event.channel) {
|
|
105
|
-
|
|
297
|
+
// Return a ChannelInstance with the channel data
|
|
298
|
+
return this.Channel(event.channel.id, event.channel);
|
|
106
299
|
}
|
|
107
300
|
if ('bridge' in event && event.bridge) {
|
|
108
|
-
|
|
301
|
+
// Return a BridgeInstance with the bridge data
|
|
302
|
+
return this.Bridge(event.bridge.id, event.bridge);
|
|
109
303
|
}
|
|
110
304
|
if ('playback' in event && event.playback) {
|
|
111
|
-
|
|
305
|
+
// Return a PlaybackInstance with the playback data
|
|
306
|
+
return this.Playback(event.playback.id, event.playback);
|
|
112
307
|
}
|
|
113
308
|
if ('recording' in event && event.recording) {
|
|
114
|
-
|
|
309
|
+
// Return a LiveRecordingInstance with the recording data
|
|
310
|
+
return this.LiveRecording(event.recording.name, event.recording);
|
|
115
311
|
}
|
|
116
312
|
if ('endpoint' in event && event.endpoint) {
|
|
313
|
+
// Endpoints don't have an instance class yet, return raw data
|
|
117
314
|
return event.endpoint;
|
|
118
315
|
}
|
|
119
|
-
// Special case for Dial event - return peer channel
|
|
316
|
+
// Special case for Dial event - return peer channel as instance
|
|
120
317
|
if (event.type === 'Dial' && 'peer' in event) {
|
|
121
|
-
return event.peer;
|
|
318
|
+
return this.Channel(event.peer.id, event.peer);
|
|
122
319
|
}
|
|
123
320
|
return undefined;
|
|
124
321
|
}
|
|
125
322
|
/**
|
|
126
323
|
* Route event to appropriate instance listeners
|
|
324
|
+
* @internal
|
|
127
325
|
*/
|
|
128
326
|
routeEventToInstances(event) {
|
|
129
327
|
// Channel events
|
|
@@ -164,10 +362,31 @@ export class AriClient extends AriEventEmitter {
|
|
|
164
362
|
}
|
|
165
363
|
}
|
|
166
364
|
// ============================================================================
|
|
167
|
-
// Instance Factory Methods
|
|
365
|
+
// Instance Factory Methods
|
|
168
366
|
// ============================================================================
|
|
169
367
|
/**
|
|
170
|
-
* Create a Channel instance
|
|
368
|
+
* Create or retrieve a Channel instance.
|
|
369
|
+
*
|
|
370
|
+
* Channel instances provide event-based programming for individual channels.
|
|
371
|
+
* Events are automatically routed to the appropriate instance based on channel ID.
|
|
372
|
+
*
|
|
373
|
+
* @param id - Channel ID (auto-generated if not provided)
|
|
374
|
+
* @param data - Initial channel data
|
|
375
|
+
* @returns Channel instance for event handling and operations
|
|
376
|
+
*
|
|
377
|
+
* @example
|
|
378
|
+
* ```typescript
|
|
379
|
+
* // Create a channel instance from an event
|
|
380
|
+
* client.on('StasisStart', (event, channelData) => {
|
|
381
|
+
* const channel = client.Channel(channelData.id, channelData);
|
|
382
|
+
*
|
|
383
|
+
* channel.on('ChannelDtmfReceived', (event) => {
|
|
384
|
+
* console.log(`DTMF: ${event.digit}`);
|
|
385
|
+
* });
|
|
386
|
+
*
|
|
387
|
+
* await channel.answer();
|
|
388
|
+
* });
|
|
389
|
+
* ```
|
|
171
390
|
*/
|
|
172
391
|
Channel(id, data) {
|
|
173
392
|
const existingId = id || data?.id;
|
|
@@ -182,7 +401,23 @@ export class AriClient extends AriEventEmitter {
|
|
|
182
401
|
return new ChannelInstance(this, id, data);
|
|
183
402
|
}
|
|
184
403
|
/**
|
|
185
|
-
* Create a Bridge instance
|
|
404
|
+
* Create or retrieve a Bridge instance.
|
|
405
|
+
*
|
|
406
|
+
* Bridge instances provide event-based programming for bridges.
|
|
407
|
+
*
|
|
408
|
+
* @param id - Bridge ID (auto-generated if not provided)
|
|
409
|
+
* @param data - Initial bridge data
|
|
410
|
+
* @returns Bridge instance for event handling and operations
|
|
411
|
+
*
|
|
412
|
+
* @example
|
|
413
|
+
* ```typescript
|
|
414
|
+
* const bridge = client.Bridge();
|
|
415
|
+
* await bridge.create({ type: 'mixing' });
|
|
416
|
+
*
|
|
417
|
+
* bridge.on('ChannelEnteredBridge', (event) => {
|
|
418
|
+
* console.log(`${event.channel.name} joined the bridge`);
|
|
419
|
+
* });
|
|
420
|
+
* ```
|
|
186
421
|
*/
|
|
187
422
|
Bridge(id, data) {
|
|
188
423
|
const existingId = id || data?.id;
|
|
@@ -197,7 +432,24 @@ export class AriClient extends AriEventEmitter {
|
|
|
197
432
|
return new BridgeInstance(this, id, data);
|
|
198
433
|
}
|
|
199
434
|
/**
|
|
200
|
-
* Create a Playback instance
|
|
435
|
+
* Create or retrieve a Playback instance.
|
|
436
|
+
*
|
|
437
|
+
* Playback instances provide event-based programming for media playback.
|
|
438
|
+
*
|
|
439
|
+
* @param id - Playback ID (auto-generated if not provided)
|
|
440
|
+
* @param data - Initial playback data
|
|
441
|
+
* @returns Playback instance for event handling and operations
|
|
442
|
+
*
|
|
443
|
+
* @example
|
|
444
|
+
* ```typescript
|
|
445
|
+
* const playback = client.Playback();
|
|
446
|
+
*
|
|
447
|
+
* playback.on('PlaybackFinished', (event) => {
|
|
448
|
+
* console.log('Playback completed');
|
|
449
|
+
* });
|
|
450
|
+
*
|
|
451
|
+
* await channel.play({ media: 'sound:hello', playbackId: playback.id });
|
|
452
|
+
* ```
|
|
201
453
|
*/
|
|
202
454
|
Playback(id, data) {
|
|
203
455
|
const existingId = id || data?.id;
|
|
@@ -212,7 +464,24 @@ export class AriClient extends AriEventEmitter {
|
|
|
212
464
|
return new PlaybackInstance(this, id, data);
|
|
213
465
|
}
|
|
214
466
|
/**
|
|
215
|
-
* Create a LiveRecording instance
|
|
467
|
+
* Create or retrieve a LiveRecording instance.
|
|
468
|
+
*
|
|
469
|
+
* LiveRecording instances provide event-based programming for active recordings.
|
|
470
|
+
*
|
|
471
|
+
* @param name - Recording name
|
|
472
|
+
* @param data - Initial recording data
|
|
473
|
+
* @returns LiveRecording instance for event handling and operations
|
|
474
|
+
*
|
|
475
|
+
* @example
|
|
476
|
+
* ```typescript
|
|
477
|
+
* const recording = client.LiveRecording('my-recording');
|
|
478
|
+
*
|
|
479
|
+
* recording.on('RecordingFinished', (event) => {
|
|
480
|
+
* console.log(`Recording saved: ${event.recording.name}`);
|
|
481
|
+
* });
|
|
482
|
+
*
|
|
483
|
+
* await channel.record({ name: 'my-recording', format: 'wav' });
|
|
484
|
+
* ```
|
|
216
485
|
*/
|
|
217
486
|
LiveRecording(name, data) {
|
|
218
487
|
const existing = this.recordingInstances.get(name);
|
|
@@ -224,7 +493,25 @@ export class AriClient extends AriEventEmitter {
|
|
|
224
493
|
return new LiveRecordingInstance(this, name, data);
|
|
225
494
|
}
|
|
226
495
|
/**
|
|
227
|
-
* Create a StoredRecording instance
|
|
496
|
+
* Create a StoredRecording instance.
|
|
497
|
+
*
|
|
498
|
+
* StoredRecording instances provide convenience methods for working with
|
|
499
|
+
* recordings that are already saved to disk. Unlike LiveRecording, these
|
|
500
|
+
* don't receive events.
|
|
501
|
+
*
|
|
502
|
+
* @param name - Recording name
|
|
503
|
+
* @returns StoredRecording instance for operations
|
|
504
|
+
*
|
|
505
|
+
* @example
|
|
506
|
+
* ```typescript
|
|
507
|
+
* const stored = client.StoredRecording('my-recording');
|
|
508
|
+
*
|
|
509
|
+
* // Copy the recording
|
|
510
|
+
* await stored.copy('my-recording-backup');
|
|
511
|
+
*
|
|
512
|
+
* // Delete the recording
|
|
513
|
+
* await stored.delete();
|
|
514
|
+
* ```
|
|
228
515
|
*/
|
|
229
516
|
StoredRecording(name) {
|
|
230
517
|
return new StoredRecordingInstance(this, name);
|
|
@@ -232,35 +519,35 @@ export class AriClient extends AriEventEmitter {
|
|
|
232
519
|
// ============================================================================
|
|
233
520
|
// Instance Registration (internal use by model instances)
|
|
234
521
|
// ============================================================================
|
|
235
|
-
/** @internal */
|
|
522
|
+
/** @internal Register a channel instance for event routing */
|
|
236
523
|
_registerChannelInstance(id, instance) {
|
|
237
524
|
this.channelInstances.set(id, instance);
|
|
238
525
|
}
|
|
239
|
-
/** @internal */
|
|
526
|
+
/** @internal Unregister a channel instance */
|
|
240
527
|
_unregisterChannelInstance(id) {
|
|
241
528
|
this.channelInstances.delete(id);
|
|
242
529
|
}
|
|
243
|
-
/** @internal */
|
|
530
|
+
/** @internal Register a bridge instance for event routing */
|
|
244
531
|
_registerBridgeInstance(id, instance) {
|
|
245
532
|
this.bridgeInstances.set(id, instance);
|
|
246
533
|
}
|
|
247
|
-
/** @internal */
|
|
534
|
+
/** @internal Unregister a bridge instance */
|
|
248
535
|
_unregisterBridgeInstance(id) {
|
|
249
536
|
this.bridgeInstances.delete(id);
|
|
250
537
|
}
|
|
251
|
-
/** @internal */
|
|
538
|
+
/** @internal Register a playback instance for event routing */
|
|
252
539
|
_registerPlaybackInstance(id, instance) {
|
|
253
540
|
this.playbackInstances.set(id, instance);
|
|
254
541
|
}
|
|
255
|
-
/** @internal */
|
|
542
|
+
/** @internal Unregister a playback instance */
|
|
256
543
|
_unregisterPlaybackInstance(id) {
|
|
257
544
|
this.playbackInstances.delete(id);
|
|
258
545
|
}
|
|
259
|
-
/** @internal */
|
|
546
|
+
/** @internal Register a recording instance for event routing */
|
|
260
547
|
_registerRecordingInstance(name, instance) {
|
|
261
548
|
this.recordingInstances.set(name, instance);
|
|
262
549
|
}
|
|
263
|
-
/** @internal */
|
|
550
|
+
/** @internal Unregister a recording instance */
|
|
264
551
|
_unregisterRecordingInstance(name) {
|
|
265
552
|
this.recordingInstances.delete(name);
|
|
266
553
|
}
|
|
@@ -268,19 +555,45 @@ export class AriClient extends AriEventEmitter {
|
|
|
268
555
|
// Connection State
|
|
269
556
|
// ============================================================================
|
|
270
557
|
/**
|
|
271
|
-
* Get the detected ARI/Asterisk version
|
|
558
|
+
* Get the detected ARI/Asterisk version compatibility checker.
|
|
559
|
+
*
|
|
560
|
+
* @returns Version compatibility object with feature flags
|
|
561
|
+
*
|
|
562
|
+
* @example
|
|
563
|
+
* ```typescript
|
|
564
|
+
* console.log(client.version.toString());
|
|
565
|
+
* // "Asterisk 20 (ARI 8.0.0)"
|
|
566
|
+
*
|
|
567
|
+
* if (client.version.hasExternalMedia) {
|
|
568
|
+
* // Use external media feature
|
|
569
|
+
* }
|
|
570
|
+
* ```
|
|
272
571
|
*/
|
|
273
572
|
get version() {
|
|
274
573
|
return this.versionCompat;
|
|
275
574
|
}
|
|
276
575
|
/**
|
|
277
|
-
* Check if WebSocket is
|
|
576
|
+
* Check if the WebSocket connection is active.
|
|
577
|
+
*
|
|
578
|
+
* @returns `true` if connected, `false` otherwise
|
|
278
579
|
*/
|
|
279
580
|
isConnected() {
|
|
280
581
|
return this.ws.isConnected();
|
|
281
582
|
}
|
|
282
583
|
/**
|
|
283
|
-
* Stop the client and disconnect
|
|
584
|
+
* Stop the client and disconnect from Asterisk.
|
|
585
|
+
*
|
|
586
|
+
* This closes the WebSocket connection and clears all instance registries.
|
|
587
|
+
* The client cannot be reused after calling stop().
|
|
588
|
+
*
|
|
589
|
+
* @example
|
|
590
|
+
* ```typescript
|
|
591
|
+
* // Graceful shutdown
|
|
592
|
+
* process.on('SIGTERM', () => {
|
|
593
|
+
* client.stop();
|
|
594
|
+
* process.exit(0);
|
|
595
|
+
* });
|
|
596
|
+
* ```
|
|
284
597
|
*/
|
|
285
598
|
stop() {
|
|
286
599
|
this.ws.disconnect();
|
|
@@ -290,21 +603,53 @@ export class AriClient extends AriEventEmitter {
|
|
|
290
603
|
this.recordingInstances.clear();
|
|
291
604
|
}
|
|
292
605
|
/**
|
|
293
|
-
* Reconnect the WebSocket
|
|
606
|
+
* Reconnect the WebSocket connection.
|
|
607
|
+
*
|
|
608
|
+
* Disconnects and then reconnects to Asterisk. Instance registries
|
|
609
|
+
* are preserved, so events will continue routing correctly.
|
|
610
|
+
*
|
|
611
|
+
* @returns Promise that resolves when reconnected
|
|
294
612
|
*/
|
|
295
613
|
async reconnect() {
|
|
296
614
|
this.ws.disconnect();
|
|
297
615
|
await this.ws.connect();
|
|
298
616
|
}
|
|
299
617
|
/**
|
|
300
|
-
* Get the application name
|
|
618
|
+
* Get the Stasis application name.
|
|
619
|
+
*
|
|
620
|
+
* @returns Application name used for this connection
|
|
301
621
|
*/
|
|
302
622
|
get app() {
|
|
303
623
|
return this.options.app;
|
|
304
624
|
}
|
|
305
625
|
}
|
|
306
626
|
/**
|
|
307
|
-
* Connect to Asterisk ARI
|
|
627
|
+
* Connect to Asterisk ARI and create a client.
|
|
628
|
+
*
|
|
629
|
+
* This is the main entry point for establishing an ARI connection.
|
|
630
|
+
* It performs version detection and sets up the WebSocket connection.
|
|
631
|
+
*
|
|
632
|
+
* @param options - Connection options
|
|
633
|
+
* @returns Promise that resolves to an ARI client
|
|
634
|
+
* @throws {AriHttpError} If connection fails or authentication is invalid
|
|
635
|
+
*
|
|
636
|
+
* @example
|
|
637
|
+
* ```typescript
|
|
638
|
+
* import { connect } from '@per_moeller/asterisk-ari';
|
|
639
|
+
*
|
|
640
|
+
* const client = await connect({
|
|
641
|
+
* url: 'http://localhost:8088',
|
|
642
|
+
* username: 'asterisk',
|
|
643
|
+
* password: 'secret',
|
|
644
|
+
* app: 'my-app'
|
|
645
|
+
* });
|
|
646
|
+
*
|
|
647
|
+
* console.log(`Connected to ${client.version}`);
|
|
648
|
+
*
|
|
649
|
+
* client.on('StasisStart', async (event, channel) => {
|
|
650
|
+
* await channel.answer();
|
|
651
|
+
* });
|
|
652
|
+
* ```
|
|
308
653
|
*/
|
|
309
654
|
export async function connect(options) {
|
|
310
655
|
const resolved = resolveOptions(options);
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;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,+EAA+E;IAC/E,gBAAgB;IAChB,+EAA+E;IAE/E;;;;;;;;;;;;;;;;;OAiBG;IACa,QAAQ,CAAmB;IAE3C;;;;;;;;;;;OAWG;IACa,OAAO,CAAkB;IAEzC;;;;;;;;;;;OAWG;IACa,SAAS,CAAoB;IAE7C;;;;;;;;;;;OAWG;IACa,YAAY,CAAuB;IAEnD;;;;;;;;;;;;OAYG;IACa,QAAQ,CAAmB;IAE3C;;;;;;;;;;OAUG;IACa,SAAS,CAAoB;IAE7C;;;;;;;;;;;OAWG;IACa,UAAU,CAAqB;IAE/C;;;;;;;;;;;OAWG;IACa,MAAM,CAAiB;IAEvC;;;;;;;;;;;;;;OAcG;IACa,SAAS,CAAoB;IAE7C;;;;;;;;;;;OAWG;IACa,YAAY,CAAuB;IAEnD;;;;;;;;;OASG;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;;;OAGG;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;;;OAGG;IACK,WAAW,CAAC,KAAe;QACjC,gFAAgF;QAChF,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAoB,EAAE,KAAkC,EAAE,cAAc,CAAC,CAAC;QAE1F,kDAAkD;QAClD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACK,iBAAiB,CAAC,KAAe;QACvC,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACxC,iDAAiD;YACjD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACtC,+CAA+C;YAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,UAAU,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC1C,mDAAmD;YACnD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,WAAW,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAC5C,yDAAyD;YACzD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,UAAU,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC1C,8DAA8D;YAC9D,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;QACD,gEAAgE;QAChE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;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,2BAA2B;IAC3B,+EAA+E;IAE/E;;;;;;;;;;;;;;;;;;;;;;;OAuBG;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;;;;;;;;;;;;;;;;;;OAkBG;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;;;;;;;;;;;;;;;;;;;OAmBG;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;;;;;;;;;;;;;;;;;;;OAmBG;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;;;;;;;;;;;;;;;;;;;;OAoBG;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,8DAA8D;IAC9D,wBAAwB,CAAC,EAAU,EAAE,QAAyB;QAC5D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,8CAA8C;IAC9C,0BAA0B,CAAC,EAAU;QACnC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,6DAA6D;IAC7D,uBAAuB,CAAC,EAAU,EAAE,QAAwB;QAC1D,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,6CAA6C;IAC7C,yBAAyB,CAAC,EAAU;QAClC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,+DAA+D;IAC/D,yBAAyB,CAAC,EAAU,EAAE,QAA0B;QAC9D,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,+CAA+C;IAC/C,2BAA2B,CAAC,EAAU;QACpC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,gEAAgE;IAChE,0BAA0B,CAAC,IAAY,EAAE,QAA+B;QACtE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,gDAAgD;IAChD,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;;;;;;;;;;;;;;OAcG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC;IAED;;;;;;;;;;;;;;OAcG;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;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;IAC1B,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;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"}
|