@ipcom/asterisk-ari 0.0.24 → 0.0.26
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/cjs/index.cjs +404 -57
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/esm/index.js +403 -57
- package/dist/esm/index.js.map +4 -4
- package/dist/types/ari-client/ariClient.d.ts +126 -18
- package/dist/types/ari-client/ariClient.d.ts.map +1 -1
- package/dist/types/ari-client/interfaces/bridges.types.d.ts +38 -0
- package/dist/types/ari-client/interfaces/bridges.types.d.ts.map +1 -0
- package/dist/types/ari-client/interfaces/events.types.d.ts +78 -0
- package/dist/types/ari-client/interfaces/events.types.d.ts.map +1 -1
- package/dist/types/ari-client/interfaces/index.d.ts +1 -0
- package/dist/types/ari-client/interfaces/index.d.ts.map +1 -1
- package/dist/types/ari-client/interfaces/playbacks.types.d.ts +10 -3
- package/dist/types/ari-client/interfaces/playbacks.types.d.ts.map +1 -1
- package/dist/types/ari-client/resources/asterisk.d.ts +1 -1
- package/dist/types/ari-client/resources/asterisk.d.ts.map +1 -1
- package/dist/types/ari-client/resources/bridges.d.ts +46 -0
- package/dist/types/ari-client/resources/bridges.d.ts.map +1 -1
- package/dist/types/ari-client/resources/playbacks.d.ts +51 -5
- package/dist/types/ari-client/resources/playbacks.d.ts.map +1 -1
- package/dist/types/ari-client/websocketClient.d.ts +56 -5
- package/dist/types/ari-client/websocketClient.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/esm/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../node_modules/exponential-backoff/src/options.ts", "../../node_modules/exponential-backoff/src/jitter/full/full.jitter.ts", "../../node_modules/exponential-backoff/src/jitter/no/no.jitter.ts", "../../node_modules/exponential-backoff/src/jitter/jitter.factory.ts", "../../node_modules/exponential-backoff/src/delay/delay.base.ts", "../../node_modules/exponential-backoff/src/delay/skip-first/skip-first.delay.ts", "../../node_modules/exponential-backoff/src/delay/always/always.delay.ts", "../../node_modules/exponential-backoff/src/delay/delay.factory.ts", "../../node_modules/exponential-backoff/src/backoff.ts", "../../src/ari-client/ariClient.ts", "../../src/ari-client/baseClient.ts", "../../src/ari-client/resources/applications.ts", "../../src/ari-client/resources/asterisk.ts", "../../src/ari-client/resources/channels.ts", "../../src/ari-client/resources/endpoints.ts", "../../src/ari-client/resources/playbacks.ts", "../../src/ari-client/resources/sounds.ts", "../../src/ari-client/websocketClient.ts"],
|
|
4
|
-
"sourcesContent": [null, null, null, null, null, null, null, null, null, "import { type IBackOffOptions, backOff } from \"exponential-backoff\";\nimport { BaseClient } from \"./baseClient.js\";\nimport type {\n Application,\n ApplicationDetails,\n} from \"./interfaces/applications.types\";\nimport type {\n AsteriskInfo,\n Logging,\n Module,\n Variable,\n} from \"./interfaces/asterisk.types\";\nimport type {\n Channel,\n ChannelPlayback,\n ChannelVar,\n ExternalMediaOptions,\n OriginateRequest,\n PlaybackOptions,\n RTPStats,\n RecordingOptions,\n SnoopOptions,\n} from \"./interfaces/channels.types\";\nimport type {\n Endpoint,\n EndpointDetails,\n} from \"./interfaces/endpoints.types.js\";\nimport type {\n WebSocketEvent,\n WebSocketEventType,\n} from \"./interfaces/events.types\";\nimport type {\n Playback as APIPlayback,\n PlaybackControlRequest,\n} from \"./interfaces/playbacks.types\";\nimport type { AriApplication, AriClientConfig } from \"./interfaces/requests.js\";\nimport type { Sound, SoundListRequest } from \"./interfaces/sounds.types\";\nimport { Applications } from \"./resources/applications.js\";\nimport { Asterisk } from \"./resources/asterisk\";\nimport { Channels } from \"./resources/channels.js\";\nimport { Endpoints } from \"./resources/endpoints\";\nimport { Playbacks } from \"./resources/playbacks\";\nimport { Sounds } from \"./resources/sounds\";\nimport { WebSocketClient } from \"./websocketClient.js\";\n\nexport class AriClient {\n private wsClient: WebSocketClient | null = null;\n private readonly baseClient: BaseClient;\n private isReconnecting = false;\n\n public channels: Channels;\n public endpoints: Endpoints;\n public applications: Applications;\n public playbacks: Playbacks;\n public sounds: Sounds;\n public asterisk: Asterisk;\n\n constructor(private config: AriClientConfig) {\n const httpProtocol = config.secure ? \"https\" : \"http\";\n const normalizedHost = config.host.replace(/^https?:\\/\\//, \"\");\n const baseUrl = `${httpProtocol}://${normalizedHost}:${config.port}/ari`;\n\n this.baseClient = new BaseClient(baseUrl, config.username, config.password);\n this.channels = new Channels(this.baseClient);\n this.endpoints = new Endpoints(this.baseClient);\n this.applications = new Applications(this.baseClient);\n this.playbacks = new Playbacks(this.baseClient);\n this.sounds = new Sounds(this.baseClient);\n this.asterisk = new Asterisk(this.baseClient);\n }\n\n /**\n * Connects to the ARI WebSocket for a specific application.\n *\n * @param app - The application name to connect to.\n * @returns {Promise<void>} Resolves when the WebSocket connects successfully.\n */\n async connectWebSocket(\n app: string,\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void> {\n if (!app) {\n throw new Error(\n \"The 'app' parameter is required to connect to the WebSocket.\",\n );\n }\n\n if (this.isReconnecting) {\n console.warn(\"Already attempting to reconnect. Skipping this attempt.\");\n return;\n }\n\n this.isReconnecting = true;\n\n // Se nenhum evento foi especificado, assumimos que o cliente quer escutar todos.\n const eventsParam =\n subscribedEvents && subscribedEvents.length > 0\n ? `&event=${subscribedEvents.join(\",\")}`\n : \"&subscribeAll=true\";\n\n const protocol = this.config.secure ? \"wss\" : \"ws\";\n const wsUrl = `${protocol}://${encodeURIComponent(this.config.username)}:${encodeURIComponent(this.config.password)}@${\n this.config.host\n }:${this.config.port}/ari/events?app=${app}${eventsParam}`;\n\n const backoffOptions: IBackOffOptions = {\n delayFirstAttempt: false,\n startingDelay: 1000,\n timeMultiple: 2,\n maxDelay: 30000,\n numOfAttempts: 10,\n jitter: \"full\",\n retry: (error: any, attemptNumber: number) => {\n console.warn(`Tentativa ${attemptNumber} falhou: ${error.message}`);\n return !this.wsClient?.isConnected();\n },\n };\n\n this.wsClient = new WebSocketClient(wsUrl);\n\n try {\n await backOff(async () => {\n if (!this.wsClient) {\n throw new Error(\"WebSocketClient instance is null.\");\n }\n await this.wsClient.connect();\n console.log(`WebSocket conectado para o app: ${app}`);\n await this.ensureAppRegistered(app); // Verifica e registra o aplicativo\n }, backoffOptions);\n } catch (err) {\n console.error(\n \"N\u00E3o foi poss\u00EDvel conectar ao WebSocket ap\u00F3s m\u00FAltiplas tentativas:\",\n err,\n );\n throw err;\n } finally {\n this.isReconnecting = false;\n }\n }\n\n /**\n * Ensures the ARI application is registered.\n *\n * @param app - The application name to ensure is registered.\n * @returns {Promise<void>}\n */\n async ensureAppRegistered(app: string): Promise<void> {\n try {\n const apps = await this.baseClient.get<AriApplication[]>(\"/applications\");\n const appExists = apps.some((a: { name: string }) => a.name === app);\n\n if (!appExists) {\n console.log(`Registrando o aplicativo ARI: ${app}`);\n await this.baseClient.post(\"/applications\", { app });\n console.log(`Aplicativo ${app} registrado com sucesso.`);\n } else {\n console.log(`Aplicativo ${app} j\u00E1 est\u00E1 registrado.`);\n }\n } catch (error) {\n console.error(`Erro ao garantir o registro do aplicativo ${app}:`, error);\n throw error;\n }\n }\n\n /**\n * Checks if the WebSocket connection is active.\n *\n * @returns {boolean} True if connected, false otherwise.\n */\n isWebSocketConnected(): boolean {\n return this.wsClient ? this.wsClient.isConnected() : false;\n }\n\n /**\n * Registers a callback function for WebSocket events.\n * This method allows you to listen for and respond to WebSocket messages\n * and process specific event types.\n *\n * @param callback - The callback function to execute when a WebSocket message is received.\n * The function will receive the parsed event data as its parameter.\n * @throws {Error} Throws an error if the WebSocket is not connected when trying to register the event.\n * @returns {void}\n */\n onWebSocketEvent<T extends WebSocketEvent[\"type\"]>(\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (!this.wsClient) {\n throw new Error(\"WebSocket is not connected.\");\n }\n\n this.wsClient.on(\"message\", callback);\n }\n\n /**\n * Closes the WebSocket connection.\n */\n closeWebSocket(): void {\n if (this.wsClient) {\n this.wsClient.close();\n this.wsClient = null;\n }\n }\n /**\n * Retrieves a list of active channels from the Asterisk ARI.\n *\n * @returns {Promise<Channel[]>} A promise resolving to the list of active channels.\n */\n /**\n * Lists all active channels.\n */\n async listChannels(): Promise<Channel[]> {\n return this.channels.list();\n }\n\n /**\n * Creates a new channel.\n */\n async originateChannel(data: OriginateRequest): Promise<Channel> {\n return this.channels.originate(data);\n }\n\n /**\n * Retrieves details of a specific channel.\n */\n async getChannelDetails(channelId: string): Promise<Channel> {\n return this.channels.getDetails(channelId);\n }\n\n /**\n * Hangs up a specific channel.\n */\n async hangupChannel(channelId: string): Promise<void> {\n return this.channels.hangup(channelId);\n }\n\n /**\n * Continues the dialplan for a specific channel.\n */\n async continueChannelDialplan(\n channelId: string,\n context?: string,\n extension?: string,\n priority?: number,\n label?: string,\n ): Promise<void> {\n return this.channels.continueDialplan(\n channelId,\n context,\n extension,\n priority,\n label,\n );\n }\n\n /**\n * Moves a channel to another Stasis application.\n */\n async moveChannelToApplication(\n channelId: string,\n app: string,\n appArgs?: string,\n ): Promise<void> {\n return this.channels.moveToApplication(channelId, app, appArgs);\n }\n\n /**\n * Sets a channel variable.\n */\n async setChannelVariable(\n channelId: string,\n variable: string,\n value: string,\n ): Promise<void> {\n return this.channels.setVariable(channelId, variable, value);\n }\n\n /**\n * Gets a channel variable.\n */\n async getChannelVariable(\n channelId: string,\n variable: string,\n ): Promise<ChannelVar> {\n return this.channels.getVariable(channelId, variable);\n }\n\n /**\n * Plays a media file to a channel.\n */\n async playMediaToChannel(\n channelId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n return this.channels.playMedia(channelId, media, options);\n }\n\n /**\n * Starts music on hold for a channel.\n */\n async startChannelMusicOnHold(channelId: string): Promise<void> {\n return this.channels.startMusicOnHold(channelId);\n }\n\n /**\n * Stops music on hold for a channel.\n */\n async stopChannelMusicOnHold(channelId: string): Promise<void> {\n return this.channels.stopMusicOnHold(channelId);\n }\n\n /**\n * Starts playback of a media file on a channel.\n */\n async startChannelPlayback(\n channelId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n return this.channels.startPlayback(channelId, media, options);\n }\n\n /**\n * Stops playback of a media file on a channel.\n */\n async stopChannelPlayback(\n channelId: string,\n playbackId: string,\n ): Promise<void> {\n return this.channels.stopPlayback(channelId, playbackId);\n }\n\n /**\n * Pauses playback of a media file on a channel.\n */\n async pauseChannelPlayback(\n channelId: string,\n playbackId: string,\n ): Promise<void> {\n return this.channels.pausePlayback(channelId, playbackId);\n }\n\n /**\n * Resumes playback of a media file on a channel.\n */\n async resumeChannelPlayback(\n channelId: string,\n playbackId: string,\n ): Promise<void> {\n return this.channels.resumePlayback(channelId, playbackId);\n }\n\n /**\n * Rewinds playback of a media file on a channel.\n */\n async rewindChannelPlayback(\n channelId: string,\n playbackId: string,\n skipMs: number,\n ): Promise<void> {\n return this.channels.rewindPlayback(channelId, playbackId, skipMs);\n }\n\n /**\n * Fast-forwards playback of a media file on a channel.\n */\n async fastForwardChannelPlayback(\n channelId: string,\n playbackId: string,\n skipMs: number,\n ): Promise<void> {\n return this.channels.fastForwardPlayback(channelId, playbackId, skipMs);\n }\n\n /**\n * Records audio from a channel.\n */\n async recordAudio(\n channelId: string,\n options: RecordingOptions,\n ): Promise<Channel> {\n return this.channels.record(channelId, options);\n }\n\n /**\n * Starts snooping on a channel.\n */\n async snoopChannel(\n channelId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n return this.channels.snoopChannel(channelId, options);\n }\n\n /**\n * Starts snooping on a channel with a specific snoop ID.\n */\n async snoopChannelWithId(\n channelId: string,\n snoopId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n return this.channels.snoopChannelWithId(channelId, snoopId, options);\n }\n\n /**\n * Initiates a dial operation on a previously created channel.\n * This function attempts to connect the specified channel to its configured destination.\n *\n * @param channelId - The unique identifier of the channel to dial.\n * @param caller - Optional. The caller ID to use for the outgoing call. If not provided, the default caller ID for the channel will be used.\n * @param timeout - Optional. The maximum time in seconds to wait for the dial operation to complete. If not specified, the system's default timeout will be used.\n * @returns A Promise that resolves when the dial operation has been initiated successfully. Note that this does not guarantee that the call was answered, only that dialing has begun.\n * @throws Will throw an error if the dial operation fails, e.g., if the channel doesn't exist or is in an invalid state.\n */\n async dialChannel(\n channelId: string,\n caller?: string,\n timeout?: number,\n ): Promise<void> {\n return this.channels.dial(channelId, caller, timeout);\n }\n\n /**\n * Retrieves RTP statistics for a channel.\n */\n async getRTPStatistics(channelId: string): Promise<RTPStats> {\n return this.channels.getRTPStatistics(channelId);\n }\n\n /**\n * Creates a channel to an external media source/sink.\n */\n async createExternalMedia(options: ExternalMediaOptions): Promise<Channel> {\n return this.channels.createExternalMedia(options);\n }\n\n /**\n * Redirects a channel to a different location.\n */\n async redirectChannel(channelId: string, endpoint: string): Promise<void> {\n return this.channels.redirectChannel(channelId, endpoint);\n }\n\n /**\n * Answers a channel.\n */\n async answerChannel(channelId: string): Promise<void> {\n return this.channels.answerChannel(channelId);\n }\n\n /**\n * Sends a ringing indication to a channel.\n */\n async ringChannel(channelId: string): Promise<void> {\n return this.channels.ringChannel(channelId);\n }\n\n /**\n * Stops the ringing indication on a specified channel in the Asterisk system.\n *\n * This function sends a request to the Asterisk server to cease the ringing\n * indication on a particular channel. This is typically used when you want to\n * stop the ringing sound on a channel without answering or hanging up the call.\n *\n * @param channelId - The unique identifier of the channel on which to stop the ringing.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n *\n * @returns A Promise that resolves when the ringing has been successfully stopped on the specified channel.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async stopRingChannel(channelId: string): Promise<void> {\n return this.channels.stopRingChannel(channelId);\n }\n\n /**\n * Sends DTMF (Dual-Tone Multi-Frequency) tones to a specified channel.\n *\n * This function allows sending DTMF tones to a channel, which can be used for various purposes\n * such as interacting with IVR systems or sending signals during a call.\n *\n * @param channelId - The unique identifier of the channel to send DTMF tones to.\n * @param dtmf - A string representing the DTMF tones to send (e.g., \"123#\").\n * @param options - Optional parameters to control the timing of DTMF tones.\n * @param options.before - The time (in milliseconds) to wait before sending DTMF.\n * @param options.between - The time (in milliseconds) to wait between each DTMF tone.\n * @param options.duration - The duration (in milliseconds) of each DTMF tone.\n * @param options.after - The time (in milliseconds) to wait after sending all DTMF tones.\n * @returns A Promise that resolves when the DTMF tones have been successfully sent.\n */\n async sendDTMF(\n channelId: string,\n dtmf: string,\n options?: {\n before?: number;\n between?: number;\n duration?: number;\n after?: number;\n },\n ): Promise<void> {\n return this.channels.sendDTMF(channelId, dtmf, options);\n }\n\n /**\n * Mutes a channel in the Asterisk system.\n *\n * This function initiates a mute operation on the specified channel, preventing\n * audio transmission in the specified direction(s).\n *\n * @param channelId - The unique identifier of the channel to be muted.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n * @param direction - The direction of audio to mute. Can be one of:\n * - \"both\": Mute both incoming and outgoing audio (default)\n * - \"in\": Mute only incoming audio\n * - \"out\": Mute only outgoing audio\n *\n * @returns A Promise that resolves when the mute operation has been successfully completed.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async muteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n return this.channels.muteChannel(channelId, direction);\n }\n\n /**\n * Unmutes a channel in the Asterisk system.\n *\n * This function removes the mute status from a specified channel, allowing audio\n * transmission to resume in the specified direction(s).\n *\n * @param channelId - The unique identifier of the channel to be unmuted.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n * @param direction - The direction of audio to unmute. Can be one of:\n * - \"both\": Unmute both incoming and outgoing audio (default)\n * - \"in\": Unmute only incoming audio\n * - \"out\": Unmute only outgoing audio\n *\n * @returns A Promise that resolves when the unmute operation has been successfully completed.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async unmuteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n return this.channels.unmuteChannel(channelId, direction);\n }\n\n /**\n * Puts a specified channel on hold.\n *\n * This function initiates a hold operation on the specified channel in the Asterisk system.\n * When a channel is put on hold, typically the audio is muted or replaced with hold music,\n * depending on the system configuration.\n *\n * @param channelId - The unique identifier of the channel to be put on hold.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n *\n * @returns A Promise that resolves when the hold operation has been successfully initiated.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async holdChannel(channelId: string): Promise<void> {\n return this.channels.holdChannel(channelId);\n }\n\n /**\n * Removes a specified channel from hold.\n *\n * This function initiates an unhold operation on the specified channel in the Asterisk system.\n * When a channel is taken off hold, it typically resumes normal audio transmission,\n * allowing the parties to continue their conversation.\n *\n * @param channelId - The unique identifier of the channel to be taken off hold.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n *\n * @returns A Promise that resolves when the unhold operation has been successfully initiated.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async unholdChannel(channelId: string): Promise<void> {\n return this.channels.unholdChannel(channelId);\n }\n\n /**\n * Creates a new channel in the Asterisk system using the provided originate request data.\n * This function initiates a new communication channel based on the specified parameters.\n *\n * @param data - An object containing the originate request data for channel creation.\n * This includes details such as the endpoint to call, the context to use,\n * and any variables to set on the new channel.\n * @param data.endpoint - The endpoint to call (e.g., \"SIP/1234\").\n * @param data.extension - The extension to dial after the channel is created.\n * @param data.context - The dialplan context to use for the new channel.\n * @param data.priority - The priority to start at in the dialplan.\n * @param data.app - The application to execute on the channel (alternative to extension/context/priority).\n * @param data.appArgs - The arguments to pass to the application, if 'app' is specified.\n * @param data.callerId - The caller ID to set on the new channel.\n * @param data.timeout - The timeout (in seconds) to wait for the channel to be answered.\n * @param data.variables - An object containing key-value pairs of channel variables to set.\n * @param data.channelId - An optional ID to assign to the new channel.\n * @param data.otherChannelId - The ID of another channel to bridge with after creation.\n *\n * @returns A Promise that resolves to the created Channel object.\n * The Channel object contains details about the newly created channel,\n * such as its unique identifier, state, and other relevant information.\n *\n * @throws Will throw an error if the channel creation fails for any reason,\n * such as invalid parameters or system issues.\n */\n async createChannel(data: OriginateRequest): Promise<Channel> {\n return this.channels.createChannel(data);\n }\n\n /**\n * Hangs up a specific channel.\n *\n * @param channelId - The unique identifier of the channel to hang up.\n * @param options - Optional parameters for the hangup operation.\n * @param options.reason_code - An optional reason code for the hangup.\n * @param options.reason - An optional textual reason for the hangup.\n * @returns A promise that resolves when the hangup operation is complete.\n */\n async hangup(\n channelId: string,\n options?: { reason_code?: string; reason?: string },\n ): Promise<void> {\n return this.channels.hangup(channelId, options);\n }\n\n /**\n * Originates a new channel with a specified ID using the provided originate request data.\n *\n * @param channelId - The desired unique identifier for the new channel.\n * @param data - The originate request data containing channel creation parameters.\n * @returns A promise that resolves to the created Channel object.\n */\n async originateWithId(\n channelId: string,\n data: OriginateRequest,\n ): Promise<Channel> {\n return this.channels.originateWithId(channelId, data);\n }\n\n // M\u00E9todos relacionados a endpoints:\n\n /**\n * Lists all endpoints.\n *\n * @returns {Promise<Endpoint[]>} A promise resolving to the list of endpoints.\n */\n async listEndpoints(): Promise<Endpoint[]> {\n return this.endpoints.list();\n }\n\n /**\n * Retrieves details of a specific endpoint.\n *\n * @param technology - The technology of the endpoint.\n * @param resource - The resource name of the endpoint.\n * @returns {Promise<EndpointDetails>} A promise resolving to the details of the endpoint.\n */\n async getEndpointDetails(\n technology: string,\n resource: string,\n ): Promise<EndpointDetails> {\n return this.endpoints.getDetails(technology, resource);\n }\n\n /**\n * Sends a message to an endpoint.\n *\n * @param technology - The technology of the endpoint.\n * @param resource - The resource name of the endpoint.\n * @param body - The message body to send.\n * @returns {Promise<void>} A promise resolving when the message is sent.\n */\n async sendMessageToEndpoint(\n technology: string,\n resource: string,\n body: any,\n ): Promise<void> {\n return this.endpoints.sendMessage(technology, resource, body);\n }\n\n // M\u00E9todos relacionados a applications\n /**\n * Lists all applications.\n *\n * @returns {Promise<Application[]>} A promise resolving to the list of applications.\n */\n async listApplications(): Promise<Application[]> {\n return this.applications.list();\n }\n\n /**\n * Retrieves details of a specific application.\n *\n * @param appName - The name of the application.\n * @returns {Promise<ApplicationDetails>} A promise resolving to the application details.\n */\n async getApplicationDetails(appName: string): Promise<ApplicationDetails> {\n return this.applications.getDetails(appName);\n }\n\n /**\n * Sends a message to a specific application.\n *\n * @param appName - The name of the application.\n * @param body - The message body to send.\n * @returns {Promise<void>} A promise resolving when the message is sent successfully.\n */\n async sendMessageToApplication(appName: string, body: any): Promise<void> {\n return this.applications.sendMessage(appName, body);\n }\n\n // M\u00E9todos relacionados a playbacks\n /**\n * Retrieves details of a specific playback.\n *\n * @param playbackId - The unique identifier of the playback.\n * @returns {Promise<Playback>} A promise resolving to the playback details.\n */\n async getPlaybackDetails(playbackId: string): Promise<APIPlayback> {\n return this.playbacks.getDetails(playbackId);\n }\n\n /**\n * Controls a specific playback in the Asterisk server.\n *\n * @param playbackId - The unique identifier of the playback to control.\n * @param controlRequest - An object containing the control operation details.\n * @returns A Promise that resolves when the control operation is successfully executed.\n */\n async controlPlayback(\n playbackId: string,\n controlRequest: PlaybackControlRequest,\n ): Promise<void> {\n return this.playbacks.control(playbackId, controlRequest);\n }\n\n /**\n * Stops a specific playback in the Asterisk server.\n *\n * @param playbackId - The unique identifier of the playback to stop.\n * @returns A Promise that resolves when the playback is successfully stopped.\n */\n async stopPlayback(playbackId: string): Promise<void> {\n return this.playbacks.stop(playbackId);\n }\n\n /**\n * Retrieves a list of all available sounds in the Asterisk server.\n *\n * @param params - Optional parameters to filter the list of sounds.\n * @returns A Promise that resolves to an array of Sound objects representing the available sounds.\n */\n async listSounds(params?: SoundListRequest): Promise<Sound[]> {\n return this.sounds.list(params);\n }\n\n /**\n * Retrieves detailed information about a specific sound in the Asterisk server.\n *\n * @param soundId - The unique identifier of the sound to retrieve details for.\n * @returns A Promise that resolves to a Sound object containing the details of the specified sound.\n */\n async getSoundDetails(soundId: string): Promise<Sound> {\n return this.sounds.getDetails(soundId);\n }\n\n /**\n * Retrieves general information about the Asterisk server.\n *\n * @returns A Promise that resolves to an AsteriskInfo object containing server information.\n */\n async getAsteriskInfo(): Promise<AsteriskInfo> {\n return this.asterisk.getInfo();\n }\n\n /**\n * Retrieves a list of all loaded modules in the Asterisk server.\n *\n * @returns A Promise that resolves to an array of Module objects representing the loaded modules.\n */\n async listModules(): Promise<Module[]> {\n return this.asterisk.listModules();\n }\n\n /**\n * Manages a specific module in the Asterisk server by loading, unloading, or reloading it.\n *\n * @param moduleName - The name of the module to manage.\n * @param action - The action to perform on the module: \"load\", \"unload\", or \"reload\".\n * @returns A Promise that resolves when the module management action is completed successfully.\n */\n async manageModule(\n moduleName: string,\n action: \"load\" | \"unload\" | \"reload\",\n ): Promise<void> {\n return this.asterisk.manageModule(moduleName, action);\n }\n\n /**\n * Retrieves a list of all configured logging channels in the Asterisk server.\n *\n * @returns A Promise that resolves to an array of Logging objects representing the configured logging channels.\n */\n async listLoggingChannels(): Promise<Logging[]> {\n return this.asterisk.listLoggingChannels();\n }\n\n /**\n * Adds or removes a log channel in the Asterisk server.\n *\n * @param logChannelName - The name of the log channel to manage.\n * @param action - The action to perform: \"add\" to create a new log channel or \"remove\" to delete an existing one.\n * @param configuration - Optional configuration object for adding a log channel. Ignored when removing a channel.\n * @param configuration.type - The type of the log channel.\n * @param configuration.configuration - Additional configuration details for the log channel.\n * @returns A Promise that resolves when the log channel management action is completed successfully.\n */\n async manageLogChannel(\n logChannelName: string,\n action: \"add\" | \"remove\",\n configuration?: { type?: string; configuration?: string },\n ): Promise<void> {\n return this.asterisk.manageLogChannel(\n logChannelName,\n action,\n configuration,\n );\n }\n\n /**\n * Retrieves the value of a global variable from the Asterisk server.\n *\n * @param variableName - The name of the global variable to retrieve.\n * @returns A Promise that resolves to a Variable object containing the name and value of the global variable.\n */\n async getGlobalVariable(variableName: string): Promise<Variable> {\n return this.asterisk.getGlobalVariable(variableName);\n }\n\n /**\n * Sets a global variable in the Asterisk server.\n *\n * This function allows you to set or update the value of a global variable\n * in the Asterisk server. Global variables are accessible throughout the\n * entire Asterisk system and can be used for various purposes such as\n * configuration settings or sharing data between different parts of the system.\n *\n * @param variableName - The name of the global variable to set or update.\n * This should be a string identifying the variable uniquely.\n * @param value - The value to assign to the global variable. This can be any\n * string value, including empty strings.\n * @returns A Promise that resolves when the global variable has been successfully\n * set. The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected\n * with an error object.\n */\n async setGlobalVariable(variableName: string, value: string): Promise<void> {\n return this.asterisk.setGlobalVariable(variableName, value);\n }\n}\n", "import axios, { type AxiosInstance } from \"axios\";\n\nexport class BaseClient {\n private client: AxiosInstance;\n\n constructor(baseUrl: string, username: string, password: string) {\n this.client = axios.create({\n baseURL: baseUrl,\n auth: { username, password },\n });\n }\n\n /**\n * Executes a GET request.\n * @param path - The API endpoint path.\n */\n async get<T>(path: string): Promise<T> {\n const response = await this.client.get<T>(path);\n return response.data;\n }\n\n /**\n * Executes a POST request.\n * @param path - The API endpoint path.\n * @param data - Optional payload to send with the request.\n */\n async post<T>(path: string, data?: unknown): Promise<T> {\n const response = await this.client.post<T>(path, data);\n return response.data;\n }\n\n /**\n * Executes a PUT request.\n * @param path - The API endpoint path.\n * @param data - Payload to send with the request.\n */\n async put<T>(path: string, data: unknown): Promise<T> {\n const response = await this.client.put<T>(path, data);\n return response.data;\n }\n\n /**\n * Executes a DELETE request.\n * @param path - The API endpoint path.\n */\n async delete<T>(path: string): Promise<T> {\n const response = await this.client.delete<T>(path);\n return response.data;\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n Application,\n ApplicationDetails,\n} from \"../interfaces/applications.types.js\";\n\nexport interface ApplicationMessage {\n event: string;\n data?: Record<string, any>;\n}\n\nexport class Applications {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all applications.\n * \n * @returns A promise that resolves to an array of Application objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(): Promise<Application[]> {\n const applications = await this.client.get<unknown>(\"/applications\");\n\n if (!Array.isArray(applications)) {\n throw new Error(\"Resposta da API /applications n\u00E3o \u00E9 um array.\");\n }\n\n return applications as Application[];\n }\n\n /**\n * Retrieves details of a specific application.\n * \n * @param appName - The name of the application to retrieve details for.\n * @returns A promise that resolves to an ApplicationDetails object.\n * @throws {Error} If there's an error fetching the application details.\n */\n async getDetails(appName: string): Promise<ApplicationDetails> {\n try {\n return await this.client.get<ApplicationDetails>(\n `/applications/${appName}`,\n );\n } catch (error) {\n console.error(`Erro ao obter detalhes do aplicativo ${appName}:`, error);\n throw error;\n }\n }\n\n /**\n * Sends a message to a specific application.\n * \n * @param appName - The name of the application to send the message to.\n * @param body - The message to be sent, containing an event and optional data.\n * @returns A promise that resolves when the message is successfully sent.\n */\n async sendMessage(appName: string, body: ApplicationMessage): Promise<void> {\n await this.client.post<void>(`/applications/${appName}/messages`, body);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n AsteriskInfo,\n Logging,\n Module,\n Variable,\n} from \"../interfaces/asterisk.types.js\";\n\nfunction toQueryParams<T>(options: T): string {\n return new URLSearchParams(\n Object.entries(options as Record<string, string>)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, String(value)]),\n ).toString();\n}\n\nexport class Asterisk {\n constructor(private client: BaseClient) {}\n\n /**\n * Retrieves information about the Asterisk server.\n */\n async getInfo(): Promise<AsteriskInfo> {\n return this.client.get<AsteriskInfo>(\"/asterisk/info\");\n }\n\n /**\n * Lists all loaded modules in the Asterisk server.\n */\n async listModules(): Promise<Module[]> {\n return this.client.get<Module[]>(\"/asterisk/modules\");\n }\n\n /**\n * Manages a specific module in the Asterisk server.\n *\n * @param moduleName - The name of the module to manage.\n * @param action - The action to perform on the module: \"load\", \"unload\", or \"reload\".\n * @returns A promise that resolves when the action is completed successfully.\n * @throws {Error} Throws an error if the HTTP method or action is invalid.\n */\n async manageModule(\n moduleName: string,\n action: \"load\" | \"unload\" | \"reload\",\n ): Promise<void> {\n const url = `/asterisk/modules/${moduleName}`;\n switch (action) {\n case \"load\":\n await this.client.post<void>(`${url}?action=load`);\n break;\n case \"unload\":\n await this.client.delete<void>(url);\n break;\n case \"reload\":\n await this.client.put<void>(url, {});\n break;\n default:\n throw new Error(`A\u00E7\u00E3o inv\u00E1lida: ${action}`);\n }\n }\n\n /**\n * Retrieves all configured logging channels.\n */\n async listLoggingChannels(): Promise<Logging[]> {\n return this.client.get<Logging[]>(\"/asterisk/logging\");\n }\n\n /**\n * Adds or removes a log channel in the Asterisk server.\n */\n async manageLogChannel(\n logChannelName: string,\n action: \"add\" | \"remove\",\n configuration?: { type?: string; configuration?: string },\n ): Promise<void> {\n const queryParams = toQueryParams(configuration || {});\n return this.client.post<void>(\n `/asterisk/logging/${logChannelName}?action=${encodeURIComponent(action)}&${queryParams}`,\n );\n }\n\n /**\n * Retrieves the value of a global variable.\n */\n async getGlobalVariable(variableName: string): Promise<Variable> {\n return this.client.get<Variable>(\n `/asterisk/variables?variable=${encodeURIComponent(variableName)}`,\n );\n }\n\n /**\n * Sets a global variable.\n */\n async setGlobalVariable(variableName: string, value: string): Promise<void> {\n return this.client.post<void>(\n `/asterisk/variables?variable=${encodeURIComponent(variableName)}&value=${encodeURIComponent(value)}`,\n );\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n Channel,\n ChannelPlayback,\n ChannelVar,\n ExternalMediaOptions,\n OriginateRequest,\n PlaybackOptions,\n RTPStats,\n RecordingOptions,\n SnoopOptions,\n} from \"../interfaces/channels.types.js\";\n\nfunction toQueryParams<T>(options: T): string {\n return new URLSearchParams(\n Object.entries(options as Record<string, string>) // Convers\u00E3o expl\u00EDcita\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, value as string]), // Garante que value \u00E9 string\n ).toString();\n}\n\nexport class Channels {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all active channels.\n */\n async list(): Promise<Channel[]> {\n const channels = await this.client.get<unknown>(\"/channels\");\n\n if (!Array.isArray(channels)) {\n throw new Error(\"Resposta da API /channels n\u00E3o \u00E9 um array.\");\n }\n\n return channels as Channel[];\n }\n\n /**\n * Creates a new channel.\n */\n async originate(data: OriginateRequest): Promise<Channel> {\n return this.client.post<Channel>(\"/channels\", data);\n }\n\n /**\n * Retrieves details of a specific channel.\n */\n async getDetails(channelId: string): Promise<Channel> {\n return this.client.get<Channel>(`/channels/${channelId}`);\n }\n\n /**\n * Creates a channel and places it in a Stasis app without dialing it.\n */\n async createChannel(data: OriginateRequest): Promise<Channel> {\n return this.client.post<Channel>(\"/channels/create\", data);\n }\n\n /**\n * Creates a new channel with a specific ID and originates a call.\n */\n async originateWithId(\n channelId: string,\n data: OriginateRequest,\n ): Promise<Channel> {\n return this.client.post<Channel>(`/channels/${channelId}`, data);\n }\n\n /**\n * Hangs up (terminates) a specific channel.\n */\n /**\n * Hangs up a specific channel with optional reason or reason code.\n */\n async hangup(\n channelId: string,\n options?: { reason_code?: string; reason?: string },\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n ...(options?.reason_code && { reason_code: options.reason_code }),\n ...(options?.reason && { reason: options.reason }),\n });\n\n return this.client.delete<void>(\n `/channels/${channelId}?${queryParams.toString()}`,\n );\n }\n\n /**\n * Continues the dialplan for a specific channel.\n */\n async continueDialplan(\n channelId: string,\n context?: string,\n extension?: string,\n priority?: number,\n label?: string,\n ): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/continue`, {\n context,\n extension,\n priority,\n label,\n });\n }\n\n /**\n * Moves the channel to another Stasis application.\n */\n async moveToApplication(\n channelId: string,\n app: string,\n appArgs?: string,\n ): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/move`, {\n app,\n appArgs,\n });\n }\n\n /**\n * Sets a channel variable.\n */\n async setVariable(\n channelId: string,\n variable: string,\n value: string,\n ): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/variable`, {\n variable,\n value,\n });\n }\n\n /**\n * Gets a channel variable.\n */\n async getVariable(channelId: string, variable: string): Promise<ChannelVar> {\n return this.client.get<ChannelVar>(\n `/channels/${channelId}/variable?variable=${encodeURIComponent(variable)}`,\n );\n }\n\n /**\n * Plays a media file to a channel.\n */\n async playMedia(\n channelId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n const queryParams = options\n ? `?${new URLSearchParams(options as Record<string, string>).toString()}`\n : \"\";\n\n return this.client.post<ChannelPlayback>(\n `/channels/${channelId}/play${queryParams}`,\n { media },\n );\n }\n\n /**\n * Starts music on hold (MOH) for a channel.\n */\n async startMusicOnHold(channelId: string): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/moh`);\n }\n\n /**\n * Stops music on hold (MOH) for a channel.\n */\n async stopMusicOnHold(channelId: string): Promise<void> {\n return this.client.delete<void>(`/channels/${channelId}/moh`);\n }\n\n /**\n * Starts playback of a media file on a channel.\n */\n async startPlayback(\n channelId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n const queryParams = options\n ? `?${new URLSearchParams(options as Record<string, string>).toString()}`\n : \"\";\n\n return this.client.post<ChannelPlayback>(\n `/channels/${channelId}/play${queryParams}`,\n { media },\n );\n }\n\n /**\n * Stops playback of a media file on a channel.\n */\n async stopPlayback(channelId: string, playbackId: string): Promise<void> {\n return this.client.delete<void>(\n `/channels/${channelId}/play/${playbackId}`,\n );\n }\n\n /**\n * Pauses playback of a media file on a channel.\n */\n async pausePlayback(channelId: string, playbackId: string): Promise<void> {\n return this.client.post<void>(\n `/channels/${channelId}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Resumes playback of a media file on a channel.\n */\n async resumePlayback(channelId: string, playbackId: string): Promise<void> {\n return this.client.delete<void>(\n `/channels/${channelId}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Rewinds playback of a media file on a channel.\n */\n async rewindPlayback(\n channelId: string,\n playbackId: string,\n skipMs: number,\n ): Promise<void> {\n return this.client.post<void>(\n `/channels/${channelId}/play/${playbackId}/rewind`,\n { skipMs },\n );\n }\n\n /**\n * Fast-forwards playback of a media file on a channel.\n */\n async fastForwardPlayback(\n channelId: string,\n playbackId: string,\n skipMs: number,\n ): Promise<void> {\n return this.client.post<void>(\n `/channels/${channelId}/play/${playbackId}/forward`,\n { skipMs },\n );\n }\n\n /**\n * Records audio from a channel.\n */\n async record(channelId: string, options: RecordingOptions): Promise<Channel> {\n // Converte RecordingOptions para URLSearchParams, garantindo compatibilidade\n const queryParams = new URLSearchParams(\n Object.entries(options as unknown as Record<string, string>).filter(\n ([, value]) => value !== undefined,\n ),\n );\n\n return this.client.post<Channel>(\n `/channels/${channelId}/record?${queryParams.toString()}`,\n );\n }\n\n /**\n * Starts snooping on a channel.\n */\n async snoopChannel(\n channelId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = toQueryParams(options);\n\n return this.client.post<Channel>(\n `/channels/${channelId}/snoop?${queryParams}`,\n );\n }\n\n /**\n * Starts snooping on a channel with a specific snoop ID.\n */\n async snoopChannelWithId(\n channelId: string,\n snoopId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = new URLSearchParams(options as Record<string, string>);\n return this.client.post<Channel>(\n `/channels/${channelId}/snoop/${snoopId}?${queryParams.toString()}`,\n );\n }\n\n /**\n * Dials a created channel.\n */\n async dial(\n channelId: string,\n caller?: string,\n timeout?: number,\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n ...(caller && { caller }),\n ...(timeout && { timeout: timeout.toString() }),\n });\n return this.client.post<void>(\n `/channels/${channelId}/dial?${queryParams.toString()}`,\n );\n }\n\n /**\n * Retrieves RTP statistics for a channel.\n */\n async getRTPStatistics(channelId: string): Promise<RTPStats> {\n return this.client.get<RTPStats>(`/channels/${channelId}/rtp_statistics`);\n }\n\n /**\n * Creates a channel to an external media source/sink.\n */\n async createExternalMedia(options: ExternalMediaOptions): Promise<Channel> {\n const queryParams = new URLSearchParams(options as Record<string, string>);\n return this.client.post<Channel>(\n `/channels/externalMedia?${queryParams.toString()}`,\n );\n }\n\n /**\n * Redirects the channel to a different location.\n */\n async redirectChannel(channelId: string, endpoint: string): Promise<void> {\n return this.client.post<void>(\n `/channels/${channelId}/redirect?endpoint=${encodeURIComponent(endpoint)}`,\n );\n }\n\n /**\n * Answers a channel.\n */\n async answerChannel(channelId: string): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/answer`);\n }\n\n /**\n * Sends a ringing indication to a channel.\n */\n async ringChannel(channelId: string): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/ring`);\n }\n\n /**\n * Stops ringing indication on a channel.\n */\n async stopRingChannel(channelId: string): Promise<void> {\n return this.client.delete<void>(`/channels/${channelId}/ring`);\n }\n\n /**\n * Sends DTMF to a channel.\n */\n async sendDTMF(\n channelId: string,\n dtmf: string,\n options?: {\n before?: number;\n between?: number;\n duration?: number;\n after?: number;\n },\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n dtmf,\n ...(options?.before && { before: options.before.toString() }),\n ...(options?.between && { between: options.between.toString() }),\n ...(options?.duration && { duration: options.duration.toString() }),\n ...(options?.after && { after: options.after.toString() }),\n });\n\n return this.client.post<void>(\n `/channels/${channelId}/dtmf?${queryParams.toString()}`,\n );\n }\n\n /**\n * Mutes a channel.\n */\n async muteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n return this.client.post<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Unmutes a channel.\n */\n async unmuteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n return this.client.delete<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Puts a channel on hold.\n */\n async holdChannel(channelId: string): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/hold`);\n }\n\n /**\n * Removes a channel from hold.\n */\n async unholdChannel(channelId: string): Promise<void> {\n return this.client.delete<void>(`/channels/${channelId}/hold`);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { Endpoint, EndpointDetails } from \"../interfaces/endpoints.types\";\n\nexport class Endpoints {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all available endpoints.\n *\n * @returns A promise that resolves to an array of Endpoint objects representing all available endpoints.\n * @throws {Error} If the API response is not an array.\n */\n async list(): Promise<Endpoint[]> {\n const endpoints = await this.client.get<unknown>(\"/endpoints\");\n\n if (!Array.isArray(endpoints)) {\n throw new Error(\"Resposta da API /endpoints n\u00E3o \u00E9 um array.\");\n }\n\n return endpoints as Endpoint[];\n }\n\n /**\n * Retrieves details of a specific endpoint.\n *\n * @param technology - The technology of the endpoint (e.g., \"PJSIP\").\n * @param resource - The specific resource name of the endpoint (e.g., \"9001\").\n * @returns A promise that resolves to an EndpointDetails object containing the details of the specified endpoint.\n */\n async getDetails(\n technology: string,\n resource: string,\n ): Promise<EndpointDetails> {\n return this.client.get<EndpointDetails>(\n `/endpoints/${technology}/${resource}`,\n );\n }\n\n /**\n * Sends a message to a specific endpoint.\n *\n * @param technology - The technology of the endpoint (e.g., \"PJSIP\").\n * @param resource - The specific resource name of the endpoint (e.g., \"9001\").\n * @param message - The message payload to send to the endpoint.\n * @returns A promise that resolves when the message has been successfully sent.\n */\n async sendMessage(\n technology: string,\n resource: string,\n message: Record<string, unknown>,\n ): Promise<void> {\n await this.client.post<void>(\n `/endpoints/${technology}/${resource}/sendMessage`,\n message,\n );\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n Playback,\n PlaybackControlRequest,\n} from \"../interfaces/playbacks.types.js\";\n\nexport class Playbacks {\n constructor(private client: BaseClient) {}\n\n /**\n * Retrieves details of a specific playback.\n *\n * @param playbackId - The unique identifier of the playback.\n * @returns A promise that resolves to a Playback object containing the details of the specified playback.\n */\n async getDetails(playbackId: string): Promise<Playback> {\n return this.client.get<Playback>(`/playbacks/${playbackId}`);\n }\n\n /**\n * Controls a specific playback (e.g., pause, resume, rewind, forward, stop).\n *\n * @param playbackId - The unique identifier of the playback to control.\n * @param controlRequest - The PlaybackControlRequest containing the control operation.\n * @returns A promise that resolves when the control operation is successfully executed.\n */\n async control(\n playbackId: string,\n controlRequest: PlaybackControlRequest,\n ): Promise<void> {\n await this.client.post<void>(\n `/playbacks/${playbackId}/control`,\n controlRequest,\n );\n }\n\n /**\n * Stops a specific playback.\n *\n * @param playbackId - The unique identifier of the playback to stop.\n * @returns A promise that resolves when the playback is successfully stopped.\n */\n async stop(playbackId: string): Promise<void> {\n await this.client.post<void>(`/playbacks/${playbackId}/stop`);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { Sound, SoundListRequest } from \"../interfaces/sounds.types.js\";\n\nexport class Sounds {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all available sounds.\n *\n * @param params - Optional parameters to filter the list of sounds.\n * @returns A promise that resolves to an array of Sound objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(params?: SoundListRequest): Promise<Sound[]> {\n const query = params\n ? `?${new URLSearchParams(params as Record<string, string>).toString()}`\n : \"\";\n\n const sounds = await this.client.get<unknown>(`/sounds${query}`);\n\n if (!Array.isArray(sounds)) {\n throw new Error(\"Resposta da API /sounds n\u00E3o \u00E9 um array.\");\n }\n\n return sounds as Sound[];\n }\n\n /**\n * Retrieves details of a specific sound.\n *\n * @param soundId - The unique identifier of the sound.\n * @returns A promise that resolves to a Sound object containing the details of the specified sound.\n */\n async getDetails(soundId: string): Promise<Sound> {\n return this.client.get<Sound>(`/sounds/${soundId}`);\n }\n}\n", "import WebSocket from \"ws\";\nimport type { WebSocketEvent } from \"./interfaces/events.types\";\n\nexport class WebSocketClient {\n private ws: WebSocket | null = null;\n private isClosedManually = false; // Para evitar reconex\u00F5es autom\u00E1ticas quando fechado manualmente\n private isReconnecting = false; // Para evitar reconex\u00F5es paralelas\n\n constructor(private url: string) {}\n\n async connect(): Promise<void> {\n if (this.isReconnecting) return; // Evita m\u00FAltiplas reconex\u00F5es simult\u00E2neas\n\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(this.url);\n\n this.ws.on(\"open\", () => {\n console.log(\"WebSocket conectado.\");\n this.isClosedManually = false;\n this.isReconnecting = false;\n resolve();\n });\n\n this.ws.on(\"error\", (err) => {\n console.error(\"Erro na conex\u00E3o WebSocket:\", err);\n reject(err);\n });\n\n this.ws.on(\"close\", (code, reason) => {\n console.warn(`WebSocket desconectado: ${code} - ${reason}`);\n this.isReconnecting = false; // Libera novas reconex\u00F5es\n });\n });\n }\n\n async reconnect(): Promise<void> {\n if (this.isClosedManually || this.isReconnecting) return;\n\n console.log(\"Tentando reconectar ao WebSocket...\");\n this.isReconnecting = true;\n try {\n await this.connect();\n console.log(\"Reconex\u00E3o bem-sucedida.\");\n } catch (err) {\n console.error(\"Erro ao tentar reconectar:\", err);\n } finally {\n this.isReconnecting = false;\n }\n }\n\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n on<T extends WebSocketEvent[\"type\"]>(\n event: \"message\" | \"open\" | \"error\" | \"close\",\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error(\"WebSocket n\u00E3o est\u00E1 conectado.\");\n }\n\n if (event === \"message\") {\n this.ws.on(event, (rawData) => {\n try {\n const decodedData = JSON.parse(rawData.toString());\n if (decodedData?.type) {\n const matchedEvent = decodedData as WebSocketEvent;\n callback(matchedEvent as Extract<WebSocketEvent, { type: T }>);\n } else {\n console.warn(\"Mensagem sem tipo:\", decodedData);\n }\n } catch (err) {\n console.error(\"Erro ao decodificar mensagem do WebSocket:\", err);\n }\n });\n } else {\n this.ws.on(event, callback as (data: any) => void);\n }\n }\n\n send(data: any): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error(\"WebSocket n\u00E3o est\u00E1 conectado.\");\n }\n\n this.ws.send(data, (err) => {\n if (err) {\n console.error(\"Erro ao enviar dados pelo WebSocket:\", err);\n }\n });\n }\n\n close(): void {\n if (this.ws) {\n this.isClosedManually = true;\n this.ws.close();\n console.log(\"WebSocket fechado manualmente.\");\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Delay", "SkipFirstDelay", "AlwaysDelay", "backOff", "BackOff", "toQueryParams"]
|
|
3
|
+
"sources": ["../../node_modules/exponential-backoff/src/options.ts", "../../node_modules/exponential-backoff/src/jitter/full/full.jitter.ts", "../../node_modules/exponential-backoff/src/jitter/no/no.jitter.ts", "../../node_modules/exponential-backoff/src/jitter/jitter.factory.ts", "../../node_modules/exponential-backoff/src/delay/delay.base.ts", "../../node_modules/exponential-backoff/src/delay/skip-first/skip-first.delay.ts", "../../node_modules/exponential-backoff/src/delay/always/always.delay.ts", "../../node_modules/exponential-backoff/src/delay/delay.factory.ts", "../../node_modules/exponential-backoff/src/backoff.ts", "../../src/ari-client/ariClient.ts", "../../src/ari-client/baseClient.ts", "../../src/ari-client/resources/applications.ts", "../../src/ari-client/resources/asterisk.ts", "../../src/ari-client/resources/bridges.ts", "../../src/ari-client/resources/channels.ts", "../../src/ari-client/resources/endpoints.ts", "../../src/ari-client/resources/playbacks.ts", "../../src/ari-client/resources/sounds.ts", "../../src/ari-client/websocketClient.ts"],
|
|
4
|
+
"sourcesContent": [null, null, null, null, null, null, null, null, null, "import { EventEmitter } from \"events\";\nimport { type IBackOffOptions, backOff } from \"exponential-backoff\";\nimport { BaseClient } from \"./baseClient.js\";\nimport type {\n Application,\n ApplicationDetails,\n WebSocketEventType,\n} from \"./interfaces\";\nimport type { AsteriskInfo, Logging, Module, Variable } from \"./interfaces\";\nimport type {\n Channel,\n ChannelPlayback,\n ChannelVar,\n ExternalMediaOptions,\n OriginateRequest,\n PlaybackOptions,\n RTPStats,\n RecordingOptions,\n SnoopOptions,\n} from \"./interfaces\";\nimport type { Endpoint, EndpointDetails } from \"./interfaces\";\nimport type { WebSocketEvent } from \"./interfaces\";\nimport type { AriApplication, AriClientConfig } from \"./interfaces\";\nimport type { Sound, SoundListRequest } from \"./interfaces\";\nimport type {\n Playback as APIPlayback,\n PlaybackControlRequest,\n} from \"./interfaces/playbacks.types\";\nimport { Applications } from \"./resources/applications.js\";\nimport { Asterisk } from \"./resources/asterisk\";\nimport { Bridges } from \"./resources/bridges\";\nimport { Channels } from \"./resources/channels.js\";\nimport { Endpoints } from \"./resources/endpoints\";\nimport { Playbacks } from \"./resources/playbacks\";\nimport { Sounds } from \"./resources/sounds\";\nimport { WebSocketClient } from \"./websocketClient.js\";\n\nexport class AriClient {\n private wsClient: WebSocketClient | null = null;\n private readonly baseClient: BaseClient;\n private isReconnecting = false;\n private readonly eventEmitter = new EventEmitter();\n\n public channels: Channels;\n public endpoints: Endpoints;\n public applications: Applications;\n public playbacks: Playbacks;\n public sounds: Sounds;\n public asterisk: Asterisk;\n public bridges: Bridges;\n\n constructor(private config: AriClientConfig) {\n const httpProtocol = config.secure ? \"https\" : \"http\";\n const normalizedHost = config.host.replace(/^https?:\\/\\//, \"\");\n const baseUrl = `${httpProtocol}://${normalizedHost}:${config.port}/ari`;\n\n this.baseClient = new BaseClient(baseUrl, config.username, config.password);\n this.channels = new Channels(this.baseClient);\n this.endpoints = new Endpoints(this.baseClient);\n this.applications = new Applications(this.baseClient);\n this.playbacks = new Playbacks(this.baseClient);\n this.sounds = new Sounds(this.baseClient);\n this.asterisk = new Asterisk(this.baseClient);\n this.bridges = new Bridges(this.baseClient);\n }\n\n /**\n * Connects to the ARI WebSocket for a specific application.\n * This function establishes a WebSocket connection to the Asterisk ARI, sets up event listeners,\n * and ensures the application is registered. It uses an exponential backoff strategy for connection attempts.\n *\n * @param app - The name of the application to connect to. This is required and used to identify the application in ARI.\n * @param subscribedEvents - Optional array of WebSocketEventType to subscribe to specific events.\n * If not provided or empty, it subscribes to all events.\n * @returns A Promise that resolves when the WebSocket connection is successfully established and the application is registered.\n * @throws Error if the 'app' parameter is not provided, or if connection attempts fail after multiple retries.\n */\n async connectWebSocket(\n app: string,\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void> {\n if (!app) {\n throw new Error(\n \"The 'app' parameter is required to connect to the WebSocket.\",\n );\n }\n\n if (this.isReconnecting) {\n console.warn(\"Already attempting to reconnect. Skipping this attempt.\");\n return;\n }\n\n this.isReconnecting = true;\n\n // Se nenhum evento foi especificado, assumimos que o cliente quer escutar todos.\n const eventsParam =\n subscribedEvents && subscribedEvents.length > 0\n ? `&event=${subscribedEvents.join(\",\")}`\n : \"&subscribeAll=true\";\n\n const protocol = this.config.secure ? \"wss\" : \"ws\";\n const wsUrl = `${protocol}://${encodeURIComponent(this.config.username)}:${encodeURIComponent(this.config.password)}@${\n this.config.host\n }:${this.config.port}/ari/events?app=${app}${eventsParam}`;\n\n const backoffOptions: IBackOffOptions = {\n delayFirstAttempt: false,\n startingDelay: 1000,\n timeMultiple: 2,\n maxDelay: 30000,\n numOfAttempts: 10,\n jitter: \"full\",\n retry: (error: any, attemptNumber: number) => {\n console.warn(`Tentativa ${attemptNumber} falhou: ${error.message}`);\n return !this.wsClient?.isConnected();\n },\n };\n\n if (this.wsClient?.isConnected()) {\n console.log(\"WebSocket j\u00E1 conectado. Removendo listeners antigos...\");\n this.wsClient.removeAllListeners(); // Limpa todos os listeners antigos\n this.wsClient.close(); // Fecha a conex\u00E3o existente antes de criar uma nova\n }\n\n this.wsClient = new WebSocketClient(wsUrl);\n\n try {\n await backOff(async () => {\n if (!this.wsClient) {\n throw new Error(\"WebSocketClient instance is null.\");\n }\n await this.wsClient.connect();\n this.integrateWebSocketEvents(); // Reinicia os listeners para a nova conex\u00E3o\n console.log(`WebSocket conectado para o app: ${app}`);\n await this.ensureAppRegistered(app); // Verifica e registra o aplicativo\n }, backoffOptions);\n } catch (err) {\n console.error(\n \"N\u00E3o foi poss\u00EDvel conectar ao WebSocket ap\u00F3s m\u00FAltiplas tentativas:\",\n err,\n );\n throw err;\n } finally {\n this.isReconnecting = false;\n }\n }\n\n /**\n * Integrates WebSocket events with playback listeners.\n */\n private integrateWebSocketEvents(): void {\n if (!this.wsClient) {\n throw new Error(\"WebSocket client n\u00E3o est\u00E1 conectado.\");\n }\n\n const eventHandlers: {\n [key in WebSocketEvent[\"type\"]]?: (data: any) => void;\n } = {\n PlaybackFinished: (data) => {\n if (\"playbackId\" in data) {\n this.playbacks.emitPlaybackEvent(\"PlaybackFinished\", data);\n }\n this.emitGlobalEvent(data); // Emite o evento globalmente\n },\n ChannelStateChange: (data) => {\n if (\"channel\" in data) {\n console.log(\"Estado do canal alterado:\", data.channel);\n }\n this.emitGlobalEvent(data);\n },\n BridgeDestroyed: (data) => {\n if (\"bridge\" in data) {\n console.log(\"Bridge destru\u00EDda:\", data.bridge);\n }\n this.emitGlobalEvent(data);\n },\n // Adicione mais eventos conforme necess\u00E1rio\n // Exemplo:\n ChannelDtmfReceived: (data) => {\n if (\"channel\" in data) {\n console.log(\"DTMF recebido no canal:\", data.channel);\n }\n this.emitGlobalEvent(data);\n },\n };\n\n // Registra todos os eventos definidos acima\n for (const [eventType, handler] of Object.entries(eventHandlers)) {\n if (handler) {\n this.wsClient.on(eventType as WebSocketEvent[\"type\"], handler);\n }\n }\n\n console.log(\"Todos os eventos do WebSocket foram registrados.\");\n\n // Adicione outros eventos relacionados ao Playback aqui, se necess\u00E1rio\n }\n\n /**\n * Registra um listener para eventos globais.\n * @param callback - A fun\u00E7\u00E3o a ser executada quando um evento global for recebido.\n */\n onGlobalEvent(callback: (data: WebSocketEvent) => void): void {\n this.eventEmitter.on(\"globalEvent\", callback);\n }\n\n /**\n * Remove um listener para eventos globais.\n * @param callback - A fun\u00E7\u00E3o a ser removida dos eventos globais.\n */\n offGlobalEvent(callback: (data: WebSocketEvent) => void): void {\n this.eventEmitter.off(\"globalEvent\", callback);\n }\n\n /**\n * Emite um evento global.\n * @param data - Os dados do evento a serem emitidos.\n */\n emitGlobalEvent(data: WebSocketEvent): void {\n this.eventEmitter.emit(\"globalEvent\", data);\n }\n\n /**\n * Unregisters a listener for playback events.\n *\n * This method removes a specific listener registered for a playback event type,\n * ensuring that no further notifications are sent to the callback function.\n *\n * @param eventType - The type of event to stop listening for.\n * @param playbackId - The unique ID of the playback associated with the listener.\n * @param callback - The callback function to remove from the listener.\n */\n unregisterPlaybackListener<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.playbacks.unregisterListener(eventType, playbackId, callback);\n }\n\n /**\n * Registers a listener for playback events.\n * The listener is triggered for events such as \"PlaybackFinished\".\n *\n * @param eventType - The type of event to listen for.\n * @param playbackId - The ID of the playback to associate with this listener.\n * @param callback - The callback function to execute when the event occurs.\n */\n registerPlaybackListener<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.playbacks.registerListener(eventType, playbackId, callback);\n }\n\n /**\n * Checks if a listener is already registered for a specific event and playback.\n *\n * @param eventType - The type of event to check.\n * @param playbackId - The playback ID associated with the listener.\n * @returns True if a listener is already registered, false otherwise.\n */\n isPlaybackListenerRegistered<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n ): boolean {\n return this.playbacks.isListenerRegistered(eventType, playbackId);\n }\n\n /**\n * Ensures the ARI application is registered.\n *\n * @param app - The application name to ensure is registered.\n * @returns {Promise<void>}\n */\n async ensureAppRegistered(app: string): Promise<void> {\n try {\n const apps = await this.baseClient.get<AriApplication[]>(\"/applications\");\n const appExists = apps.some((a: { name: string }) => a.name === app);\n\n if (!appExists) {\n console.log(`Registrando o aplicativo ARI: ${app}`);\n await this.baseClient.post(\"/applications\", { app });\n console.log(`Aplicativo ${app} registrado com sucesso.`);\n } else {\n console.log(`Aplicativo ${app} j\u00E1 est\u00E1 registrado.`);\n }\n } catch (error) {\n console.error(`Erro ao garantir o registro do aplicativo ${app}:`, error);\n throw error;\n }\n }\n\n /**\n * Checks if the WebSocket connection is active.\n *\n * @returns {boolean} True if connected, false otherwise.\n */\n isWebSocketConnected(): boolean {\n return this.wsClient ? this.wsClient.isConnected() : false;\n }\n\n /**\n * Registers a listener for WebSocket events.\n *\n * This function allows you to attach a callback function to a specific WebSocket event type.\n * The callback will be executed whenever an event of the specified type is received.\n *\n * @template T - The type of WebSocket event, extending WebSocketEvent[\"type\"].\n * @param {T} event - The type of WebSocket event to listen for.\n * @param {(data: Extract<WebSocketEvent, { type: T }>) => void} callback - The function to be called when the event is received.\n * The callback receives the event data as its parameter.\n * @throws {Error} Throws an error if the WebSocket client is not connected when this method is called.\n * @returns {void} This function doesn't return a value.\n */\n onWebSocketEvent<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (!this.wsClient) {\n throw new Error(\"WebSocket n\u00E3o est\u00E1 conectado.\");\n }\n\n this.wsClient.on(event, callback);\n }\n\n /**\n * Removes a specific listener for WebSocket events.\n *\n * This function unregisters a previously registered callback function for a specific WebSocket event type.\n * It's useful for removing event handlers when they are no longer needed or for cleaning up resources.\n *\n * @template T - The type of WebSocket event, extending WebSocketEvent[\"type\"].\n * @param {T} event - The type of WebSocket event to remove the listener from.\n * @param {(data: Extract<WebSocketEvent, { type: T }>) => void} callback - The callback function to be removed.\n * This should be the same function reference that was used when adding the event listener.\n * @throws {Error} Throws an error if the WebSocket client is not connected when this method is called.\n * @returns {void} This function doesn't return a value.\n */\n offWebSocketEvent<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (!this.wsClient) {\n throw new Error(\"WebSocket n\u00E3o est\u00E1 conectado.\");\n }\n\n this.wsClient.off(event, callback);\n }\n\n /**\n * Removes all listeners for a specific WebSocket event type.\n *\n * This function removes all event listeners that have been registered for a particular\n * WebSocket event type. It's useful for cleaning up event listeners when they are no\n * longer needed or before re-registering new listeners.\n *\n * @param event - The type of WebSocket event for which all listeners should be removed.\n * This should be a string identifying the event type (e.g., 'message', 'close', etc.).\n *\n * @throws {Error} Throws an error if the WebSocket client is not connected when this method is called.\n *\n * @returns {void} This function doesn't return a value.\n */\n removeAllWebSocketListeners(event: string): void {\n if (!this.wsClient) {\n throw new Error(\"WebSocket n\u00E3o est\u00E1 conectado.\");\n }\n\n this.wsClient.removeAllListeners(event);\n }\n\n /**\n * Closes the WebSocket connection and removes all associated listeners.\n *\n * This function terminates the active WebSocket connection if one exists,\n * and cleans up by removing all event listeners attached to it. After calling\n * this function, the WebSocket client will be set to null, effectively\n * ending the connection and preparing for potential future connections.\n *\n * @returns {void} This function doesn't return a value.\n */\n closeWebSocket(): void {\n if (this.wsClient) {\n this.wsClient.close();\n this.wsClient = null;\n }\n }\n\n /**\n * Retrieves a list of active channels from the Asterisk ARI.\n *\n * @returns {Promise<Channel[]>} A promise resolving to the list of active channels.\n */\n /**\n * Lists all active channels.\n */\n async listChannels(): Promise<Channel[]> {\n return this.channels.list();\n }\n\n /**\n * Creates a new channel.\n */\n async originateChannel(data: OriginateRequest): Promise<Channel> {\n return this.channels.originate(data);\n }\n\n /**\n * Retrieves details of a specific channel.\n */\n async getChannelDetails(channelId: string): Promise<Channel> {\n return this.channels.getDetails(channelId);\n }\n\n /**\n * Hangs up a specific channel.\n */\n async hangupChannel(channelId: string): Promise<void> {\n return this.channels.hangup(channelId);\n }\n\n /**\n * Continues the dialplan for a specific channel.\n */\n async continueChannelDialplan(\n channelId: string,\n context?: string,\n extension?: string,\n priority?: number,\n label?: string,\n ): Promise<void> {\n return this.channels.continueDialplan(\n channelId,\n context,\n extension,\n priority,\n label,\n );\n }\n\n /**\n * Moves a channel to another Stasis application.\n */\n async moveChannelToApplication(\n channelId: string,\n app: string,\n appArgs?: string,\n ): Promise<void> {\n return this.channels.moveToApplication(channelId, app, appArgs);\n }\n\n /**\n * Sets a channel variable.\n */\n async setChannelVariable(\n channelId: string,\n variable: string,\n value: string,\n ): Promise<void> {\n return this.channels.setVariable(channelId, variable, value);\n }\n\n /**\n * Gets a channel variable.\n */\n async getChannelVariable(\n channelId: string,\n variable: string,\n ): Promise<ChannelVar> {\n return this.channels.getVariable(channelId, variable);\n }\n\n /**\n * Plays a media file to a channel.\n */\n async playMediaToChannel(\n channelId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n return this.channels.playMedia(channelId, media, options);\n }\n\n /**\n * Starts music on hold for a channel.\n */\n async startChannelMusicOnHold(channelId: string): Promise<void> {\n return this.channels.startMusicOnHold(channelId);\n }\n\n /**\n * Stops music on hold for a channel.\n */\n async stopChannelMusicOnHold(channelId: string): Promise<void> {\n return this.channels.stopMusicOnHold(channelId);\n }\n\n /**\n * Starts playback of a media file on a channel.\n */\n async startChannelPlayback(\n channelId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n return this.channels.startPlayback(channelId, media, options);\n }\n\n /**\n * Stops playback of a media file on a channel.\n */\n async stopChannelPlayback(\n channelId: string,\n playbackId: string,\n ): Promise<void> {\n return this.channels.stopPlayback(channelId, playbackId);\n }\n\n /**\n * Pauses playback of a media file on a channel.\n */\n async pauseChannelPlayback(\n channelId: string,\n playbackId: string,\n ): Promise<void> {\n return this.channels.pausePlayback(channelId, playbackId);\n }\n\n /**\n * Resumes playback of a media file on a channel.\n */\n async resumeChannelPlayback(\n channelId: string,\n playbackId: string,\n ): Promise<void> {\n return this.channels.resumePlayback(channelId, playbackId);\n }\n\n /**\n * Rewinds playback of a media file on a channel.\n */\n async rewindChannelPlayback(\n channelId: string,\n playbackId: string,\n skipMs: number,\n ): Promise<void> {\n return this.channels.rewindPlayback(channelId, playbackId, skipMs);\n }\n\n /**\n * Fast-forwards playback of a media file on a channel.\n */\n async fastForwardChannelPlayback(\n channelId: string,\n playbackId: string,\n skipMs: number,\n ): Promise<void> {\n return this.channels.fastForwardPlayback(channelId, playbackId, skipMs);\n }\n\n /**\n * Records audio from a channel.\n */\n async recordAudio(\n channelId: string,\n options: RecordingOptions,\n ): Promise<Channel> {\n return this.channels.record(channelId, options);\n }\n\n /**\n * Starts snooping on a channel.\n */\n async snoopChannel(\n channelId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n return this.channels.snoopChannel(channelId, options);\n }\n\n /**\n * Starts snooping on a channel with a specific snoop ID.\n */\n async snoopChannelWithId(\n channelId: string,\n snoopId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n return this.channels.snoopChannelWithId(channelId, snoopId, options);\n }\n\n /**\n * Initiates a dial operation on a previously created channel.\n * This function attempts to connect the specified channel to its configured destination.\n *\n * @param channelId - The unique identifier of the channel to dial.\n * @param caller - Optional. The caller ID to use for the outgoing call. If not provided, the default caller ID for the channel will be used.\n * @param timeout - Optional. The maximum time in seconds to wait for the dial operation to complete. If not specified, the system's default timeout will be used.\n * @returns A Promise that resolves when the dial operation has been initiated successfully. Note that this does not guarantee that the call was answered, only that dialing has begun.\n * @throws Will throw an error if the dial operation fails, e.g., if the channel doesn't exist or is in an invalid state.\n */\n async dialChannel(\n channelId: string,\n caller?: string,\n timeout?: number,\n ): Promise<void> {\n return this.channels.dial(channelId, caller, timeout);\n }\n\n /**\n * Retrieves RTP statistics for a channel.\n */\n async getRTPStatistics(channelId: string): Promise<RTPStats> {\n return this.channels.getRTPStatistics(channelId);\n }\n\n /**\n * Creates a channel to an external media source/sink.\n */\n async createExternalMedia(options: ExternalMediaOptions): Promise<Channel> {\n return this.channels.createExternalMedia(options);\n }\n\n /**\n * Redirects a channel to a different location.\n */\n async redirectChannel(channelId: string, endpoint: string): Promise<void> {\n return this.channels.redirectChannel(channelId, endpoint);\n }\n\n /**\n * Answers a channel.\n */\n async answerChannel(channelId: string): Promise<void> {\n return this.channels.answerChannel(channelId);\n }\n\n /**\n * Sends a ringing indication to a channel.\n */\n async ringChannel(channelId: string): Promise<void> {\n return this.channels.ringChannel(channelId);\n }\n\n /**\n * Stops the ringing indication on a specified channel in the Asterisk system.\n *\n * This function sends a request to the Asterisk server to cease the ringing\n * indication on a particular channel. This is typically used when you want to\n * stop the ringing sound on a channel without answering or hanging up the call.\n *\n * @param channelId - The unique identifier of the channel on which to stop the ringing.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n *\n * @returns A Promise that resolves when the ringing has been successfully stopped on the specified channel.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async stopRingChannel(channelId: string): Promise<void> {\n return this.channels.stopRingChannel(channelId);\n }\n\n /**\n * Sends DTMF (Dual-Tone Multi-Frequency) tones to a specified channel.\n *\n * This function allows sending DTMF tones to a channel, which can be used for various purposes\n * such as interacting with IVR systems or sending signals during a call.\n *\n * @param channelId - The unique identifier of the channel to send DTMF tones to.\n * @param dtmf - A string representing the DTMF tones to send (e.g., \"123#\").\n * @param options - Optional parameters to control the timing of DTMF tones.\n * @param options.before - The time (in milliseconds) to wait before sending DTMF.\n * @param options.between - The time (in milliseconds) to wait between each DTMF tone.\n * @param options.duration - The duration (in milliseconds) of each DTMF tone.\n * @param options.after - The time (in milliseconds) to wait after sending all DTMF tones.\n * @returns A Promise that resolves when the DTMF tones have been successfully sent.\n */\n async sendDTMF(\n channelId: string,\n dtmf: string,\n options?: {\n before?: number;\n between?: number;\n duration?: number;\n after?: number;\n },\n ): Promise<void> {\n return this.channels.sendDTMF(channelId, dtmf, options);\n }\n\n /**\n * Mutes a channel in the Asterisk system.\n *\n * This function initiates a mute operation on the specified channel, preventing\n * audio transmission in the specified direction(s).\n *\n * @param channelId - The unique identifier of the channel to be muted.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n * @param direction - The direction of audio to mute. Can be one of:\n * - \"both\": Mute both incoming and outgoing audio (default)\n * - \"in\": Mute only incoming audio\n * - \"out\": Mute only outgoing audio\n *\n * @returns A Promise that resolves when the mute operation has been successfully completed.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async muteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n return this.channels.muteChannel(channelId, direction);\n }\n\n /**\n * Unmutes a channel in the Asterisk system.\n *\n * This function removes the mute status from a specified channel, allowing audio\n * transmission to resume in the specified direction(s).\n *\n * @param channelId - The unique identifier of the channel to be unmuted.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n * @param direction - The direction of audio to unmute. Can be one of:\n * - \"both\": Unmute both incoming and outgoing audio (default)\n * - \"in\": Unmute only incoming audio\n * - \"out\": Unmute only outgoing audio\n *\n * @returns A Promise that resolves when the unmute operation has been successfully completed.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async unmuteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n return this.channels.unmuteChannel(channelId, direction);\n }\n\n /**\n * Puts a specified channel on hold.\n *\n * This function initiates a hold operation on the specified channel in the Asterisk system.\n * When a channel is put on hold, typically the audio is muted or replaced with hold music,\n * depending on the system configuration.\n *\n * @param channelId - The unique identifier of the channel to be put on hold.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n *\n * @returns A Promise that resolves when the hold operation has been successfully initiated.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async holdChannel(channelId: string): Promise<void> {\n return this.channels.holdChannel(channelId);\n }\n\n /**\n * Removes a specified channel from hold.\n *\n * This function initiates an unhold operation on the specified channel in the Asterisk system.\n * When a channel is taken off hold, it typically resumes normal audio transmission,\n * allowing the parties to continue their conversation.\n *\n * @param channelId - The unique identifier of the channel to be taken off hold.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n *\n * @returns A Promise that resolves when the unhold operation has been successfully initiated.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async unholdChannel(channelId: string): Promise<void> {\n return this.channels.unholdChannel(channelId);\n }\n\n /**\n * Creates a new channel in the Asterisk system using the provided originate request data.\n * This function initiates a new communication channel based on the specified parameters.\n *\n * @param data - An object containing the originate request data for channel creation.\n * This includes details such as the endpoint to call, the context to use,\n * and any variables to set on the new channel.\n * @param data.endpoint - The endpoint to call (e.g., \"SIP/1234\").\n * @param data.extension - The extension to dial after the channel is created.\n * @param data.context - The dialplan context to use for the new channel.\n * @param data.priority - The priority to start at in the dialplan.\n * @param data.app - The application to execute on the channel (alternative to extension/context/priority).\n * @param data.appArgs - The arguments to pass to the application, if 'app' is specified.\n * @param data.callerId - The caller ID to set on the new channel.\n * @param data.timeout - The timeout (in seconds) to wait for the channel to be answered.\n * @param data.variables - An object containing key-value pairs of channel variables to set.\n * @param data.channelId - An optional ID to assign to the new channel.\n * @param data.otherChannelId - The ID of another channel to bridge with after creation.\n *\n * @returns A Promise that resolves to the created Channel object.\n * The Channel object contains details about the newly created channel,\n * such as its unique identifier, state, and other relevant information.\n *\n * @throws Will throw an error if the channel creation fails for any reason,\n * such as invalid parameters or system issues.\n */\n async createChannel(data: OriginateRequest): Promise<Channel> {\n return this.channels.createChannel(data);\n }\n\n /**\n * Hangs up a specific channel.\n *\n * @param channelId - The unique identifier of the channel to hang up.\n * @param options - Optional parameters for the hangup operation.\n * @param options.reason_code - An optional reason code for the hangup.\n * @param options.reason - An optional textual reason for the hangup.\n * @returns A promise that resolves when the hangup operation is complete.\n */\n async hangup(\n channelId: string,\n options?: { reason_code?: string; reason?: string },\n ): Promise<void> {\n return this.channels.hangup(channelId, options);\n }\n\n /**\n * Originates a new channel with a specified ID using the provided originate request data.\n *\n * @param channelId - The desired unique identifier for the new channel.\n * @param data - The originate request data containing channel creation parameters.\n * @returns A promise that resolves to the created Channel object.\n */\n async originateWithId(\n channelId: string,\n data: OriginateRequest,\n ): Promise<Channel> {\n return this.channels.originateWithId(channelId, data);\n }\n\n // M\u00E9todos relacionados a endpoints:\n\n /**\n * Lists all endpoints.\n *\n * @returns {Promise<Endpoint[]>} A promise resolving to the list of endpoints.\n */\n async listEndpoints(): Promise<Endpoint[]> {\n return this.endpoints.list();\n }\n\n /**\n * Retrieves details of a specific endpoint.\n *\n * @param technology - The technology of the endpoint.\n * @param resource - The resource name of the endpoint.\n * @returns {Promise<EndpointDetails>} A promise resolving to the details of the endpoint.\n */\n async getEndpointDetails(\n technology: string,\n resource: string,\n ): Promise<EndpointDetails> {\n return this.endpoints.getDetails(technology, resource);\n }\n\n /**\n * Sends a message to an endpoint.\n *\n * @param technology - The technology of the endpoint.\n * @param resource - The resource name of the endpoint.\n * @param body - The message body to send.\n * @returns {Promise<void>} A promise resolving when the message is sent.\n */\n async sendMessageToEndpoint(\n technology: string,\n resource: string,\n body: any,\n ): Promise<void> {\n return this.endpoints.sendMessage(technology, resource, body);\n }\n\n // M\u00E9todos relacionados a applications\n /**\n * Lists all applications.\n *\n * @returns {Promise<Application[]>} A promise resolving to the list of applications.\n */\n async listApplications(): Promise<Application[]> {\n return this.applications.list();\n }\n\n /**\n * Retrieves details of a specific application.\n *\n * @param appName - The name of the application.\n * @returns {Promise<ApplicationDetails>} A promise resolving to the application details.\n */\n async getApplicationDetails(appName: string): Promise<ApplicationDetails> {\n return this.applications.getDetails(appName);\n }\n\n /**\n * Sends a message to a specific application.\n *\n * @param appName - The name of the application.\n * @param body - The message body to send.\n * @returns {Promise<void>} A promise resolving when the message is sent successfully.\n */\n async sendMessageToApplication(appName: string, body: any): Promise<void> {\n return this.applications.sendMessage(appName, body);\n }\n\n // M\u00E9todos relacionados a playbacks\n /**\n * Retrieves details of a specific playback.\n *\n * @param playbackId - The unique identifier of the playback.\n * @returns {Promise<Playback>} A promise resolving to the playback details.\n */\n async getPlaybackDetails(playbackId: string): Promise<APIPlayback> {\n return this.playbacks.getDetails(playbackId);\n }\n\n /**\n * Controls a specific playback in the Asterisk server.\n * This function allows manipulation of an ongoing playback, such as pausing, resuming, or skipping.\n *\n * @param playbackId - The unique identifier of the playback to control.\n * This should be a string that uniquely identifies the playback in the Asterisk system.\n * @param controlRequest - An object containing the control operation details.\n * This object should conform to the PlaybackControlRequest interface,\n * which includes an 'operation' property specifying the control action to perform.\n * @returns A Promise that resolves when the control operation is successfully executed.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n * @throws Will throw an error if the playback control operation fails, e.g., if the playback doesn't exist\n * or the requested operation is invalid.\n */\n async controlPlayback(\n playbackId: string,\n controlRequest: PlaybackControlRequest,\n ): Promise<void> {\n const { operation } = controlRequest; // Extrai a opera\u00E7\u00E3o do objeto\n return this.playbacks.control(playbackId, operation);\n }\n\n /**\n * Stops a specific playback in the Asterisk server.\n *\n * @param playbackId - The unique identifier of the playback to stop.\n * @returns A Promise that resolves when the playback is successfully stopped.\n */\n async stopPlayback(playbackId: string): Promise<void> {\n return this.playbacks.stop(playbackId);\n }\n\n /**\n * Retrieves a list of all available sounds in the Asterisk server.\n *\n * @param params - Optional parameters to filter the list of sounds.\n * @returns A Promise that resolves to an array of Sound objects representing the available sounds.\n */\n async listSounds(params?: SoundListRequest): Promise<Sound[]> {\n return this.sounds.list(params);\n }\n\n /**\n * Retrieves detailed information about a specific sound in the Asterisk server.\n *\n * @param soundId - The unique identifier of the sound to retrieve details for.\n * @returns A Promise that resolves to a Sound object containing the details of the specified sound.\n */\n async getSoundDetails(soundId: string): Promise<Sound> {\n return this.sounds.getDetails(soundId);\n }\n\n /**\n * Retrieves general information about the Asterisk server.\n *\n * @returns A Promise that resolves to an AsteriskInfo object containing server information.\n */\n async getAsteriskInfo(): Promise<AsteriskInfo> {\n return this.asterisk.getInfo();\n }\n\n /**\n * Retrieves a list of all loaded modules in the Asterisk server.\n *\n * @returns A Promise that resolves to an array of Module objects representing the loaded modules.\n */\n async listModules(): Promise<Module[]> {\n return this.asterisk.listModules();\n }\n\n /**\n * Manages a specific module in the Asterisk server by loading, unloading, or reloading it.\n *\n * @param moduleName - The name of the module to manage.\n * @param action - The action to perform on the module: \"load\", \"unload\", or \"reload\".\n * @returns A Promise that resolves when the module management action is completed successfully.\n */\n async manageModule(\n moduleName: string,\n action: \"load\" | \"unload\" | \"reload\",\n ): Promise<void> {\n return this.asterisk.manageModule(moduleName, action);\n }\n\n /**\n * Retrieves a list of all configured logging channels in the Asterisk server.\n *\n * @returns A Promise that resolves to an array of Logging objects representing the configured logging channels.\n */\n async listLoggingChannels(): Promise<Logging[]> {\n return this.asterisk.listLoggingChannels();\n }\n\n /**\n * Adds or removes a log channel in the Asterisk server.\n *\n * @param logChannelName - The name of the log channel to manage.\n * @param action - The action to perform: \"add\" to create a new log channel or \"remove\" to delete an existing one.\n * @param configuration - Optional configuration object for adding a log channel. Ignored when removing a channel.\n * @param configuration.type - The type of the log channel.\n * @param configuration.configuration - Additional configuration details for the log channel.\n * @returns A Promise that resolves when the log channel management action is completed successfully.\n */\n async manageLogChannel(\n logChannelName: string,\n action: \"add\" | \"remove\",\n configuration?: { type?: string; configuration?: string },\n ): Promise<void> {\n return this.asterisk.manageLogChannel(\n logChannelName,\n action,\n configuration,\n );\n }\n\n /**\n * Retrieves the value of a global variable from the Asterisk server.\n *\n * @param variableName - The name of the global variable to retrieve.\n * @returns A Promise that resolves to a Variable object containing the name and value of the global variable.\n */\n async getGlobalVariable(variableName: string): Promise<Variable> {\n return this.asterisk.getGlobalVariable(variableName);\n }\n\n /**\n * Sets a global variable in the Asterisk server.\n *\n * This function allows you to set or update the value of a global variable\n * in the Asterisk server. Global variables are accessible throughout the\n * entire Asterisk system and can be used for various purposes such as\n * configuration settings or sharing data between different parts of the system.\n *\n * @param variableName - The name of the global variable to set or update.\n * This should be a string identifying the variable uniquely.\n * @param value - The value to assign to the global variable. This can be any\n * string value, including empty strings.\n * @returns A Promise that resolves when the global variable has been successfully\n * set. The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected\n * with an error object.\n */\n async setGlobalVariable(variableName: string, value: string): Promise<void> {\n return this.asterisk.setGlobalVariable(variableName, value);\n }\n}\n", "import axios, { type AxiosInstance } from \"axios\";\n\nexport class BaseClient {\n private client: AxiosInstance;\n\n constructor(baseUrl: string, username: string, password: string) {\n this.client = axios.create({\n baseURL: baseUrl,\n auth: { username, password },\n });\n }\n\n /**\n * Executes a GET request.\n * @param path - The API endpoint path.\n */\n async get<T>(path: string): Promise<T> {\n const response = await this.client.get<T>(path);\n return response.data;\n }\n\n /**\n * Executes a POST request.\n * @param path - The API endpoint path.\n * @param data - Optional payload to send with the request.\n */\n async post<T>(path: string, data?: unknown): Promise<T> {\n const response = await this.client.post<T>(path, data);\n return response.data;\n }\n\n /**\n * Executes a PUT request.\n * @param path - The API endpoint path.\n * @param data - Payload to send with the request.\n */\n async put<T>(path: string, data: unknown): Promise<T> {\n const response = await this.client.put<T>(path, data);\n return response.data;\n }\n\n /**\n * Executes a DELETE request.\n * @param path - The API endpoint path.\n */\n async delete<T>(path: string): Promise<T> {\n const response = await this.client.delete<T>(path);\n return response.data;\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n Application,\n ApplicationDetails,\n} from \"../interfaces/applications.types.js\";\n\nexport interface ApplicationMessage {\n event: string;\n data?: Record<string, any>;\n}\n\nexport class Applications {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all applications.\n * \n * @returns A promise that resolves to an array of Application objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(): Promise<Application[]> {\n const applications = await this.client.get<unknown>(\"/applications\");\n\n if (!Array.isArray(applications)) {\n throw new Error(\"Resposta da API /applications n\u00E3o \u00E9 um array.\");\n }\n\n return applications as Application[];\n }\n\n /**\n * Retrieves details of a specific application.\n * \n * @param appName - The name of the application to retrieve details for.\n * @returns A promise that resolves to an ApplicationDetails object.\n * @throws {Error} If there's an error fetching the application details.\n */\n async getDetails(appName: string): Promise<ApplicationDetails> {\n try {\n return await this.client.get<ApplicationDetails>(\n `/applications/${appName}`,\n );\n } catch (error) {\n console.error(`Erro ao obter detalhes do aplicativo ${appName}:`, error);\n throw error;\n }\n }\n\n /**\n * Sends a message to a specific application.\n * \n * @param appName - The name of the application to send the message to.\n * @param body - The message to be sent, containing an event and optional data.\n * @returns A promise that resolves when the message is successfully sent.\n */\n async sendMessage(appName: string, body: ApplicationMessage): Promise<void> {\n await this.client.post<void>(`/applications/${appName}/messages`, body);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { AsteriskInfo, Logging, Module, Variable } from \"../interfaces\";\n\nfunction toQueryParams<T>(options: T): string {\n return new URLSearchParams(\n Object.entries(options as Record<string, string>)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, String(value)]),\n ).toString();\n}\n\nexport class Asterisk {\n constructor(private client: BaseClient) {}\n\n /**\n * Retrieves information about the Asterisk server.\n */\n async getInfo(): Promise<AsteriskInfo> {\n return this.client.get<AsteriskInfo>(\"/asterisk/info\");\n }\n\n /**\n * Lists all loaded modules in the Asterisk server.\n */\n async listModules(): Promise<Module[]> {\n return this.client.get<Module[]>(\"/asterisk/modules\");\n }\n\n /**\n * Manages a specific module in the Asterisk server.\n *\n * @param moduleName - The name of the module to manage.\n * @param action - The action to perform on the module: \"load\", \"unload\", or \"reload\".\n * @returns A promise that resolves when the action is completed successfully.\n * @throws {Error} Throws an error if the HTTP method or action is invalid.\n */\n async manageModule(\n moduleName: string,\n action: \"load\" | \"unload\" | \"reload\",\n ): Promise<void> {\n const url = `/asterisk/modules/${moduleName}`;\n switch (action) {\n case \"load\":\n await this.client.post<void>(`${url}?action=load`);\n break;\n case \"unload\":\n await this.client.delete<void>(url);\n break;\n case \"reload\":\n await this.client.put<void>(url, {});\n break;\n default:\n throw new Error(`A\u00E7\u00E3o inv\u00E1lida: ${action}`);\n }\n }\n\n /**\n * Retrieves all configured logging channels.\n */\n async listLoggingChannels(): Promise<Logging[]> {\n return this.client.get<Logging[]>(\"/asterisk/logging\");\n }\n\n /**\n * Adds or removes a log channel in the Asterisk server.\n */\n async manageLogChannel(\n logChannelName: string,\n action: \"add\" | \"remove\",\n configuration?: { type?: string; configuration?: string },\n ): Promise<void> {\n const queryParams = toQueryParams(configuration || {});\n return this.client.post<void>(\n `/asterisk/logging/${logChannelName}?action=${encodeURIComponent(action)}&${queryParams}`,\n );\n }\n\n /**\n * Retrieves the value of a global variable.\n */\n async getGlobalVariable(variableName: string): Promise<Variable> {\n return this.client.get<Variable>(\n `/asterisk/variables?variable=${encodeURIComponent(variableName)}`,\n );\n }\n\n /**\n * Sets a global variable.\n */\n async setGlobalVariable(variableName: string, value: string): Promise<void> {\n return this.client.post<void>(\n `/asterisk/variables?variable=${encodeURIComponent(variableName)}&value=${encodeURIComponent(value)}`,\n );\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n AddChannelRequest,\n Bridge,\n BridgePlayback,\n CreateBridgeRequest,\n PlayMediaRequest,\n RemoveChannelRequest,\n} from \"../interfaces/bridges.types.js\";\n\nexport class Bridges {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all active bridges.\n */\n async list(): Promise<Bridge[]> {\n return this.client.get<Bridge[]>(\"/bridges\");\n }\n\n /**\n * Creates a new bridge.\n */\n async createBridge(request: CreateBridgeRequest): Promise<Bridge> {\n return this.client.post<Bridge>(\"/bridges\", request);\n }\n\n /**\n * Retrieves details of a specific bridge.\n */\n async getDetails(bridgeId: string): Promise<Bridge> {\n return this.client.get<Bridge>(`/bridges/${bridgeId}`);\n }\n\n /**\n * Destroys (deletes) a specific bridge.\n */\n async destroy(bridgeId: string): Promise<void> {\n return this.client.delete<void>(`/bridges/${bridgeId}`);\n }\n\n /**\n * Adds a channel or multiple channels to a bridge.\n */\n async addChannels(\n bridgeId: string,\n request: AddChannelRequest,\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n channel: Array.isArray(request.channel)\n ? request.channel.join(\",\")\n : request.channel,\n ...(request.role && { role: request.role }),\n }).toString();\n\n await this.client.post<void>(\n `/bridges/${bridgeId}/addChannel?${queryParams}`,\n );\n }\n\n /**\n * Removes a channel or multiple channels from a bridge.\n */\n async removeChannels(\n bridgeId: string,\n request: RemoveChannelRequest,\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n channel: Array.isArray(request.channel)\n ? request.channel.join(\",\")\n : request.channel,\n }).toString();\n\n await this.client.post<void>(\n `/bridges/${bridgeId}/removeChannel?${queryParams}`,\n );\n }\n\n /**\n * Plays media to a bridge.\n */\n async playMedia(\n bridgeId: string,\n request: PlayMediaRequest,\n ): Promise<BridgePlayback> {\n const queryParams = new URLSearchParams({\n ...(request.lang && { lang: request.lang }),\n ...(request.offsetms && { offsetms: request.offsetms.toString() }),\n ...(request.skipms && { skipms: request.skipms.toString() }),\n ...(request.playbackId && { playbackId: request.playbackId }),\n }).toString();\n\n return this.client.post<BridgePlayback>(\n `/bridges/${bridgeId}/play?${queryParams}`,\n { media: request.media },\n );\n }\n\n /**\n * Stops media playback on a bridge.\n */\n async stopPlayback(bridgeId: string, playbackId: string): Promise<void> {\n await this.client.delete<void>(`/bridges/${bridgeId}/play/${playbackId}`);\n }\n\n /**\n * Sets the video source for a bridge.\n */\n async setVideoSource(bridgeId: string, channelId: string): Promise<void> {\n await this.client.post<void>(\n `/bridges/${bridgeId}/videoSource?channelId=${encodeURIComponent(channelId)}`,\n );\n }\n\n /**\n * Clears the video source for a bridge.\n */\n async clearVideoSource(bridgeId: string): Promise<void> {\n await this.client.delete<void>(`/bridges/${bridgeId}/videoSource`);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n Channel,\n ChannelPlayback,\n ChannelVar,\n ExternalMediaOptions,\n OriginateRequest,\n PlaybackOptions,\n RTPStats,\n RecordingOptions,\n SnoopOptions,\n} from \"../interfaces/channels.types.js\";\n\nfunction toQueryParams<T>(options: T): string {\n return new URLSearchParams(\n Object.entries(options as Record<string, string>) // Convers\u00E3o expl\u00EDcita\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, value as string]), // Garante que value \u00E9 string\n ).toString();\n}\n\nexport class Channels {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all active channels.\n */\n async list(): Promise<Channel[]> {\n const channels = await this.client.get<unknown>(\"/channels\");\n\n if (!Array.isArray(channels)) {\n throw new Error(\"Resposta da API /channels n\u00E3o \u00E9 um array.\");\n }\n\n return channels as Channel[];\n }\n\n /**\n * Creates a new channel.\n */\n async originate(data: OriginateRequest): Promise<Channel> {\n return this.client.post<Channel>(\"/channels\", data);\n }\n\n /**\n * Retrieves details of a specific channel.\n */\n async getDetails(channelId: string): Promise<Channel> {\n return this.client.get<Channel>(`/channels/${channelId}`);\n }\n\n /**\n * Creates a channel and places it in a Stasis app without dialing it.\n */\n async createChannel(data: OriginateRequest): Promise<Channel> {\n return this.client.post<Channel>(\"/channels/create\", data);\n }\n\n /**\n * Creates a new channel with a specific ID and originates a call.\n */\n async originateWithId(\n channelId: string,\n data: OriginateRequest,\n ): Promise<Channel> {\n return this.client.post<Channel>(`/channels/${channelId}`, data);\n }\n\n /**\n * Hangs up (terminates) a specific channel.\n */\n /**\n * Hangs up a specific channel with optional reason or reason code.\n */\n async hangup(\n channelId: string,\n options?: { reason_code?: string; reason?: string },\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n ...(options?.reason_code && { reason_code: options.reason_code }),\n ...(options?.reason && { reason: options.reason }),\n });\n\n return this.client.delete<void>(\n `/channels/${channelId}?${queryParams.toString()}`,\n );\n }\n\n /**\n * Continues the dialplan for a specific channel.\n */\n async continueDialplan(\n channelId: string,\n context?: string,\n extension?: string,\n priority?: number,\n label?: string,\n ): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/continue`, {\n context,\n extension,\n priority,\n label,\n });\n }\n\n /**\n * Moves the channel to another Stasis application.\n */\n async moveToApplication(\n channelId: string,\n app: string,\n appArgs?: string,\n ): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/move`, {\n app,\n appArgs,\n });\n }\n\n /**\n * Sets a channel variable.\n */\n async setVariable(\n channelId: string,\n variable: string,\n value: string,\n ): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/variable`, {\n variable,\n value,\n });\n }\n\n /**\n * Gets a channel variable.\n */\n async getVariable(channelId: string, variable: string): Promise<ChannelVar> {\n return this.client.get<ChannelVar>(\n `/channels/${channelId}/variable?variable=${encodeURIComponent(variable)}`,\n );\n }\n\n /**\n * Plays a media file to a channel.\n */\n async playMedia(\n channelId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n const queryParams = options\n ? `?${new URLSearchParams(options as Record<string, string>).toString()}`\n : \"\";\n\n return this.client.post<ChannelPlayback>(\n `/channels/${channelId}/play${queryParams}`,\n { media },\n );\n }\n\n /**\n * Starts music on hold (MOH) for a channel.\n */\n async startMusicOnHold(channelId: string): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/moh`);\n }\n\n /**\n * Stops music on hold (MOH) for a channel.\n */\n async stopMusicOnHold(channelId: string): Promise<void> {\n return this.client.delete<void>(`/channels/${channelId}/moh`);\n }\n\n /**\n * Starts playback of a media file on a channel.\n */\n async startPlayback(\n channelId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n const queryParams = options\n ? `?${new URLSearchParams(options as Record<string, string>).toString()}`\n : \"\";\n\n return this.client.post<ChannelPlayback>(\n `/channels/${channelId}/play${queryParams}`,\n { media },\n );\n }\n\n /**\n * Stops playback of a media file on a channel.\n */\n async stopPlayback(channelId: string, playbackId: string): Promise<void> {\n return this.client.delete<void>(\n `/channels/${channelId}/play/${playbackId}`,\n );\n }\n\n /**\n * Pauses playback of a media file on a channel.\n */\n async pausePlayback(channelId: string, playbackId: string): Promise<void> {\n return this.client.post<void>(\n `/channels/${channelId}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Resumes playback of a media file on a channel.\n */\n async resumePlayback(channelId: string, playbackId: string): Promise<void> {\n return this.client.delete<void>(\n `/channels/${channelId}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Rewinds playback of a media file on a channel.\n */\n async rewindPlayback(\n channelId: string,\n playbackId: string,\n skipMs: number,\n ): Promise<void> {\n return this.client.post<void>(\n `/channels/${channelId}/play/${playbackId}/rewind`,\n { skipMs },\n );\n }\n\n /**\n * Fast-forwards playback of a media file on a channel.\n */\n async fastForwardPlayback(\n channelId: string,\n playbackId: string,\n skipMs: number,\n ): Promise<void> {\n return this.client.post<void>(\n `/channels/${channelId}/play/${playbackId}/forward`,\n { skipMs },\n );\n }\n\n /**\n * Records audio from a channel.\n */\n async record(channelId: string, options: RecordingOptions): Promise<Channel> {\n // Converte RecordingOptions para URLSearchParams, garantindo compatibilidade\n const queryParams = new URLSearchParams(\n Object.entries(options as unknown as Record<string, string>).filter(\n ([, value]) => value !== undefined,\n ),\n );\n\n return this.client.post<Channel>(\n `/channels/${channelId}/record?${queryParams.toString()}`,\n );\n }\n\n /**\n * Starts snooping on a channel.\n */\n async snoopChannel(\n channelId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = toQueryParams(options);\n\n return this.client.post<Channel>(\n `/channels/${channelId}/snoop?${queryParams}`,\n );\n }\n\n /**\n * Starts snooping on a channel with a specific snoop ID.\n */\n async snoopChannelWithId(\n channelId: string,\n snoopId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = new URLSearchParams(options as Record<string, string>);\n return this.client.post<Channel>(\n `/channels/${channelId}/snoop/${snoopId}?${queryParams.toString()}`,\n );\n }\n\n /**\n * Dials a created channel.\n */\n async dial(\n channelId: string,\n caller?: string,\n timeout?: number,\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n ...(caller && { caller }),\n ...(timeout && { timeout: timeout.toString() }),\n });\n return this.client.post<void>(\n `/channels/${channelId}/dial?${queryParams.toString()}`,\n );\n }\n\n /**\n * Retrieves RTP statistics for a channel.\n */\n async getRTPStatistics(channelId: string): Promise<RTPStats> {\n return this.client.get<RTPStats>(`/channels/${channelId}/rtp_statistics`);\n }\n\n /**\n * Creates a channel to an external media source/sink.\n */\n async createExternalMedia(options: ExternalMediaOptions): Promise<Channel> {\n const queryParams = new URLSearchParams(options as Record<string, string>);\n return this.client.post<Channel>(\n `/channels/externalMedia?${queryParams.toString()}`,\n );\n }\n\n /**\n * Redirects the channel to a different location.\n */\n async redirectChannel(channelId: string, endpoint: string): Promise<void> {\n return this.client.post<void>(\n `/channels/${channelId}/redirect?endpoint=${encodeURIComponent(endpoint)}`,\n );\n }\n\n /**\n * Answers a channel.\n */\n async answerChannel(channelId: string): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/answer`);\n }\n\n /**\n * Sends a ringing indication to a channel.\n */\n async ringChannel(channelId: string): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/ring`);\n }\n\n /**\n * Stops ringing indication on a channel.\n */\n async stopRingChannel(channelId: string): Promise<void> {\n return this.client.delete<void>(`/channels/${channelId}/ring`);\n }\n\n /**\n * Sends DTMF to a channel.\n */\n async sendDTMF(\n channelId: string,\n dtmf: string,\n options?: {\n before?: number;\n between?: number;\n duration?: number;\n after?: number;\n },\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n dtmf,\n ...(options?.before && { before: options.before.toString() }),\n ...(options?.between && { between: options.between.toString() }),\n ...(options?.duration && { duration: options.duration.toString() }),\n ...(options?.after && { after: options.after.toString() }),\n });\n\n return this.client.post<void>(\n `/channels/${channelId}/dtmf?${queryParams.toString()}`,\n );\n }\n\n /**\n * Mutes a channel.\n */\n async muteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n return this.client.post<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Unmutes a channel.\n */\n async unmuteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n return this.client.delete<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Puts a channel on hold.\n */\n async holdChannel(channelId: string): Promise<void> {\n return this.client.post<void>(`/channels/${channelId}/hold`);\n }\n\n /**\n * Removes a channel from hold.\n */\n async unholdChannel(channelId: string): Promise<void> {\n return this.client.delete<void>(`/channels/${channelId}/hold`);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { Endpoint, EndpointDetails } from \"../interfaces/endpoints.types\";\n\nexport class Endpoints {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all available endpoints.\n *\n * @returns A promise that resolves to an array of Endpoint objects representing all available endpoints.\n * @throws {Error} If the API response is not an array.\n */\n async list(): Promise<Endpoint[]> {\n const endpoints = await this.client.get<unknown>(\"/endpoints\");\n\n if (!Array.isArray(endpoints)) {\n throw new Error(\"Resposta da API /endpoints n\u00E3o \u00E9 um array.\");\n }\n\n return endpoints as Endpoint[];\n }\n\n /**\n * Retrieves details of a specific endpoint.\n *\n * @param technology - The technology of the endpoint (e.g., \"PJSIP\").\n * @param resource - The specific resource name of the endpoint (e.g., \"9001\").\n * @returns A promise that resolves to an EndpointDetails object containing the details of the specified endpoint.\n */\n async getDetails(\n technology: string,\n resource: string,\n ): Promise<EndpointDetails> {\n return this.client.get<EndpointDetails>(\n `/endpoints/${technology}/${resource}`,\n );\n }\n\n /**\n * Sends a message to a specific endpoint.\n *\n * @param technology - The technology of the endpoint (e.g., \"PJSIP\").\n * @param resource - The specific resource name of the endpoint (e.g., \"9001\").\n * @param message - The message payload to send to the endpoint.\n * @returns A promise that resolves when the message has been successfully sent.\n */\n async sendMessage(\n technology: string,\n resource: string,\n message: Record<string, unknown>,\n ): Promise<void> {\n await this.client.post<void>(\n `/endpoints/${technology}/${resource}/sendMessage`,\n message,\n );\n }\n}\n", "import { EventEmitter } from \"events\";\nimport type { BaseClient } from \"../baseClient.js\";\nimport type {\n Playback,\n PlaybackControlRequest,\n WebSocketEvent,\n} from \"../interfaces\";\n\nexport class Playbacks extends EventEmitter {\n constructor(private client: BaseClient) {\n super();\n }\n\n /**\n * Retrieves details of a specific playback.\n *\n * @param playbackId - The unique identifier of the playback.\n * @returns A promise that resolves to a Playback object containing the details of the specified playback.\n */\n async getDetails(playbackId: string): Promise<Playback> {\n return this.client.get<Playback>(`/playbacks/${playbackId}`);\n }\n\n /**\n * Controls a specific playback by performing various operations such as pause, resume, restart, reverse, forward, or stop.\n *\n * @param playbackId - The unique identifier of the playback to control.\n * @param operation - The operation to perform on the playback. Possible values are:\n * - \"pause\": Pauses the playback.\n * - \"unpause\": Resumes a paused playback.\n * - \"restart\": Restarts the playback from the beginning.\n * - \"reverse\": Reverses the playback direction.\n * - \"forward\": Moves the playback forward.\n * - \"stop\": Stops the playback.\n * @returns A promise that resolves when the control operation is successfully executed.\n */\n async control(\n playbackId: string,\n operation: \"pause\" | \"unpause\" | \"restart\" | \"reverse\" | \"forward\" | \"stop\",\n ): Promise<void> {\n await this.client.post<void>(`/playbacks/${playbackId}/control`, {\n operation,\n });\n }\n\n /**\n * Stops a specific playback.\n *\n * @param playbackId - The unique identifier of the playback to stop.\n * @returns A promise that resolves when the playback is successfully stopped.\n */\n async stop(playbackId: string): Promise<void> {\n await this.client.post<void>(`/playbacks/${playbackId}/stop`);\n }\n\n /**\n * Registers a listener for playback events.\n * The listener is triggered for events such as \"PlaybackFinished\".\n *\n * @param eventType - The type of event to listen for.\n * @param playbackId - The ID of the playback to associate with this listener.\n * @param callback - The callback function to execute when the event occurs.\n */\n registerListener<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.on(`${eventType}:${playbackId}`, callback);\n }\n\n /**\n * Unregisters a listener for playback events.\n *\n * @param eventType - The type of event to stop listening for.\n * @param playbackId - The ID of the playback associated with the listener.\n * @param callback - The callback function to remove.\n */\n unregisterListener<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.off(`${eventType}:${playbackId}`, callback);\n }\n\n /**\n * Checks if a listener is already registered for a specific event and playback.\n *\n * @param eventType - The type of event to check.\n * @param playbackId - The playback ID associated with the listener.\n * @returns True if a listener is already registered, false otherwise.\n */\n isListenerRegistered<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n ): boolean {\n return this.listenerCount(`${eventType}:${playbackId}`) > 0;\n }\n\n /**\n * Emits playback events received via WebSocket.\n * This method should be called by the WebSocket client when playback events occur.\n *\n * @param eventType - The type of the WebSocket event.\n * @param data - The data associated with the event.\n */\n emitPlaybackEvent<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n data: Extract<WebSocketEvent, { type: T }>,\n ): void {\n if (\"playbackId\" in data) {\n this.emit(`${eventType}:${data.playbackId}`, data);\n }\n // Emite eventos globais para o tipo de evento\n this.emit(eventType, data);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { Sound, SoundListRequest } from \"../interfaces/sounds.types.js\";\n\nexport class Sounds {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all available sounds.\n *\n * @param params - Optional parameters to filter the list of sounds.\n * @returns A promise that resolves to an array of Sound objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(params?: SoundListRequest): Promise<Sound[]> {\n const query = params\n ? `?${new URLSearchParams(params as Record<string, string>).toString()}`\n : \"\";\n\n const sounds = await this.client.get<unknown>(`/sounds${query}`);\n\n if (!Array.isArray(sounds)) {\n throw new Error(\"Resposta da API /sounds n\u00E3o \u00E9 um array.\");\n }\n\n return sounds as Sound[];\n }\n\n /**\n * Retrieves details of a specific sound.\n *\n * @param soundId - The unique identifier of the sound.\n * @returns A promise that resolves to a Sound object containing the details of the specified sound.\n */\n async getDetails(soundId: string): Promise<Sound> {\n return this.client.get<Sound>(`/sounds/${soundId}`);\n }\n}\n", "import { EventEmitter } from \"events\";\nimport WebSocket from \"ws\";\nimport type { WebSocketEvent } from \"./interfaces\";\n\n/**\n * WebSocketClient class for managing WebSocket connections.\n * Extends EventEmitter to provide event-based communication.\n */\nexport class WebSocketClient extends EventEmitter {\n private ws: WebSocket | null = null;\n private isClosedManually = false;\n private isReconnecting = false;\n\n /**\n * Creates a new WebSocketClient instance.\n * @param url - The WebSocket server URL to connect to.\n */\n constructor(private url: string) {\n super();\n }\n\n /**\n * Establishes a connection to the WebSocket server.\n * @returns A Promise that resolves when the connection is established, or rejects if an error occurs.\n * @throws Will throw an error if the connection fails.\n */\n async connect(): Promise<void> {\n if (this.isReconnecting) return;\n\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(this.url);\n\n this.ws.on(\"open\", () => {\n console.log(\"WebSocket conectado.\");\n this.isClosedManually = false;\n this.isReconnecting = false;\n resolve();\n });\n\n this.ws.on(\"error\", (err) => {\n console.error(\"Erro na conex\u00E3o WebSocket:\", err);\n reject(err);\n });\n\n this.ws.on(\"close\", (code, reason) => {\n console.warn(`WebSocket desconectado: ${code} - ${reason}`);\n this.isReconnecting = false;\n this.emit(\"close\", { code, reason });\n });\n\n this.ws.on(\"message\", (rawData) => {\n this.handleMessage(rawData);\n });\n });\n }\n\n /**\n * Checks if the WebSocket connection is currently open.\n * @returns True if the connection is open, false otherwise.\n */\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Adds a listener for WebSocket events.\n * @param event - The event type to listen for.\n * @param callback - The function to call when the event occurs.\n * @returns The WebSocketClient instance for chaining.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.on(event, callback);\n return this;\n }\n\n /**\n * Removes a specific listener from a WebSocket event.\n * @param event - The event type to remove the listener from.\n * @param callback - The function to remove from the event listeners.\n * @returns The WebSocketClient instance for chaining.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.off(event, callback);\n return this;\n }\n\n /**\n * Removes all listeners for a specific event, or all events if no event is specified.\n * @param event - Optional. The event to remove all listeners from.\n * @returns The WebSocketClient instance for chaining.\n */\n removeAllListeners(event?: string | symbol): this {\n super.removeAllListeners(event);\n return this;\n }\n\n /**\n * Handles incoming WebSocket messages.\n * @param rawData - The raw data received from the WebSocket.\n */\n private handleMessage(rawData: WebSocket.Data): void {\n try {\n const decodedData = JSON.parse(rawData.toString()) as WebSocketEvent;\n if (decodedData?.type) {\n this.emit(decodedData.type, decodedData);\n } else {\n console.warn(\"Mensagem recebida sem tipo:\", decodedData);\n }\n } catch (err) {\n console.error(\"Erro ao decodificar mensagem do WebSocket:\", err);\n }\n }\n\n /**\n * Sends data through the WebSocket connection.\n * @param data - The data to send.\n * @throws Will throw an error if the WebSocket is not connected.\n */\n send(data: any): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error(\"WebSocket n\u00E3o est\u00E1 conectado.\");\n }\n\n this.ws.send(data, (err) => {\n if (err) {\n console.error(\"Erro ao enviar dados pelo WebSocket:\", err);\n }\n });\n }\n\n /**\n * Closes the WebSocket connection manually.\n */\n close(): void {\n if (this.ws) {\n this.isClosedManually = true;\n this.ws.close();\n console.log(\"WebSocket fechado manualmente.\");\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Delay", "SkipFirstDelay", "AlwaysDelay", "backOff", "BackOff", "EventEmitter", "toQueryParams", "EventEmitter", "EventEmitter"]
|
|
7
7
|
}
|