@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.
@@ -1,82 +1,293 @@
1
1
  /**
2
2
  * Type-safe event emitter for ARI events
3
+ *
4
+ * This module provides typed event emitter classes that ensure type safety
5
+ * when listening to and emitting ARI events.
6
+ *
7
+ * @packageDocumentation
3
8
  */
4
9
  import type { AriEventMap, AriEventType } from './types.js';
5
- type EventListener<T> = (event: T, ...args: unknown[]) => void | Promise<void>;
10
+ import type { ChannelInstance } from '../models/channel.js';
11
+ import type { BridgeInstance } from '../models/bridge.js';
12
+ import type { PlaybackInstance } from '../models/playback.js';
13
+ import type { LiveRecordingInstance } from '../models/recording.js';
14
+ import type { Endpoint } from '../types/api.js';
6
15
  /**
7
- * Typed event emitter with support for wildcard listeners
16
+ * Maps event types to their convenience instance argument type.
17
+ *
18
+ * This provides the instance types (with methods) for event callbacks,
19
+ * enabling ari-client style usage:
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * client.on('StasisStart', (event, channel) => {
24
+ * // channel is ChannelInstance with methods like answer(), play(), etc.
25
+ * channel.answer();
26
+ * });
27
+ * ```
28
+ */
29
+ export type EventInstanceArg<K extends AriEventType> = K extends 'StasisStart' | 'StasisEnd' | 'ChannelCreated' | 'ChannelDestroyed' | 'ChannelStateChange' | 'ChannelDtmfReceived' | 'ChannelHangupRequest' | 'ChannelHold' | 'ChannelUnhold' | 'ChannelTalkingStarted' | 'ChannelTalkingFinished' | 'ChannelConnectedLine' | 'ChannelDialplan' | 'ChannelCallerId' | 'ChannelToneDetected' | 'ChannelEnteredBridge' | 'ChannelLeftBridge' | 'ChannelTransfer' | 'BridgeBlindTransfer' | 'ApplicationMoveFailed' ? ChannelInstance : K extends 'BridgeCreated' | 'BridgeDestroyed' | 'BridgeMerged' | 'BridgeVideoSourceChanged' ? BridgeInstance : K extends 'PlaybackStarted' | 'PlaybackContinuing' | 'PlaybackFinished' ? PlaybackInstance : K extends 'RecordingStarted' | 'RecordingFinished' | 'RecordingFailed' ? LiveRecordingInstance : K extends 'EndpointStateChange' | 'PeerStatusChange' | 'ContactStatusChange' ? Endpoint : K extends 'Dial' ? ChannelInstance : K extends 'ChannelVarset' ? ChannelInstance | undefined : K extends 'ChannelUserevent' ? ChannelInstance | undefined : undefined;
30
+ /**
31
+ * A typed event emitter with support for wildcard listeners.
32
+ *
33
+ * This generic class wraps Node.js EventEmitter to provide type-safe
34
+ * event handling based on an event map type parameter.
35
+ *
36
+ * @typeParam TEventMap - Object type mapping event names to event data types
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * interface MyEvents {
41
+ * userJoined: { userId: string; name: string };
42
+ * userLeft: { userId: string };
43
+ * '*': { userId: string } | { userId: string; name: string };
44
+ * }
45
+ *
46
+ * const emitter = new TypedEventEmitter<MyEvents>();
47
+ *
48
+ * emitter.on('userJoined', (event) => {
49
+ * // event is typed as { userId: string; name: string }
50
+ * console.log(event.name);
51
+ * });
52
+ * ```
8
53
  */
