@ipcom/asterisk-ari 0.0.137 → 0.0.139

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.
@@ -803,6 +803,9 @@ var Asterisk = class {
803
803
  constructor(client) {
804
804
  this.client = client;
805
805
  }
806
+ async ping() {
807
+ return this.client.get("/asterisk/ping");
808
+ }
806
809
  /**
807
810
  * Retrieves information about the Asterisk server.
808
811
  */
@@ -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/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", "../../node_modules/uuid/dist/esm/stringify.js", "../../node_modules/uuid/dist/esm/rng.js", "../../node_modules/uuid/dist/esm/native.js", "../../node_modules/uuid/dist/esm/v4.js", "../../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", "../../src/ari-client/ariClient.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 axios, { type AxiosInstance, type AxiosRequestConfig } from \"axios\";\n\nexport class BaseClient {\n private client: AxiosInstance;\n\n constructor(\n private baseUrl: string,\n private username: string,\n private password: string,\n timeout = 5000, // Timeout configur\u00E1vel\n ) {\n if (!/^https?:\\/\\/.+/.test(baseUrl)) {\n throw new Error(\n \"Invalid base URL. It must start with http:// or https://\",\n );\n }\n\n this.client = axios.create({\n baseURL: baseUrl,\n auth: { username, password },\n timeout,\n });\n\n // Interceptores\n this.addInterceptors();\n }\n\n public getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Retorna as credenciais configuradas.\n */\n public getCredentials(): {\n baseUrl: string;\n username: string;\n password: string;\n } {\n return {\n baseUrl: this.baseUrl,\n username: this.username,\n password: this.password,\n };\n }\n\n /**\n * Adds interceptors to the Axios instance.\n */\n private addInterceptors(): void {\n // Interceptor para registrar requisi\u00E7\u00F5es\n this.client.interceptors.request.use(\n (config) => {\n // Pode adicionar logs ou metadados aqui, se necess\u00E1rio\n return config;\n },\n (error) => {\n console.error(\"[Request Error]\", error.message); // Log opcional\n return Promise.reject(error);\n },\n );\n\n // Interceptor para tratar respostas e erros\n this.client.interceptors.response.use(\n (response) => response,\n (error) => {\n const status = error.response?.status;\n const message =\n error.response?.data?.message || error.message || \"Unknown error\";\n\n const errorDetails = {\n status,\n message,\n url: error.config?.url || \"Unknown URL\",\n method: error.config?.method?.toUpperCase() || \"Unknown Method\",\n };\n\n if (status === 404) {\n console.warn(`[404] Not Found: ${errorDetails.url}`);\n } else if (status >= 500) {\n console.error(`[500] Server Error: ${errorDetails.url}`);\n } else {\n console.warn(\n `[Response Error] ${errorDetails.method} ${errorDetails.url}: ${message}`,\n );\n }\n\n // Cria um erro controlado com os detalhes\n return Promise.reject(\n new Error(\n `[Error] ${errorDetails.method} ${errorDetails.url} - ${message} (Status: ${status})`,\n ),\n );\n },\n );\n }\n\n /**\n * Executes a GET request.\n * @param path - The API endpoint path.\n * @param config - Optional Axios request configuration.\n */\n async get<T>(path: string, config?: AxiosRequestConfig): Promise<T> {\n try {\n const response = await this.client.get<T>(path, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\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 * @param config - Optional Axios request configuration.\n */\n async post<T>(\n path: string,\n data?: Record<string, any>,\n config?: AxiosRequestConfig,\n ): Promise<T> {\n try {\n const response = await this.client.post<T>(path, data, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\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 * @param config - Optional Axios request configuration.\n */\n async put<T>(\n path: string,\n data: Record<string, any>,\n config?: AxiosRequestConfig,\n ): Promise<T> {\n try {\n const response = await this.client.put<T>(path, data, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\n }\n\n /**\n * Executes a DELETE request.\n * @param path - The API endpoint path.\n * @param config - Optional Axios request configuration.\n */\n async delete<T>(path: string, config?: AxiosRequestConfig): Promise<T> {\n try {\n const response = await this.client.delete<T>(path, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\n }\n\n /**\n * Handles errors for HTTP requests.\n * @param error - The error to handle.\n */\n private handleRequestError(error: any): never {\n if (axios.isAxiosError(error)) {\n // Erros provenientes do Axios\n console.error(`[HTTP Error] ${error.message}`);\n throw new Error(error.message || \"HTTP Error\");\n } else {\n // Outros erros n\u00E3o relacionados ao Axios\n console.error(`[Unexpected Error] ${error}`);\n throw error;\n }\n }\n\n /**\n * Sets custom headers for the client instance.\n * Useful for adding dynamic tokens or specific API headers.\n * @param headers - Headers to merge with existing configuration.\n */\n setHeaders(headers: Record<string, string>): void {\n this.client.defaults.headers.common = {\n ...this.client.defaults.headers.common,\n ...headers,\n };\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 get(): 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 list(): 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 manage(\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 { v4 as uuidv4 } from \"uuid\";\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 { toQueryParams } from \"../utils\";\nimport type { PlaybackInstance } from \"./playbacks\";\n\nexport class ChannelInstance {\n private eventEmitter = new 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 ) {\n this.id = channelId || `channel-${Date.now()}`; // Inicializa o ID do canal\n }\n\n /**\n * Registra um listener para eventos espec\u00EDficos deste canal.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"channel\" in data && data.channel?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.on(event, wrappedListener);\n }\n\n /**\n * Registra um listener \u00FAnico para eventos espec\u00EDficos deste canal.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"channel\" in data && data.channel?.id === this.id) {\n // Garante que o evento \u00E9 para este canal\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n\n this.eventEmitter.once(event, wrappedListener);\n }\n\n /**\n * Remove um listener para eventos espec\u00EDficos deste canal.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener?: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (listener) {\n this.eventEmitter.off(event, listener);\n } else {\n // Remove todos os listeners associados ao evento para este canal\n const listeners = this.eventEmitter.listeners(event) as Array<\n (...args: any[]) => void\n >;\n\n listeners.forEach((fn) => {\n this.eventEmitter.off(event, fn);\n });\n }\n }\n\n /**\n * Obt\u00E9m a quantidade de listeners registrados para o evento especificado.\n */\n getListenerCount(event: string): number {\n return this.eventEmitter.listenerCount(event);\n }\n\n /**\n * Emite eventos internamente para o canal.\n * Verifica o ID do canal antes de emitir.\n */\n emitEvent(event: WebSocketEvent): void {\n if (\"channel\" in event && event.channel?.id === this.id) {\n this.eventEmitter.emit(event.type, event);\n }\n }\n\n /**\n * Remove todos os listeners para este canal.\n */\n removeAllListeners(): void {\n console.log(`Removendo todos os listeners para o canal ${this.id}`);\n this.eventEmitter.removeAllListeners();\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 playbackId?: string,\n ): Promise<PlaybackInstance> {\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails();\n }\n\n const playback = this.client.Playback(playbackId || uuidv4());\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 {\n private channelInstances = new Map<string, ChannelInstance>();\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {}\n\n Channel({ id }: { id?: string }): ChannelInstance {\n if (!id) {\n const instance = new ChannelInstance(this.client, this.baseClient);\n this.channelInstances.set(instance.id, instance);\n return instance;\n }\n\n if (!this.channelInstances.has(id)) {\n const instance = new ChannelInstance(this.client, this.baseClient, id);\n this.channelInstances.set(id, instance);\n return instance;\n }\n\n return this.channelInstances.get(id)!;\n }\n\n /**\n * Remove uma inst\u00E2ncia de canal.\n */\n removeChannelInstance(channelId: string): void {\n if (this.channelInstances.has(channelId)) {\n const instance = this.channelInstances.get(channelId);\n instance?.removeAllListeners();\n this.channelInstances.delete(channelId);\n console.log(`Inst\u00E2ncia do canal ${channelId} removida.`);\n } else {\n console.warn(\n `Tentativa de remover uma inst\u00E2ncia inexistente: ${channelId}`,\n );\n }\n }\n\n /**\n * Propaga eventos do WebSocket para o canal correspondente.\n */\n propagateEventToChannel(event: WebSocketEvent): void {\n if (\"channel\" in event && event.channel?.id) {\n const instance = this.channelInstances.get(event.channel.id);\n if (instance) {\n instance.emitEvent(event);\n } else {\n console.warn(\n `Nenhuma inst\u00E2ncia encontrada para o canal ${event.channel.id}`,\n );\n }\n }\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 validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n", "import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n", "import { randomUUID } from 'crypto';\nexport default { randomUUID };\n", "import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random || (options.rng || rng)();\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\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\";\n\nexport class PlaybackInstance {\n private eventEmitter = new EventEmitter();\n private playbackData: Playback | null = null;\n public id: string;\n\n constructor(\n private client: AriClient,\n private baseClient: BaseClient,\n private playbackId: string = `playback-${Date.now()}`,\n ) {\n this.id = playbackId;\n }\n\n /**\n * Registra um listener para eventos espec\u00EDficos deste playback.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"playback\" in data && data.playback?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.on(event, wrappedListener);\n }\n\n /**\n * Registra um listener \u00FAnico para eventos espec\u00EDficos deste playback.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"playback\" in data && data.playback?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.once(event, wrappedListener);\n }\n\n /**\n * Remove um listener para eventos espec\u00EDficos deste playback.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener?: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (listener) {\n this.eventEmitter.off(event, listener);\n } else {\n this.eventEmitter.removeAllListeners(event);\n }\n }\n\n /**\n * Emite eventos internamente para o playback.\n */\n emitEvent(event: WebSocketEvent): void {\n if (\"playback\" in event && event.playback?.id === this.id) {\n this.eventEmitter.emit(event.type, event);\n }\n }\n\n /**\n * Obt\u00E9m os detalhes do playback.\n */\n async get(): Promise<Playback> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado a esta inst\u00E2ncia.\");\n }\n\n this.playbackData = await this.baseClient.get<Playback>(\n `/playbacks/${this.id}`,\n );\n return this.playbackData;\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 /**\n * Encerra o playback.\n */\n async stop(): Promise<void> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado para encerrar.\");\n }\n\n await this.baseClient.delete<void>(`/playbacks/${this.id}`);\n }\n\n /**\n * Remove todos os listeners para este playback.\n */\n removeAllListeners(): void {\n this.eventEmitter.removeAllListeners();\n }\n}\n\nexport class Playbacks {\n private playbackInstances = new Map<string, PlaybackInstance>();\n\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {}\n\n /**\n * Gerencia inst\u00E2ncias de playback.\n */\n Playback({ id }: { id?: string }): PlaybackInstance {\n if (!id) {\n const instance = new PlaybackInstance(this.client, this.baseClient);\n this.playbackInstances.set(instance.id, instance);\n return instance;\n }\n\n if (!this.playbackInstances.has(id)) {\n const instance = new PlaybackInstance(this.client, this.baseClient, id);\n this.playbackInstances.set(id, instance);\n return instance;\n }\n\n return this.playbackInstances.get(id)!;\n }\n\n /**\n * Remove uma inst\u00E2ncia de playback.\n */\n removePlaybackInstance(playbackId: string): void {\n if (this.playbackInstances.has(playbackId)) {\n const instance = this.playbackInstances.get(playbackId);\n instance?.removeAllListeners();\n this.playbackInstances.delete(playbackId);\n }\n }\n\n /**\n * Propaga eventos do WebSocket para o playback correspondente.\n */\n propagateEventToPlayback(event: WebSocketEvent): void {\n if (\"playback\" in event && event.playback?.id) {\n const instance = this.playbackInstances.get(event.playback.id);\n if (instance) {\n instance.emitEvent(event);\n }\n }\n }\n\n /**\n * Obt\u00E9m detalhes de um playback espec\u00EDfico.\n */\n async getDetails(playbackId: string): Promise<Playback> {\n return this.baseClient.get<Playback>(`/playbacks/${playbackId}`);\n }\n\n /**\n * Controla um playback espec\u00EDfico.\n */\n async control(\n playbackId: string,\n operation: \"pause\" | \"unpause\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n const playback = this.Playback({ id: playbackId });\n await playback.control(operation);\n }\n\n /**\n * Encerra um playback espec\u00EDfico.\n */\n async stop(playbackId: string): Promise<void> {\n const playback = this.Playback({ id: playbackId });\n await playback.stop();\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { Sound, SoundListRequest } from \"../interfaces/sounds.types.js\";\n\nexport class Sounds {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all available sounds.\n *\n * @param params - Optional parameters to filter the list of sounds.\n * @returns A promise that resolves to an array of Sound objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(params?: SoundListRequest): Promise<Sound[]> {\n const query = params\n ? `?${new URLSearchParams(params as Record<string, string>).toString()}`\n : \"\";\n\n const sounds = await this.client.get<unknown>(`/sounds${query}`);\n\n if (!Array.isArray(sounds)) {\n throw new Error(\"Resposta da API /sounds n\u00E3o \u00E9 um array.\");\n }\n\n return sounds as Sound[];\n }\n\n /**\n * Retrieves details of a specific sound.\n *\n * @param soundId - The unique identifier of the sound.\n * @returns A promise that resolves to a Sound object containing the details of the specified sound.\n */\n async getDetails(soundId: string): Promise<Sound> {\n return this.client.get<Sound>(`/sounds/${soundId}`);\n }\n}\n", "import { EventEmitter } from \"events\";\nimport { type IBackOffOptions, backOff } from \"exponential-backoff\";\nimport WebSocket from \"ws\";\nimport type { AriClient } from \"./ariClient\";\nimport type { BaseClient } from \"./baseClient.js\";\nimport type { WebSocketEvent, WebSocketEventType } from \"./interfaces\";\n\nexport class WebSocketClient extends EventEmitter {\n private ws?: WebSocket;\n private isReconnecting = false;\n private readonly maxReconnectAttempts = 10;\n\n private readonly backOffOptions: IBackOffOptions = {\n numOfAttempts: 10, // M\u00E1ximo de tentativas de reconex\u00E3o\n startingDelay: 500, // In\u00EDcio com 500ms de atraso\n maxDelay: 10000, // Limite m\u00E1ximo de atraso de 10s\n timeMultiple: 2, // Atraso aumenta exponencialmente\n jitter: \"full\", // Randomiza\u00E7\u00E3o para evitar colis\u00F5es\n delayFirstAttempt: false, // N\u00E3o atrase a primeira tentativa\n retry: (error, attemptNumber) => {\n console.warn(\n `Tentativa #${attemptNumber} falhou:`,\n error.message || error,\n );\n // Continue tentando reconectar, a menos que seja um erro cr\u00EDtico\n return true;\n },\n };\n\n constructor(\n private baseClient: BaseClient, // BaseClient cont\u00E9m baseUrl, username, e password\n private apps: string[], // Lista de aplicativos a serem conectados\n private subscribedEvents?: WebSocketEventType[], // Lista de eventos a serem assinados\n private ariClient?: AriClient, // Para acessar recursos como ChannelInstance\n ) {\n super();\n }\n\n /**\n * Conecta ao WebSocket.\n */\n public async connect(): Promise<void> {\n const { baseUrl, username, password } = this.baseClient.getCredentials();\n\n // Determina o protocolo correto\n const protocol = baseUrl.startsWith(\"https\") ? \"wss\" : \"ws\";\n\n // Remove o prefixo redundante \"/ari\" do baseUrl, se existir\n const normalizedHost = baseUrl\n .replace(/^https?:\\/\\//, \"\")\n .replace(/\\/ari$/, \"\");\n\n // Prepara os par\u00E2metros da query\n const queryParams = new URLSearchParams();\n queryParams.append(\"app\", this.apps.join(\",\")); // Adiciona os aplicativos como uma lista separada por v\u00EDrgulas\n if (this.subscribedEvents && this.subscribedEvents.length > 0) {\n this.subscribedEvents.forEach((event) =>\n queryParams.append(\"event\", event),\n );\n } else {\n queryParams.append(\"subscribeAll\", \"true\");\n }\n\n // Constr\u00F3i a URL final corrigida\n const wsUrl = `${protocol}://${encodeURIComponent(username)}:${encodeURIComponent(password)}@${normalizedHost}/ari/events?${queryParams.toString()}`;\n\n console.log(\"Conectando ao WebSocket em:\", wsUrl);\n\n // Inicializa o WebSocket\n return this.initializeWebSocket(wsUrl);\n }\n\n /**\n * Inicializa a conex\u00E3o WebSocket com l\u00F3gica de reconex\u00E3o.\n */\n private async initializeWebSocket(wsUrl: string): Promise<void> {\n return backOff(async () => {\n return new Promise<void>((resolve, reject) => {\n this.ws = new WebSocket(wsUrl);\n\n this.ws.on(\"open\", () => {\n console.log(\"WebSocket conectado com sucesso.\");\n this.isReconnecting = false;\n this.emit(\"connected\");\n resolve();\n });\n\n this.ws.on(\"message\", (data) => this.handleMessage(data.toString()));\n\n this.ws.on(\"close\", (code) => {\n console.warn(\n `WebSocket desconectado com c\u00F3digo ${code}. Tentando reconectar...`,\n );\n if (!this.isReconnecting) {\n this.reconnect(wsUrl);\n }\n });\n\n this.ws.on(\"error\", (err) => {\n console.error(\"Erro no WebSocket:\", err.message);\n if (!this.isReconnecting) {\n this.reconnect(wsUrl);\n }\n reject(err);\n });\n });\n }, this.backOffOptions);\n }\n\n /**\n * Processa as mensagens recebidas do WebSocket.\n */\n private handleMessage(rawMessage: string): void {\n try {\n const event: WebSocketEvent = JSON.parse(rawMessage);\n\n // Filtrar eventos n\u00E3o assinados\n if (\n this.subscribedEvents &&\n !this.subscribedEvents.includes(event.type as WebSocketEventType)\n ) {\n return;\n }\n\n // Processa eventos associados a canais\n if (\"channel\" in event && event.channel?.id && this.ariClient) {\n const instanceChannel = this.ariClient.Channel(event.channel.id);\n\n // Encaminha o evento para o ChannelInstance\n instanceChannel.emitEvent(event);\n\n // Tamb\u00E9m adiciona `instanceChannel` ao evento\n event.instanceChannel = instanceChannel;\n }\n\n if (\"playback\" in event && event.playback?.id && this.ariClient) {\n const instancePlayback = this.ariClient.Playback(event.playback.id);\n\n // Encaminha o evento para o ChannelInstance\n instancePlayback.emitEvent(event);\n\n // Tamb\u00E9m adiciona `instanceChannel` ao evento\n event.instancePlayback = instancePlayback;\n }\n\n this.emit(event.type, event); // Evento gen\u00E9rico para o WebSocket\n } catch (err) {\n console.error(\"Erro ao processar mensagem WebSocket:\", err);\n this.emit(\"error\", new Error(\"Falha ao decodificar mensagem WebSocket.\"));\n }\n }\n\n /**\n * Tenta reconectar ao WebSocket.\n */\n private reconnect(wsUrl: string): void {\n this.isReconnecting = true;\n console.log(\"Iniciando tentativa de reconex\u00E3o...\");\n this.removeAllListeners(); // Limpa todos os listeners associados\n backOff(() => this.initializeWebSocket(wsUrl), this.backOffOptions).catch(\n (err) => {\n console.error(\n \"Falha ao reconectar ap\u00F3s v\u00E1rias tentativas:\",\n err.message || err,\n );\n },\n );\n }\n\n /**\n * Fecha o WebSocket manualmente.\n */\n public close(): void {\n this.ws?.close();\n this.ws = undefined;\n }\n}\n", "import { BaseClient } from \"./baseClient.js\";\nimport type {\n AriClientConfig,\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 { WebSocketClient } from \"./websocketClient.js\";\n\nexport class AriClient {\n private readonly baseClient: BaseClient;\n private webSocketClient?: WebSocketClient;\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 /**\n * Inicializa uma conex\u00E3o WebSocket.\n */\n public async connectWebSocket(\n apps: string[],\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void> {\n if (this.webSocketClient) {\n console.warn(\"WebSocket j\u00E1 est\u00E1 conectado.\");\n return;\n }\n this.webSocketClient = new WebSocketClient(\n this.baseClient,\n apps,\n subscribedEvents,\n this,\n );\n await this.webSocketClient.connect();\n }\n\n /**\n * Adiciona um listener para eventos do WebSocket.\n */\n public on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.on(event, listener);\n }\n\n /**\n * Adiciona um listener \u00FAnico para eventos do WebSocket.\n */\n public once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.once(event, listener);\n }\n\n /**\n * Remove um listener para eventos do WebSocket.\n */\n public off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.off(event, listener);\n }\n\n /**\n * Fecha a conex\u00E3o WebSocket.\n */\n public closeWebSocket(): void {\n this.webSocketClient?.close();\n this.webSocketClient = undefined;\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `ChannelInstance` para manipular canais localmente.\n */\n\n Channel(channelId?: string): ChannelInstance {\n return this.channels.Channel({ id: channelId });\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance` para manipular playbacks.\n */\n public Playback(playbackId?: string, _app?: string): PlaybackInstance {\n return this.playbacks.Playback({ id: playbackId });\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 AsteriskPing,\n} from \"./ari-client/interfaces/index.js\";\n", "import axios, { type AxiosInstance, type AxiosRequestConfig } from \"axios\";\n\nexport class BaseClient {\n private client: AxiosInstance;\n\n constructor(\n private baseUrl: string,\n private username: string,\n private password: string,\n timeout = 5000, // Timeout configur\u00E1vel\n ) {\n if (!/^https?:\\/\\/.+/.test(baseUrl)) {\n throw new Error(\n \"Invalid base URL. It must start with http:// or https://\",\n );\n }\n\n this.client = axios.create({\n baseURL: baseUrl,\n auth: { username, password },\n timeout,\n });\n\n // Interceptores\n this.addInterceptors();\n }\n\n public getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Retorna as credenciais configuradas.\n */\n public getCredentials(): {\n baseUrl: string;\n username: string;\n password: string;\n } {\n return {\n baseUrl: this.baseUrl,\n username: this.username,\n password: this.password,\n };\n }\n\n /**\n * Adds interceptors to the Axios instance.\n */\n private addInterceptors(): void {\n // Interceptor para registrar requisi\u00E7\u00F5es\n this.client.interceptors.request.use(\n (config) => {\n // Pode adicionar logs ou metadados aqui, se necess\u00E1rio\n return config;\n },\n (error) => {\n console.error(\"[Request Error]\", error.message); // Log opcional\n return Promise.reject(error);\n },\n );\n\n // Interceptor para tratar respostas e erros\n this.client.interceptors.response.use(\n (response) => response,\n (error) => {\n const status = error.response?.status;\n const message =\n error.response?.data?.message || error.message || \"Unknown error\";\n\n const errorDetails = {\n status,\n message,\n url: error.config?.url || \"Unknown URL\",\n method: error.config?.method?.toUpperCase() || \"Unknown Method\",\n };\n\n if (status === 404) {\n console.warn(`[404] Not Found: ${errorDetails.url}`);\n } else if (status >= 500) {\n console.error(`[500] Server Error: ${errorDetails.url}`);\n } else {\n console.warn(\n `[Response Error] ${errorDetails.method} ${errorDetails.url}: ${message}`,\n );\n }\n\n // Cria um erro controlado com os detalhes\n return Promise.reject(\n new Error(\n `[Error] ${errorDetails.method} ${errorDetails.url} - ${message} (Status: ${status})`,\n ),\n );\n },\n );\n }\n\n /**\n * Executes a GET request.\n * @param path - The API endpoint path.\n * @param config - Optional Axios request configuration.\n */\n async get<T>(path: string, config?: AxiosRequestConfig): Promise<T> {\n try {\n const response = await this.client.get<T>(path, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\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 * @param config - Optional Axios request configuration.\n */\n async post<T>(\n path: string,\n data?: Record<string, any>,\n config?: AxiosRequestConfig,\n ): Promise<T> {\n try {\n const response = await this.client.post<T>(path, data, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\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 * @param config - Optional Axios request configuration.\n */\n async put<T>(\n path: string,\n data: Record<string, any>,\n config?: AxiosRequestConfig,\n ): Promise<T> {\n try {\n const response = await this.client.put<T>(path, data, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\n }\n\n /**\n * Executes a DELETE request.\n * @param path - The API endpoint path.\n * @param config - Optional Axios request configuration.\n */\n async delete<T>(path: string, config?: AxiosRequestConfig): Promise<T> {\n try {\n const response = await this.client.delete<T>(path, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\n }\n\n /**\n * Handles errors for HTTP requests.\n * @param error - The error to handle.\n */\n private handleRequestError(error: any): never {\n if (axios.isAxiosError(error)) {\n // Erros provenientes do Axios\n console.error(`[HTTP Error] ${error.message}`);\n throw new Error(error.message || \"HTTP Error\");\n } else {\n // Outros erros n\u00E3o relacionados ao Axios\n console.error(`[Unexpected Error] ${error}`);\n throw error;\n }\n }\n\n /**\n * Sets custom headers for the client instance.\n * Useful for adding dynamic tokens or specific API headers.\n * @param headers - Headers to merge with existing configuration.\n */\n setHeaders(headers: Record<string, string>): void {\n this.client.defaults.headers.common = {\n ...this.client.defaults.headers.common,\n ...headers,\n };\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n Application,\n ApplicationDetails,\n} from \"../interfaces/applications.types.js\";\n\nexport interface ApplicationMessage {\n event: string;\n data?: Record<string, any>;\n}\n\nexport class Applications {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all applications.\n * \n * @returns A promise that resolves to an array of Application objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(): Promise<Application[]> {\n const applications = await this.client.get<unknown>(\"/applications\");\n\n if (!Array.isArray(applications)) {\n throw new Error(\"Resposta da API /applications n\u00E3o \u00E9 um array.\");\n }\n\n return applications as Application[];\n }\n\n /**\n * Retrieves details of a specific application.\n * \n * @param appName - The name of the application to retrieve details for.\n * @returns A promise that resolves to an ApplicationDetails object.\n * @throws {Error} If there's an error fetching the application details.\n */\n async getDetails(appName: string): Promise<ApplicationDetails> {\n try {\n return await this.client.get<ApplicationDetails>(\n `/applications/${appName}`,\n );\n } catch (error) {\n console.error(`Erro ao obter detalhes do aplicativo ${appName}:`, error);\n throw error;\n }\n }\n\n /**\n * Sends a message to a specific application.\n * \n * @param appName - The name of the application to send the message to.\n * @param body - The message to be sent, containing an event and optional data.\n * @returns A promise that resolves when the message is successfully sent.\n */\n async sendMessage(appName: string, body: ApplicationMessage): Promise<void> {\n await this.client.post<void>(`/applications/${appName}/messages`, body);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n AsteriskInfo,\n AsteriskPing,\n Logging,\n Module,\n Variable,\n} 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 async ping(): Promise<AsteriskPing> {\n return this.client.get<AsteriskPing>(\"/asterisk/ping\");\n }\n\n /**\n * Retrieves information about the Asterisk server.\n */\n async get(): 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 list(): 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 manage(\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 { v4 as uuidv4 } from \"uuid\";\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 { toQueryParams } from \"../utils\";\nimport type { PlaybackInstance } from \"./playbacks\";\n\nexport class ChannelInstance {\n private eventEmitter = new 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 ) {\n this.id = channelId || `channel-${Date.now()}`; // Inicializa o ID do canal\n }\n\n /**\n * Registra um listener para eventos espec\u00EDficos deste canal.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"channel\" in data && data.channel?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.on(event, wrappedListener);\n }\n\n /**\n * Registra um listener \u00FAnico para eventos espec\u00EDficos deste canal.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"channel\" in data && data.channel?.id === this.id) {\n // Garante que o evento \u00E9 para este canal\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n\n this.eventEmitter.once(event, wrappedListener);\n }\n\n /**\n * Remove um listener para eventos espec\u00EDficos deste canal.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener?: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (listener) {\n this.eventEmitter.off(event, listener);\n } else {\n // Remove todos os listeners associados ao evento para este canal\n const listeners = this.eventEmitter.listeners(event) as Array<\n (...args: any[]) => void\n >;\n\n listeners.forEach((fn) => {\n this.eventEmitter.off(event, fn);\n });\n }\n }\n\n /**\n * Obt\u00E9m a quantidade de listeners registrados para o evento especificado.\n */\n getListenerCount(event: string): number {\n return this.eventEmitter.listenerCount(event);\n }\n\n /**\n * Emite eventos internamente para o canal.\n * Verifica o ID do canal antes de emitir.\n */\n emitEvent(event: WebSocketEvent): void {\n if (\"channel\" in event && event.channel?.id === this.id) {\n this.eventEmitter.emit(event.type, event);\n }\n }\n\n /**\n * Remove todos os listeners para este canal.\n */\n removeAllListeners(): void {\n console.log(`Removendo todos os listeners para o canal ${this.id}`);\n this.eventEmitter.removeAllListeners();\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 playbackId?: string,\n ): Promise<PlaybackInstance> {\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails();\n }\n\n const playback = this.client.Playback(playbackId || uuidv4());\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 {\n private channelInstances = new Map<string, ChannelInstance>();\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {}\n\n Channel({ id }: { id?: string }): ChannelInstance {\n if (!id) {\n const instance = new ChannelInstance(this.client, this.baseClient);\n this.channelInstances.set(instance.id, instance);\n return instance;\n }\n\n if (!this.channelInstances.has(id)) {\n const instance = new ChannelInstance(this.client, this.baseClient, id);\n this.channelInstances.set(id, instance);\n return instance;\n }\n\n return this.channelInstances.get(id)!;\n }\n\n /**\n * Remove uma inst\u00E2ncia de canal.\n */\n removeChannelInstance(channelId: string): void {\n if (this.channelInstances.has(channelId)) {\n const instance = this.channelInstances.get(channelId);\n instance?.removeAllListeners();\n this.channelInstances.delete(channelId);\n console.log(`Inst\u00E2ncia do canal ${channelId} removida.`);\n } else {\n console.warn(\n `Tentativa de remover uma inst\u00E2ncia inexistente: ${channelId}`,\n );\n }\n }\n\n /**\n * Propaga eventos do WebSocket para o canal correspondente.\n */\n propagateEventToChannel(event: WebSocketEvent): void {\n if (\"channel\" in event && event.channel?.id) {\n const instance = this.channelInstances.get(event.channel.id);\n if (instance) {\n instance.emitEvent(event);\n } else {\n console.warn(\n `Nenhuma inst\u00E2ncia encontrada para o canal ${event.channel.id}`,\n );\n }\n }\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 validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n", "import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n", "import { randomUUID } from 'crypto';\nexport default { randomUUID };\n", "import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random || (options.rng || rng)();\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\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\";\n\nexport class PlaybackInstance {\n private eventEmitter = new EventEmitter();\n private playbackData: Playback | null = null;\n public id: string;\n\n constructor(\n private client: AriClient,\n private baseClient: BaseClient,\n private playbackId: string = `playback-${Date.now()}`,\n ) {\n this.id = playbackId;\n }\n\n /**\n * Registra um listener para eventos espec\u00EDficos deste playback.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"playback\" in data && data.playback?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.on(event, wrappedListener);\n }\n\n /**\n * Registra um listener \u00FAnico para eventos espec\u00EDficos deste playback.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"playback\" in data && data.playback?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.once(event, wrappedListener);\n }\n\n /**\n * Remove um listener para eventos espec\u00EDficos deste playback.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener?: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (listener) {\n this.eventEmitter.off(event, listener);\n } else {\n this.eventEmitter.removeAllListeners(event);\n }\n }\n\n /**\n * Emite eventos internamente para o playback.\n */\n emitEvent(event: WebSocketEvent): void {\n if (\"playback\" in event && event.playback?.id === this.id) {\n this.eventEmitter.emit(event.type, event);\n }\n }\n\n /**\n * Obt\u00E9m os detalhes do playback.\n */\n async get(): Promise<Playback> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado a esta inst\u00E2ncia.\");\n }\n\n this.playbackData = await this.baseClient.get<Playback>(\n `/playbacks/${this.id}`,\n );\n return this.playbackData;\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 /**\n * Encerra o playback.\n */\n async stop(): Promise<void> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado para encerrar.\");\n }\n\n await this.baseClient.delete<void>(`/playbacks/${this.id}`);\n }\n\n /**\n * Remove todos os listeners para este playback.\n */\n removeAllListeners(): void {\n this.eventEmitter.removeAllListeners();\n }\n}\n\nexport class Playbacks {\n private playbackInstances = new Map<string, PlaybackInstance>();\n\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {}\n\n /**\n * Gerencia inst\u00E2ncias de playback.\n */\n Playback({ id }: { id?: string }): PlaybackInstance {\n if (!id) {\n const instance = new PlaybackInstance(this.client, this.baseClient);\n this.playbackInstances.set(instance.id, instance);\n return instance;\n }\n\n if (!this.playbackInstances.has(id)) {\n const instance = new PlaybackInstance(this.client, this.baseClient, id);\n this.playbackInstances.set(id, instance);\n return instance;\n }\n\n return this.playbackInstances.get(id)!;\n }\n\n /**\n * Remove uma inst\u00E2ncia de playback.\n */\n removePlaybackInstance(playbackId: string): void {\n if (this.playbackInstances.has(playbackId)) {\n const instance = this.playbackInstances.get(playbackId);\n instance?.removeAllListeners();\n this.playbackInstances.delete(playbackId);\n }\n }\n\n /**\n * Propaga eventos do WebSocket para o playback correspondente.\n */\n propagateEventToPlayback(event: WebSocketEvent): void {\n if (\"playback\" in event && event.playback?.id) {\n const instance = this.playbackInstances.get(event.playback.id);\n if (instance) {\n instance.emitEvent(event);\n }\n }\n }\n\n /**\n * Obt\u00E9m detalhes de um playback espec\u00EDfico.\n */\n async getDetails(playbackId: string): Promise<Playback> {\n return this.baseClient.get<Playback>(`/playbacks/${playbackId}`);\n }\n\n /**\n * Controla um playback espec\u00EDfico.\n */\n async control(\n playbackId: string,\n operation: \"pause\" | \"unpause\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n const playback = this.Playback({ id: playbackId });\n await playback.control(operation);\n }\n\n /**\n * Encerra um playback espec\u00EDfico.\n */\n async stop(playbackId: string): Promise<void> {\n const playback = this.Playback({ id: playbackId });\n await playback.stop();\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { Sound, SoundListRequest } from \"../interfaces/sounds.types.js\";\n\nexport class Sounds {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all available sounds.\n *\n * @param params - Optional parameters to filter the list of sounds.\n * @returns A promise that resolves to an array of Sound objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(params?: SoundListRequest): Promise<Sound[]> {\n const query = params\n ? `?${new URLSearchParams(params as Record<string, string>).toString()}`\n : \"\";\n\n const sounds = await this.client.get<unknown>(`/sounds${query}`);\n\n if (!Array.isArray(sounds)) {\n throw new Error(\"Resposta da API /sounds n\u00E3o \u00E9 um array.\");\n }\n\n return sounds as Sound[];\n }\n\n /**\n * Retrieves details of a specific sound.\n *\n * @param soundId - The unique identifier of the sound.\n * @returns A promise that resolves to a Sound object containing the details of the specified sound.\n */\n async getDetails(soundId: string): Promise<Sound> {\n return this.client.get<Sound>(`/sounds/${soundId}`);\n }\n}\n", "import { EventEmitter } from \"events\";\nimport { type IBackOffOptions, backOff } from \"exponential-backoff\";\nimport WebSocket from \"ws\";\nimport type { AriClient } from \"./ariClient\";\nimport type { BaseClient } from \"./baseClient.js\";\nimport type { WebSocketEvent, WebSocketEventType } from \"./interfaces\";\n\nexport class WebSocketClient extends EventEmitter {\n private ws?: WebSocket;\n private isReconnecting = false;\n private readonly maxReconnectAttempts = 10;\n\n private readonly backOffOptions: IBackOffOptions = {\n numOfAttempts: 10, // M\u00E1ximo de tentativas de reconex\u00E3o\n startingDelay: 500, // In\u00EDcio com 500ms de atraso\n maxDelay: 10000, // Limite m\u00E1ximo de atraso de 10s\n timeMultiple: 2, // Atraso aumenta exponencialmente\n jitter: \"full\", // Randomiza\u00E7\u00E3o para evitar colis\u00F5es\n delayFirstAttempt: false, // N\u00E3o atrase a primeira tentativa\n retry: (error, attemptNumber) => {\n console.warn(\n `Tentativa #${attemptNumber} falhou:`,\n error.message || error,\n );\n // Continue tentando reconectar, a menos que seja um erro cr\u00EDtico\n return true;\n },\n };\n\n constructor(\n private baseClient: BaseClient, // BaseClient cont\u00E9m baseUrl, username, e password\n private apps: string[], // Lista de aplicativos a serem conectados\n private subscribedEvents?: WebSocketEventType[], // Lista de eventos a serem assinados\n private ariClient?: AriClient, // Para acessar recursos como ChannelInstance\n ) {\n super();\n }\n\n /**\n * Conecta ao WebSocket.\n */\n public async connect(): Promise<void> {\n const { baseUrl, username, password } = this.baseClient.getCredentials();\n\n // Determina o protocolo correto\n const protocol = baseUrl.startsWith(\"https\") ? \"wss\" : \"ws\";\n\n // Remove o prefixo redundante \"/ari\" do baseUrl, se existir\n const normalizedHost = baseUrl\n .replace(/^https?:\\/\\//, \"\")\n .replace(/\\/ari$/, \"\");\n\n // Prepara os par\u00E2metros da query\n const queryParams = new URLSearchParams();\n queryParams.append(\"app\", this.apps.join(\",\")); // Adiciona os aplicativos como uma lista separada por v\u00EDrgulas\n if (this.subscribedEvents && this.subscribedEvents.length > 0) {\n this.subscribedEvents.forEach((event) =>\n queryParams.append(\"event\", event),\n );\n } else {\n queryParams.append(\"subscribeAll\", \"true\");\n }\n\n // Constr\u00F3i a URL final corrigida\n const wsUrl = `${protocol}://${encodeURIComponent(username)}:${encodeURIComponent(password)}@${normalizedHost}/ari/events?${queryParams.toString()}`;\n\n console.log(\"Conectando ao WebSocket em:\", wsUrl);\n\n // Inicializa o WebSocket\n return this.initializeWebSocket(wsUrl);\n }\n\n /**\n * Inicializa a conex\u00E3o WebSocket com l\u00F3gica de reconex\u00E3o.\n */\n private async initializeWebSocket(wsUrl: string): Promise<void> {\n return backOff(async () => {\n return new Promise<void>((resolve, reject) => {\n this.ws = new WebSocket(wsUrl);\n\n this.ws.on(\"open\", () => {\n console.log(\"WebSocket conectado com sucesso.\");\n this.isReconnecting = false;\n this.emit(\"connected\");\n resolve();\n });\n\n this.ws.on(\"message\", (data) => this.handleMessage(data.toString()));\n\n this.ws.on(\"close\", (code) => {\n console.warn(\n `WebSocket desconectado com c\u00F3digo ${code}. Tentando reconectar...`,\n );\n if (!this.isReconnecting) {\n this.reconnect(wsUrl);\n }\n });\n\n this.ws.on(\"error\", (err) => {\n console.error(\"Erro no WebSocket:\", err.message);\n if (!this.isReconnecting) {\n this.reconnect(wsUrl);\n }\n reject(err);\n });\n });\n }, this.backOffOptions);\n }\n\n /**\n * Processa as mensagens recebidas do WebSocket.\n */\n private handleMessage(rawMessage: string): void {\n try {\n const event: WebSocketEvent = JSON.parse(rawMessage);\n\n // Filtrar eventos n\u00E3o assinados\n if (\n this.subscribedEvents &&\n !this.subscribedEvents.includes(event.type as WebSocketEventType)\n ) {\n return;\n }\n\n // Processa eventos associados a canais\n if (\"channel\" in event && event.channel?.id && this.ariClient) {\n const instanceChannel = this.ariClient.Channel(event.channel.id);\n\n // Encaminha o evento para o ChannelInstance\n instanceChannel.emitEvent(event);\n\n // Tamb\u00E9m adiciona `instanceChannel` ao evento\n event.instanceChannel = instanceChannel;\n }\n\n if (\"playback\" in event && event.playback?.id && this.ariClient) {\n const instancePlayback = this.ariClient.Playback(event.playback.id);\n\n // Encaminha o evento para o ChannelInstance\n instancePlayback.emitEvent(event);\n\n // Tamb\u00E9m adiciona `instanceChannel` ao evento\n event.instancePlayback = instancePlayback;\n }\n\n this.emit(event.type, event); // Evento gen\u00E9rico para o WebSocket\n } catch (err) {\n console.error(\"Erro ao processar mensagem WebSocket:\", err);\n this.emit(\"error\", new Error(\"Falha ao decodificar mensagem WebSocket.\"));\n }\n }\n\n /**\n * Tenta reconectar ao WebSocket.\n */\n private reconnect(wsUrl: string): void {\n this.isReconnecting = true;\n console.log(\"Iniciando tentativa de reconex\u00E3o...\");\n this.removeAllListeners(); // Limpa todos os listeners associados\n backOff(() => this.initializeWebSocket(wsUrl), this.backOffOptions).catch(\n (err) => {\n console.error(\n \"Falha ao reconectar ap\u00F3s v\u00E1rias tentativas:\",\n err.message || err,\n );\n },\n );\n }\n\n /**\n * Fecha o WebSocket manualmente.\n */\n public close(): void {\n this.ws?.close();\n this.ws = undefined;\n }\n}\n", "import { BaseClient } from \"./baseClient.js\";\nimport type {\n AriClientConfig,\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 { WebSocketClient } from \"./websocketClient.js\";\n\nexport class AriClient {\n private readonly baseClient: BaseClient;\n private webSocketClient?: WebSocketClient;\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 /**\n * Inicializa uma conex\u00E3o WebSocket.\n */\n public async connectWebSocket(\n apps: string[],\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void> {\n if (this.webSocketClient) {\n console.warn(\"WebSocket j\u00E1 est\u00E1 conectado.\");\n return;\n }\n this.webSocketClient = new WebSocketClient(\n this.baseClient,\n apps,\n subscribedEvents,\n this,\n );\n await this.webSocketClient.connect();\n }\n\n /**\n * Adiciona um listener para eventos do WebSocket.\n */\n public on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.on(event, listener);\n }\n\n /**\n * Adiciona um listener \u00FAnico para eventos do WebSocket.\n */\n public once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.once(event, listener);\n }\n\n /**\n * Remove um listener para eventos do WebSocket.\n */\n public off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.off(event, listener);\n }\n\n /**\n * Fecha a conex\u00E3o WebSocket.\n */\n public closeWebSocket(): void {\n this.webSocketClient?.close();\n this.webSocketClient = undefined;\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `ChannelInstance` para manipular canais localmente.\n */\n\n Channel(channelId?: string): ChannelInstance {\n return this.channels.Channel({ id: channelId });\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance` para manipular playbacks.\n */\n public Playback(playbackId?: string, _app?: string): PlaybackInstance {\n return this.playbacks.Playback({ id: playbackId });\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", "axios", "import_crypto", "toQueryParams", "toQueryParams", "import_events", "import_events", "WebSocket"]
7
7
  }
