@ipcom/asterisk-ari 0.0.112 → 0.0.114
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.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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/index.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/utils.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, "// Exporta a classe principal AriClient\nexport { AriClient } from \"./ari-client/ariClient.js\";\n\n// Exporta as classes dos recursos, caso o usu\u00E1rio precise us\u00E1-las diretamente\nexport { Channels, ChannelInstance } from \"./ari-client/resources/channels.js\";\nexport { Endpoints } from \"./ari-client/resources/endpoints.js\";\nexport { Applications } from \"./ari-client/resources/applications.js\";\nexport { Sounds } from \"./ari-client/resources/sounds.js\";\nexport {\n Playbacks,\n PlaybackInstance,\n} from \"./ari-client/resources/playbacks.js\";\nexport { Asterisk } from \"./ari-client/resources/asterisk.js\";\nexport { Bridges } from \"./ari-client/resources/bridges.js\";\n\n// Exporta interfaces importantes para tipagem\nexport type {\n AriClientConfig,\n Channel,\n Endpoint,\n Playback,\n Application,\n Sound,\n AsteriskInfo,\n Module,\n Logging,\n Variable,\n WebSocketEvent,\n WebSocketEventType,\n OriginateRequest,\n PlaybackOptions,\n RTPStats,\n RecordingOptions,\n SnoopOptions,\n ExternalMediaOptions,\n ChannelPlayback,\n ChannelVar,\n ChannelDialplan,\n AriApplication,\n EndpointDetails,\n PlaybackControlRequest,\n ApplicationDetails,\n SoundListRequest,\n PlayMediaRequest,\n Bridge,\n BridgePlayback,\n CreateBridgeRequest,\n RemoveChannelRequest,\n AddChannelRequest,\n ChannelEvent,\n PlaybackEvent,\n} from \"./ari-client/interfaces/index.js\";\n", "import { type IBackOffOptions, backOff } from \"exponential-backoff\";\nimport { BaseClient } from \"./baseClient.js\";\nimport type {\n AriApplication,\n AriClientConfig,\n Channel,\n WebSocketEvent,\n WebSocketEventType,\n} from \"./interfaces\";\nimport { Applications } from \"./resources/applications.js\";\nimport { Asterisk } from \"./resources/asterisk\";\nimport { Bridges } from \"./resources/bridges\";\nimport { type ChannelInstance, Channels } from \"./resources/channels.js\";\nimport { Endpoints } from \"./resources/endpoints\";\nimport { type PlaybackInstance, Playbacks } from \"./resources/playbacks\";\nimport { Sounds } from \"./resources/sounds\";\nimport { isChannelEvent } from \"./utils\";\nimport { WebSocketClient } from \"./websocketClient.js\";\n\nexport class AriClient {\n private eventListeners: Map<string, (data: any) => void> = new Map();\n private wsClients: Map<string, WebSocketClient> = new Map(); // Map para armazenar conex\u00F5es por app\n private readonly baseClient: BaseClient;\n private isReconnecting: Map<string, boolean> = new Map(); // Estado de reconex\u00E3o por app\n private webSocketReady: Map<string, Promise<void>> = new Map(); // Rastreamento do estado de cada conex\u00E3o\n private channelInstances: Map<string, ChannelInstance> = new Map();\n private pendingListeners: {\n event: WebSocketEvent[\"type\"];\n callback: (data: any) => void;\n }[] = [];\n private processPendingListeners(): void {\n for (const [app, wsClient] of this.wsClients.entries()) {\n if (!wsClient.isConnected()) {\n console.warn(`WebSocket para o app '${app}' ainda n\u00E3o est\u00E1 conectado.`);\n continue; // Pule apps sem conex\u00E3o\n }\n\n // Processar listeners pendentes\n while (this.pendingListeners.length > 0) {\n const { event, callback } = this.pendingListeners.shift()!;\n\n // Evita duplicar listeners\n if (wsClient.listenerCount(event) > 0) {\n console.log(\n `Listener j\u00E1 registrado para o evento '${event}' no app '${app}'. Ignorando duplicata.`,\n );\n continue;\n }\n\n console.log(`Registrando listener para '${app}' no evento: ${event}`);\n wsClient.on(event, callback);\n }\n }\n }\n\n private async reconnectWebSocket(app: string): Promise<void> {\n console.log(`Tentando reconectar o WebSocket para o app '${app}'...`);\n\n try {\n await this.connectSingleWebSocket(app);\n this.processPendingListeners(); // Reprocessa listeners ap\u00F3s reconex\u00E3o\n console.log(`Reconex\u00E3o bem-sucedida para o app '${app}'.`);\n } catch (error) {\n console.error(`Erro ao reconectar o WebSocket para '${app}':`, error);\n }\n }\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, this);\n this.playbacks = new Playbacks(this.baseClient, this);\n this.endpoints = new Endpoints(this.baseClient);\n this.applications = new Applications(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 // Getter para wsClients\n public getWebSocketClients(): Map<string, WebSocketClient> {\n return this.wsClients;\n }\n\n /**\n * Registra listeners globais para eventos de WebSocket.\n */\n public on<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n app: string, // Nome do app agora \u00E9 obrigat\u00F3rio\n ): void {\n if (!app) {\n throw new Error(\n \"O nome do app \u00E9 obrigat\u00F3rio para registrar um listener de evento.\",\n );\n }\n\n console.log(\n `Registrando listener para evento '${eventType}' no app '${app}'.`,\n );\n\n const callbackKey = `${app}:${eventType}`; // Chave combinada de app e evento\n\n if (this.eventListeners.has(callbackKey)) {\n console.log(\n `Listener para evento '${eventType}' j\u00E1 est\u00E1 registrado no app '${app}'. Ignorando duplicata.`,\n );\n return; // Evita duplicatas\n }\n\n const wrappedCallback = (event: WebSocketEvent) => {\n if (isChannelEvent(event)) {\n const channelId = event.channel.id;\n\n if (channelId) {\n if (!this.channelInstances.has(channelId)) {\n const channelInstance = this.createChannelInstance(channelId, app);\n this.channelInstances.set(channelId, channelInstance);\n }\n\n event.instanceChannel = this.channelInstances.get(channelId);\n event.instanceChannel?.emit(event.type, event); // Propaga para o instanceChannel\n }\n }\n\n callback(event as Extract<WebSocketEvent, { type: T }>);\n };\n\n // Registra o listener no WebSocket associado ao app\n const wsClient = this.wsClients.get(app);\n if (wsClient) {\n const scopedEvent = `${app}:${eventType}`;\n wsClient.on(scopedEvent, wrappedCallback);\n this.eventListeners.set(callbackKey, wrappedCallback);\n console.log(\n `Listener para evento '${eventType}' registrado com sucesso no app '${app}'.`,\n );\n } else {\n console.warn(`WebSocket para o app '${app}' n\u00E3o est\u00E1 conectado.`);\n }\n }\n\n public removeListener<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n app?: string,\n ): void {\n if (app) {\n const callbackKey = `${eventType}-${app}`;\n const callback = this.eventListeners.get(callbackKey);\n if (callback) {\n const wsClient = this.wsClients.get(app);\n if (wsClient) {\n wsClient.off(eventType, callback);\n console.log(\n `Listener para evento '${eventType}' removido do app '${app}'`,\n );\n }\n this.eventListeners.delete(callbackKey);\n }\n } else {\n for (const [_app, wsClient] of this.wsClients.entries()) {\n const callbackKey = `${eventType}-${_app}`;\n const callback = this.eventListeners.get(callbackKey);\n if (callback) {\n wsClient.off(eventType, callback);\n console.log(\n `Listener global para evento '${eventType}' removido do app '${_app}'`,\n );\n this.eventListeners.delete(callbackKey);\n }\n }\n }\n }\n\n /**\n * Type guard to check if the given data object contains a valid channel property.\n * This function is used to narrow down the type of the data object and ensure it has a channel with an id.\n *\n * @param data - The object to be checked for the presence of a channel property.\n * @returns A type predicate indicating whether the data object contains a valid channel.\n * Returns true if the data object has a channel property with an id, false otherwise.\n */\n private hasChannel(data: any): data is { channel: Channel } {\n return data?.channel?.id !== undefined;\n }\n\n // M\u00E9todo para criar uma inst\u00E2ncia de ChannelInstance\n private createChannelInstance(\n channelId: string,\n app: string,\n ): ChannelInstance {\n return this.channels.Channel({\n id: channelId,\n app,\n });\n }\n\n private handleWebSocketEvent(event: WebSocketEvent, app: string): void {\n console.log(\"Evento recebido no WebSocket:\", event.type, event);\n const { type, ...data } = event;\n\n if (this.hasChannel(data)) {\n const channelId = data.channel.id;\n\n if (channelId) {\n // Verifica se j\u00E1 existe uma inst\u00E2ncia de ChannelInstance\n if (!this.channelInstances.has(channelId)) {\n const channelInstance = this.createChannelInstance(channelId, app);\n this.channelInstances.set(channelId, channelInstance);\n }\n\n // Retorna apenas os dados do `Channel` para compatibilidade\n const channelInstance = this.channelInstances.get(channelId);\n if (channelInstance) {\n data.channel = { ...data.channel, ...channelInstance }; // Combina os dados do `Channel` com `ChannelInstance`\n }\n }\n }\n\n const listener = this.eventListeners.get(type);\n if (listener) {\n listener(data);\n }\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 /**\n * Connects to the ARI WebSocket for one or more applications.\n * Establishes a WebSocket connection for each app and subscribes to events.\n *\n * @param apps - Array of application names to connect to.\n * @param subscribedEvents - Optional array of events to subscribe to.\n * If not provided or empty, subscribes to all events.\n * @returns A Promise that resolves when all connections are established.\n */\n async connectWebSocket(\n apps: string[],\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void[]> {\n if (!Array.isArray(apps) || apps.length === 0) {\n throw new Error(\"\u00C9 necess\u00E1rio fornecer pelo menos um aplicativo.\");\n }\n\n // Remover duplicatas antes de processar\n const uniqueApps = [...new Set(apps)];\n\n return Promise.all(\n uniqueApps.map(async (app) => {\n if (this.wsClients.has(app)) {\n console.log(`Conex\u00E3o WebSocket para '${app}' j\u00E1 existe. Ignorando.`);\n return; // Reutiliza conex\u00E3o existente\n }\n\n await this.connectSingleWebSocket(app, subscribedEvents);\n }),\n );\n }\n\n /**\n * Establishes a single WebSocket connection for a given app.\n */\n private async connectSingleWebSocket(\n app: string,\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void> {\n if (!app) {\n throw new Error(\"O nome do aplicativo \u00E9 obrigat\u00F3rio.\");\n }\n\n // Evitar m\u00FAltiplas tentativas simult\u00E2neas para o mesmo app\n if (this.webSocketReady.get(app)) {\n console.log(`Conex\u00E3o WebSocket para '${app}' j\u00E1 est\u00E1 ativa.`);\n return this.webSocketReady.get(app)!;\n }\n\n const protocol = this.config.secure ? \"wss\" : \"ws\";\n const eventsParam =\n subscribedEvents && subscribedEvents.length > 0\n ? `&event=${subscribedEvents.join(\",\")}`\n : \"&subscribeAll=true\";\n const wsUrl = `${protocol}://${encodeURIComponent(\n this.config.username,\n )}:${encodeURIComponent(this.config.password)}@${\n this.config.host\n }:${this.config.port}/ari/events?app=${app}${eventsParam}`;\n\n // Configura\u00E7\u00E3o de backoff\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(\n `Tentativa ${attemptNumber} falhou para '${app}': ${error.message}`,\n );\n\n // Verifica se algum WebSocket no wsClients ainda n\u00E3o est\u00E1 conectado\n return (\n !this.wsClients.has(app) || !this.wsClients.get(app)?.isConnected()\n );\n },\n };\n\n // Promessa para gerenciar a conex\u00E3o\n const webSocketPromise = new Promise<void>(async (resolve, reject) => {\n try {\n if (this.isReconnecting.get(app)) {\n console.warn(`J\u00E1 est\u00E1 tentando reconectar para o app '${app}'.`);\n return;\n }\n\n this.isReconnecting.set(app, true);\n\n const wsClient = new WebSocketClient(wsUrl);\n wsClient.setMaxListeners(30);\n\n await backOff(async () => {\n if (!wsClient) {\n throw new Error(\"WebSocketClient instance is null.\");\n }\n\n await wsClient.connect();\n console.log(`WebSocket conectado para o app: ${app}`);\n\n // Integrar eventos do WebSocket\n this.integrateWebSocketEvents(app, wsClient);\n\n // Garante que o app est\u00E1 registrado\n await this.ensureAppRegistered(app);\n\n // Adiciona o WebSocket ao Map\n this.wsClients.set(app, wsClient);\n\n // Chamar processPendingListeners ap\u00F3s a conex\u00E3o\n this.processPendingListeners();\n }, backoffOptions);\n\n resolve(); // Conex\u00E3o bem-sucedida\n } catch (error) {\n console.error(`Erro ao conectar WebSocket para '${app}':`, error);\n reject(error);\n } finally {\n this.isReconnecting.delete(app);\n }\n });\n\n this.webSocketReady.set(app, webSocketPromise);\n return webSocketPromise;\n }\n\n /**\n * Integrates WebSocket events with playback listeners.\n */\n private integrateWebSocketEvents(\n app: string,\n wsClient: WebSocketClient,\n ): void {\n if (!wsClient) {\n throw new Error(\n `WebSocket client para o app '${app}' n\u00E3o est\u00E1 conectado.`,\n );\n }\n\n // Verifica se os eventos j\u00E1 foram registrados\n if (wsClient.listenerCount(\"PlaybackStarted\") > 0) {\n // console.log(`[${app}] Eventos j\u00E1 registrados. Ignorando.`);\n return; // Evita registrar eventos novamente\n }\n\n const eventHandlers: Partial<\n Record<WebSocketEventType, (data: WebSocketEvent) => void>\n > = {\n PlaybackStarted: (data) => {\n if (\"playbackId\" in data) {\n // console.log(`[${app}] PlaybackStarted:`, data);\n }\n },\n PlaybackFinished: (data) => {\n if (\"playbackId\" in data) {\n // console.log(`[${app}] PlaybackFinished:`, data);\n }\n },\n ChannelDtmfReceived: (data) => {\n if (data.type === \"ChannelDtmfReceived\" && \"digit\" in data) {\n // console.log(`[${app}] DTMF recebido: ${data.digit}`);\n } else {\n console.warn(\n `[${app}] Evento inesperado em ChannelDtmfReceived`,\n data,\n );\n }\n },\n ChannelStateChange: (data) => {\n if (\"channel\" in data) {\n // console.log(`[${app}] Estado do canal alterado:`, data.channel);\n }\n },\n };\n\n for (const [eventType, handler] of Object.entries(eventHandlers)) {\n if (handler) {\n wsClient.on(eventType as WebSocketEventType, handler);\n }\n }\n\n console.log(`[${app}] Todos os eventos do WebSocket foram registrados.`);\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 public logListeners(): void {\n this.wsClients.forEach((wsClient, app) => {\n console.log(`Listeners registrados para '${app}':`);\n wsClient.eventNames().forEach((event) => {\n const eventName = String(event); // Converte o nome do evento para string\n const count = wsClient.listenerCount(event);\n console.log(` Evento '${eventName}': ${count} listener(s)`);\n });\n });\n }\n\n /**\n * Checks if the WebSocket connection is active.\n *\n * @returns {boolean} True if connected, false otherwise.\n */\n anyWebSocketConnected(): boolean {\n // Verifica se todos os WebSockets em wsClients est\u00E3o conectados\n return Array.from(this.wsClients.values()).every((wsClient) =>\n wsClient.isConnected(),\n );\n }\n\n isWebSocketConnected(app: string): boolean {\n const wsClient = this.wsClients.get(app);\n return wsClient ? wsClient.isConnected() : false;\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(app: string): void {\n const wsClient = this.wsClients.get(app);\n if (wsClient) {\n wsClient.close();\n this.wsClients.delete(app); // Remove o WebSocket do Map\n console.log(`WebSocket para o app '${app}' foi fechado.`);\n } else {\n console.warn(`WebSocket para o app '${app}' n\u00E3o encontrado.`);\n }\n }\n\n closeAllWebSockets(): void {\n this.wsClients.forEach((wsClient, app) => {\n wsClient.close();\n console.log(`WebSocket para o app '${app}' foi fechado.`);\n });\n this.wsClients.clear(); // Limpa o Map\n console.log(\"Todos os WebSockets foram fechados.\");\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `ChannelInstance` para manipular canais localmente.\n *\n * @param channelId - O ID do canal, se dispon\u00EDvel. Caso contr\u00E1rio, a inst\u00E2ncia ser\u00E1 para um canal ainda n\u00E3o criado.\n * @param app\n * @returns Uma inst\u00E2ncia de `ChannelInstance` vinculada ao cliente atual.\n */\n Channel(channelId?: string, app?: string): ChannelInstance {\n if (!app) {\n throw new Error(\n \"O nome do aplicativo (app) \u00E9 obrigat\u00F3rio para criar um Channel.\",\n );\n }\n return this.channels.Channel({ id: channelId, app });\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance` para manipular playbacks.\n *\n * @param playbackId - O ID do playback, se dispon\u00EDvel. Caso contr\u00E1rio, a inst\u00E2ncia ser\u00E1 para um playback ainda n\u00E3o inicializado.\n * @param app\n * @returns Uma inst\u00E2ncia de `PlaybackInstance` vinculada ao cliente atual.\n */\n Playback(playbackId?: string, app?: string): PlaybackInstance {\n if (!app) {\n throw new Error(\n \"O nome do aplicativo (app) \u00E9 obrigat\u00F3rio para criar um Channel.\",\n );\n }\n return this.playbacks.Playback({ id: playbackId, app });\n }\n}\n", "import { EventEmitter } from \"events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport type { WebSocketEvent } from \"./interfaces\";\nimport type { WebSocketClient } from \"./websocketClient\";\n\nexport class BaseClient {\n private client: AxiosInstance;\n private eventEmitter = new EventEmitter();\n private wsClients: Map<string, WebSocketClient> = new Map(); // Gerencia os WebSocket clients\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 // Gerenciamento de WebSocket clients\n\n /**\n * Adiciona um WebSocket client ao gerenciador.\n * @param app - Nome do aplicativo ou contexto associado.\n * @param wsClient - Inst\u00E2ncia do WebSocketClient.\n */\n addWebSocketClient(app: string, wsClient: WebSocketClient): void {\n if (this.wsClients.has(app)) {\n throw new Error(`J\u00E1 existe um WebSocket client registrado para '${app}'`);\n }\n this.wsClients.set(app, wsClient);\n console.log(`WebSocket client adicionado para '${app}'`);\n }\n\n /**\n * Remove um WebSocket client do gerenciador.\n * @param app - Nome do aplicativo ou contexto associado.\n */\n removeWebSocketClient(app: string): void {\n if (!this.wsClients.has(app)) {\n throw new Error(`Nenhum WebSocket client encontrado para '${app}'`);\n }\n this.wsClients.delete(app);\n console.log(`WebSocket client removido para '${app}'`);\n }\n\n /**\n * Obt\u00E9m todos os WebSocket clients.\n * @returns Um Map contendo todos os WebSocket clients registrados.\n */\n getWebSocketClients(): Map<string, WebSocketClient> {\n return this.wsClients;\n }\n\n /**\n * Obt\u00E9m um WebSocket client espec\u00EDfico.\n * @param app - Nome do aplicativo ou contexto associado.\n * @returns O WebSocket client correspondente.\n */\n getWebSocketClient(app: string): WebSocketClient | undefined {\n return this.wsClients.get(app);\n }\n\n // Gerenciamento de eventos WebSocket\n\n onWebSocketEvent(callback: (event: WebSocketEvent) => void): void {\n console.log(\"Registrando callback para eventos do WebSocket\");\n this.eventEmitter.on(\"websocketEvent\", (event) => {\n console.log(\"Evento recebido no BaseClient:\", event);\n callback(event);\n });\n }\n\n emitWebSocketEvent(event: WebSocketEvent): void {\n console.log(\"Emitindo evento do WebSocket:\", event);\n this.eventEmitter.emit(\"websocketEvent\", event);\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 { EventEmitter } from \"events\";\nimport type { AriClient } from \"../ariClient\";\nimport 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 WebSocketEvent,\n} from \"../interfaces\";\nimport { isChannelEvent, toQueryParams } from \"../utils\";\nimport type { PlaybackInstance } from \"./playbacks\";\n\nexport class ChannelInstance extends EventEmitter {\n private channelData: Channel | null = null;\n public id: string; // ID do canal\n\n constructor(\n private client: AriClient,\n private baseClient: BaseClient,\n private channelId: string = `channel-${Date.now()}`, // Gera um ID padr\u00E3o se n\u00E3o fornecido\n private app: string, // Nome do aplicativo (app)\n ) {\n super();\n\n this.id = channelId || `channel-${Date.now()}`; // Inicializa o ID do canal\n\n const wsClients = this.client.getWebSocketClients();\n const wsClient = wsClients.get(this.app); // Busca o WebSocket espec\u00EDfico para o app\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para o canal: ${this.id}`,\n );\n }\n\n // Adiciona listeners escopados para este canal no WebSocket espec\u00EDfico do app\n wsClient.addScopedMessageListener(\n this.id,\n this.app,\n (event: WebSocketEvent) => {\n if (isChannelEvent(event, this.id)) {\n const channelEventType = event.type;\n this.emit(channelEventType, event); // Emite evento para o ChannelInstance\n }\n },\n );\n\n // Remove listeners escopados quando o \u00FAltimo listener for removido\n this.on(\"removeListener\", (eventName) => {\n if (\n this.eventNames().length === 0 ||\n this.listenerCount(eventName) === 0\n ) {\n wsClient.removeScopedMessageListeners(this.id, this.app);\n console.log(\n `Listeners escopados removidos para canal '${this.id}' no app '${this.app}'.`,\n );\n }\n });\n\n // Remove listeners escopados quando o \u00FAltimo listener for removido\n this.on(\"removeListener\", (eventName) => {\n if (\n this.eventNames().length === 0 ||\n this.listenerCount(eventName) === 0\n ) {\n wsClient.removeScopedMessageListeners(this.id, this.app);\n console.log(`Listeners escopados removidos para canal '${this.id}'.`);\n }\n });\n }\n\n /**\n * Adiciona um listener para eventos de canal.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n const scopedEvent = `${this.app}:Channel:${this.id}:${event}`;\n console.log({ metheod: \"on\", event, scopedEvent });\n\n // Verifica se j\u00E1 existe um listener para este evento escopado\n const existingListeners = wsClient.listeners(scopedEvent);\n if (existingListeners.includes(callback)) {\n console.warn(`Listener j\u00E1 registrado para o evento '${scopedEvent}'.`);\n return this; // N\u00E3o registra duplicatas\n }\n\n wsClient.on(scopedEvent, callback);\n return this;\n }\n\n /**\n * Adiciona um listener para ser chamado apenas uma vez.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n // Remover listeners existentes para o mesmo escopo, se necess\u00E1rio\n wsClient.removeWildcardListeners(this.id, event, \"Channel\");\n\n const scopedEvent = `${this.app}:Channel:${this.id}:${event}`;\n\n console.log({ metheod: \"once\", event, scopedEvent });\n\n // Verificar se j\u00E1 existe um listener para o evento escopado\n const existingListeners = wsClient.listeners(scopedEvent);\n if (existingListeners.some((listener) => listener === callback)) {\n console.warn(`Listener j\u00E1 registrado para o evento '${scopedEvent}'.`);\n return this; // N\u00E3o registra duplicatas\n }\n\n const listener = (data: WebSocketEvent) => {\n callback(data as Extract<WebSocketEvent, { type: T }>);\n wsClient.off(scopedEvent, listener); // Remove o listener ap\u00F3s execu\u00E7\u00E3o\n wsClient.removeWildcardListeners(this.id, event, \"Channel\");\n };\n\n wsClient.on(scopedEvent, listener);\n\n return this;\n }\n\n /**\n * Remove um listener espec\u00EDfico.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n const scopedEvent = `${this.app}:Channel:${this.id}:${event}`;\n wsClient.off(scopedEvent, callback);\n\n return this;\n }\n\n async answer(): Promise<void> {\n await this.baseClient.post<void>(`/channels/${this.id}/answer`);\n }\n\n /**\n * Origina um canal f\u00EDsico no Asterisk.\n */\n async originate(data: OriginateRequest): Promise<Channel> {\n if (this.channelData) {\n throw new Error(\"O canal j\u00E1 foi criado.\");\n }\n\n const channel = await this.baseClient.post<Channel>(\"/channels\", data);\n this.channelData = channel;\n\n return channel;\n }\n\n /**\n * Obt\u00E9m os detalhes do canal.\n */\n async getDetails(): Promise<Channel> {\n if (this.channelData) {\n return this.channelData;\n }\n\n if (!this.id) {\n throw new Error(\"Nenhum ID de canal associado a esta inst\u00E2ncia.\");\n }\n\n const details = await this.baseClient.get<Channel>(`/channels/${this.id}`);\n this.channelData = details; // Armazena os detalhes para evitar m\u00FAltiplas chamadas\n return details;\n }\n\n async getVariable(variable: string): Promise<ChannelVar> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n return this.baseClient.get<ChannelVar>(\n `/channels/${this.id}/variable?variable=${encodeURIComponent(variable)}`,\n );\n }\n\n /**\n * Encerra o canal, se ele j\u00E1 foi criado.\n */\n async hangup(): Promise<void> {\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails();\n }\n\n if (!this.channelData?.id) {\n throw new Error(\"N\u00E3o foi poss\u00EDvel inicializar o canal. ID inv\u00E1lido.\");\n }\n\n await this.baseClient.delete(`/channels/${this.channelData.id}`);\n }\n\n /**\n * Reproduz m\u00EDdia no canal.\n */\n async play(\n options: { media: string; lang?: string },\n playback?: PlaybackInstance,\n ): Promise<PlaybackInstance> {\n // Verifica se o canal foi inicializado\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails(); // Inicializa automaticamente\n }\n\n if (!playback) {\n playback = this.client.Playback();\n }\n\n if (!this.channelData?.id) {\n throw new Error(\"N\u00E3o foi poss\u00EDvel inicializar o canal. ID inv\u00E1lido.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playback.id}`,\n options,\n );\n\n return playback;\n }\n\n /**\n * Reproduz m\u00EDdia em um canal.\n */\n async playMedia(\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n if (!this.channelData) {\n throw new Error(\"O canal ainda n\u00E3o foi criado.\");\n }\n\n const queryParams = options\n ? `?${new URLSearchParams(options as Record<string, string>).toString()}`\n : \"\";\n\n return this.baseClient.post<ChannelPlayback>(\n `/channels/${this.channelData.id}/play${queryParams}`,\n { media },\n );\n }\n\n /**\n * Para a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async stopPlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/play/${playbackId}`,\n );\n }\n\n /**\n * Pausa a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async pausePlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Retoma a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async resumePlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Retrocede a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async rewindPlayback(playbackId: string, skipMs: number): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/rewind`,\n { skipMs },\n );\n }\n\n /**\n * Avan\u00E7a a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async fastForwardPlayback(playbackId: string, skipMs: number): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/forward`,\n { skipMs },\n );\n }\n\n /**\n * Muta o canal.\n */\n async muteChannel(direction: \"both\" | \"in\" | \"out\" = \"both\"): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Desmuta o canal.\n */\n async unmuteChannel(\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Coloca o canal em espera.\n */\n async holdChannel(): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(`/channels/${this.channelData.id}/hold`);\n }\n\n /**\n * Remove o canal da espera.\n */\n async unholdChannel(): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(`/channels/${this.channelData.id}/hold`);\n }\n}\n\nexport class Channels extends EventEmitter {\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {\n super();\n }\n\n Channel({ id, app }: { id?: string; app: string }): ChannelInstance {\n if (!app) {\n throw new Error(\n \"O nome do aplicativo (app) \u00E9 obrigat\u00F3rio para criar um Channel.\",\n );\n }\n return new ChannelInstance(this.client, this.baseClient, id, app);\n }\n\n /**\n * Origina um canal f\u00EDsico diretamente, sem uma inst\u00E2ncia de `ChannelInstance`.\n */\n async originate(data: OriginateRequest): Promise<Channel> {\n return this.baseClient.post<Channel>(\"/channels\", data);\n }\n\n /**\n * Obt\u00E9m detalhes de um canal espec\u00EDfico.\n */\n async getDetails(channelId: string): Promise<Channel> {\n return this.baseClient.get<Channel>(`/channels/${channelId}`);\n }\n\n /**\n * Lista todos os canais ativos.\n */\n async list(): Promise<Channel[]> {\n const channels = await this.baseClient.get<unknown>(\"/channels\");\n if (!Array.isArray(channels)) {\n throw new Error(\"Resposta da API /channels n\u00E3o \u00E9 um array.\");\n }\n return channels as Channel[];\n }\n\n /**\n * Encerra um canal espec\u00EDfico.\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.baseClient.delete<void>(\n `/channels/${channelId}?${queryParams.toString()}`,\n );\n }\n\n /**\n * Inicia a escuta em um canal.\n */\n async snoopChannel(\n channelId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/snoop?${queryParams}`,\n );\n }\n\n async startSilence(channelId: string): Promise<void> {\n return this.baseClient.post<void>(`/channels/${channelId}/silence`);\n }\n\n async stopSilence(channelId: string): Promise<void> {\n return this.baseClient.delete<void>(`/channels/${channelId}/silence`);\n }\n\n async getRTPStatistics(channelId: string): Promise<RTPStats> {\n return this.baseClient.get<RTPStats>(\n `/channels/${channelId}/rtp_statistics`,\n );\n }\n\n async createExternalMedia(options: ExternalMediaOptions): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/externalMedia?${queryParams}`,\n );\n }\n\n async playWithId(\n channelId: string,\n playbackId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n const queryParams = options ? `?${toQueryParams(options)}` : \"\";\n return this.baseClient.post<ChannelPlayback>(\n `/channels/${channelId}/play/${playbackId}${queryParams}`,\n { media },\n );\n }\n\n async snoopChannelWithId(\n channelId: string,\n snoopId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/snoop/${snoopId}?${queryParams}`,\n );\n }\n\n async startMohWithClass(channelId: string, mohClass: string): Promise<void> {\n const queryParams = `mohClass=${encodeURIComponent(mohClass)}`;\n await this.baseClient.post<void>(\n `/channels/${channelId}/moh?${queryParams}`,\n );\n }\n\n async getChannelVariable(\n channelId: string,\n variable: string,\n ): Promise<ChannelVar> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n return this.baseClient.get<ChannelVar>(\n `/channels/${channelId}/variable?variable=${encodeURIComponent(variable)}`,\n );\n }\n\n async setChannelVariable(\n channelId: string,\n variable: string,\n value?: string,\n ): Promise<void> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n const queryParams = new URLSearchParams({\n variable,\n ...(value && { value }),\n });\n await this.baseClient.post<void>(\n `/channels/${channelId}/variable?${queryParams}`,\n );\n }\n\n async moveToApplication(\n channelId: string,\n app: string,\n appArgs?: string,\n ): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/move`, {\n app,\n appArgs,\n });\n }\n\n async continueDialplan(\n channelId: string,\n context?: string,\n extension?: string,\n priority?: number,\n label?: string,\n ): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/continue`, {\n context,\n extension,\n priority,\n label,\n });\n }\n\n async stopMusicOnHold(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/moh`);\n }\n\n async startMusicOnHold(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/moh`);\n }\n\n async record(channelId: string, options: RecordingOptions): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/record?${queryParams}`,\n );\n }\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 await this.baseClient.post<void>(\n `/channels/${channelId}/dial?${queryParams}`,\n );\n }\n\n async redirectChannel(channelId: string, endpoint: string): Promise<void> {\n await this.baseClient.post<void>(\n `/channels/${channelId}/redirect?endpoint=${encodeURIComponent(endpoint)}`,\n );\n }\n\n async answerChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/answer`);\n }\n\n async ringChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/ring`);\n }\n\n async stopRingChannel(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/ring`);\n }\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 = toQueryParams({ dtmf, ...options });\n await this.baseClient.post<void>(\n `/channels/${channelId}/dtmf?${queryParams}`,\n );\n }\n\n async muteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n await this.baseClient.post<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n async unmuteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n await this.baseClient.delete<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n async holdChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/hold`);\n }\n\n async unholdChannel(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/hold`);\n }\n\n async createChannel(data: OriginateRequest): Promise<Channel> {\n return this.baseClient.post<Channel>(\"/channels/create\", data);\n }\n\n async originateWithId(\n channelId: string,\n data: OriginateRequest,\n ): Promise<Channel> {\n return this.baseClient.post<Channel>(`/channels/${channelId}`, data);\n }\n}\n", "import type { Channel, Playback, WebSocketEvent } from \"./interfaces\";\n\nexport function 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, value as string]),\n ).toString();\n}\n\nexport function isPlaybackEvent(\n event: WebSocketEvent,\n playbackId?: string,\n): event is Extract<WebSocketEvent, { playbackId: string }> {\n const hasPlayback = \"playback\" in event && event.playback?.id !== undefined;\n return hasPlayback && (!playbackId || event.playback?.id === playbackId);\n}\n\n/**\n * Verifica se um evento pertence a um canal e opcionalmente valida o ID do canal.\n * @param event O evento WebSocket a ser validado.\n * @param channelId Opcional. O ID do canal a ser validado.\n * @returns Verdadeiro se o evento \u00E9 relacionado a um canal (e ao ID, se fornecido).\n */\nexport function isChannelEvent(\n event: WebSocketEvent,\n channelId?: string,\n): event is Extract<WebSocketEvent, { channel: Channel }> {\n // Verifica se o evento tem a propriedade `channel`\n const hasChannel = \"channel\" in event && event.channel?.id !== undefined;\n\n return hasChannel && (!channelId || event.channel?.id === channelId);\n}\n\nexport const channelEvents = [\n \"ChannelCreated\",\n \"ChannelDestroyed\",\n \"ChannelEnteredBridge\",\n \"ChannelLeftBridge\",\n \"ChannelStateChange\",\n \"ChannelDtmfReceived\",\n \"ChannelDialplan\",\n \"ChannelCallerId\",\n \"ChannelUserevent\",\n \"ChannelHangupRequest\",\n \"ChannelVarset\",\n \"ChannelTalkingStarted\",\n \"ChannelTalkingFinished\",\n \"ChannelHold\",\n \"ChannelUnhold\",\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 { AriClient } from \"../ariClient\";\nimport type { BaseClient } from \"../baseClient.js\";\nimport type { Playback, WebSocketEvent } from \"../interfaces\";\nimport { isPlaybackEvent } from \"../utils\";\n\nexport class PlaybackInstance extends EventEmitter {\n private playbackData: Playback | null = null;\n public id: string; // Garantimos que o ID esteja dispon\u00EDvel\n\n constructor(\n private client: AriClient,\n private baseClient: BaseClient,\n private playbackId: string = `playback-${Date.now()}`, // Gera um ID padr\u00E3o se n\u00E3o fornecido\n private app: string, // Nome do aplicativo (app)\n ) {\n super();\n this.id = playbackId || `playback-${Date.now()}`; // Inicializa o ID do playback\n\n const wsClients = this.client.getWebSocketClients();\n const wsClient = Array.from(wsClients.values()).find((client) =>\n client.isConnected(),\n );\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para o playback: ${this.id}`,\n );\n }\n\n try {\n wsClient.addScopedMessageListener(\n this.id,\n this.app,\n (event: WebSocketEvent) => {\n if (isPlaybackEvent(event, this.id)) {\n const playbackEventType = event.type;\n this.emit(playbackEventType, event); // Emite evento para o PlaybackInstance\n }\n },\n );\n } catch (error) {\n console.error(\n `Erro ao adicionar listener escopado para playback '${this.id}':`,\n error,\n );\n throw error;\n }\n\n // Remove listeners escopados quando o \u00FAltimo listener for removido\n this.on(\"removeListener\", (eventName) => {\n if (\n this.eventNames().length === 0 ||\n this.listenerCount(eventName) === 0\n ) {\n wsClient.removeScopedMessageListeners(this.id, this.app);\n console.log(\n `Listeners escopados removidos para playback '${this.id}'.`,\n );\n }\n });\n }\n\n /**\n * Adiciona um listener para eventos de playback.\n */\n /**\n * Adiciona um listener para eventos de playback.\n */\n /**\n * Adiciona um listener para eventos de playback.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n const scopedEvent = `${this.app}:Playback:${this.id}:${event}`;\n console.log({ metheod: \"on\", event, scopedEvent });\n\n // Verificar se j\u00E1 existe um listener para o evento escopado\n const existingListeners = wsClient.listeners(scopedEvent);\n if (existingListeners.some((listener) => listener === callback)) {\n console.warn(`Listener j\u00E1 registrado para o evento '${scopedEvent}'.`);\n return this; // N\u00E3o registra duplicatas\n }\n\n wsClient.on(scopedEvent, callback as (data: WebSocketEvent) => void);\n\n return this;\n }\n\n /**\n * Adiciona um listener para ser chamado apenas uma vez.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n // Remove listeners duplicados com base no padr\u00E3o\n wsClient.removeWildcardListeners(this.id, event, \"Playback\");\n\n const scopedEvent = `${this.app}:Playback:${this.id}:${event}`;\n\n console.log({ metheod: \"once\", event, scopedEvent });\n\n // Verificar se j\u00E1 existe um listener para o evento escopado\n const existingListeners = wsClient.listeners(scopedEvent);\n if (existingListeners.some((listener) => listener === callback)) {\n console.warn(`Listener j\u00E1 registrado para o evento '${scopedEvent}'.`);\n return this; // N\u00E3o registra duplicatas\n }\n\n const listener = (data: WebSocketEvent) => {\n callback(data as Extract<WebSocketEvent, { type: T }>);\n wsClient.off(scopedEvent, listener); // Remove o listener ap\u00F3s execu\u00E7\u00E3o\n wsClient.removeWildcardListeners(this.id, event, \"Playback\");\n };\n\n wsClient.on(scopedEvent, listener);\n\n return this;\n }\n\n /**\n * Remove um listener espec\u00EDfico.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n const scopedEvent = `${this.app}:Playback:${this.id}:${event}`;\n wsClient.off(scopedEvent, callback as (data: WebSocketEvent) => void);\n\n return this;\n }\n\n /**\n * Obt\u00E9m os detalhes do playback.\n */\n async getDetails(): Promise<Playback> {\n if (!this.id && !this.playbackData) {\n throw new Error(\"Nenhum playback associado a esta inst\u00E2ncia.\");\n }\n\n console.log({\n message: \"NPM\",\n id: `/playbacks/${this.id}`,\n data: this.playbackData,\n });\n\n const details = await this.baseClient.get<Playback>(\n `/playbacks/${this.id}`,\n );\n this.playbackData = details;\n return details;\n }\n\n /**\n * Controla o playback.\n */\n async control(\n operation: \"pause\" | \"unpause\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado para controlar.\");\n }\n\n await this.baseClient.post<void>(\n `/playbacks/${this.id}/control?operation=${operation}`,\n );\n }\n\n async stop(): Promise<void> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado para encerrar.\");\n }\n\n try {\n await this.baseClient.delete<void>(`/playbacks/${this.id}`);\n console.log(`Playback '${this.id}' parado com sucesso.`);\n } catch (error: any) {\n if (error.response?.status === 404) {\n console.warn(\n `Playback '${this.id}' n\u00E3o encontrado para encerrar (404).`,\n );\n // Voc\u00EA pode decidir n\u00E3o lan\u00E7ar o erro, j\u00E1 que o playback n\u00E3o existe mais\n return;\n }\n\n // Repassa outros erros\n console.error(\n `Erro ao encerrar o playback '${this.id}':`,\n error.message || error,\n );\n throw error; // Repassa o erro caso n\u00E3o seja tratado\n }\n }\n}\n\nexport class Playbacks extends EventEmitter {\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {\n super();\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance`.\n */\n Playback({ id, app }: { id?: string; app: string }): PlaybackInstance {\n if (!app) {\n throw new Error(\n \"O nome do aplicativo (app) \u00E9 obrigat\u00F3rio para criar um Channel.\",\n );\n }\n const playbackId = id || `playback-${Date.now()}`;\n return new PlaybackInstance(this.client, this.baseClient, playbackId, app);\n }\n\n /**\n * Obt\u00E9m os clientes WebSocket dispon\u00EDveis.\n */\n getWebSocketClients() {\n return this.client.getWebSocketClients();\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.baseClient.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\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n await this.baseClient.post<void>(\n `/playbacks/${playbackId}/control?operation=${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 try {\n await this.baseClient.delete<void>(`/playbacks/${playbackId}`);\n console.log(`Playback '${playbackId}' parado com sucesso.`);\n } catch (error: any) {\n if (error.response?.status === 404) {\n console.warn(\n `Playback '${playbackId}' n\u00E3o encontrado para encerrar (404).`,\n );\n // Voc\u00EA pode decidir n\u00E3o lan\u00E7ar o erro, j\u00E1 que o playback n\u00E3o existe mais\n return;\n }\n\n // Repassa outros erros\n console.error(\n `Erro ao encerrar o playback '${playbackId}':`,\n error.message || error,\n );\n throw error; // Repassa o erro caso n\u00E3o seja tratado\n }\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", "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 { type IBackOffOptions, backOff } from \"exponential-backoff\";\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 private messageListeners: ((data: any) => void)[] = [];\n maxReconnectAttempts = 30;\n private reconnectAttempts = 0; // Para gerenciar tentativas de reconex\u00E3o\n private scopedListeners: Map<string, (data: WebSocketEvent) => void> =\n new Map();\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 private async reconnect(): Promise<void> {\n console.log(\"Iniciando processo de reconex\u00E3o...\");\n\n const backoffOptions: IBackOffOptions = {\n delayFirstAttempt: false,\n startingDelay: 1000, // 1 segundo inicial\n timeMultiple: 2, // Multiplicador exponencial\n maxDelay: 30000, // 30 segundos de atraso m\u00E1ximo\n numOfAttempts: this.maxReconnectAttempts, // Limite de tentativas\n jitter: \"full\",\n retry: (error: any, attemptNumber: number) => {\n console.warn(\n `Tentativa ${attemptNumber} de reconex\u00E3o falhou: ${error.message}`,\n );\n return !this.isClosedManually; // Tenta novamente apenas se o WebSocket n\u00E3o foi fechado manualmente\n },\n };\n\n try {\n await backOff(async () => {\n console.log(`Tentando reconectar (#${this.reconnectAttempts + 1})...`);\n await this.connect(); // Tenta reconectar\n console.log(\"Reconex\u00E3o bem-sucedida.\");\n }, backoffOptions);\n\n // Reconex\u00E3o bem-sucedida, reseta o estado\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n } catch (error) {\n console.error(\n `Reconex\u00E3o falhou ap\u00F3s ${this.maxReconnectAttempts} tentativas.`,\n error,\n );\n this.isReconnecting = false; // Garante que o estado seja atualizado mesmo em falha\n }\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; // Impede 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 this.reconnectAttempts = 0; // Resetar tentativas ap\u00F3s sucesso\n console.log(\n `Listeners ativos para 'message': ${this.listenerCount(\"message\")}`,\n );\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.emit(\"close\", { code, reason });\n\n if (!this.isClosedManually) {\n this.reconnect(); // Tenta reconectar se n\u00E3o foi fechado manualmente\n }\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 onMessage(callback: (data: any) => void): void {\n if (!this.messageListeners.includes(callback)) {\n this.messageListeners.push(callback);\n this.on(\"message\", callback); // Registra no evento gen\u00E9rico\n } else {\n console.warn(\"Tentativa de registrar listener duplicado para 'message'.\");\n }\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 string>(event: T, callback: (data: any) => void): this {\n // Verifica se o listener para o evento j\u00E1 existe\n const existingListeners = this.listeners(event);\n if (existingListeners.includes(callback)) {\n console.warn(\n `Listener duplicado detectado para o evento '${event}'. Ignorando.`,\n );\n return this; // Evita duplicatas\n }\n\n console.log(`Registrando listener para o evento '${event}'.`);\n console.log(\n `Antes: ${this.listenerCount(event)} listener(s) para o evento '${event}'.`,\n );\n\n // Adiciona o listener\n super.on(event, callback);\n\n console.log(\n `Depois: ${this.listenerCount(event)} listener(s) para o evento '${event}'.`,\n );\n\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 /**\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 string>(event: T, callback: (data: any) => void): this {\n // Adiciona logs para depura\u00E7\u00E3o\n const existingListeners = this.listeners(event);\n if (existingListeners.length > 0) {\n console.log(\n `Removendo listener para o evento '${event}'. Total antes: ${existingListeners.length}`,\n );\n } else {\n console.warn(`Nenhum listener encontrado para o evento '${event}'`);\n }\n\n // Remove o listener espec\u00EDfico\n super.off(event, callback);\n\n // Verifica o estado ap\u00F3s a remo\u00E7\u00E3o\n const remainingListeners = this.listeners(event);\n console.log(\n `Listener para o evento '${event}' removido. Total agora: ${remainingListeners.length}`,\n );\n\n return this;\n }\n\n removeWildcardListeners(\n id: string,\n event: string,\n type: \"Channel\" | \"Playback\",\n ): void {\n console.log(\n `Removendo listeners para '${type}:${id}:${event}' com wildcard no app`,\n );\n\n // Itera sobre todos os eventos registrados no WebSocketClient\n for (const eventName of this.eventNames()) {\n if (typeof eventName === \"string\") {\n const eventString = String(eventName); // Garante que \u00E9 string\n\n if (eventString.includes(`:${type}:${id}:${event}`)) {\n console.log(`Removendo listener para o evento: ${eventString}`);\n\n // Remove todos os listeners associados ao evento espec\u00EDfico\n this.removeAllListeners(eventName);\n }\n }\n }\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 * Adiciona um listener escopado ao evento \"message\".\n * @param instanceId - Identificador \u00FAnico da inst\u00E2ncia que est\u00E1 registrando o listener.\n * @param app\n * @param callback - Fun\u00E7\u00E3o de callback para o evento.\n */\n addScopedMessageListener(\n instanceId: string,\n app: string,\n callback: (data: WebSocketEvent) => void,\n ): void {\n const key = `${app}:${instanceId}`;\n if (this.scopedListeners.has(key)) {\n console.warn(\n `Listener escopado para a inst\u00E2ncia '${key}' j\u00E1 existe. Ignorando.`,\n );\n return;\n }\n\n const scopedListener = (data: WebSocketEvent) => {\n try {\n if (\n data.application === app &&\n ((data.type.startsWith(\"Channel\") &&\n \"channel\" in data &&\n data.channel?.id === instanceId) ||\n (data.type.startsWith(\"Playback\") &&\n \"playbackId\" in data &&\n data.playbackId === instanceId))\n ) {\n console.log(\n `Listener escopado ativado para inst\u00E2ncia '${instanceId}' no app '${app}'.`,\n );\n callback(data);\n }\n } catch (error) {\n console.error(\n `Erro no listener escopado para inst\u00E2ncia '${instanceId}' no app '${app}':`,\n error,\n );\n }\n };\n\n this.scopedListeners.set(key, scopedListener);\n this.on(\"message\", scopedListener);\n console.log(\n `Listener escopado adicionado para a inst\u00E2ncia '${instanceId}' no app '${app}'. Total de listeners: ${this.listenerCount(\n \"message\",\n )}`,\n );\n }\n\n /**\n * Remove todos os listeners associados a uma inst\u00E2ncia espec\u00EDfica.\n * @param instanceId - Identificador da inst\u00E2ncia cujos listeners ser\u00E3o removidos.\n * @param app\n */\n removeScopedMessageListeners(instanceId: string, app: string): void {\n const key = `${app}:${instanceId}`;\n if (!this.scopedListeners.has(key)) {\n console.warn(`Nenhum listener encontrado para a inst\u00E2ncia '${key}'.`);\n return;\n }\n\n const scopedListener = this.scopedListeners.get(key);\n if (scopedListener) {\n this.off(\"message\", scopedListener);\n this.scopedListeners.delete(key);\n console.log(\n `Listeners removidos para a inst\u00E2ncia '${key}'. Total de listeners restantes: ${this.listenerCount(\n \"message\",\n )}`,\n );\n } else {\n console.warn(`Listener j\u00E1 foi removido para a inst\u00E2ncia '${key}'.`);\n }\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\n if (decodedData?.type && decodedData?.application) {\n const scopedEvent = `${decodedData.application}:${decodedData.type}`;\n\n // Determinar o escopo com base no tipo de evento\n if (\"channel\" in decodedData && decodedData.channel?.id) {\n const channelScopedEvent = `${decodedData.application}:Channel:${decodedData.channel.id}:${decodedData.type}`;\n this.emit(channelScopedEvent, decodedData); // Emitir evento para o escopo do canal\n } else if (\"playback\" in decodedData && decodedData.playback?.id) {\n const playbackScopedEvent = `${decodedData.application}:Playback:${decodedData.playback.id}:${decodedData.type}`;\n this.emit(playbackScopedEvent, decodedData); // Emitir evento para o escopo do playback\n }\n\n // Emitir evento geral para a aplica\u00E7\u00E3o\n this.emit(scopedEvent, decodedData);\n } else {\n console.warn(\n \"Mensagem recebida sem tipo ou aplica\u00E7\u00E3o v\u00E1lida:\",\n decodedData,\n );\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 this.ws = null;\n\n // Remove todos os listeners do evento 'message'\n this.removeAllListeners(\"message\");\n\n console.log(\n \"WebSocket fechado manualmente e listeners para 'message' limpos.\",\n );\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": [null, null, null, null, null, null, null, null, null, "// Exporta a classe principal AriClient\nexport { AriClient } from \"./ari-client/ariClient.js\";\n\n// Exporta as classes dos recursos, caso o usu\u00E1rio precise us\u00E1-las diretamente\nexport { Channels, ChannelInstance } from \"./ari-client/resources/channels.js\";\nexport { Endpoints } from \"./ari-client/resources/endpoints.js\";\nexport { Applications } from \"./ari-client/resources/applications.js\";\nexport { Sounds } from \"./ari-client/resources/sounds.js\";\nexport {\n Playbacks,\n PlaybackInstance,\n} from \"./ari-client/resources/playbacks.js\";\nexport { Asterisk } from \"./ari-client/resources/asterisk.js\";\nexport { Bridges } from \"./ari-client/resources/bridges.js\";\n\n// Exporta interfaces importantes para tipagem\nexport type {\n AriClientConfig,\n Channel,\n Endpoint,\n Playback,\n Application,\n Sound,\n AsteriskInfo,\n Module,\n Logging,\n Variable,\n WebSocketEvent,\n WebSocketEventType,\n OriginateRequest,\n PlaybackOptions,\n RTPStats,\n RecordingOptions,\n SnoopOptions,\n ExternalMediaOptions,\n ChannelPlayback,\n ChannelVar,\n ChannelDialplan,\n AriApplication,\n EndpointDetails,\n PlaybackControlRequest,\n ApplicationDetails,\n SoundListRequest,\n PlayMediaRequest,\n Bridge,\n BridgePlayback,\n CreateBridgeRequest,\n RemoveChannelRequest,\n AddChannelRequest,\n ChannelEvent,\n PlaybackEvent,\n} from \"./ari-client/interfaces/index.js\";\n", "import { type IBackOffOptions, backOff } from \"exponential-backoff\";\nimport { BaseClient } from \"./baseClient.js\";\nimport type {\n AriApplication,\n AriClientConfig,\n Channel,\n WebSocketEvent,\n WebSocketEventType,\n} from \"./interfaces\";\nimport { Applications } from \"./resources/applications.js\";\nimport { Asterisk } from \"./resources/asterisk\";\nimport { Bridges } from \"./resources/bridges\";\nimport { type ChannelInstance, Channels } from \"./resources/channels.js\";\nimport { Endpoints } from \"./resources/endpoints\";\nimport { type PlaybackInstance, Playbacks } from \"./resources/playbacks\";\nimport { Sounds } from \"./resources/sounds\";\nimport { isChannelEvent } from \"./utils\";\nimport { WebSocketClient } from \"./websocketClient.js\";\n\nexport class AriClient {\n private eventListeners: Map<string, (data: any) => void> = new Map();\n private wsClients: Map<string, WebSocketClient> = new Map(); // Map para armazenar conex\u00F5es por app\n private readonly baseClient: BaseClient;\n private isReconnecting: Map<string, boolean> = new Map(); // Estado de reconex\u00E3o por app\n private webSocketReady: Map<string, Promise<void>> = new Map(); // Rastreamento do estado de cada conex\u00E3o\n private channelInstances: Map<string, ChannelInstance> = new Map();\n private pendingListeners: {\n event: WebSocketEvent[\"type\"];\n callback: (data: any) => void;\n }[] = [];\n private processPendingListeners(): void {\n for (const [app, wsClient] of this.wsClients.entries()) {\n if (!wsClient.isConnected()) {\n console.warn(`WebSocket para o app '${app}' ainda n\u00E3o est\u00E1 conectado.`);\n continue; // Pule apps sem conex\u00E3o\n }\n\n // Processar listeners pendentes\n while (this.pendingListeners.length > 0) {\n const { event, callback } = this.pendingListeners.shift()!;\n\n // Evita duplicar listeners\n if (wsClient.listenerCount(event) > 0) {\n console.log(\n `Listener j\u00E1 registrado para o evento '${event}' no app '${app}'. Ignorando duplicata.`,\n );\n continue;\n }\n\n console.log(`Registrando listener para '${app}' no evento: ${event}`);\n wsClient.on(event, callback);\n }\n }\n }\n\n private async reconnectWebSocket(app: string): Promise<void> {\n console.log(`Tentando reconectar o WebSocket para o app '${app}'...`);\n\n try {\n await this.connectSingleWebSocket(app);\n this.processPendingListeners(); // Reprocessa listeners ap\u00F3s reconex\u00E3o\n console.log(`Reconex\u00E3o bem-sucedida para o app '${app}'.`);\n } catch (error) {\n console.error(`Erro ao reconectar o WebSocket para '${app}':`, error);\n }\n }\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, this);\n this.playbacks = new Playbacks(this.baseClient, this);\n this.endpoints = new Endpoints(this.baseClient);\n this.applications = new Applications(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 // Getter para wsClients\n public getWebSocketClients(): Map<string, WebSocketClient> {\n return this.wsClients;\n }\n\n /**\n * Registra listeners globais para eventos de WebSocket.\n */\n public on<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n app: string, // Nome do app agora \u00E9 obrigat\u00F3rio\n ): void {\n if (!app) {\n throw new Error(\n \"O nome do app \u00E9 obrigat\u00F3rio para registrar um listener de evento.\",\n );\n }\n\n console.log(\n `Registrando listener para evento '${eventType}' no app '${app}'.`,\n );\n\n const callbackKey = `${app}:${eventType}`; // Chave combinada de app e evento\n\n if (this.eventListeners.has(callbackKey)) {\n console.log(\n `Listener para evento '${eventType}' j\u00E1 est\u00E1 registrado no app '${app}'. Ignorando duplicata.`,\n );\n return; // Evita duplicatas\n }\n\n const wrappedCallback = (event: WebSocketEvent) => {\n if (isChannelEvent(event)) {\n const channelId = event.channel.id;\n\n if (channelId) {\n if (!this.channelInstances.has(channelId)) {\n const channelInstance = this.createChannelInstance(channelId, app);\n this.channelInstances.set(channelId, channelInstance);\n }\n\n event.instanceChannel = this.channelInstances.get(channelId);\n event.instanceChannel?.emit(event.type, event); // Propaga para o instanceChannel\n }\n }\n\n callback(event as Extract<WebSocketEvent, { type: T }>);\n };\n\n // Registra o listener no WebSocket associado ao app\n const wsClient = this.wsClients.get(app);\n if (wsClient) {\n const scopedEvent = `${app}:${eventType}`;\n wsClient.on(scopedEvent, wrappedCallback);\n this.eventListeners.set(callbackKey, wrappedCallback);\n console.log(\n `Listener para evento '${eventType}' registrado com sucesso no app '${app}'.`,\n );\n } else {\n console.warn(`WebSocket para o app '${app}' n\u00E3o est\u00E1 conectado.`);\n }\n }\n\n public removeListener<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n app?: string,\n ): void {\n if (app) {\n const callbackKey = `${eventType}-${app}`;\n const callback = this.eventListeners.get(callbackKey);\n if (callback) {\n const wsClient = this.wsClients.get(app);\n if (wsClient) {\n wsClient.off(eventType, callback);\n console.log(\n `Listener para evento '${eventType}' removido do app '${app}'`,\n );\n }\n this.eventListeners.delete(callbackKey);\n }\n } else {\n for (const [_app, wsClient] of this.wsClients.entries()) {\n const callbackKey = `${eventType}-${_app}`;\n const callback = this.eventListeners.get(callbackKey);\n if (callback) {\n wsClient.off(eventType, callback);\n console.log(\n `Listener global para evento '${eventType}' removido do app '${_app}'`,\n );\n this.eventListeners.delete(callbackKey);\n }\n }\n }\n }\n\n /**\n * Type guard to check if the given data object contains a valid channel property.\n * This function is used to narrow down the type of the data object and ensure it has a channel with an id.\n *\n * @param data - The object to be checked for the presence of a channel property.\n * @returns A type predicate indicating whether the data object contains a valid channel.\n * Returns true if the data object has a channel property with an id, false otherwise.\n */\n private hasChannel(data: any): data is { channel: Channel } {\n return data?.channel?.id !== undefined;\n }\n\n // M\u00E9todo para criar uma inst\u00E2ncia de ChannelInstance\n private createChannelInstance(\n channelId: string,\n app: string,\n ): ChannelInstance {\n return this.channels.Channel({\n id: channelId,\n app,\n });\n }\n\n private handleWebSocketEvent(event: WebSocketEvent, app: string): void {\n console.log(\"Evento recebido no WebSocket:\", event.type, event);\n const { type, ...data } = event;\n\n if (this.hasChannel(data)) {\n const channelId = data.channel.id;\n\n if (channelId) {\n // Verifica se j\u00E1 existe uma inst\u00E2ncia de ChannelInstance\n if (!this.channelInstances.has(channelId)) {\n const channelInstance = this.createChannelInstance(channelId, app);\n this.channelInstances.set(channelId, channelInstance);\n }\n\n // Retorna apenas os dados do `Channel` para compatibilidade\n const channelInstance = this.channelInstances.get(channelId);\n if (channelInstance) {\n data.channel = { ...data.channel, ...channelInstance }; // Combina os dados do `Channel` com `ChannelInstance`\n }\n }\n }\n\n const listener = this.eventListeners.get(type);\n if (listener) {\n listener(data);\n }\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 /**\n * Connects to the ARI WebSocket for one or more applications.\n * Establishes a WebSocket connection for each app and subscribes to events.\n *\n * @param apps - Array of application names to connect to.\n * @param subscribedEvents - Optional array of events to subscribe to.\n * If not provided or empty, subscribes to all events.\n * @returns A Promise that resolves when all connections are established.\n */\n async connectWebSocket(\n apps: string[],\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void[]> {\n if (!Array.isArray(apps) || apps.length === 0) {\n throw new Error(\"\u00C9 necess\u00E1rio fornecer pelo menos um aplicativo.\");\n }\n\n // Remover duplicatas antes de processar\n const uniqueApps = [...new Set(apps)];\n\n return Promise.all(\n uniqueApps.map(async (app) => {\n if (this.wsClients.has(app)) {\n console.log(`Conex\u00E3o WebSocket para '${app}' j\u00E1 existe. Ignorando.`);\n return; // Reutiliza conex\u00E3o existente\n }\n\n await this.connectSingleWebSocket(app, subscribedEvents);\n }),\n );\n }\n\n /**\n * Establishes a single WebSocket connection for a given app.\n */\n private async connectSingleWebSocket(\n app: string,\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void> {\n if (!app) {\n throw new Error(\"O nome do aplicativo \u00E9 obrigat\u00F3rio.\");\n }\n\n // Evitar m\u00FAltiplas tentativas simult\u00E2neas para o mesmo app\n if (this.webSocketReady.get(app)) {\n console.log(`Conex\u00E3o WebSocket para '${app}' j\u00E1 est\u00E1 ativa.`);\n return this.webSocketReady.get(app)!;\n }\n\n const protocol = this.config.secure ? \"wss\" : \"ws\";\n const eventsParam =\n subscribedEvents && subscribedEvents.length > 0\n ? `&event=${subscribedEvents.join(\",\")}`\n : \"&subscribeAll=true\";\n const wsUrl = `${protocol}://${encodeURIComponent(\n this.config.username,\n )}:${encodeURIComponent(this.config.password)}@${\n this.config.host\n }:${this.config.port}/ari/events?app=${app}${eventsParam}`;\n\n // Configura\u00E7\u00E3o de backoff\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(\n `Tentativa ${attemptNumber} falhou para '${app}': ${error.message}`,\n );\n\n // Verifica se algum WebSocket no wsClients ainda n\u00E3o est\u00E1 conectado\n return (\n !this.wsClients.has(app) || !this.wsClients.get(app)?.isConnected()\n );\n },\n };\n\n // Promessa para gerenciar a conex\u00E3o\n const webSocketPromise = new Promise<void>(async (resolve, reject) => {\n try {\n if (this.isReconnecting.get(app)) {\n console.warn(`J\u00E1 est\u00E1 tentando reconectar para o app '${app}'.`);\n return;\n }\n\n this.isReconnecting.set(app, true);\n\n const wsClient = new WebSocketClient(wsUrl);\n wsClient.setMaxListeners(30);\n\n await backOff(async () => {\n if (!wsClient) {\n throw new Error(\"WebSocketClient instance is null.\");\n }\n\n await wsClient.connect();\n console.log(`WebSocket conectado para o app: ${app}`);\n\n // Integrar eventos do WebSocket\n this.integrateWebSocketEvents(app, wsClient);\n\n // Garante que o app est\u00E1 registrado\n await this.ensureAppRegistered(app);\n\n // Adiciona o WebSocket ao Map\n this.wsClients.set(app, wsClient);\n\n // Chamar processPendingListeners ap\u00F3s a conex\u00E3o\n this.processPendingListeners();\n }, backoffOptions);\n\n resolve(); // Conex\u00E3o bem-sucedida\n } catch (error) {\n console.error(`Erro ao conectar WebSocket para '${app}':`, error);\n reject(error);\n } finally {\n this.isReconnecting.delete(app);\n }\n });\n\n this.webSocketReady.set(app, webSocketPromise);\n return webSocketPromise;\n }\n\n /**\n * Integrates WebSocket events with playback listeners.\n */\n private integrateWebSocketEvents(\n app: string,\n wsClient: WebSocketClient,\n ): void {\n if (!wsClient) {\n throw new Error(\n `WebSocket client para o app '${app}' n\u00E3o est\u00E1 conectado.`,\n );\n }\n\n // Verifica se os eventos j\u00E1 foram registrados\n if (wsClient.listenerCount(\"PlaybackStarted\") > 0) {\n // console.log(`[${app}] Eventos j\u00E1 registrados. Ignorando.`);\n return; // Evita registrar eventos novamente\n }\n\n const eventHandlers: Partial<\n Record<WebSocketEventType, (data: WebSocketEvent) => void>\n > = {\n PlaybackStarted: (data) => {\n if (\"playbackId\" in data) {\n // console.log(`[${app}] PlaybackStarted:`, data);\n }\n },\n PlaybackFinished: (data) => {\n if (\"playbackId\" in data) {\n // console.log(`[${app}] PlaybackFinished:`, data);\n }\n },\n ChannelDtmfReceived: (data) => {\n if (data.type === \"ChannelDtmfReceived\" && \"digit\" in data) {\n // console.log(`[${app}] DTMF recebido: ${data.digit}`);\n } else {\n console.warn(\n `[${app}] Evento inesperado em ChannelDtmfReceived`,\n data,\n );\n }\n },\n ChannelStateChange: (data) => {\n if (\"channel\" in data) {\n // console.log(`[${app}] Estado do canal alterado:`, data.channel);\n }\n },\n };\n\n for (const [eventType, handler] of Object.entries(eventHandlers)) {\n if (handler) {\n wsClient.on(eventType as WebSocketEventType, handler);\n }\n }\n\n console.log(`[${app}] Todos os eventos do WebSocket foram registrados.`);\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 public logListeners(): void {\n this.wsClients.forEach((wsClient, app) => {\n console.log(`Listeners registrados para '${app}':`);\n wsClient.eventNames().forEach((event) => {\n const eventName = String(event); // Converte o nome do evento para string\n const count = wsClient.listenerCount(event);\n console.log(` Evento '${eventName}': ${count} listener(s)`);\n });\n });\n }\n\n /**\n * Checks if the WebSocket connection is active.\n *\n * @returns {boolean} True if connected, false otherwise.\n */\n anyWebSocketConnected(): boolean {\n // Verifica se todos os WebSockets em wsClients est\u00E3o conectados\n return Array.from(this.wsClients.values()).every((wsClient) =>\n wsClient.isConnected(),\n );\n }\n\n isWebSocketConnected(app: string): boolean {\n const wsClient = this.wsClients.get(app);\n return wsClient ? wsClient.isConnected() : false;\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(app: string): void {\n const wsClient = this.wsClients.get(app);\n if (wsClient) {\n wsClient.close();\n this.wsClients.delete(app); // Remove o WebSocket do Map\n console.log(`WebSocket para o app '${app}' foi fechado.`);\n } else {\n console.warn(`WebSocket para o app '${app}' n\u00E3o encontrado.`);\n }\n }\n\n closeAllWebSockets(): void {\n this.wsClients.forEach((wsClient, app) => {\n wsClient.close();\n console.log(`WebSocket para o app '${app}' foi fechado.`);\n });\n this.wsClients.clear(); // Limpa o Map\n console.log(\"Todos os WebSockets foram fechados.\");\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `ChannelInstance` para manipular canais localmente.\n *\n * @param channelId - O ID do canal, se dispon\u00EDvel. Caso contr\u00E1rio, a inst\u00E2ncia ser\u00E1 para um canal ainda n\u00E3o criado.\n * @param app\n * @returns Uma inst\u00E2ncia de `ChannelInstance` vinculada ao cliente atual.\n */\n Channel(channelId?: string, app?: string): ChannelInstance {\n if (!app) {\n throw new Error(\n \"O nome do aplicativo (app) \u00E9 obrigat\u00F3rio para criar um Channel.\",\n );\n }\n return this.channels.Channel({ id: channelId, app });\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance` para manipular playbacks.\n *\n * @param playbackId - O ID do playback, se dispon\u00EDvel. Caso contr\u00E1rio, a inst\u00E2ncia ser\u00E1 para um playback ainda n\u00E3o inicializado.\n * @param app\n * @returns Uma inst\u00E2ncia de `PlaybackInstance` vinculada ao cliente atual.\n */\n Playback(playbackId?: string, app?: string): PlaybackInstance {\n if (!app) {\n throw new Error(\n \"O nome do aplicativo (app) \u00E9 obrigat\u00F3rio para criar um Channel.\",\n );\n }\n return this.playbacks.Playback({ id: playbackId, app });\n }\n}\n", "import { EventEmitter } from \"events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport type { WebSocketEvent } from \"./interfaces\";\nimport type { WebSocketClient } from \"./websocketClient\";\n\nexport class BaseClient {\n private client: AxiosInstance;\n private eventEmitter = new EventEmitter();\n private wsClients: Map<string, WebSocketClient> = new Map(); // Gerencia os WebSocket clients\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 // Gerenciamento de WebSocket clients\n\n /**\n * Adiciona um WebSocket client ao gerenciador.\n * @param app - Nome do aplicativo ou contexto associado.\n * @param wsClient - Inst\u00E2ncia do WebSocketClient.\n */\n addWebSocketClient(app: string, wsClient: WebSocketClient): void {\n if (this.wsClients.has(app)) {\n throw new Error(`J\u00E1 existe um WebSocket client registrado para '${app}'`);\n }\n this.wsClients.set(app, wsClient);\n console.log(`WebSocket client adicionado para '${app}'`);\n }\n\n /**\n * Remove um WebSocket client do gerenciador.\n * @param app - Nome do aplicativo ou contexto associado.\n */\n removeWebSocketClient(app: string): void {\n if (!this.wsClients.has(app)) {\n throw new Error(`Nenhum WebSocket client encontrado para '${app}'`);\n }\n this.wsClients.delete(app);\n console.log(`WebSocket client removido para '${app}'`);\n }\n\n /**\n * Obt\u00E9m todos os WebSocket clients.\n * @returns Um Map contendo todos os WebSocket clients registrados.\n */\n getWebSocketClients(): Map<string, WebSocketClient> {\n return this.wsClients;\n }\n\n /**\n * Obt\u00E9m um WebSocket client espec\u00EDfico.\n * @param app - Nome do aplicativo ou contexto associado.\n * @returns O WebSocket client correspondente.\n */\n getWebSocketClient(app: string): WebSocketClient | undefined {\n return this.wsClients.get(app);\n }\n\n // Gerenciamento de eventos WebSocket\n\n onWebSocketEvent(callback: (event: WebSocketEvent) => void): void {\n console.log(\"Registrando callback para eventos do WebSocket\");\n this.eventEmitter.on(\"websocketEvent\", (event) => {\n console.log(\"Evento recebido no BaseClient:\", event);\n callback(event);\n });\n }\n\n emitWebSocketEvent(event: WebSocketEvent): void {\n console.log(\"Emitindo evento do WebSocket:\", event);\n this.eventEmitter.emit(\"websocketEvent\", event);\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 { EventEmitter } from \"events\";\nimport type { AriClient } from \"../ariClient\";\nimport 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 WebSocketEvent,\n} from \"../interfaces\";\nimport { isChannelEvent, toQueryParams } from \"../utils\";\nimport type { PlaybackInstance } from \"./playbacks\";\n\nexport class ChannelInstance extends EventEmitter {\n private channelData: Channel | null = null;\n public id: string; // ID do canal\n\n constructor(\n private client: AriClient,\n private baseClient: BaseClient,\n private channelId: string = `channel-${Date.now()}`, // Gera um ID padr\u00E3o se n\u00E3o fornecido\n private app: string, // Nome do aplicativo (app)\n ) {\n super();\n\n this.id = channelId || `channel-${Date.now()}`; // Inicializa o ID do canal\n\n const wsClients = this.client.getWebSocketClients();\n const wsClient = wsClients.get(this.app); // Busca o WebSocket espec\u00EDfico para o app\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para o canal: ${this.id}`,\n );\n }\n\n // Adiciona listeners escopados para este canal no WebSocket espec\u00EDfico do app\n wsClient.addScopedMessageListener(\n this.id,\n this.app,\n (event: WebSocketEvent) => {\n if (isChannelEvent(event, this.id)) {\n const channelEventType = event.type;\n this.emit(channelEventType, event); // Emite evento para o ChannelInstance\n }\n },\n );\n\n // Remove listeners escopados quando o \u00FAltimo listener for removido\n this.on(\"removeListener\", (eventName) => {\n if (\n this.eventNames().length === 0 ||\n this.listenerCount(eventName) === 0\n ) {\n wsClient.removeScopedMessageListeners(this.id, this.app);\n console.log(\n `Listeners escopados removidos para canal '${this.id}' no app '${this.app}'.`,\n );\n }\n });\n\n // Remove listeners escopados quando o \u00FAltimo listener for removido\n this.on(\"removeListener\", (eventName) => {\n if (\n this.eventNames().length === 0 ||\n this.listenerCount(eventName) === 0\n ) {\n wsClient.removeScopedMessageListeners(this.id, this.app);\n console.log(`Listeners escopados removidos para canal '${this.id}'.`);\n }\n });\n }\n\n /**\n * Adiciona um listener para eventos de canal.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n const scopedEvent = `${this.app}:Channel:${this.id}:${event}`;\n console.log({ metheod: \"on\", event, scopedEvent });\n\n // Verifica se j\u00E1 existe um listener para este evento escopado\n const existingListeners = wsClient.listeners(scopedEvent);\n if (existingListeners.includes(callback)) {\n console.warn(`Listener j\u00E1 registrado para o evento '${scopedEvent}'.`);\n return this; // N\u00E3o registra duplicatas\n }\n\n wsClient.on(scopedEvent, callback);\n return this;\n }\n\n /**\n * Adiciona um listener para ser chamado apenas uma vez.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n // Remover listeners existentes para o mesmo escopo, se necess\u00E1rio\n wsClient.removeWildcardListeners(this.id, event, \"Channel\");\n\n const scopedEvent = `${this.app}:Channel:${this.id}:${event}`;\n\n console.log({ metheod: \"once\", event, scopedEvent });\n\n // Verificar se j\u00E1 existe um listener para o evento escopado\n const existingListeners = wsClient.listeners(scopedEvent);\n if (existingListeners.some((listener) => listener === callback)) {\n console.warn(`Listener j\u00E1 registrado para o evento '${scopedEvent}'.`);\n return this; // N\u00E3o registra duplicatas\n }\n\n const listener = (data: WebSocketEvent) => {\n callback(data as Extract<WebSocketEvent, { type: T }>);\n wsClient.off(scopedEvent, listener); // Remove o listener ap\u00F3s execu\u00E7\u00E3o\n wsClient.removeWildcardListeners(this.id, event, \"Channel\");\n };\n\n wsClient.on(scopedEvent, listener);\n\n return this;\n }\n\n /**\n * Remove um listener espec\u00EDfico.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n const scopedEvent = `${this.app}:Channel:${this.id}:${event}`;\n wsClient.off(scopedEvent, callback);\n\n return this;\n }\n\n async answer(): Promise<void> {\n await this.baseClient.post<void>(`/channels/${this.id}/answer`);\n }\n\n /**\n * Origina um canal f\u00EDsico no Asterisk.\n */\n async originate(data: OriginateRequest): Promise<Channel> {\n if (this.channelData) {\n throw new Error(\"O canal j\u00E1 foi criado.\");\n }\n\n const channel = await this.baseClient.post<Channel>(\"/channels\", data);\n this.channelData = channel;\n\n return channel;\n }\n\n /**\n * Obt\u00E9m os detalhes do canal.\n */\n async getDetails(): Promise<Channel> {\n if (this.channelData) {\n return this.channelData;\n }\n\n if (!this.id) {\n throw new Error(\"Nenhum ID de canal associado a esta inst\u00E2ncia.\");\n }\n\n const details = await this.baseClient.get<Channel>(`/channels/${this.id}`);\n this.channelData = details; // Armazena os detalhes para evitar m\u00FAltiplas chamadas\n return details;\n }\n\n async getVariable(variable: string): Promise<ChannelVar> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n return this.baseClient.get<ChannelVar>(\n `/channels/${this.id}/variable?variable=${encodeURIComponent(variable)}`,\n );\n }\n\n /**\n * Encerra o canal, se ele j\u00E1 foi criado.\n */\n async hangup(): Promise<void> {\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails();\n }\n\n if (!this.channelData?.id) {\n throw new Error(\"N\u00E3o foi poss\u00EDvel inicializar o canal. ID inv\u00E1lido.\");\n }\n\n await this.baseClient.delete(`/channels/${this.channelData.id}`);\n }\n\n /**\n * Reproduz m\u00EDdia no canal.\n */\n async play(\n options: { media: string; lang?: string },\n playback?: PlaybackInstance,\n ): Promise<PlaybackInstance> {\n // Verifica se o canal foi inicializado\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails(); // Inicializa automaticamente\n }\n\n if (!playback) {\n playback = this.client.Playback();\n }\n\n if (!this.channelData?.id) {\n throw new Error(\"N\u00E3o foi poss\u00EDvel inicializar o canal. ID inv\u00E1lido.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playback.id}`,\n options,\n );\n\n return playback;\n }\n\n /**\n * Reproduz m\u00EDdia em um canal.\n */\n async playMedia(\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n if (!this.channelData) {\n throw new Error(\"O canal ainda n\u00E3o foi criado.\");\n }\n\n const queryParams = options\n ? `?${new URLSearchParams(options as Record<string, string>).toString()}`\n : \"\";\n\n return this.baseClient.post<ChannelPlayback>(\n `/channels/${this.channelData.id}/play${queryParams}`,\n { media },\n );\n }\n\n /**\n * Para a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async stopPlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/play/${playbackId}`,\n );\n }\n\n /**\n * Pausa a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async pausePlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Retoma a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async resumePlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Retrocede a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async rewindPlayback(playbackId: string, skipMs: number): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/rewind`,\n { skipMs },\n );\n }\n\n /**\n * Avan\u00E7a a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async fastForwardPlayback(playbackId: string, skipMs: number): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/forward`,\n { skipMs },\n );\n }\n\n /**\n * Muta o canal.\n */\n async muteChannel(direction: \"both\" | \"in\" | \"out\" = \"both\"): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Desmuta o canal.\n */\n async unmuteChannel(\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Coloca o canal em espera.\n */\n async holdChannel(): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(`/channels/${this.channelData.id}/hold`);\n }\n\n /**\n * Remove o canal da espera.\n */\n async unholdChannel(): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(`/channels/${this.channelData.id}/hold`);\n }\n}\n\nexport class Channels extends EventEmitter {\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {\n super();\n }\n\n Channel({ id, app }: { id?: string; app: string }): ChannelInstance {\n if (!app) {\n throw new Error(\n \"O nome do aplicativo (app) \u00E9 obrigat\u00F3rio para criar um Channel.\",\n );\n }\n return new ChannelInstance(this.client, this.baseClient, id, app);\n }\n\n /**\n * Origina um canal f\u00EDsico diretamente, sem uma inst\u00E2ncia de `ChannelInstance`.\n */\n async originate(data: OriginateRequest): Promise<Channel> {\n return this.baseClient.post<Channel>(\"/channels\", data);\n }\n\n /**\n * Obt\u00E9m detalhes de um canal espec\u00EDfico.\n */\n async getDetails(channelId: string): Promise<Channel> {\n return this.baseClient.get<Channel>(`/channels/${channelId}`);\n }\n\n /**\n * Lista todos os canais ativos.\n */\n async list(): Promise<Channel[]> {\n const channels = await this.baseClient.get<unknown>(\"/channels\");\n if (!Array.isArray(channels)) {\n throw new Error(\"Resposta da API /channels n\u00E3o \u00E9 um array.\");\n }\n return channels as Channel[];\n }\n\n /**\n * Encerra um canal espec\u00EDfico.\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.baseClient.delete<void>(\n `/channels/${channelId}?${queryParams.toString()}`,\n );\n }\n\n /**\n * Inicia a escuta em um canal.\n */\n async snoopChannel(\n channelId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/snoop?${queryParams}`,\n );\n }\n\n async startSilence(channelId: string): Promise<void> {\n return this.baseClient.post<void>(`/channels/${channelId}/silence`);\n }\n\n async stopSilence(channelId: string): Promise<void> {\n return this.baseClient.delete<void>(`/channels/${channelId}/silence`);\n }\n\n async getRTPStatistics(channelId: string): Promise<RTPStats> {\n return this.baseClient.get<RTPStats>(\n `/channels/${channelId}/rtp_statistics`,\n );\n }\n\n async createExternalMedia(options: ExternalMediaOptions): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/externalMedia?${queryParams}`,\n );\n }\n\n async playWithId(\n channelId: string,\n playbackId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n const queryParams = options ? `?${toQueryParams(options)}` : \"\";\n return this.baseClient.post<ChannelPlayback>(\n `/channels/${channelId}/play/${playbackId}${queryParams}`,\n { media },\n );\n }\n\n async snoopChannelWithId(\n channelId: string,\n snoopId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/snoop/${snoopId}?${queryParams}`,\n );\n }\n\n async startMohWithClass(channelId: string, mohClass: string): Promise<void> {\n const queryParams = `mohClass=${encodeURIComponent(mohClass)}`;\n await this.baseClient.post<void>(\n `/channels/${channelId}/moh?${queryParams}`,\n );\n }\n\n async getChannelVariable(\n channelId: string,\n variable: string,\n ): Promise<ChannelVar> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n return this.baseClient.get<ChannelVar>(\n `/channels/${channelId}/variable?variable=${encodeURIComponent(variable)}`,\n );\n }\n\n async setChannelVariable(\n channelId: string,\n variable: string,\n value?: string,\n ): Promise<void> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n const queryParams = new URLSearchParams({\n variable,\n ...(value && { value }),\n });\n await this.baseClient.post<void>(\n `/channels/${channelId}/variable?${queryParams}`,\n );\n }\n\n async moveToApplication(\n channelId: string,\n app: string,\n appArgs?: string,\n ): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/move`, {\n app,\n appArgs,\n });\n }\n\n async continueDialplan(\n channelId: string,\n context?: string,\n extension?: string,\n priority?: number,\n label?: string,\n ): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/continue`, {\n context,\n extension,\n priority,\n label,\n });\n }\n\n async stopMusicOnHold(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/moh`);\n }\n\n async startMusicOnHold(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/moh`);\n }\n\n async record(channelId: string, options: RecordingOptions): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/record?${queryParams}`,\n );\n }\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 await this.baseClient.post<void>(\n `/channels/${channelId}/dial?${queryParams}`,\n );\n }\n\n async redirectChannel(channelId: string, endpoint: string): Promise<void> {\n await this.baseClient.post<void>(\n `/channels/${channelId}/redirect?endpoint=${encodeURIComponent(endpoint)}`,\n );\n }\n\n async answerChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/answer`);\n }\n\n async ringChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/ring`);\n }\n\n async stopRingChannel(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/ring`);\n }\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 = toQueryParams({ dtmf, ...options });\n await this.baseClient.post<void>(\n `/channels/${channelId}/dtmf?${queryParams}`,\n );\n }\n\n async muteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n await this.baseClient.post<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n async unmuteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n await this.baseClient.delete<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n async holdChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/hold`);\n }\n\n async unholdChannel(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/hold`);\n }\n\n async createChannel(data: OriginateRequest): Promise<Channel> {\n return this.baseClient.post<Channel>(\"/channels/create\", data);\n }\n\n async originateWithId(\n channelId: string,\n data: OriginateRequest,\n ): Promise<Channel> {\n return this.baseClient.post<Channel>(`/channels/${channelId}`, data);\n }\n}\n", "import type { Channel, Playback, WebSocketEvent } from \"./interfaces\";\n\nexport function 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, value as string]),\n ).toString();\n}\n\nexport function isPlaybackEvent(\n event: WebSocketEvent,\n playbackId?: string,\n): event is Extract<WebSocketEvent, { playbackId: string }> {\n const hasPlayback = \"playback\" in event && event.playback?.id !== undefined;\n return hasPlayback && (!playbackId || event.playback?.id === playbackId);\n}\n\n/**\n * Verifica se um evento pertence a um canal e opcionalmente valida o ID do canal.\n * @param event O evento WebSocket a ser validado.\n * @param channelId Opcional. O ID do canal a ser validado.\n * @returns Verdadeiro se o evento \u00E9 relacionado a um canal (e ao ID, se fornecido).\n */\nexport function isChannelEvent(\n event: WebSocketEvent,\n channelId?: string,\n): event is Extract<WebSocketEvent, { channel: Channel }> {\n // Verifica se o evento tem a propriedade `channel`\n const hasChannel = \"channel\" in event && event.channel?.id !== undefined;\n\n return hasChannel && (!channelId || event.channel?.id === channelId);\n}\n\nexport const channelEvents = [\n \"ChannelCreated\",\n \"ChannelDestroyed\",\n \"ChannelEnteredBridge\",\n \"ChannelLeftBridge\",\n \"ChannelStateChange\",\n \"ChannelDtmfReceived\",\n \"ChannelDialplan\",\n \"ChannelCallerId\",\n \"ChannelUserevent\",\n \"ChannelHangupRequest\",\n \"ChannelVarset\",\n \"ChannelTalkingStarted\",\n \"ChannelTalkingFinished\",\n \"ChannelHold\",\n \"ChannelUnhold\",\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 { AriClient } from \"../ariClient\";\nimport type { BaseClient } from \"../baseClient.js\";\nimport type { Playback, WebSocketEvent } from \"../interfaces\";\nimport { isPlaybackEvent } from \"../utils\";\n\nexport class PlaybackInstance extends EventEmitter {\n private playbackData: Playback | null = null;\n public id: string; // Garantimos que o ID esteja dispon\u00EDvel\n\n constructor(\n private client: AriClient,\n private baseClient: BaseClient,\n private playbackId: string = `playback-${Date.now()}`, // Gera um ID padr\u00E3o se n\u00E3o fornecido\n private app: string, // Nome do aplicativo (app)\n ) {\n super();\n this.id = playbackId || `playback-${Date.now()}`; // Inicializa o ID do playback\n\n const wsClients = this.client.getWebSocketClients();\n const wsClient = Array.from(wsClients.values()).find((client) =>\n client.isConnected(),\n );\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para o playback: ${this.id}`,\n );\n }\n\n try {\n wsClient.addScopedMessageListener(\n this.id,\n this.app,\n (event: WebSocketEvent) => {\n if (isPlaybackEvent(event, this.id)) {\n const playbackEventType = event.type;\n this.emit(playbackEventType, event); // Emite evento para o PlaybackInstance\n }\n },\n );\n } catch (error) {\n console.error(\n `Erro ao adicionar listener escopado para playback '${this.id}':`,\n error,\n );\n throw error;\n }\n\n // Remove listeners escopados quando o \u00FAltimo listener for removido\n this.on(\"removeListener\", (eventName) => {\n if (\n this.eventNames().length === 0 ||\n this.listenerCount(eventName) === 0\n ) {\n wsClient.removeScopedMessageListeners(this.id, this.app);\n console.log(\n `Listeners escopados removidos para playback '${this.id}'.`,\n );\n }\n });\n }\n\n /**\n * Adiciona um listener para eventos de playback.\n */\n /**\n * Adiciona um listener para eventos de playback.\n */\n /**\n * Adiciona um listener para eventos de playback.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n const scopedEvent = `${this.app}:Playback:${this.id}:${event}`;\n console.log({ metheod: \"on\", event, scopedEvent });\n\n // Verificar se j\u00E1 existe um listener para o evento escopado\n const existingListeners = wsClient.listeners(scopedEvent);\n if (existingListeners.some((listener) => listener === callback)) {\n console.warn(`Listener j\u00E1 registrado para o evento '${scopedEvent}'.`);\n return this; // N\u00E3o registra duplicatas\n }\n\n wsClient.on(scopedEvent, callback as (data: WebSocketEvent) => void);\n\n return this;\n }\n\n /**\n * Adiciona um listener para ser chamado apenas uma vez.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n // Remove listeners duplicados com base no padr\u00E3o\n wsClient.removeWildcardListeners(this.id, event, \"Playback\");\n\n const scopedEvent = `${this.app}:Playback:${this.id}:${event}`;\n\n console.log({ metheod: \"once\", event, scopedEvent });\n\n // Verificar se j\u00E1 existe um listener para o evento escopado\n const existingListeners = wsClient.listeners(scopedEvent);\n if (existingListeners.some((listener) => listener === callback)) {\n console.warn(`Listener j\u00E1 registrado para o evento '${scopedEvent}'.`);\n return this; // N\u00E3o registra duplicatas\n }\n\n const listener = (data: WebSocketEvent) => {\n callback(data as Extract<WebSocketEvent, { type: T }>);\n wsClient.off(scopedEvent, listener); // Remove o listener ap\u00F3s execu\u00E7\u00E3o\n wsClient.removeWildcardListeners(this.id, event, \"Playback\");\n };\n\n wsClient.on(scopedEvent, listener);\n\n return this;\n }\n\n /**\n * Remove um listener espec\u00EDfico.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n const wsClient = this.client.getWebSocketClients().get(this.app);\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para '${this.app}'.`,\n );\n }\n\n const scopedEvent = `${this.app}:Playback:${this.id}:${event}`;\n wsClient.off(scopedEvent, callback as (data: WebSocketEvent) => void);\n\n return this;\n }\n\n /**\n * Obt\u00E9m os detalhes do playback.\n */\n async getDetails(): Promise<Playback> {\n if (!this.id && !this.playbackData) {\n throw new Error(\"Nenhum playback associado a esta inst\u00E2ncia.\");\n }\n\n console.log({\n message: \"NPM\",\n id: `/playbacks/${this.id}`,\n data: this.playbackData,\n });\n\n const details = await this.baseClient.get<Playback>(\n `/playbacks/${this.id}`,\n );\n this.playbackData = details;\n return details;\n }\n\n /**\n * Controla o playback.\n */\n async control(\n operation: \"pause\" | \"unpause\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado para controlar.\");\n }\n\n await this.baseClient.post<void>(\n `/playbacks/${this.id}/control?operation=${operation}`,\n );\n }\n\n async stop(): Promise<void> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado para encerrar.\");\n }\n\n try {\n await this.baseClient.delete<void>(`/playbacks/${this.id}`);\n console.log(`Playback '${this.id}' parado com sucesso.`);\n } catch (error: any) {\n if (error.response?.status === 404) {\n console.warn(\n `Playback '${this.id}' n\u00E3o encontrado para encerrar (404).`,\n );\n // Voc\u00EA pode decidir n\u00E3o lan\u00E7ar o erro, j\u00E1 que o playback n\u00E3o existe mais\n return;\n }\n\n // Repassa outros erros\n console.error(\n `Erro ao encerrar o playback '${this.id}':`,\n error.message || error,\n );\n throw error; // Repassa o erro caso n\u00E3o seja tratado\n }\n }\n}\n\nexport class Playbacks extends EventEmitter {\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {\n super();\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance`.\n */\n Playback({ id, app }: { id?: string; app: string }): PlaybackInstance {\n if (!app) {\n throw new Error(\n \"O nome do aplicativo (app) \u00E9 obrigat\u00F3rio para criar um Channel.\",\n );\n }\n const playbackId = id || `playback-${Date.now()}`;\n return new PlaybackInstance(this.client, this.baseClient, playbackId, app);\n }\n\n /**\n * Obt\u00E9m os clientes WebSocket dispon\u00EDveis.\n */\n getWebSocketClients() {\n return this.client.getWebSocketClients();\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.baseClient.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\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n await this.baseClient.post<void>(\n `/playbacks/${playbackId}/control?operation=${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 try {\n await this.baseClient.delete<void>(`/playbacks/${playbackId}`);\n console.log(`Playback '${playbackId}' parado com sucesso.`);\n } catch (error: any) {\n if (error.response?.status === 404) {\n console.warn(\n `Playback '${playbackId}' n\u00E3o encontrado para encerrar (404).`,\n );\n // Voc\u00EA pode decidir n\u00E3o lan\u00E7ar o erro, j\u00E1 que o playback n\u00E3o existe mais\n return;\n }\n\n // Repassa outros erros\n console.error(\n `Erro ao encerrar o playback '${playbackId}':`,\n error.message || error,\n );\n throw error; // Repassa o erro caso n\u00E3o seja tratado\n }\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", "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 { type IBackOffOptions, backOff } from \"exponential-backoff\";\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 private messageListeners: ((data: any) => void)[] = [];\n maxReconnectAttempts = 30;\n private reconnectAttempts = 0; // Para gerenciar tentativas de reconex\u00E3o\n private scopedListeners: Map<string, (data: WebSocketEvent) => void> =\n new Map();\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 private async reconnect(): Promise<void> {\n console.log(\"Iniciando processo de reconex\u00E3o...\");\n\n const backoffOptions: IBackOffOptions = {\n delayFirstAttempt: false,\n startingDelay: 1000, // 1 segundo inicial\n timeMultiple: 2, // Multiplicador exponencial\n maxDelay: 30000, // 30 segundos de atraso m\u00E1ximo\n numOfAttempts: this.maxReconnectAttempts, // Limite de tentativas\n jitter: \"full\",\n retry: (error: any, attemptNumber: number) => {\n console.warn(\n `Tentativa ${attemptNumber} de reconex\u00E3o falhou: ${error.message}`,\n );\n return !this.isClosedManually; // Tenta novamente apenas se o WebSocket n\u00E3o foi fechado manualmente\n },\n };\n\n try {\n await backOff(async () => {\n console.log(`Tentando reconectar (#${this.reconnectAttempts + 1})...`);\n await this.connect(); // Tenta reconectar\n console.log(\"Reconex\u00E3o bem-sucedida.\");\n }, backoffOptions);\n\n // Reconex\u00E3o bem-sucedida, reseta o estado\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n } catch (error) {\n console.error(\n `Reconex\u00E3o falhou ap\u00F3s ${this.maxReconnectAttempts} tentativas.`,\n error,\n );\n this.isReconnecting = false; // Garante que o estado seja atualizado mesmo em falha\n }\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; // Impede 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 this.reconnectAttempts = 0; // Resetar tentativas ap\u00F3s sucesso\n console.log(\n `Listeners ativos para 'message': ${this.listenerCount(\"message\")}`,\n );\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.emit(\"close\", { code, reason });\n\n if (!this.isClosedManually) {\n this.reconnect(); // Tenta reconectar se n\u00E3o foi fechado manualmente\n }\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 onMessage(callback: (data: any) => void): void {\n if (!this.messageListeners.includes(callback)) {\n this.messageListeners.push(callback);\n this.on(\"message\", callback); // Registra no evento gen\u00E9rico\n } else {\n console.warn(\"Tentativa de registrar listener duplicado para 'message'.\");\n }\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 string>(event: T, callback: (data: any) => void): this {\n // Verifica se o listener para 'message' j\u00E1 existe\n if (event === \"message\") {\n const existingListeners = this.listeners(event);\n const isDuplicate = existingListeners.includes(callback);\n\n console.log(`Registrando listener para o evento '${event}'.`);\n console.log(\n `Antes: ${existingListeners.length} listener(s) para o evento '${event}'.`,\n );\n\n if (isDuplicate) {\n console.warn(\n `Listener duplicado detectado para '${event}'. Ignorando.`,\n );\n return this; // Evita duplicatas\n }\n }\n\n super.on(event, callback);\n\n // Logs detalhados ap\u00F3s registro\n if (event === \"message\") {\n console.log(\n `Depois: ${this.listenerCount(event)} listener(s) para o evento '${event}'.`,\n );\n }\n\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 /**\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 string>(event: T, callback: (data: any) => void): this {\n const existingListeners = this.listeners(event);\n\n console.log(\n `Removendo listener para o evento '${event}'. Total antes: ${existingListeners.length}`,\n );\n\n if (!existingListeners.includes(callback)) {\n console.warn(\n `Listener n\u00E3o encontrado para o evento '${event}'. Nenhuma a\u00E7\u00E3o tomada.`,\n );\n return this;\n }\n\n super.off(event, callback);\n\n console.log(\n `Listener para o evento '${event}' removido. Total agora: ${this.listenerCount(event)}`,\n );\n\n return this;\n }\n\n removeWildcardListeners(\n id: string,\n event: string,\n type: \"Channel\" | \"Playback\",\n ): void {\n console.log(\n `Removendo listeners para '${type}:${id}:${event}' com wildcard no app`,\n );\n\n // Itera sobre todos os eventos registrados no WebSocketClient\n for (const eventName of this.eventNames()) {\n if (typeof eventName === \"string\") {\n const eventString = String(eventName); // Garante que \u00E9 string\n\n if (eventString.includes(`:${type}:${id}:${event}`)) {\n console.log(`Removendo listener para o evento: ${eventString}`);\n\n // Remove todos os listeners associados ao evento espec\u00EDfico\n this.removeAllListeners(eventName);\n }\n }\n }\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 * Adiciona um listener escopado ao evento \"message\".\n * @param instanceId - Identificador \u00FAnico da inst\u00E2ncia que est\u00E1 registrando o listener.\n * @param app\n * @param callback - Fun\u00E7\u00E3o de callback para o evento.\n */\n addScopedMessageListener(\n instanceId: string,\n app: string,\n callback: (data: WebSocketEvent) => void,\n ): void {\n const key = `${app}:${instanceId}`;\n if (this.scopedListeners.has(key)) {\n console.warn(\n `Listener escopado para a inst\u00E2ncia '${key}' j\u00E1 existe. Ignorando.`,\n );\n return;\n }\n\n const scopedListener = (data: WebSocketEvent) => {\n try {\n if (\n data.application === app &&\n ((data.type.startsWith(\"Channel\") &&\n \"channel\" in data &&\n data.channel?.id === instanceId) ||\n (data.type.startsWith(\"Playback\") &&\n \"playbackId\" in data &&\n data.playbackId === instanceId))\n ) {\n console.log(\n `Listener escopado ativado para inst\u00E2ncia '${instanceId}' no app '${app}'.`,\n );\n callback(data);\n }\n } catch (error) {\n console.error(\n `Erro no listener escopado para inst\u00E2ncia '${instanceId}' no app '${app}':`,\n error,\n );\n }\n };\n\n this.scopedListeners.set(key, scopedListener);\n this.on(\"message\", scopedListener);\n console.log(\n `Listener escopado adicionado para a inst\u00E2ncia '${instanceId}' no app '${app}'. Total de listeners: ${this.listenerCount(\n \"message\",\n )}`,\n );\n }\n\n /**\n * Remove todos os listeners associados a uma inst\u00E2ncia espec\u00EDfica.\n * @param instanceId - Identificador da inst\u00E2ncia cujos listeners ser\u00E3o removidos.\n * @param app\n */\n removeScopedMessageListeners(instanceId: string, app: string): void {\n const key = `${app}:${instanceId}`;\n if (!this.scopedListeners.has(key)) {\n console.warn(`Nenhum listener encontrado para a inst\u00E2ncia '${key}'.`);\n return;\n }\n\n const scopedListener = this.scopedListeners.get(key);\n if (scopedListener) {\n this.off(\"message\", scopedListener);\n this.scopedListeners.delete(key);\n console.log(\n `Listeners removidos para a inst\u00E2ncia '${key}'. Total de listeners restantes: ${this.listenerCount(\n \"message\",\n )}`,\n );\n } else {\n console.warn(`Listener j\u00E1 foi removido para a inst\u00E2ncia '${key}'.`);\n }\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\n if (decodedData?.type && decodedData?.application) {\n const scopedEvent = `${decodedData.application}:${decodedData.type}`;\n\n // Determinar o escopo com base no tipo de evento\n if (\"channel\" in decodedData && decodedData.channel?.id) {\n const channelScopedEvent = `${decodedData.application}:Channel:${decodedData.channel.id}:${decodedData.type}`;\n this.emit(channelScopedEvent, decodedData); // Emitir evento para o escopo do canal\n } else if (\"playback\" in decodedData && decodedData.playback?.id) {\n const playbackScopedEvent = `${decodedData.application}:Playback:${decodedData.playback.id}:${decodedData.type}`;\n this.emit(playbackScopedEvent, decodedData); // Emitir evento para o escopo do playback\n }\n\n // Emitir evento geral para a aplica\u00E7\u00E3o\n this.emit(scopedEvent, decodedData);\n } else {\n console.warn(\n \"Mensagem recebida sem tipo ou aplica\u00E7\u00E3o v\u00E1lida:\",\n decodedData,\n );\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 this.ws = null;\n\n // Remove todos os listeners do evento 'message'\n this.removeAllListeners(\"message\");\n\n console.log(\n \"WebSocket fechado manualmente e listeners para 'message' limpos.\",\n );\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["exports", "exports", "exports", "exports", "Delay", "exports", "SkipFirstDelay", "exports", "AlwaysDelay", "exports", "exports", "backOff", "exports", "BackOff", "import_exponential_backoff", "axios", "import_events", "toQueryParams", "listener", "toQueryParams", "import_events", "client", "listener", "import_events", "WebSocket", "channelInstance"]
|
|
7
7
|
}
|