9
54
  export declare class TypedEventEmitter<TEventMap extends object> {
10
55
  private emitter;
11
56
  private wildcardListeners;
12
57
  constructor();
13
58
  /**
14
- * Add an event listener
59
+ * Add an event listener.
60
+ *
61
+ * @param event - Event name to listen for, or '*' for all events
62
+ * @param listener - Callback function to invoke when event occurs
63
+ * @returns This emitter for chaining
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * emitter.on('userJoined', (event) => {
68
+ * console.log(`${event.name} joined`);
69
+ * });
70
+ * ```
15
71
  */
16
- on<K extends keyof TEventMap>(event: K, listener: EventListener<TEventMap[K]>): this;
72
+ on<K extends keyof TEventMap>(event: K, listener: (event: TEventMap[K], ...args: unknown[]) => void | Promise<void>): this;
17
73
  /**
18
- * Add a one-time event listener
74
+ * Add a one-time event listener.
75
+ *
76
+ * The listener is automatically removed after being invoked once.
77
+ *
78
+ * @param event - Event name to listen for, or '*' for all events
79
+ * @param listener - Callback function to invoke when event occurs
80
+ * @returns This emitter for chaining
19
81
  */
20
- once<K extends keyof TEventMap>(event: K, listener: EventListener<TEventMap[K]>): this;
82
+ once<K extends keyof TEventMap>(event: K, listener: (event: TEventMap[K], ...args: unknown[]) => void | Promise<void>): this;
21
83
  /**
22
- * Remove an event listener
84
+ * Remove an event listener.
85
+ *
86
+ * @param event - Event name the listener was registered for
87
+ * @param listener - The listener function to remove
88
+ * @returns This emitter for chaining
23
89
  */
24
- off<K extends keyof TEventMap>(event: K, listener: EventListener<TEventMap[K]>): this;
90
+ off<K extends keyof TEventMap>(event: K, listener: (event: TEventMap[K], ...args: unknown[]) => void | Promise<void>): this;
25
91
  /**
26
- * Emit an event
92
+ * Emit an event to all registered listeners.
93
+ *
94
+ * @param event - Event name to emit
95
+ * @param data - Event data to pass to listeners
96
+ * @param convenienceArg - Optional second argument for listeners
97
+ * @returns `true` if any listeners were invoked
98
+ *
99
+ * @internal
27
100
  */
28
- emit<K extends keyof TEventMap>(event: K, data: TEventMap[K], ...args: unknown[]): boolean;
101
+ emit<K extends keyof TEventMap>(event: K, data: TEventMap[K], convenienceArg?: unknown): boolean;
29
102
  /**
30
- * Remove all listeners for an event
103
+ * Remove all listeners for a specific event or all events.
104
+ *
105
+ * @param event - Event name to remove listeners for, or undefined for all
106
+ * @returns This emitter for chaining
31
107
  */
32
108
  removeAllListeners<K extends keyof TEventMap>(event?: K): this;
33
109
  /**
34
- * Get listener count for an event
110
+ * Get the number of listeners for an event.
111
+ *
112
+ * @param event - Event name to count listeners for
113
+ * @returns Number of registered listeners
35
114
  */
36
115
  listenerCount<K extends keyof TEventMap>(event: K): number;
37
116
  /**
38
- * Set max listeners
117
+ * Set the maximum number of listeners before a warning is issued.
118
+ *
119
+ * @param n - Maximum number of listeners
120
+ * @returns This emitter for chaining
39
121
  */
40
122
  setMaxListeners(n: number): this;
41
123
  }
42
124
  /**
43
- * ARI Event emitter with typed events
125
+ * Listener function type for ARI events with typed instance argument.
126
+ *
127
+ * This type provides proper typing for the second "convenience" argument
128
+ * that is passed to listeners for ari-client compatibility. The argument
129
+ * is an instance type (e.g., `ChannelInstance`) with methods, not just data.
130
+ *
131
+ * @typeParam K - The event type string
132
+ *
133
+ * @example
134
+ * ```typescript
135
+ * // For StasisStart, the listener receives (event, channel)
136
+ * const listener: AriEventListener<'StasisStart'> = (event, channel) => {
137
+ * // event is StasisStartEvent
138
+ * // channel is ChannelInstance with methods like answer(), play(), etc.
139
+ * channel.answer();
140
+ * };
141
+ * ```
142
+ */
143
+ export type AriEventListener<K extends AriEventType | '*'> = K extends '*' ? (event: AriEventMap['*']) => void | Promise<void> : K extends AriEventType ? EventInstanceArg<K> extends undefined ? (event: AriEventMap[K]) => void | Promise<void> : (event: AriEventMap[K], arg: EventInstanceArg<K>) => void | Promise<void> : never;
144
+ /**
145
+ * ARI Event emitter with typed events and convenience arguments.
146
+ *
147
+ * This class is the base for `AriClient` and provides type-safe event
148
+ * handling for all ARI events. It supports the ari-client style of
149
+ * passing convenience arguments (channel, bridge, etc.) as a second
150
+ * parameter to listeners.
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * const emitter = new AriEventEmitter();
155
+ *
156
+ * // The channel parameter is automatically typed
157
+ * emitter.on('StasisStart', (event, channel) => {
158
+ * console.log(`Call from ${channel.caller.number}`);
159
+ * });
160
+ *
161
+ * // Wildcard listener receives all events
162
+ * emitter.on('*', (event) => {
163
+ * console.log(`Event: ${event.type}`);
164
+ * });
165
+ * ```
44
166
  */
