@per_moeller/asterisk-ari 1.0.2 → 1.0.4
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 +363 -21
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +395 -24
- 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 +235 -24
- package/dist/events/emitter.d.ts.map +1 -1
- package/dist/events/emitter.js +248 -22
- package/dist/events/emitter.js.map +1 -1
- package/dist/events/types.d.ts +389 -1
- 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/channel.d.ts +349 -32
- 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/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,15 +278,50 @@ 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
|
-
// Emit to global listeners
|
|
95
|
-
this.
|
|
284
|
+
// Emit to global listeners with convenience argument (ari-client compatibility)
|
|
285
|
+
const convenienceArg = this.getConvenienceArg(event);
|
|
286
|
+
this.emit(event.type, event, convenienceArg);
|
|
96
287
|
// Route to specific instances based on event type
|
|
97
288
|
this.routeEventToInstances(event);
|
|
98
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* Extract convenience instance argument from event for ari-client style callbacks.
|
|
292
|
+
* Returns instance types (ChannelInstance, BridgeInstance, etc.) with methods.
|
|
293
|
+
* @internal
|
|
294
|
+
*/
|
|
295
|
+
getConvenienceArg(event) {
|
|
296
|
+
if ('channel' in event && event.channel) {
|
|
297
|
+
// Return a ChannelInstance with the channel data
|
|
298
|
+
return this.Channel(event.channel.id, event.channel);
|
|
299
|
+
}
|
|
300
|
+
if ('bridge' in event && event.bridge) {
|
|
301
|
+
// Return a BridgeInstance with the bridge data
|
|
302
|
+
return this.Bridge(event.bridge.id, event.bridge);
|
|
303
|
+
}
|
|
304
|
+
if ('playback' in event && event.playback) {
|
|
305
|
+
// Return a PlaybackInstance with the playback data
|
|
306
|
+
return this.Playback(event.playback.id, event.playback);
|
|
307
|
+
}
|
|
308
|
+
if ('recording' in event && event.recording) {
|
|
309
|
+
// Return a LiveRecordingInstance with the recording data
|
|
310
|
+
return this.LiveRecording(event.recording.name, event.recording);
|
|
311
|
+
}
|
|
312
|
+
if ('endpoint' in event && event.endpoint) {
|
|
313
|
+
// Endpoints don't have an instance class yet, return raw data
|
|
314
|
+
return event.endpoint;
|
|
315
|
+
}
|
|
316
|
+
// Special case for Dial event - return peer channel as instance
|
|
317
|
+
if (event.type === 'Dial' && 'peer' in event) {
|
|
318
|
+
return this.Channel(event.peer.id, event.peer);
|
|
319
|
+
}
|
|
320
|
+
return undefined;
|
|
321
|
+
}
|
|
99
322
|
/**
|
|
100
323
|
* Route event to appropriate instance listeners
|
|
324
|
+
* @internal
|
|
101
325
|
*/
|
|
102
326
|
routeEventToInstances(event) {
|
|
103
327
|
// Channel events
|
|
@@ -138,10 +362,31 @@ export class AriClient extends AriEventEmitter {
|
|
|
138
362
|
}
|
|
139
363
|
}
|
|
140
364
|
// ============================================================================
|
|
141
|
-
// Instance Factory Methods
|
|
365
|
+
// Instance Factory Methods
|
|
142
366
|
// ============================================================================
|
|
143
367
|
/**
|
|
144
|
-
* 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
|
+
* ```
|
|
145
390
|
*/
|
|
146
391
|
Channel(id, data) {
|
|
147
392
|
const existingId = id || data?.id;
|
|
@@ -156,7 +401,23 @@ export class AriClient extends AriEventEmitter {
|
|
|
156
401
|
return new ChannelInstance(this, id, data);
|
|
157
402
|
}
|
|
158
403
|
/**
|
|
159
|
-
* 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
|
+
* ```
|
|
160
421
|
*/
|
|
161
422
|
Bridge(id, data) {
|
|
162
423
|
const existingId = id || data?.id;
|
|
@@ -171,7 +432,24 @@ export class AriClient extends AriEventEmitter {
|
|
|
171
432
|
return new BridgeInstance(this, id, data);
|
|
172
433
|
}
|
|
173
434
|
/**
|
|
174
|
-
* 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
|
+
* ```
|
|
175
453
|
*/
|
|
176
454
|
Playback(id, data) {
|
|
177
455
|
const existingId = id || data?.id;
|
|
@@ -186,7 +464,24 @@ export class AriClient extends AriEventEmitter {
|
|
|
186
464
|
return new PlaybackInstance(this, id, data);
|
|
187
465
|
}
|
|
188
466
|
/**
|
|
189
|
-
* 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
|
+
* ```
|
|
190
485
|
*/
|
|
191
486
|
LiveRecording(name, data) {
|
|
192
487
|
const existing = this.recordingInstances.get(name);
|
|
@@ -198,7 +493,25 @@ export class AriClient extends AriEventEmitter {
|
|
|
198
493
|
return new LiveRecordingInstance(this, name, data);
|
|
199
494
|
}
|
|
200
495
|
/**
|
|
201
|
-
* 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
|
+
* ```
|
|
202
515
|
*/
|
|
203
516
|
StoredRecording(name) {
|
|
204
517
|
return new StoredRecordingInstance(this, name);
|
|
@@ -206,35 +519,35 @@ export class AriClient extends AriEventEmitter {
|
|
|
206
519
|
// ============================================================================
|
|
207
520
|
// Instance Registration (internal use by model instances)
|
|
208
521
|
// ============================================================================
|
|
209
|
-
/** @internal */
|
|
522
|
+
/** @internal Register a channel instance for event routing */
|
|
210
523
|
_registerChannelInstance(id, instance) {
|
|
211
524
|
this.channelInstances.set(id, instance);
|
|
212
525
|
}
|
|
213
|
-
/** @internal */
|
|
526
|
+
/** @internal Unregister a channel instance */
|
|
214
527
|
_unregisterChannelInstance(id) {
|
|
215
528
|
this.channelInstances.delete(id);
|
|
216
529
|
}
|
|
217
|
-
/** @internal */
|
|
530
|
+
/** @internal Register a bridge instance for event routing */
|
|
218
531
|
_registerBridgeInstance(id, instance) {
|
|
219
532
|
this.bridgeInstances.set(id, instance);
|
|
220
533
|
}
|
|
221
|
-
/** @internal */
|
|
534
|
+
/** @internal Unregister a bridge instance */
|
|
222
535
|
_unregisterBridgeInstance(id) {
|
|
223
536
|
this.bridgeInstances.delete(id);
|
|
224
537
|
}
|
|
225
|
-
/** @internal */
|
|
538
|
+
/** @internal Register a playback instance for event routing */
|
|
226
539
|
_registerPlaybackInstance(id, instance) {
|
|
227
540
|
this.playbackInstances.set(id, instance);
|
|
228
541
|
}
|
|
229
|
-
/** @internal */
|
|
542
|
+
/** @internal Unregister a playback instance */
|
|
230
543
|
_unregisterPlaybackInstance(id) {
|
|
231
544
|
this.playbackInstances.delete(id);
|
|
232
545
|
}
|
|
233
|
-
/** @internal */
|
|
546
|
+
/** @internal Register a recording instance for event routing */
|
|
234
547
|
_registerRecordingInstance(name, instance) {
|
|
235
548
|
this.recordingInstances.set(name, instance);
|
|
236
549
|
}
|
|
237
|
-
/** @internal */
|
|
550
|
+
/** @internal Unregister a recording instance */
|
|
238
551
|
_unregisterRecordingInstance(name) {
|
|
239
552
|
this.recordingInstances.delete(name);
|
|
240
553
|
}
|
|
@@ -242,19 +555,45 @@ export class AriClient extends AriEventEmitter {
|
|
|
242
555
|
// Connection State
|
|
243
556
|
// ============================================================================
|
|
244
557
|
/**
|
|
245
|
-
* 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
|
+
* ```
|
|
246
571
|
*/
|
|
247
572
|
get version() {
|
|
248
573
|
return this.versionCompat;
|
|
249
574
|
}
|
|
250
575
|
/**
|
|
251
|
-
* Check if WebSocket is
|
|
576
|
+
* Check if the WebSocket connection is active.
|
|
577
|
+
*
|
|
578
|
+
* @returns `true` if connected, `false` otherwise
|
|
252
579
|
*/
|
|
253
580
|
isConnected() {
|
|
254
581
|
return this.ws.isConnected();
|
|
255
582
|
}
|
|
256
583
|
/**
|
|
257
|
-
* 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
|
+
* ```
|
|
258
597
|
*/
|
|
259
598
|
stop() {
|
|
260
599
|
this.ws.disconnect();
|
|
@@ -264,21 +603,53 @@ export class AriClient extends AriEventEmitter {
|
|
|
264
603
|
this.recordingInstances.clear();
|
|
265
604
|
}
|
|
266
605
|
/**
|
|
267
|
-
* 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
|
|
268
612
|
*/
|
|
269
613
|
async reconnect() {
|
|
270
614
|
this.ws.disconnect();
|
|
271
615
|
await this.ws.connect();
|
|
272
616
|
}
|
|
273
617
|
/**
|
|
274
|
-
* Get the application name
|
|
618
|
+
* Get the Stasis application name.
|
|
619
|
+
*
|
|
620
|
+
* @returns Application name used for this connection
|
|
275
621
|
*/
|
|
276
622
|
get app() {
|
|
277
623
|
return this.options.app;
|
|
278
624
|
}
|
|
279
625
|
}
|
|
280
626
|
/**
|
|
281
|
-
* 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
|
+
* ```
|
|
282
653
|
*/
|
|
283
654
|
export async function connect(options) {
|
|
284
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"}
|