package/dist/esm/index.js CHANGED
@@ -781,6 +781,9 @@ var Asterisk = class {
781
781
  constructor(client) {
782
782
  this.client = client;
783
783
  }
784
+ async ping() {
785
+ return this.client.get("/asterisk/ping");
786
+ }
784
787
  /**
785
788
  * Retrieves information about the Asterisk server.
786
789
  */
@@ -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/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", "../../node_modules/uuid/dist/esm/stringify.js", "../../node_modules/uuid/dist/esm/rng.js", "../../node_modules/uuid/dist/esm/native.js", "../../node_modules/uuid/dist/esm/v4.js", "../../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", "../../src/ari-client/ariClient.ts"],
4
- "sourcesContent": [null, null, null, null, null, null, null, null, null, "import axios, { type AxiosInstance, type AxiosRequestConfig } from \"axios\";\n\nexport class BaseClient {\n private client: AxiosInstance;\n\n constructor(\n private baseUrl: string,\n private username: string,\n private password: string,\n timeout = 5000, // Timeout configur\u00E1vel\n ) {\n if (!/^https?:\\/\\/.+/.test(baseUrl)) {\n throw new Error(\n \"Invalid base URL. It must start with http:// or https://\",\n );\n }\n\n this.client = axios.create({\n baseURL: baseUrl,\n auth: { username, password },\n timeout,\n });\n\n // Interceptores\n this.addInterceptors();\n }\n\n public getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Retorna as credenciais configuradas.\n */\n public getCredentials(): {\n baseUrl: string;\n username: string;\n password: string;\n } {\n return {\n baseUrl: this.baseUrl,\n username: this.username,\n password: this.password,\n };\n }\n\n /**\n * Adds interceptors to the Axios instance.\n */\n private addInterceptors(): void {\n // Interceptor para registrar requisi\u00E7\u00F5es\n this.client.interceptors.request.use(\n (config) => {\n // Pode adicionar logs ou metadados aqui, se necess\u00E1rio\n return config;\n },\n (error) => {\n console.error(\"[Request Error]\", error.message); // Log opcional\n return Promise.reject(error);\n },\n );\n\n // Interceptor para tratar respostas e erros\n this.client.interceptors.response.use(\n (response) => response,\n (error) => {\n const status = error.response?.status;\n const message =\n error.response?.data?.message || error.message || \"Unknown error\";\n\n const errorDetails = {\n status,\n message,\n url: error.config?.url || \"Unknown URL\",\n method: error.config?.method?.toUpperCase() || \"Unknown Method\",\n };\n\n if (status === 404) {\n console.warn(`[404] Not Found: ${errorDetails.url}`);\n } else if (status >= 500) {\n console.error(`[500] Server Error: ${errorDetails.url}`);\n } else {\n console.warn(\n `[Response Error] ${errorDetails.method} ${errorDetails.url}: ${message}`,\n );\n }\n\n // Cria um erro controlado com os detalhes\n return Promise.reject(\n new Error(\n `[Error] ${errorDetails.method} ${errorDetails.url} - ${message} (Status: ${status})`,\n ),\n );\n },\n );\n }\n\n /**\n * Executes a GET request.\n * @param path - The API endpoint path.\n * @param config - Optional Axios request configuration.\n */\n async get<T>(path: string, config?: AxiosRequestConfig): Promise<T> {\n try {\n const response = await this.client.get<T>(path, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\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 * @param config - Optional Axios request configuration.\n */\n async post<T>(\n path: string,\n data?: Record<string, any>,\n config?: AxiosRequestConfig,\n ): Promise<T> {\n try {\n const response = await this.client.post<T>(path, data, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\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 * @param config - Optional Axios request configuration.\n */\n async put<T>(\n path: string,\n data: Record<string, any>,\n config?: AxiosRequestConfig,\n ): Promise<T> {\n try {\n const response = await this.client.put<T>(path, data, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\n }\n\n /**\n * Executes a DELETE request.\n * @param path - The API endpoint path.\n * @param config - Optional Axios request configuration.\n */\n async delete<T>(path: string, config?: AxiosRequestConfig): Promise<T> {\n try {\n const response = await this.client.delete<T>(path, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\n }\n\n /**\n * Handles errors for HTTP requests.\n * @param error - The error to handle.\n */\n private handleRequestError(error: any): never {\n if (axios.isAxiosError(error)) {\n // Erros provenientes do Axios\n console.error(`[HTTP Error] ${error.message}`);\n throw new Error(error.message || \"HTTP Error\");\n } else {\n // Outros erros n\u00E3o relacionados ao Axios\n console.error(`[Unexpected Error] ${error}`);\n throw error;\n }\n }\n\n /**\n * Sets custom headers for the client instance.\n * Useful for adding dynamic tokens or specific API headers.\n * @param headers - Headers to merge with existing configuration.\n */\n setHeaders(headers: Record<string, string>): void {\n this.client.defaults.headers.common = {\n ...this.client.defaults.headers.common,\n ...headers,\n };\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 get(): 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 list(): 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 manage(\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 { v4 as uuidv4 } from \"uuid\";\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 { toQueryParams } from \"../utils\";\nimport type { PlaybackInstance } from \"./playbacks\";\n\nexport class ChannelInstance {\n private eventEmitter = new 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 ) {\n this.id = channelId || `channel-${Date.now()}`; // Inicializa o ID do canal\n }\n\n /**\n * Registra um listener para eventos espec\u00EDficos deste canal.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"channel\" in data && data.channel?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.on(event, wrappedListener);\n }\n\n /**\n * Registra um listener \u00FAnico para eventos espec\u00EDficos deste canal.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"channel\" in data && data.channel?.id === this.id) {\n // Garante que o evento \u00E9 para este canal\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n\n this.eventEmitter.once(event, wrappedListener);\n }\n\n /**\n * Remove um listener para eventos espec\u00EDficos deste canal.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener?: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (listener) {\n this.eventEmitter.off(event, listener);\n } else {\n // Remove todos os listeners associados ao evento para este canal\n const listeners = this.eventEmitter.listeners(event) as Array<\n (...args: any[]) => void\n >;\n\n listeners.forEach((fn) => {\n this.eventEmitter.off(event, fn);\n });\n }\n }\n\n /**\n * Obt\u00E9m a quantidade de listeners registrados para o evento especificado.\n */\n getListenerCount(event: string): number {\n return this.eventEmitter.listenerCount(event);\n }\n\n /**\n * Emite eventos internamente para o canal.\n * Verifica o ID do canal antes de emitir.\n */\n emitEvent(event: WebSocketEvent): void {\n if (\"channel\" in event && event.channel?.id === this.id) {\n this.eventEmitter.emit(event.type, event);\n }\n }\n\n /**\n * Remove todos os listeners para este canal.\n */\n removeAllListeners(): void {\n console.log(`Removendo todos os listeners para o canal ${this.id}`);\n this.eventEmitter.removeAllListeners();\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 playbackId?: string,\n ): Promise<PlaybackInstance> {\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails();\n }\n\n const playback = this.client.Playback(playbackId || uuidv4());\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 {\n private channelInstances = new Map<string, ChannelInstance>();\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {}\n\n Channel({ id }: { id?: string }): ChannelInstance {\n if (!id) {\n const instance = new ChannelInstance(this.client, this.baseClient);\n this.channelInstances.set(instance.id, instance);\n return instance;\n }\n\n if (!this.channelInstances.has(id)) {\n const instance = new ChannelInstance(this.client, this.baseClient, id);\n this.channelInstances.set(id, instance);\n return instance;\n }\n\n return this.channelInstances.get(id)!;\n }\n\n /**\n * Remove uma inst\u00E2ncia de canal.\n */\n removeChannelInstance(channelId: string): void {\n if (this.channelInstances.has(channelId)) {\n const instance = this.channelInstances.get(channelId);\n instance?.removeAllListeners();\n this.channelInstances.delete(channelId);\n console.log(`Inst\u00E2ncia do canal ${channelId} removida.`);\n } else {\n console.warn(\n `Tentativa de remover uma inst\u00E2ncia inexistente: ${channelId}`,\n );\n }\n }\n\n /**\n * Propaga eventos do WebSocket para o canal correspondente.\n */\n propagateEventToChannel(event: WebSocketEvent): void {\n if (\"channel\" in event && event.channel?.id) {\n const instance = this.channelInstances.get(event.channel.id);\n if (instance) {\n instance.emitEvent(event);\n } else {\n console.warn(\n `Nenhuma inst\u00E2ncia encontrada para o canal ${event.channel.id}`,\n );\n }\n }\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 validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n", "import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n", "import { randomUUID } from 'crypto';\nexport default { randomUUID };\n", "import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random || (options.rng || rng)();\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\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\";\n\nexport class PlaybackInstance {\n private eventEmitter = new EventEmitter();\n private playbackData: Playback | null = null;\n public id: string;\n\n constructor(\n private client: AriClient,\n private baseClient: BaseClient,\n private playbackId: string = `playback-${Date.now()}`,\n ) {\n this.id = playbackId;\n }\n\n /**\n * Registra um listener para eventos espec\u00EDficos deste playback.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"playback\" in data && data.playback?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.on(event, wrappedListener);\n }\n\n /**\n * Registra um listener \u00FAnico para eventos espec\u00EDficos deste playback.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"playback\" in data && data.playback?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.once(event, wrappedListener);\n }\n\n /**\n * Remove um listener para eventos espec\u00EDficos deste playback.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener?: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (listener) {\n this.eventEmitter.off(event, listener);\n } else {\n this.eventEmitter.removeAllListeners(event);\n }\n }\n\n /**\n * Emite eventos internamente para o playback.\n */\n emitEvent(event: WebSocketEvent): void {\n if (\"playback\" in event && event.playback?.id === this.id) {\n this.eventEmitter.emit(event.type, event);\n }\n }\n\n /**\n * Obt\u00E9m os detalhes do playback.\n */\n async get(): Promise<Playback> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado a esta inst\u00E2ncia.\");\n }\n\n this.playbackData = await this.baseClient.get<Playback>(\n `/playbacks/${this.id}`,\n );\n return this.playbackData;\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 /**\n * Encerra o playback.\n */\n async stop(): Promise<void> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado para encerrar.\");\n }\n\n await this.baseClient.delete<void>(`/playbacks/${this.id}`);\n }\n\n /**\n * Remove todos os listeners para este playback.\n */\n removeAllListeners(): void {\n this.eventEmitter.removeAllListeners();\n }\n}\n\nexport class Playbacks {\n private playbackInstances = new Map<string, PlaybackInstance>();\n\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {}\n\n /**\n * Gerencia inst\u00E2ncias de playback.\n */\n Playback({ id }: { id?: string }): PlaybackInstance {\n if (!id) {\n const instance = new PlaybackInstance(this.client, this.baseClient);\n this.playbackInstances.set(instance.id, instance);\n return instance;\n }\n\n if (!this.playbackInstances.has(id)) {\n const instance = new PlaybackInstance(this.client, this.baseClient, id);\n this.playbackInstances.set(id, instance);\n return instance;\n }\n\n return this.playbackInstances.get(id)!;\n }\n\n /**\n * Remove uma inst\u00E2ncia de playback.\n */\n removePlaybackInstance(playbackId: string): void {\n if (this.playbackInstances.has(playbackId)) {\n const instance = this.playbackInstances.get(playbackId);\n instance?.removeAllListeners();\n this.playbackInstances.delete(playbackId);\n }\n }\n\n /**\n * Propaga eventos do WebSocket para o playback correspondente.\n */\n propagateEventToPlayback(event: WebSocketEvent): void {\n if (\"playback\" in event && event.playback?.id) {\n const instance = this.playbackInstances.get(event.playback.id);\n if (instance) {\n instance.emitEvent(event);\n }\n }\n }\n\n /**\n * Obt\u00E9m detalhes de um playback espec\u00EDfico.\n */\n async getDetails(playbackId: string): Promise<Playback> {\n return this.baseClient.get<Playback>(`/playbacks/${playbackId}`);\n }\n\n /**\n * Controla um playback espec\u00EDfico.\n */\n async control(\n playbackId: string,\n operation: \"pause\" | \"unpause\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n const playback = this.Playback({ id: playbackId });\n await playback.control(operation);\n }\n\n /**\n * Encerra um playback espec\u00EDfico.\n */\n async stop(playbackId: string): Promise<void> {\n const playback = this.Playback({ id: playbackId });\n await playback.stop();\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { Sound, SoundListRequest } from \"../interfaces/sounds.types.js\";\n\nexport class Sounds {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all available sounds.\n *\n * @param params - Optional parameters to filter the list of sounds.\n * @returns A promise that resolves to an array of Sound objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(params?: SoundListRequest): Promise<Sound[]> {\n const query = params\n ? `?${new URLSearchParams(params as Record<string, string>).toString()}`\n : \"\";\n\n const sounds = await this.client.get<unknown>(`/sounds${query}`);\n\n if (!Array.isArray(sounds)) {\n throw new Error(\"Resposta da API /sounds n\u00E3o \u00E9 um array.\");\n }\n\n return sounds as Sound[];\n }\n\n /**\n * Retrieves details of a specific sound.\n *\n * @param soundId - The unique identifier of the sound.\n * @returns A promise that resolves to a Sound object containing the details of the specified sound.\n */\n async getDetails(soundId: string): Promise<Sound> {\n return this.client.get<Sound>(`/sounds/${soundId}`);\n }\n}\n", "import { EventEmitter } from \"events\";\nimport { type IBackOffOptions, backOff } from \"exponential-backoff\";\nimport WebSocket from \"ws\";\nimport type { AriClient } from \"./ariClient\";\nimport type { BaseClient } from \"./baseClient.js\";\nimport type { WebSocketEvent, WebSocketEventType } from \"./interfaces\";\n\nexport class WebSocketClient extends EventEmitter {\n private ws?: WebSocket;\n private isReconnecting = false;\n private readonly maxReconnectAttempts = 10;\n\n private readonly backOffOptions: IBackOffOptions = {\n numOfAttempts: 10, // M\u00E1ximo de tentativas de reconex\u00E3o\n startingDelay: 500, // In\u00EDcio com 500ms de atraso\n maxDelay: 10000, // Limite m\u00E1ximo de atraso de 10s\n timeMultiple: 2, // Atraso aumenta exponencialmente\n jitter: \"full\", // Randomiza\u00E7\u00E3o para evitar colis\u00F5es\n delayFirstAttempt: false, // N\u00E3o atrase a primeira tentativa\n retry: (error, attemptNumber) => {\n console.warn(\n `Tentativa #${attemptNumber} falhou:`,\n error.message || error,\n );\n // Continue tentando reconectar, a menos que seja um erro cr\u00EDtico\n return true;\n },\n };\n\n constructor(\n private baseClient: BaseClient, // BaseClient cont\u00E9m baseUrl, username, e password\n private apps: string[], // Lista de aplicativos a serem conectados\n private subscribedEvents?: WebSocketEventType[], // Lista de eventos a serem assinados\n private ariClient?: AriClient, // Para acessar recursos como ChannelInstance\n ) {\n super();\n }\n\n /**\n * Conecta ao WebSocket.\n */\n public async connect(): Promise<void> {\n const { baseUrl, username, password } = this.baseClient.getCredentials();\n\n // Determina o protocolo correto\n const protocol = baseUrl.startsWith(\"https\") ? \"wss\" : \"ws\";\n\n // Remove o prefixo redundante \"/ari\" do baseUrl, se existir\n const normalizedHost = baseUrl\n .replace(/^https?:\\/\\//, \"\")\n .replace(/\\/ari$/, \"\");\n\n // Prepara os par\u00E2metros da query\n const queryParams = new URLSearchParams();\n queryParams.append(\"app\", this.apps.join(\",\")); // Adiciona os aplicativos como uma lista separada por v\u00EDrgulas\n if (this.subscribedEvents && this.subscribedEvents.length > 0) {\n this.subscribedEvents.forEach((event) =>\n queryParams.append(\"event\", event),\n );\n } else {\n queryParams.append(\"subscribeAll\", \"true\");\n }\n\n // Constr\u00F3i a URL final corrigida\n const wsUrl = `${protocol}://${encodeURIComponent(username)}:${encodeURIComponent(password)}@${normalizedHost}/ari/events?${queryParams.toString()}`;\n\n console.log(\"Conectando ao WebSocket em:\", wsUrl);\n\n // Inicializa o WebSocket\n return this.initializeWebSocket(wsUrl);\n }\n\n /**\n * Inicializa a conex\u00E3o WebSocket com l\u00F3gica de reconex\u00E3o.\n */\n private async initializeWebSocket(wsUrl: string): Promise<void> {\n return backOff(async () => {\n return new Promise<void>((resolve, reject) => {\n this.ws = new WebSocket(wsUrl);\n\n this.ws.on(\"open\", () => {\n console.log(\"WebSocket conectado com sucesso.\");\n this.isReconnecting = false;\n this.emit(\"connected\");\n resolve();\n });\n\n this.ws.on(\"message\", (data) => this.handleMessage(data.toString()));\n\n this.ws.on(\"close\", (code) => {\n console.warn(\n `WebSocket desconectado com c\u00F3digo ${code}. Tentando reconectar...`,\n );\n if (!this.isReconnecting) {\n this.reconnect(wsUrl);\n }\n });\n\n this.ws.on(\"error\", (err) => {\n console.error(\"Erro no WebSocket:\", err.message);\n if (!this.isReconnecting) {\n this.reconnect(wsUrl);\n }\n reject(err);\n });\n });\n }, this.backOffOptions);\n }\n\n /**\n * Processa as mensagens recebidas do WebSocket.\n */\n private handleMessage(rawMessage: string): void {\n try {\n const event: WebSocketEvent = JSON.parse(rawMessage);\n\n // Filtrar eventos n\u00E3o assinados\n if (\n this.subscribedEvents &&\n !this.subscribedEvents.includes(event.type as WebSocketEventType)\n ) {\n return;\n }\n\n // Processa eventos associados a canais\n if (\"channel\" in event && event.channel?.id && this.ariClient) {\n const instanceChannel = this.ariClient.Channel(event.channel.id);\n\n // Encaminha o evento para o ChannelInstance\n instanceChannel.emitEvent(event);\n\n // Tamb\u00E9m adiciona `instanceChannel` ao evento\n event.instanceChannel = instanceChannel;\n }\n\n if (\"playback\" in event && event.playback?.id && this.ariClient) {\n const instancePlayback = this.ariClient.Playback(event.playback.id);\n\n // Encaminha o evento para o ChannelInstance\n instancePlayback.emitEvent(event);\n\n // Tamb\u00E9m adiciona `instanceChannel` ao evento\n event.instancePlayback = instancePlayback;\n }\n\n this.emit(event.type, event); // Evento gen\u00E9rico para o WebSocket\n } catch (err) {\n console.error(\"Erro ao processar mensagem WebSocket:\", err);\n this.emit(\"error\", new Error(\"Falha ao decodificar mensagem WebSocket.\"));\n }\n }\n\n /**\n * Tenta reconectar ao WebSocket.\n */\n private reconnect(wsUrl: string): void {\n this.isReconnecting = true;\n console.log(\"Iniciando tentativa de reconex\u00E3o...\");\n this.removeAllListeners(); // Limpa todos os listeners associados\n backOff(() => this.initializeWebSocket(wsUrl), this.backOffOptions).catch(\n (err) => {\n console.error(\n \"Falha ao reconectar ap\u00F3s v\u00E1rias tentativas:\",\n err.message || err,\n );\n },\n );\n }\n\n /**\n * Fecha o WebSocket manualmente.\n */\n public close(): void {\n this.ws?.close();\n this.ws = undefined;\n }\n}\n", "import { BaseClient } from \"./baseClient.js\";\nimport type {\n AriClientConfig,\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 { WebSocketClient } from \"./websocketClient.js\";\n\nexport class AriClient {\n private readonly baseClient: BaseClient;\n private webSocketClient?: WebSocketClient;\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 /**\n * Inicializa uma conex\u00E3o WebSocket.\n */\n public async connectWebSocket(\n apps: string[],\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void> {\n if (this.webSocketClient) {\n console.warn(\"WebSocket j\u00E1 est\u00E1 conectado.\");\n return;\n }\n this.webSocketClient = new WebSocketClient(\n this.baseClient,\n apps,\n subscribedEvents,\n this,\n );\n await this.webSocketClient.connect();\n }\n\n /**\n * Adiciona um listener para eventos do WebSocket.\n */\n public on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.on(event, listener);\n }\n\n /**\n * Adiciona um listener \u00FAnico para eventos do WebSocket.\n */\n public once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.once(event, listener);\n }\n\n /**\n * Remove um listener para eventos do WebSocket.\n */\n public off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.off(event, listener);\n }\n\n /**\n * Fecha a conex\u00E3o WebSocket.\n */\n public closeWebSocket(): void {\n this.webSocketClient?.close();\n this.webSocketClient = undefined;\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `ChannelInstance` para manipular canais localmente.\n */\n\n Channel(channelId?: string): ChannelInstance {\n return this.channels.Channel({ id: channelId });\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance` para manipular playbacks.\n */\n public Playback(playbackId?: string, _app?: string): PlaybackInstance {\n return this.playbacks.Playback({ id: playbackId });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": [null, null, null, null, null, null, null, null, null, "import axios, { type AxiosInstance, type AxiosRequestConfig } from \"axios\";\n\nexport class BaseClient {\n private client: AxiosInstance;\n\n constructor(\n private baseUrl: string,\n private username: string,\n private password: string,\n timeout = 5000, // Timeout configur\u00E1vel\n ) {\n if (!/^https?:\\/\\/.+/.test(baseUrl)) {\n throw new Error(\n \"Invalid base URL. It must start with http:// or https://\",\n );\n }\n\n this.client = axios.create({\n baseURL: baseUrl,\n auth: { username, password },\n timeout,\n });\n\n // Interceptores\n this.addInterceptors();\n }\n\n public getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Retorna as credenciais configuradas.\n */\n public getCredentials(): {\n baseUrl: string;\n username: string;\n password: string;\n } {\n return {\n baseUrl: this.baseUrl,\n username: this.username,\n password: this.password,\n };\n }\n\n /**\n * Adds interceptors to the Axios instance.\n */\n private addInterceptors(): void {\n // Interceptor para registrar requisi\u00E7\u00F5es\n this.client.interceptors.request.use(\n (config) => {\n // Pode adicionar logs ou metadados aqui, se necess\u00E1rio\n return config;\n },\n (error) => {\n console.error(\"[Request Error]\", error.message); // Log opcional\n return Promise.reject(error);\n },\n );\n\n // Interceptor para tratar respostas e erros\n this.client.interceptors.response.use(\n (response) => response,\n (error) => {\n const status = error.response?.status;\n const message =\n error.response?.data?.message || error.message || \"Unknown error\";\n\n const errorDetails = {\n status,\n message,\n url: error.config?.url || \"Unknown URL\",\n method: error.config?.method?.toUpperCase() || \"Unknown Method\",\n };\n\n if (status === 404) {\n console.warn(`[404] Not Found: ${errorDetails.url}`);\n } else if (status >= 500) {\n console.error(`[500] Server Error: ${errorDetails.url}`);\n } else {\n console.warn(\n `[Response Error] ${errorDetails.method} ${errorDetails.url}: ${message}`,\n );\n }\n\n // Cria um erro controlado com os detalhes\n return Promise.reject(\n new Error(\n `[Error] ${errorDetails.method} ${errorDetails.url} - ${message} (Status: ${status})`,\n ),\n );\n },\n );\n }\n\n /**\n * Executes a GET request.\n * @param path - The API endpoint path.\n * @param config - Optional Axios request configuration.\n */\n async get<T>(path: string, config?: AxiosRequestConfig): Promise<T> {\n try {\n const response = await this.client.get<T>(path, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\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 * @param config - Optional Axios request configuration.\n */\n async post<T>(\n path: string,\n data?: Record<string, any>,\n config?: AxiosRequestConfig,\n ): Promise<T> {\n try {\n const response = await this.client.post<T>(path, data, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\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 * @param config - Optional Axios request configuration.\n */\n async put<T>(\n path: string,\n data: Record<string, any>,\n config?: AxiosRequestConfig,\n ): Promise<T> {\n try {\n const response = await this.client.put<T>(path, data, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\n }\n\n /**\n * Executes a DELETE request.\n * @param path - The API endpoint path.\n * @param config - Optional Axios request configuration.\n */\n async delete<T>(path: string, config?: AxiosRequestConfig): Promise<T> {\n try {\n const response = await this.client.delete<T>(path, config);\n return response.data;\n } catch (error) {\n this.handleRequestError(error);\n }\n }\n\n /**\n * Handles errors for HTTP requests.\n * @param error - The error to handle.\n */\n private handleRequestError(error: any): never {\n if (axios.isAxiosError(error)) {\n // Erros provenientes do Axios\n console.error(`[HTTP Error] ${error.message}`);\n throw new Error(error.message || \"HTTP Error\");\n } else {\n // Outros erros n\u00E3o relacionados ao Axios\n console.error(`[Unexpected Error] ${error}`);\n throw error;\n }\n }\n\n /**\n * Sets custom headers for the client instance.\n * Useful for adding dynamic tokens or specific API headers.\n * @param headers - Headers to merge with existing configuration.\n */\n setHeaders(headers: Record<string, string>): void {\n this.client.defaults.headers.common = {\n ...this.client.defaults.headers.common,\n ...headers,\n };\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n Application,\n ApplicationDetails,\n} from \"../interfaces/applications.types.js\";\n\nexport interface ApplicationMessage {\n event: string;\n data?: Record<string, any>;\n}\n\nexport class Applications {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all applications.\n * \n * @returns A promise that resolves to an array of Application objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(): Promise<Application[]> {\n const applications = await this.client.get<unknown>(\"/applications\");\n\n if (!Array.isArray(applications)) {\n throw new Error(\"Resposta da API /applications n\u00E3o \u00E9 um array.\");\n }\n\n return applications as Application[];\n }\n\n /**\n * Retrieves details of a specific application.\n * \n * @param appName - The name of the application to retrieve details for.\n * @returns A promise that resolves to an ApplicationDetails object.\n * @throws {Error} If there's an error fetching the application details.\n */\n async getDetails(appName: string): Promise<ApplicationDetails> {\n try {\n return await this.client.get<ApplicationDetails>(\n `/applications/${appName}`,\n );\n } catch (error) {\n console.error(`Erro ao obter detalhes do aplicativo ${appName}:`, error);\n throw error;\n }\n }\n\n /**\n * Sends a message to a specific application.\n * \n * @param appName - The name of the application to send the message to.\n * @param body - The message to be sent, containing an event and optional data.\n * @returns A promise that resolves when the message is successfully sent.\n */\n async sendMessage(appName: string, body: ApplicationMessage): Promise<void> {\n await this.client.post<void>(`/applications/${appName}/messages`, body);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n AsteriskInfo,\n AsteriskPing,\n Logging,\n Module,\n Variable,\n} 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 async ping(): Promise<AsteriskPing> {\n return this.client.get<AsteriskPing>(\"/asterisk/ping\");\n }\n\n /**\n * Retrieves information about the Asterisk server.\n */\n async get(): 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 list(): 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 manage(\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 { v4 as uuidv4 } from \"uuid\";\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 { toQueryParams } from \"../utils\";\nimport type { PlaybackInstance } from \"./playbacks\";\n\nexport class ChannelInstance {\n private eventEmitter = new 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 ) {\n this.id = channelId || `channel-${Date.now()}`; // Inicializa o ID do canal\n }\n\n /**\n * Registra um listener para eventos espec\u00EDficos deste canal.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"channel\" in data && data.channel?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.on(event, wrappedListener);\n }\n\n /**\n * Registra um listener \u00FAnico para eventos espec\u00EDficos deste canal.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"channel\" in data && data.channel?.id === this.id) {\n // Garante que o evento \u00E9 para este canal\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n\n this.eventEmitter.once(event, wrappedListener);\n }\n\n /**\n * Remove um listener para eventos espec\u00EDficos deste canal.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener?: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (listener) {\n this.eventEmitter.off(event, listener);\n } else {\n // Remove todos os listeners associados ao evento para este canal\n const listeners = this.eventEmitter.listeners(event) as Array<\n (...args: any[]) => void\n >;\n\n listeners.forEach((fn) => {\n this.eventEmitter.off(event, fn);\n });\n }\n }\n\n /**\n * Obt\u00E9m a quantidade de listeners registrados para o evento especificado.\n */\n getListenerCount(event: string): number {\n return this.eventEmitter.listenerCount(event);\n }\n\n /**\n * Emite eventos internamente para o canal.\n * Verifica o ID do canal antes de emitir.\n */\n emitEvent(event: WebSocketEvent): void {\n if (\"channel\" in event && event.channel?.id === this.id) {\n this.eventEmitter.emit(event.type, event);\n }\n }\n\n /**\n * Remove todos os listeners para este canal.\n */\n removeAllListeners(): void {\n console.log(`Removendo todos os listeners para o canal ${this.id}`);\n this.eventEmitter.removeAllListeners();\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 playbackId?: string,\n ): Promise<PlaybackInstance> {\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails();\n }\n\n const playback = this.client.Playback(playbackId || uuidv4());\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 {\n private channelInstances = new Map<string, ChannelInstance>();\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {}\n\n Channel({ id }: { id?: string }): ChannelInstance {\n if (!id) {\n const instance = new ChannelInstance(this.client, this.baseClient);\n this.channelInstances.set(instance.id, instance);\n return instance;\n }\n\n if (!this.channelInstances.has(id)) {\n const instance = new ChannelInstance(this.client, this.baseClient, id);\n this.channelInstances.set(id, instance);\n return instance;\n }\n\n return this.channelInstances.get(id)!;\n }\n\n /**\n * Remove uma inst\u00E2ncia de canal.\n */\n removeChannelInstance(channelId: string): void {\n if (this.channelInstances.has(channelId)) {\n const instance = this.channelInstances.get(channelId);\n instance?.removeAllListeners();\n this.channelInstances.delete(channelId);\n console.log(`Inst\u00E2ncia do canal ${channelId} removida.`);\n } else {\n console.warn(\n `Tentativa de remover uma inst\u00E2ncia inexistente: ${channelId}`,\n );\n }\n }\n\n /**\n * Propaga eventos do WebSocket para o canal correspondente.\n */\n propagateEventToChannel(event: WebSocketEvent): void {\n if (\"channel\" in event && event.channel?.id) {\n const instance = this.channelInstances.get(event.channel.id);\n if (instance) {\n instance.emitEvent(event);\n } else {\n console.warn(\n `Nenhuma inst\u00E2ncia encontrada para o canal ${event.channel.id}`,\n );\n }\n }\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 validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n", "import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n", "import { randomUUID } from 'crypto';\nexport default { randomUUID };\n", "import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random || (options.rng || rng)();\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\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\";\n\nexport class PlaybackInstance {\n private eventEmitter = new EventEmitter();\n private playbackData: Playback | null = null;\n public id: string;\n\n constructor(\n private client: AriClient,\n private baseClient: BaseClient,\n private playbackId: string = `playback-${Date.now()}`,\n ) {\n this.id = playbackId;\n }\n\n /**\n * Registra um listener para eventos espec\u00EDficos deste playback.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"playback\" in data && data.playback?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.on(event, wrappedListener);\n }\n\n /**\n * Registra um listener \u00FAnico para eventos espec\u00EDficos deste playback.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n const wrappedListener = (data: WebSocketEvent) => {\n if (\"playback\" in data && data.playback?.id === this.id) {\n listener(data as Extract<WebSocketEvent, { type: T }>);\n }\n };\n this.eventEmitter.once(event, wrappedListener);\n }\n\n /**\n * Remove um listener para eventos espec\u00EDficos deste playback.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener?: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (listener) {\n this.eventEmitter.off(event, listener);\n } else {\n this.eventEmitter.removeAllListeners(event);\n }\n }\n\n /**\n * Emite eventos internamente para o playback.\n */\n emitEvent(event: WebSocketEvent): void {\n if (\"playback\" in event && event.playback?.id === this.id) {\n this.eventEmitter.emit(event.type, event);\n }\n }\n\n /**\n * Obt\u00E9m os detalhes do playback.\n */\n async get(): Promise<Playback> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado a esta inst\u00E2ncia.\");\n }\n\n this.playbackData = await this.baseClient.get<Playback>(\n `/playbacks/${this.id}`,\n );\n return this.playbackData;\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 /**\n * Encerra o playback.\n */\n async stop(): Promise<void> {\n if (!this.id) {\n throw new Error(\"Nenhum playback associado para encerrar.\");\n }\n\n await this.baseClient.delete<void>(`/playbacks/${this.id}`);\n }\n\n /**\n * Remove todos os listeners para este playback.\n */\n removeAllListeners(): void {\n this.eventEmitter.removeAllListeners();\n }\n}\n\nexport class Playbacks {\n private playbackInstances = new Map<string, PlaybackInstance>();\n\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {}\n\n /**\n * Gerencia inst\u00E2ncias de playback.\n */\n Playback({ id }: { id?: string }): PlaybackInstance {\n if (!id) {\n const instance = new PlaybackInstance(this.client, this.baseClient);\n this.playbackInstances.set(instance.id, instance);\n return instance;\n }\n\n if (!this.playbackInstances.has(id)) {\n const instance = new PlaybackInstance(this.client, this.baseClient, id);\n this.playbackInstances.set(id, instance);\n return instance;\n }\n\n return this.playbackInstances.get(id)!;\n }\n\n /**\n * Remove uma inst\u00E2ncia de playback.\n */\n removePlaybackInstance(playbackId: string): void {\n if (this.playbackInstances.has(playbackId)) {\n const instance = this.playbackInstances.get(playbackId);\n instance?.removeAllListeners();\n this.playbackInstances.delete(playbackId);\n }\n }\n\n /**\n * Propaga eventos do WebSocket para o playback correspondente.\n */\n propagateEventToPlayback(event: WebSocketEvent): void {\n if (\"playback\" in event && event.playback?.id) {\n const instance = this.playbackInstances.get(event.playback.id);\n if (instance) {\n instance.emitEvent(event);\n }\n }\n }\n\n /**\n * Obt\u00E9m detalhes de um playback espec\u00EDfico.\n */\n async getDetails(playbackId: string): Promise<Playback> {\n return this.baseClient.get<Playback>(`/playbacks/${playbackId}`);\n }\n\n /**\n * Controla um playback espec\u00EDfico.\n */\n async control(\n playbackId: string,\n operation: \"pause\" | \"unpause\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n const playback = this.Playback({ id: playbackId });\n await playback.control(operation);\n }\n\n /**\n * Encerra um playback espec\u00EDfico.\n */\n async stop(playbackId: string): Promise<void> {\n const playback = this.Playback({ id: playbackId });\n await playback.stop();\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { Sound, SoundListRequest } from \"../interfaces/sounds.types.js\";\n\nexport class Sounds {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all available sounds.\n *\n * @param params - Optional parameters to filter the list of sounds.\n * @returns A promise that resolves to an array of Sound objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(params?: SoundListRequest): Promise<Sound[]> {\n const query = params\n ? `?${new URLSearchParams(params as Record<string, string>).toString()}`\n : \"\";\n\n const sounds = await this.client.get<unknown>(`/sounds${query}`);\n\n if (!Array.isArray(sounds)) {\n throw new Error(\"Resposta da API /sounds n\u00E3o \u00E9 um array.\");\n }\n\n return sounds as Sound[];\n }\n\n /**\n * Retrieves details of a specific sound.\n *\n * @param soundId - The unique identifier of the sound.\n * @returns A promise that resolves to a Sound object containing the details of the specified sound.\n */\n async getDetails(soundId: string): Promise<Sound> {\n return this.client.get<Sound>(`/sounds/${soundId}`);\n }\n}\n", "import { EventEmitter } from \"events\";\nimport { type IBackOffOptions, backOff } from \"exponential-backoff\";\nimport WebSocket from \"ws\";\nimport type { AriClient } from \"./ariClient\";\nimport type { BaseClient } from \"./baseClient.js\";\nimport type { WebSocketEvent, WebSocketEventType } from \"./interfaces\";\n\nexport class WebSocketClient extends EventEmitter {\n private ws?: WebSocket;\n private isReconnecting = false;\n private readonly maxReconnectAttempts = 10;\n\n private readonly backOffOptions: IBackOffOptions = {\n numOfAttempts: 10, // M\u00E1ximo de tentativas de reconex\u00E3o\n startingDelay: 500, // In\u00EDcio com 500ms de atraso\n maxDelay: 10000, // Limite m\u00E1ximo de atraso de 10s\n timeMultiple: 2, // Atraso aumenta exponencialmente\n jitter: \"full\", // Randomiza\u00E7\u00E3o para evitar colis\u00F5es\n delayFirstAttempt: false, // N\u00E3o atrase a primeira tentativa\n retry: (error, attemptNumber) => {\n console.warn(\n `Tentativa #${attemptNumber} falhou:`,\n error.message || error,\n );\n // Continue tentando reconectar, a menos que seja um erro cr\u00EDtico\n return true;\n },\n };\n\n constructor(\n private baseClient: BaseClient, // BaseClient cont\u00E9m baseUrl, username, e password\n private apps: string[], // Lista de aplicativos a serem conectados\n private subscribedEvents?: WebSocketEventType[], // Lista de eventos a serem assinados\n private ariClient?: AriClient, // Para acessar recursos como ChannelInstance\n ) {\n super();\n }\n\n /**\n * Conecta ao WebSocket.\n */\n public async connect(): Promise<void> {\n const { baseUrl, username, password } = this.baseClient.getCredentials();\n\n // Determina o protocolo correto\n const protocol = baseUrl.startsWith(\"https\") ? \"wss\" : \"ws\";\n\n // Remove o prefixo redundante \"/ari\" do baseUrl, se existir\n const normalizedHost = baseUrl\n .replace(/^https?:\\/\\//, \"\")\n .replace(/\\/ari$/, \"\");\n\n // Prepara os par\u00E2metros da query\n const queryParams = new URLSearchParams();\n queryParams.append(\"app\", this.apps.join(\",\")); // Adiciona os aplicativos como uma lista separada por v\u00EDrgulas\n if (this.subscribedEvents && this.subscribedEvents.length > 0) {\n this.subscribedEvents.forEach((event) =>\n queryParams.append(\"event\", event),\n );\n } else {\n queryParams.append(\"subscribeAll\", \"true\");\n }\n\n // Constr\u00F3i a URL final corrigida\n const wsUrl = `${protocol}://${encodeURIComponent(username)}:${encodeURIComponent(password)}@${normalizedHost}/ari/events?${queryParams.toString()}`;\n\n console.log(\"Conectando ao WebSocket em:\", wsUrl);\n\n // Inicializa o WebSocket\n return this.initializeWebSocket(wsUrl);\n }\n\n /**\n * Inicializa a conex\u00E3o WebSocket com l\u00F3gica de reconex\u00E3o.\n */\n private async initializeWebSocket(wsUrl: string): Promise<void> {\n return backOff(async () => {\n return new Promise<void>((resolve, reject) => {\n this.ws = new WebSocket(wsUrl);\n\n this.ws.on(\"open\", () => {\n console.log(\"WebSocket conectado com sucesso.\");\n this.isReconnecting = false;\n this.emit(\"connected\");\n resolve();\n });\n\n this.ws.on(\"message\", (data) => this.handleMessage(data.toString()));\n\n this.ws.on(\"close\", (code) => {\n console.warn(\n `WebSocket desconectado com c\u00F3digo ${code}. Tentando reconectar...`,\n );\n if (!this.isReconnecting) {\n this.reconnect(wsUrl);\n }\n });\n\n this.ws.on(\"error\", (err) => {\n console.error(\"Erro no WebSocket:\", err.message);\n if (!this.isReconnecting) {\n this.reconnect(wsUrl);\n }\n reject(err);\n });\n });\n }, this.backOffOptions);\n }\n\n /**\n * Processa as mensagens recebidas do WebSocket.\n */\n private handleMessage(rawMessage: string): void {\n try {\n const event: WebSocketEvent = JSON.parse(rawMessage);\n\n // Filtrar eventos n\u00E3o assinados\n if (\n this.subscribedEvents &&\n !this.subscribedEvents.includes(event.type as WebSocketEventType)\n ) {\n return;\n }\n\n // Processa eventos associados a canais\n if (\"channel\" in event && event.channel?.id && this.ariClient) {\n const instanceChannel = this.ariClient.Channel(event.channel.id);\n\n // Encaminha o evento para o ChannelInstance\n instanceChannel.emitEvent(event);\n\n // Tamb\u00E9m adiciona `instanceChannel` ao evento\n event.instanceChannel = instanceChannel;\n }\n\n if (\"playback\" in event && event.playback?.id && this.ariClient) {\n const instancePlayback = this.ariClient.Playback(event.playback.id);\n\n // Encaminha o evento para o ChannelInstance\n instancePlayback.emitEvent(event);\n\n // Tamb\u00E9m adiciona `instanceChannel` ao evento\n event.instancePlayback = instancePlayback;\n }\n\n this.emit(event.type, event); // Evento gen\u00E9rico para o WebSocket\n } catch (err) {\n console.error(\"Erro ao processar mensagem WebSocket:\", err);\n this.emit(\"error\", new Error(\"Falha ao decodificar mensagem WebSocket.\"));\n }\n }\n\n /**\n * Tenta reconectar ao WebSocket.\n */\n private reconnect(wsUrl: string): void {\n this.isReconnecting = true;\n console.log(\"Iniciando tentativa de reconex\u00E3o...\");\n this.removeAllListeners(); // Limpa todos os listeners associados\n backOff(() => this.initializeWebSocket(wsUrl), this.backOffOptions).catch(\n (err) => {\n console.error(\n \"Falha ao reconectar ap\u00F3s v\u00E1rias tentativas:\",\n err.message || err,\n );\n },\n );\n }\n\n /**\n * Fecha o WebSocket manualmente.\n */\n public close(): void {\n this.ws?.close();\n this.ws = undefined;\n }\n}\n", "import { BaseClient } from \"./baseClient.js\";\nimport type {\n AriClientConfig,\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 { WebSocketClient } from \"./websocketClient.js\";\n\nexport class AriClient {\n private readonly baseClient: BaseClient;\n private webSocketClient?: WebSocketClient;\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 /**\n * Inicializa uma conex\u00E3o WebSocket.\n */\n public async connectWebSocket(\n apps: string[],\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void> {\n if (this.webSocketClient) {\n console.warn(\"WebSocket j\u00E1 est\u00E1 conectado.\");\n return;\n }\n this.webSocketClient = new WebSocketClient(\n this.baseClient,\n apps,\n subscribedEvents,\n this,\n );\n await this.webSocketClient.connect();\n }\n\n /**\n * Adiciona um listener para eventos do WebSocket.\n */\n public on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.on(event, listener);\n }\n\n /**\n * Adiciona um listener \u00FAnico para eventos do WebSocket.\n */\n public once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.once(event, listener);\n }\n\n /**\n * Remove um listener para eventos do WebSocket.\n */\n public off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n listener: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.webSocketClient?.off(event, listener);\n }\n\n /**\n * Fecha a conex\u00E3o WebSocket.\n */\n public closeWebSocket(): void {\n this.webSocketClient?.close();\n this.webSocketClient = undefined;\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `ChannelInstance` para manipular canais localmente.\n */\n\n Channel(channelId?: string): ChannelInstance {\n return this.channels.Channel({ id: channelId });\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance` para manipular playbacks.\n */\n public Playback(playbackId?: string, _app?: string): PlaybackInstance {\n return this.playbacks.Playback({ id: playbackId });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["Delay", "SkipFirstDelay", "AlwaysDelay", "backOff", "BackOff", "toQueryParams", "toQueryParams", "EventEmitter", "EventEmitter"]
7
7
  }
@@ -36,4 +36,9 @@ export interface Variable {
36
36
  name: string;
37
37
  value: string;
38
38
  }
39
+ export interface AsteriskPing {
40
+ asterisk_id: string;
41
+ ping: string;
42
+ timestamp: string;
43
+ }
39
44
  //# sourceMappingURL=asterisk.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"asterisk.types.d.ts","sourceRoot":"","sources":["../../../../src/ari-client/interfaces/asterisk.types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE;YACN,YAAY,EAAE,MAAM,CAAC;YACrB,gBAAgB,EAAE,MAAM,CAAC;SAC1B,CAAC;KACH,CAAC;IACF,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAGD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"asterisk.types.d.ts","sourceRoot":"","sources":["../../../../src/ari-client/interfaces/asterisk.types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE;YACN,YAAY,EAAE,MAAM,CAAC;YACrB,gBAAgB,EAAE,MAAM,CAAC;SAC1B,CAAC;KACH,CAAC;IACF,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAGD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -4,7 +4,7 @@ export type { Endpoint, EndpointDetails } from "./endpoints.types.js";
4
4
  export type { Playback, PlaybackControlRequest } from "./playbacks.types.js";
5
5
  export type { Application, ApplicationDetails } from "./applications.types.js";
6
6
  export type { Sound, SoundListRequest } from "./sounds.types.js";
7
- export type { AsteriskInfo, Module, Logging, Variable } from "./asterisk.types";
7
+ export type { AsteriskInfo, Module, Logging, Variable, AsteriskPing, } from "./asterisk.types";
8
8
  export type { WebSocketEvent, WebSocketEventType, ChannelEvent, PlaybackEvent, } from "./events.types.js";
9
9
  export type { AddChannelRequest, RemoveChannelRequest, CreateBridgeRequest, Bridge, BridgePlayback, PlayMediaRequest, } from "./bridges.types";
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ari-client/interfaces/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACrE,YAAY,EACV,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACtE,YAAY,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAChF,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,MAAM,EACN,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ari-client/interfaces/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACrE,YAAY,EACV,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACtE,YAAY,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACjE,YAAY,EACV,YAAY,EACZ,MAAM,EACN,OAAO,EACP,QAAQ,EACR,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,MAAM,EACN,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import type { BaseClient } from "../baseClient.js";
2
- import type { AsteriskInfo, Logging, Module, Variable } from "../interfaces";
2
+ import type { AsteriskInfo, AsteriskPing, Logging, Module, Variable } from "../interfaces";
3
3
  export declare class Asterisk {
4
4
  private client;
5
5
  constructor(client: BaseClient);
6
+ ping(): Promise<AsteriskPing>;
6
7
  /**
7
8
  * Retrieves information about the Asterisk server.
8
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"asterisk.d.ts","sourceRoot":"","sources":["../../../../src/ari-client/resources/asterisk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAU7E,qBAAa,QAAQ;IACP,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;IAEtC;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;IAIlC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/B;;;;;;;OAOG;IACG,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GACnC,OAAO,CAAC,IAAI,CAAC;IAiBhB;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAI/C;;OAEG;IACG,gBAAgB,CACpB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,KAAK,GAAG,QAAQ,EACxB,aAAa,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACxD,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;IACG,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAMhE;;OAEG;IACG,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK5E"}
1
+ {"version":3,"file":"asterisk.d.ts","sourceRoot":"","sources":["../../../../src/ari-client/resources/asterisk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,MAAM,EACN,QAAQ,EACT,MAAM,eAAe,CAAC;AAUvB,qBAAa,QAAQ;IACP,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;IAEhC,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;IAInC;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;IAIlC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/B;;;;;;;OAOG;IACG,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GACnC,OAAO,CAAC,IAAI,CAAC;IAiBhB;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAI/C;;OAEG;IACG,gBAAgB,CACpB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,KAAK,GAAG,QAAQ,EACxB,aAAa,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACxD,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;IACG,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAMhE;;OAEG;IACG,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK5E"}
@@ -6,5 +6,5 @@ export { Sounds } from "./ari-client/resources/sounds.js";
6
6
  export { Playbacks, PlaybackInstance, } from "./ari-client/resources/playbacks.js";
7
7
  export { Asterisk } from "./ari-client/resources/asterisk.js";
8
8
  export { Bridges } from "./ari-client/resources/bridges.js";
9
- export type { AriClientConfig, Channel, Endpoint, Playback, Application, Sound, AsteriskInfo, Module, Logging, Variable, WebSocketEvent, WebSocketEventType, OriginateRequest, PlaybackOptions, RTPStats, RecordingOptions, SnoopOptions, ExternalMediaOptions, ChannelPlayback, ChannelVar, ChannelDialplan, AriApplication, EndpointDetails, PlaybackControlRequest, ApplicationDetails, SoundListRequest, PlayMediaRequest, Bridge, BridgePlayback, CreateBridgeRequest, RemoveChannelRequest, AddChannelRequest, ChannelEvent, PlaybackEvent, } from "./ari-client/interfaces/index.js";
9
+ export type { AriClientConfig, Channel, Endpoint, Playback, Application, Sound, AsteriskInfo, Module, Logging, Variable, WebSocketEvent, WebSocketEventType, OriginateRequest, PlaybackOptions, RTPStats, RecordingOptions, SnoopOptions, ExternalMediaOptions, ChannelPlayback, ChannelVar, ChannelDialplan, AriApplication, EndpointDetails, PlaybackControlRequest, ApplicationDetails, SoundListRequest, PlayMediaRequest, Bridge, BridgePlayback, CreateBridgeRequest, RemoveChannelRequest, AddChannelRequest, ChannelEvent, PlaybackEvent, AsteriskPing, } from "./ari-client/interfaces/index.js";
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EACL,SAAS,EACT,gBAAgB,GACjB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAG5D,YAAY,EACV,eAAe,EACf,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,KAAK,EACL,YAAY,EACZ,MAAM,EACN,OAAO,EACP,QAAQ,EACR,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,eAAe,EACf,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,aAAa,GACd,MAAM,kCAAkC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EACL,SAAS,EACT,gBAAgB,GACjB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAG5D,YAAY,EACV,eAAe,EACf,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,KAAK,EACL,YAAY,EACZ,MAAM,EACN,OAAO,EACP,QAAQ,EACR,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,eAAe,EACf,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,kCAAkC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ipcom/asterisk-ari",
3
- "version": "0.0.137",
3
+ "version": "0.0.139",
4
4
  "type": "module",
5
5
  "description": "JavaScript client for Asterisk REST Interface.",
6
6
  "homepage": "https://github.com/fabiotheo/ipcom-asterisk-ari",