45
- export declare class AriEventEmitter extends TypedEventEmitter<AriEventMap> {
167
+ export declare class AriEventEmitter {
168
+ private emitter;
169
+ private wildcardListeners;
170
+ constructor();
171
+ /**
172
+ * Add a listener for a specific event type.
173
+ *
174
+ * The listener receives the event object and an optional convenience
175
+ * argument (channel, bridge, playback, etc.) depending on the event type.
176
+ *
177
+ * @param event - Event type to listen for, or '*' for all events
178
+ * @param listener - Callback function with typed parameters
179
+ * @returns This emitter for chaining
180
+ *
181
+ * @example
182
+ * ```typescript
183
+ * // Channel events pass the channel as second argument
184
+ * client.on('StasisStart', (event, channel) => {
185
+ * channel.answer();
186
+ * });
187
+ *
188
+ * // Bridge events pass the bridge
189
+ * client.on('BridgeCreated', (event, bridge) => {
190
+ * console.log(`Bridge ${bridge.id} created`);
191
+ * });
192
+ *
193
+ * // Listen to all events
194
+ * client.on('*', (event) => {
195
+ * console.log(event.type);
196
+ * });
197
+ * ```
198
+ */
199
+ on<K extends AriEventType | '*'>(event: K, listener: AriEventListener<K>): this;
200
+ /**
201
+ * Add a one-time listener for a specific event type.
202
+ *
203
+ * The listener is automatically removed after being invoked once.
204
+ *
205
+ * @param event - Event type to listen for, or '*' for all events
206
+ * @param listener - Callback function with typed parameters
207
+ * @returns This emitter for chaining
208
+ *
209
+ * @example
210
+ * ```typescript
211
+ * // Wait for a single event
212
+ * client.once('StasisStart', (event, channel) => {
213
+ * console.log('First call received!');
214
+ * });
215
+ * ```
216
+ */
217
+ once<K extends AriEventType | '*'>(event: K, listener: AriEventListener<K>): this;
218
+ /**
219
+ * Remove a listener for a specific event type.
220
+ *
221
+ * @param event - Event type the listener was registered for
222
+ * @param listener - The listener function to remove
223
+ * @returns This emitter for chaining
224
+ */
225
+ off<K extends AriEventType | '*'>(event: K, listener: AriEventListener<K>): this;
226
+ /**
227
+ * Emit an event to all registered listeners.
228
+ *
229
+ * @param event - Event type to emit
230
+ * @param data - Event data to pass to listeners
231
+ * @param convenienceArg - Optional convenience argument (channel, bridge, etc.)
232
+ * @returns `true` if any listeners were invoked
233
+ *
234
+ * @internal
235
+ */
236
+ emit<K extends AriEventType>(event: K, data: AriEventMap[K], convenienceArg?: unknown): boolean;
46
237
  /**
47
- * Add a listener for a specific event type
238
+ * Remove all listeners for a specific event or all events.
239
+ *
240
+ * @param event - Event type to remove listeners for, or undefined for all
241
+ * @returns This emitter for chaining
48
242
  */
49
- on<K extends AriEventType | '*'>(event: K, listener: EventListener<AriEventMap[K]>): this;
243
+ removeAllListeners<K extends AriEventType | '*'>(event?: K): this;
50
244
  /**
51
- * Add a one-time listener for a specific event type
245
+ * Get the number of listeners for an event type.
246
+ *
247
+ * @param event - Event type to count listeners for
248
+ * @returns Number of registered listeners
52
249
  */
53
- once<K extends AriEventType | '*'>(event: K, listener: EventListener<AriEventMap[K]>): this;
250
+ listenerCount<K extends AriEventType | '*'>(event: K): number;
54
251
  /**
55
- * Remove a listener for a specific event type
252
+ * Set the maximum number of listeners before a warning is issued.
253
+ *
254
+ * @param n - Maximum number of listeners (default: 100)
255
+ * @returns This emitter for chaining
56
256
  */
57
- off<K extends AriEventType | '*'>(event: K, listener: EventListener<AriEventMap[K]>): this;
257
+ setMaxListeners(n: number): this;
58
258
  }
59
259
  /**
60
- * Connection event map
260
+ * Event map for WebSocket connection events.
261
+ *
262
+ * Used internally by `ConnectionEventEmitter` to type connection-related events.
61
263
  */
62
264
  export interface ConnectionEventMap {
265
+ /** Emitted when the connection is established */
63
266
  connected: void;
267
+ /** Emitted when the connection is closed */
64
268
  disconnected: {
65
269
  intentional: boolean;
66
270
  error?: Error;
67
271
  };
272
+ /** Emitted when attempting to reconnect */
68
273
  reconnecting: {
69
274
  attempt: number;
70
275
  delay: number;
71
276
  };
277
+ /** Emitted when reconnection succeeds */
72
278
  reconnected: void;
279
+ /** Emitted when an error occurs */
73
280
  error: Error;
281
+ /** Emitted when a message is received */
74
282
  message: unknown;
75
283
  }
76
284
  /**
77
- * Connection event emitter
285
+ * Event emitter for WebSocket connection events.
286
+ *
287
+ * Used internally by the WebSocket manager to emit connection state events.
288
+ *
289
+ * @internal
78
290
  */
79
291
  export declare class ConnectionEventEmitter extends TypedEventEmitter<ConnectionEventMap> {
80
292
  }
81
- export {};
82
293
  //# sourceMappingURL=emitter.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/events/emitter.ts"],"names":[],"mappings":"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"}