@ipcom/asterisk-ari 0.0.77 → 0.0.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +684 -553
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/esm/index.js +707 -553
- package/dist/esm/index.js.map +4 -4
- package/dist/types/ari-client/ariClient.d.ts +2 -377
- package/dist/types/ari-client/ariClient.d.ts.map +1 -1
- package/dist/types/ari-client/interfaces/events.types.d.ts +3 -5
- package/dist/types/ari-client/interfaces/events.types.d.ts.map +1 -1
- package/dist/types/ari-client/resources/channels.d.ts +1 -1
- package/dist/types/ari-client/resources/channels.d.ts.map +1 -1
- package/dist/types/ari-client/resources/playbacks.d.ts +10 -15
- package/dist/types/ari-client/resources/playbacks.d.ts.map +1 -1
- package/dist/types/ari-client/utils.d.ts +3 -0
- package/dist/types/ari-client/utils.d.ts.map +1 -1
- package/dist/types/ari-client/websocketClient.d.ts +3 -0
- package/dist/types/ari-client/websocketClient.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../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", "../../src/ari-client/utils.ts", "../../src/ari-client/resources/endpoints.ts", "../../src/ari-client/resources/playbacks.ts", "../../src/ari-client/resources/sounds.ts", "../../src/ari-client/websocketClient.ts"
|
|
4
|
-
"sourcesContent": ["// 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 { EventEmitter } from \"events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport type { WebSocketEvent } from \"./interfaces\";\nimport type { WebSocketClient } from \"./websocketClient\";\n\nexport class BaseClient {\n private client: AxiosInstance;\n private eventEmitter = new EventEmitter();\n private wsClients: Map<string, WebSocketClient> = new Map(); // Gerencia os WebSocket clients\n\n constructor(baseUrl: string, username: string, password: string) {\n this.client = axios.create({\n baseURL: baseUrl,\n auth: { username, password },\n });\n }\n\n /**\n * Executes a GET request.\n * @param path - The API endpoint path.\n */\n async get<T>(path: string): Promise<T> {\n const response = await this.client.get<T>(path);\n return response.data;\n }\n\n /**\n * Executes a POST request.\n * @param path - The API endpoint path.\n * @param data - Optional payload to send with the request.\n */\n async post<T>(path: string, data?: unknown): Promise<T> {\n const response = await this.client.post<T>(path, data);\n return response.data;\n }\n\n /**\n * Executes a PUT request.\n * @param path - The API endpoint path.\n * @param data - Payload to send with the request.\n */\n async put<T>(path: string, data: unknown): Promise<T> {\n const response = await this.client.put<T>(path, data);\n return response.data;\n }\n\n /**\n * Executes a DELETE request.\n * @param path - The API endpoint path.\n */\n async delete<T>(path: string): Promise<T> {\n const response = await this.client.delete<T>(path);\n return response.data;\n }\n\n // Gerenciamento de WebSocket clients\n\n /**\n * Adiciona um WebSocket client ao gerenciador.\n * @param app - Nome do aplicativo ou contexto associado.\n * @param wsClient - Inst\u00E2ncia do WebSocketClient.\n */\n addWebSocketClient(app: string, wsClient: WebSocketClient): void {\n if (this.wsClients.has(app)) {\n throw new Error(`J\u00E1 existe um WebSocket client registrado para '${app}'`);\n }\n this.wsClients.set(app, wsClient);\n console.log(`WebSocket client adicionado para '${app}'`);\n }\n\n /**\n * Remove um WebSocket client do gerenciador.\n * @param app - Nome do aplicativo ou contexto associado.\n */\n removeWebSocketClient(app: string): void {\n if (!this.wsClients.has(app)) {\n throw new Error(`Nenhum WebSocket client encontrado para '${app}'`);\n }\n this.wsClients.delete(app);\n console.log(`WebSocket client removido para '${app}'`);\n }\n\n /**\n * Obt\u00E9m todos os WebSocket clients.\n * @returns Um Map contendo todos os WebSocket clients registrados.\n */\n getWebSocketClients(): Map<string, WebSocketClient> {\n return this.wsClients;\n }\n\n /**\n * Obt\u00E9m um WebSocket client espec\u00EDfico.\n * @param app - Nome do aplicativo ou contexto associado.\n * @returns O WebSocket client correspondente.\n */\n getWebSocketClient(app: string): WebSocketClient | undefined {\n return this.wsClients.get(app);\n }\n\n // Gerenciamento de eventos WebSocket\n\n onWebSocketEvent(callback: (event: WebSocketEvent) => void): void {\n console.log(\"Registrando callback para eventos do WebSocket\");\n this.eventEmitter.on(\"websocketEvent\", (event) => {\n console.log(\"Evento recebido no BaseClient:\", event);\n callback(event);\n });\n }\n\n emitWebSocketEvent(event: WebSocketEvent): void {\n console.log(\"Emitindo evento do WebSocket:\", event);\n this.eventEmitter.emit(\"websocketEvent\", event);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n Application,\n ApplicationDetails,\n} from \"../interfaces/applications.types.js\";\n\nexport interface ApplicationMessage {\n event: string;\n data?: Record<string, any>;\n}\n\nexport class Applications {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all applications.\n * \n * @returns A promise that resolves to an array of Application objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(): Promise<Application[]> {\n const applications = await this.client.get<unknown>(\"/applications\");\n\n if (!Array.isArray(applications)) {\n throw new Error(\"Resposta da API /applications n\u00E3o \u00E9 um array.\");\n }\n\n return applications as Application[];\n }\n\n /**\n * Retrieves details of a specific application.\n * \n * @param appName - The name of the application to retrieve details for.\n * @returns A promise that resolves to an ApplicationDetails object.\n * @throws {Error} If there's an error fetching the application details.\n */\n async getDetails(appName: string): Promise<ApplicationDetails> {\n try {\n return await this.client.get<ApplicationDetails>(\n `/applications/${appName}`,\n );\n } catch (error) {\n console.error(`Erro ao obter detalhes do aplicativo ${appName}:`, error);\n throw error;\n }\n }\n\n /**\n * Sends a message to a specific application.\n * \n * @param appName - The name of the application to send the message to.\n * @param body - The message to be sent, containing an event and optional data.\n * @returns A promise that resolves when the message is successfully sent.\n */\n async sendMessage(appName: string, body: ApplicationMessage): Promise<void> {\n await this.client.post<void>(`/applications/${appName}/messages`, body);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { AsteriskInfo, Logging, Module, Variable } from \"../interfaces\";\n\nfunction toQueryParams<T>(options: T): string {\n return new URLSearchParams(\n Object.entries(options as Record<string, string>)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, String(value)]),\n ).toString();\n}\n\nexport class Asterisk {\n constructor(private client: BaseClient) {}\n\n /**\n * Retrieves information about the Asterisk server.\n */\n async getInfo(): Promise<AsteriskInfo> {\n return this.client.get<AsteriskInfo>(\"/asterisk/info\");\n }\n\n /**\n * Lists all loaded modules in the Asterisk server.\n */\n async listModules(): Promise<Module[]> {\n return this.client.get<Module[]>(\"/asterisk/modules\");\n }\n\n /**\n * Manages a specific module in the Asterisk server.\n *\n * @param moduleName - The name of the module to manage.\n * @param action - The action to perform on the module: \"load\", \"unload\", or \"reload\".\n * @returns A promise that resolves when the action is completed successfully.\n * @throws {Error} Throws an error if the HTTP method or action is invalid.\n */\n async manageModule(\n moduleName: string,\n action: \"load\" | \"unload\" | \"reload\",\n ): Promise<void> {\n const url = `/asterisk/modules/${moduleName}`;\n switch (action) {\n case \"load\":\n await this.client.post<void>(`${url}?action=load`);\n break;\n case \"unload\":\n await this.client.delete<void>(url);\n break;\n case \"reload\":\n await this.client.put<void>(url, {});\n break;\n default:\n throw new Error(`A\u00E7\u00E3o inv\u00E1lida: ${action}`);\n }\n }\n\n /**\n * Retrieves all configured logging channels.\n */\n async listLoggingChannels(): Promise<Logging[]> {\n return this.client.get<Logging[]>(\"/asterisk/logging\");\n }\n\n /**\n * Adds or removes a log channel in the Asterisk server.\n */\n async manageLogChannel(\n logChannelName: string,\n action: \"add\" | \"remove\",\n configuration?: { type?: string; configuration?: string },\n ): Promise<void> {\n const queryParams = toQueryParams(configuration || {});\n return this.client.post<void>(\n `/asterisk/logging/${logChannelName}?action=${encodeURIComponent(action)}&${queryParams}`,\n );\n }\n\n /**\n * Retrieves the value of a global variable.\n */\n async getGlobalVariable(variableName: string): Promise<Variable> {\n return this.client.get<Variable>(\n `/asterisk/variables?variable=${encodeURIComponent(variableName)}`,\n );\n }\n\n /**\n * Sets a global variable.\n */\n async setGlobalVariable(variableName: string, value: string): Promise<void> {\n return this.client.post<void>(\n `/asterisk/variables?variable=${encodeURIComponent(variableName)}&value=${encodeURIComponent(value)}`,\n );\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n AddChannelRequest,\n Bridge,\n BridgePlayback,\n CreateBridgeRequest,\n PlayMediaRequest,\n RemoveChannelRequest,\n} from \"../interfaces/bridges.types.js\";\n\nexport class Bridges {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all active bridges.\n */\n async list(): Promise<Bridge[]> {\n return this.client.get<Bridge[]>(\"/bridges\");\n }\n\n /**\n * Creates a new bridge.\n */\n async createBridge(request: CreateBridgeRequest): Promise<Bridge> {\n return this.client.post<Bridge>(\"/bridges\", request);\n }\n\n /**\n * Retrieves details of a specific bridge.\n */\n async getDetails(bridgeId: string): Promise<Bridge> {\n return this.client.get<Bridge>(`/bridges/${bridgeId}`);\n }\n\n /**\n * Destroys (deletes) a specific bridge.\n */\n async destroy(bridgeId: string): Promise<void> {\n return this.client.delete<void>(`/bridges/${bridgeId}`);\n }\n\n /**\n * Adds a channel or multiple channels to a bridge.\n */\n async addChannels(\n bridgeId: string,\n request: AddChannelRequest,\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n channel: Array.isArray(request.channel)\n ? request.channel.join(\",\")\n : request.channel,\n ...(request.role && { role: request.role }),\n }).toString();\n\n await this.client.post<void>(\n `/bridges/${bridgeId}/addChannel?${queryParams}`,\n );\n }\n\n /**\n * Removes a channel or multiple channels from a bridge.\n */\n async removeChannels(\n bridgeId: string,\n request: RemoveChannelRequest,\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n channel: Array.isArray(request.channel)\n ? request.channel.join(\",\")\n : request.channel,\n }).toString();\n\n await this.client.post<void>(\n `/bridges/${bridgeId}/removeChannel?${queryParams}`,\n );\n }\n\n /**\n * Plays media to a bridge.\n */\n async playMedia(\n bridgeId: string,\n request: PlayMediaRequest,\n ): Promise<BridgePlayback> {\n const queryParams = new URLSearchParams({\n ...(request.lang && { lang: request.lang }),\n ...(request.offsetms && { offsetms: request.offsetms.toString() }),\n ...(request.skipms && { skipms: request.skipms.toString() }),\n ...(request.playbackId && { playbackId: request.playbackId }),\n }).toString();\n\n return this.client.post<BridgePlayback>(\n `/bridges/${bridgeId}/play?${queryParams}`,\n { media: request.media },\n );\n }\n\n /**\n * Stops media playback on a bridge.\n */\n async stopPlayback(bridgeId: string, playbackId: string): Promise<void> {\n await this.client.delete<void>(`/bridges/${bridgeId}/play/${playbackId}`);\n }\n\n /**\n * Sets the video source for a bridge.\n */\n async setVideoSource(bridgeId: string, channelId: string): Promise<void> {\n await this.client.post<void>(\n `/bridges/${bridgeId}/videoSource?channelId=${encodeURIComponent(channelId)}`,\n );\n }\n\n /**\n * Clears the video source for a bridge.\n */\n async clearVideoSource(bridgeId: string): Promise<void> {\n await this.client.delete<void>(`/bridges/${bridgeId}/videoSource`);\n }\n}\n", "import { EventEmitter } from \"events\";\nimport type { AriClient } from \"../ariClient\";\nimport type { BaseClient } from \"../baseClient.js\";\nimport type {\n Channel,\n ChannelPlayback,\n ChannelVar,\n ExternalMediaOptions,\n OriginateRequest,\n PlaybackOptions,\n RTPStats,\n RecordingOptions,\n SnoopOptions,\n WebSocketEvent,\n} from \"../interfaces\";\nimport { isChannelEvent, toQueryParams } from \"../utils\";\nimport type { PlaybackInstance } from \"./playbacks\";\n\nexport class ChannelInstance extends EventEmitter {\n private channelData: Channel | null = null;\n public id: string; // ID do canal\n\n constructor(\n private client: AriClient,\n private baseClient: BaseClient,\n private channelId: string = `channel-${Date.now()}`, // Gera um ID padr\u00E3o se n\u00E3o fornecido\n ) {\n super();\n\n this.id = channelId || `channel-${Date.now()}`; // Inicializa o ID do canal\n\n const wsClients = this.client.getWebSocketClients();\n const wsClient = Array.from(wsClients.values()).find((client) =>\n client.isConnected(),\n );\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para o canal: ${this.id}`,\n );\n }\n\n wsClient.on(\"message\", (event: WebSocketEvent) => {\n if (isChannelEvent(event, this.id)) {\n console.log(`Evento recebido no ChannelInstance: ${event.type}`, event);\n this.emit(event.type, event); // Emite evento para o ChannelInstance\n }\n });\n }\n\n /**\n * Adiciona um listener para eventos de canal.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.on(event, callback);\n return this;\n }\n\n /**\n * Adiciona um listener para ser chamado apenas uma vez.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.once(event, callback);\n return this;\n }\n\n /**\n * Remove um listener espec\u00EDfico.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.off(event, callback);\n return this;\n }\n\n async answer(): Promise<void> {\n await this.baseClient.post<void>(`/channels/${this.id}/answer`);\n }\n\n /**\n * Origina um canal f\u00EDsico no Asterisk.\n */\n async originate(data: OriginateRequest): Promise<Channel> {\n if (this.channelData) {\n throw new Error(\"O canal j\u00E1 foi criado.\");\n }\n\n const channel = await this.baseClient.post<Channel>(\"/channels\", data);\n this.channelData = channel;\n\n return channel;\n }\n\n /**\n * Obt\u00E9m os detalhes do canal.\n */\n async getDetails(): Promise<Channel> {\n if (this.channelData) {\n return this.channelData;\n }\n\n if (!this.id) {\n throw new Error(\"Nenhum ID de canal associado a esta inst\u00E2ncia.\");\n }\n\n const details = await this.baseClient.get<Channel>(`/channels/${this.id}`);\n this.channelData = details; // Armazena os detalhes para evitar m\u00FAltiplas chamadas\n return details;\n }\n\n async getVariable(variable: string): Promise<ChannelVar> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n return this.baseClient.get<ChannelVar>(\n `/channels/${this.id}/variable?variable=${encodeURIComponent(variable)}`,\n );\n }\n\n /**\n * Encerra o canal, se ele j\u00E1 foi criado.\n */\n async hangup(): Promise<void> {\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails();\n }\n\n if (!this.channelData?.id) {\n throw new Error(\"N\u00E3o foi poss\u00EDvel inicializar o canal. ID inv\u00E1lido.\");\n }\n\n await this.baseClient.delete(`/channels/${this.channelData.id}`);\n }\n\n /**\n * Reproduz m\u00EDdia no canal.\n */\n async play(\n options: { media: string; lang?: string },\n playback?: PlaybackInstance,\n ): Promise<PlaybackInstance> {\n // Verifica se o canal foi inicializado\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails(); // Inicializa automaticamente\n }\n\n if (!playback) {\n playback = this.client.Playback();\n }\n\n if (!this.channelData?.id) {\n throw new Error(\"N\u00E3o foi poss\u00EDvel inicializar o canal. ID inv\u00E1lido.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playback.id}`,\n options,\n );\n\n return playback;\n }\n\n /**\n * Reproduz m\u00EDdia em um canal.\n */\n async playMedia(\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n if (!this.channelData) {\n throw new Error(\"O canal ainda n\u00E3o foi criado.\");\n }\n\n const queryParams = options\n ? `?${new URLSearchParams(options as Record<string, string>).toString()}`\n : \"\";\n\n return this.baseClient.post<ChannelPlayback>(\n `/channels/${this.channelData.id}/play${queryParams}`,\n { media },\n );\n }\n\n /**\n * Para a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async stopPlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/play/${playbackId}`,\n );\n }\n\n /**\n * Pausa a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async pausePlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Retoma a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async resumePlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Retrocede a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async rewindPlayback(playbackId: string, skipMs: number): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/rewind`,\n { skipMs },\n );\n }\n\n /**\n * Avan\u00E7a a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async fastForwardPlayback(playbackId: string, skipMs: number): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/forward`,\n { skipMs },\n );\n }\n\n /**\n * Muta o canal.\n */\n async muteChannel(direction: \"both\" | \"in\" | \"out\" = \"both\"): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Desmuta o canal.\n */\n async unmuteChannel(\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Coloca o canal em espera.\n */\n async holdChannel(): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(`/channels/${this.channelData.id}/hold`);\n }\n\n /**\n * Remove o canal da espera.\n */\n async unholdChannel(): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(`/channels/${this.channelData.id}/hold`);\n }\n}\n\nexport class Channels extends EventEmitter {\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {\n super();\n }\n\n createChannelInstance(channelId?: string): ChannelInstance {\n return new ChannelInstance(this.client, this.baseClient, channelId);\n }\n\n /**\n * Origina um canal f\u00EDsico diretamente, sem uma inst\u00E2ncia de `ChannelInstance`.\n */\n async originate(data: OriginateRequest): Promise<Channel> {\n return this.baseClient.post<Channel>(\"/channels\", data);\n }\n\n /**\n * Obt\u00E9m detalhes de um canal espec\u00EDfico.\n */\n async getDetails(channelId: string): Promise<Channel> {\n return this.baseClient.get<Channel>(`/channels/${channelId}`);\n }\n\n /**\n * Lista todos os canais ativos.\n */\n async list(): Promise<Channel[]> {\n const channels = await this.baseClient.get<unknown>(\"/channels\");\n if (!Array.isArray(channels)) {\n throw new Error(\"Resposta da API /channels n\u00E3o \u00E9 um array.\");\n }\n return channels as Channel[];\n }\n\n /**\n * Encerra um canal espec\u00EDfico.\n */\n async hangup(\n channelId: string,\n options?: { reason_code?: string; reason?: string },\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n ...(options?.reason_code && { reason_code: options.reason_code }),\n ...(options?.reason && { reason: options.reason }),\n });\n\n return this.baseClient.delete<void>(\n `/channels/${channelId}?${queryParams.toString()}`,\n );\n }\n\n /**\n * Inicia a escuta em um canal.\n */\n async snoopChannel(\n channelId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/snoop?${queryParams}`,\n );\n }\n\n async startSilence(channelId: string): Promise<void> {\n return this.baseClient.post<void>(`/channels/${channelId}/silence`);\n }\n\n async stopSilence(channelId: string): Promise<void> {\n return this.baseClient.delete<void>(`/channels/${channelId}/silence`);\n }\n\n async getRTPStatistics(channelId: string): Promise<RTPStats> {\n return this.baseClient.get<RTPStats>(\n `/channels/${channelId}/rtp_statistics`,\n );\n }\n\n async createExternalMedia(options: ExternalMediaOptions): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/externalMedia?${queryParams}`,\n );\n }\n\n async playWithId(\n channelId: string,\n playbackId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n const queryParams = options ? `?${toQueryParams(options)}` : \"\";\n return this.baseClient.post<ChannelPlayback>(\n `/channels/${channelId}/play/${playbackId}${queryParams}`,\n { media },\n );\n }\n\n async snoopChannelWithId(\n channelId: string,\n snoopId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/snoop/${snoopId}?${queryParams}`,\n );\n }\n\n async startMohWithClass(channelId: string, mohClass: string): Promise<void> {\n const queryParams = `mohClass=${encodeURIComponent(mohClass)}`;\n await this.baseClient.post<void>(\n `/channels/${channelId}/moh?${queryParams}`,\n );\n }\n\n async getChannelVariable(\n channelId: string,\n variable: string,\n ): Promise<ChannelVar> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n return this.baseClient.get<ChannelVar>(\n `/channels/${channelId}/variable?variable=${encodeURIComponent(variable)}`,\n );\n }\n\n async setChannelVariable(\n channelId: string,\n variable: string,\n value?: string,\n ): Promise<void> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n const queryParams = new URLSearchParams({\n variable,\n ...(value && { value }),\n });\n await this.baseClient.post<void>(\n `/channels/${channelId}/variable?${queryParams}`,\n );\n }\n\n async moveToApplication(\n channelId: string,\n app: string,\n appArgs?: string,\n ): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/move`, {\n app,\n appArgs,\n });\n }\n\n async continueDialplan(\n channelId: string,\n context?: string,\n extension?: string,\n priority?: number,\n label?: string,\n ): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/continue`, {\n context,\n extension,\n priority,\n label,\n });\n }\n\n async stopMusicOnHold(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/moh`);\n }\n\n async startMusicOnHold(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/moh`);\n }\n\n async record(channelId: string, options: RecordingOptions): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/record?${queryParams}`,\n );\n }\n\n async dial(\n channelId: string,\n caller?: string,\n timeout?: number,\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n ...(caller && { caller }),\n ...(timeout && { timeout: timeout.toString() }),\n });\n await this.baseClient.post<void>(\n `/channels/${channelId}/dial?${queryParams}`,\n );\n }\n\n async redirectChannel(channelId: string, endpoint: string): Promise<void> {\n await this.baseClient.post<void>(\n `/channels/${channelId}/redirect?endpoint=${encodeURIComponent(endpoint)}`,\n );\n }\n\n async answerChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/answer`);\n }\n\n async ringChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/ring`);\n }\n\n async stopRingChannel(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/ring`);\n }\n\n async sendDTMF(\n channelId: string,\n dtmf: string,\n options?: {\n before?: number;\n between?: number;\n duration?: number;\n after?: number;\n },\n ): Promise<void> {\n const queryParams = toQueryParams({ dtmf, ...options });\n await this.baseClient.post<void>(\n `/channels/${channelId}/dtmf?${queryParams}`,\n );\n }\n\n async muteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n await this.baseClient.post<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n async unmuteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n await this.baseClient.delete<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n async holdChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/hold`);\n }\n\n async unholdChannel(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/hold`);\n }\n\n async createChannel(data: OriginateRequest): Promise<Channel> {\n return this.baseClient.post<Channel>(\"/channels/create\", data);\n }\n\n async originateWithId(\n channelId: string,\n data: OriginateRequest,\n ): Promise<Channel> {\n return this.baseClient.post<Channel>(`/channels/${channelId}`, data);\n }\n}\n", "import type { Channel, 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\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 // Verifica o ID do canal, se necess\u00E1rio\n const matchesChannelId =\n hasChannel && (!channelId || event.channel?.id === channelId);\n\n if (!hasChannel || (channelId && !matchesChannelId)) {\n console.log(\n `Evento ignorado no isChannelEvent: tipo=${event.type}, canal esperado=${channelId}, evento recebido=`,\n event,\n );\n }\n\n return matchesChannelId;\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 { BaseClient } from \"../baseClient.js\";\nimport type {\n Playback,\n PlaybackControlRequest,\n WebSocketEvent,\n} from \"../interfaces\";\n\nexport class PlaybackInstance extends EventEmitter {\n private playbackData: Playback | null = null;\n public id: string; // Garantimos que o ID esteja dispon\u00EDvel\n\n constructor(\n private baseClient: BaseClient,\n private playbackId?: string,\n ) {\n super();\n this.id = playbackId || `playback-${Date.now()}`; // Inicializa o ID\n // Associar eventos ao playback\n const wsClients = this.baseClient.getWebSocketClients();\n const wsClient = Array.from(wsClients.values()).find((client) =>\n client.isConnected(),\n );\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para o playback: ${this.id}`,\n );\n }\n\n wsClient.on(\"message\", (event: WebSocketEvent) => {\n if (this.isPlaybackEvent(event)) {\n console.log(\n `Evento recebido no PlaybackInstance: ${event.type}`,\n event,\n );\n this.emit(event.type, event); // Reemite o evento para esta inst\u00E2ncia\n }\n });\n }\n\n /**\n * Verifica se o evento \u00E9 relacionado a um playback.\n */\n private isPlaybackEvent(\n event: WebSocketEvent,\n ): event is Extract<WebSocketEvent, { playbackId: string }> {\n // Primeiro, verifica se o evento come\u00E7a com \"Playback\"\n const isPlaybackType = event?.type.startsWith(\"Playback\");\n\n // S\u00F3 verifica o `playbackId` se for um evento do tipo Playback\n const isPlaybackEvent =\n isPlaybackType && \"playbackId\" in event && event.playbackId === this.id;\n\n if (!isPlaybackEvent) {\n console.log(\n `Evento ignorado no isPlaybackEvent: tipo=${event.type}, playback esperado=${this.id}, evento recebido=`,\n event,\n );\n }\n\n return isPlaybackEvent;\n }\n\n /**\n * Obt\u00E9m os detalhes do playback.\n */\n async getDetails(): Promise<Playback> {\n if (!this.playbackId && !this.playbackData) {\n throw new Error(\"Nenhum playback associado a esta inst\u00E2ncia.\");\n }\n\n const details = await this.baseClient.get<Playback>(\n `/playbacks/${this.id}`,\n );\n this.playbackData = details;\n return details;\n }\n\n /**\n * Controla o playback.\n */\n async control(\n operation: \"pause\" | \"unpause\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n if (!this.playbackId) {\n throw new Error(\"Nenhum playback associado para controlar.\");\n }\n\n await this.baseClient.post<void>(\n `/playbacks/${this.id}/control?operation=${operation}`,\n );\n }\n\n async stop(): Promise<void> {\n if (!this.playbackId) {\n throw new Error(\"Nenhum playback associado para encerrar.\");\n }\n\n await this.baseClient.delete<void>(`/playbacks/${this.playbackId}`);\n this.emit(\"PlaybackStopped\", this.playbackData);\n }\n\n /**\n * Adiciona um listener para eventos de playback.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.on(event, callback);\n return this;\n }\n\n /**\n * Adiciona um listener para ser chamado apenas uma vez.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.once(event, callback);\n return this;\n }\n\n /**\n * Remove um listener espec\u00EDfico.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.off(event, callback);\n return this;\n }\n}\n\nexport class Playbacks extends EventEmitter {\n constructor(private client: BaseClient) {\n super();\n\n // Registrar eventos globais de playback\n this.client.onWebSocketEvent((event) => {\n if (this.isPlaybackEvent(event)) {\n const playbackId = event.playbackId;\n if (playbackId) {\n this.emit(`${event.type}:${playbackId}`, event);\n }\n this.emit(event.type, event); // Emite o evento globalmente tamb\u00E9m\n }\n });\n }\n\n /**\n * Obt\u00E9m os clientes WebSocket dispon\u00EDveis.\n */\n getWebSocketClients() {\n return this.client.getWebSocketClients();\n }\n\n /**\n * Verifica se o evento \u00E9 relacionado a um playback.\n */\n private isPlaybackEvent(\n event: WebSocketEvent,\n ): event is Extract<WebSocketEvent, { playbackId: string }> {\n console.log({ eventAri: event });\n return event && typeof event === \"object\" && \"playbackId\" in event;\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance`.\n */\n Playback(playbackId?: string): PlaybackInstance {\n const id = playbackId || `playback-${Date.now()}`;\n return new PlaybackInstance(this.client, id);\n }\n\n /**\n * Emite eventos de playback.\n * Atualizado para gerenciar eventos espec\u00EDficos para `PlaybackInstance`.\n */\n emitPlaybackEvent<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n data: Extract<WebSocketEvent, { type: T }>,\n ): void {\n if (\"playbackId\" in data) {\n const playbackId = data.playbackId;\n if (playbackId) {\n this.emit(`${eventType}:${playbackId}`, data);\n }\n }\n this.emit(eventType, data);\n }\n\n /**\n * Retrieves details of a specific playback.\n *\n * @param playbackId - The unique identifier of the playback.\n * @returns A promise that resolves to a Playback object containing the details of the specified playback.\n */\n async getDetails(playbackId: string): Promise<Playback> {\n return this.client.get<Playback>(`/playbacks/${playbackId}`);\n }\n\n /**\n * Controls a specific playback by performing various operations such as pause, resume, restart, reverse, forward, or stop.\n *\n * @param playbackId - The unique identifier of the playback to control.\n * @param operation - The operation to perform on the playback. Possible values are:\n * - \"pause\": Pauses the playback.\n * - \"unpause\": Resumes a paused playback.\n * - \"restart\": Restarts the playback from the beginning.\n * - \"reverse\": Reverses the playback direction.\n * - \"forward\": Moves the playback forward.\n * - \"stop\": Stops the playback.\n * @returns A promise that resolves when the control operation is successfully executed.\n */\n async control(\n playbackId: string,\n operation: \"pause\" | \"unpause\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n await this.client.post<void>(\n `/playbacks/${playbackId}/control?operation=${operation}`,\n );\n }\n\n /**\n * Stops a specific playback.\n *\n * @param playbackId - The unique identifier of the playback to stop.\n * @returns A promise that resolves when the playback is successfully stopped.\n */\n async stop(playbackId: string): Promise<void> {\n await this.client.delete<void>(`/playbacks/${playbackId}`);\n }\n\n /**\n * Registers a listener for playback events.\n * The listener is triggered for events such as \"PlaybackFinished\".\n *\n * @param eventType - The type of event to listen for.\n * @param playbackId - The ID of the playback to associate with this listener.\n * @param callback - The callback function to execute when the event occurs.\n */\n registerListener<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.on(`${eventType}:${playbackId}`, callback);\n }\n\n /**\n * Unregisters a listener for playback events.\n *\n * @param eventType - The type of event to stop listening for.\n * @param playbackId - The ID of the playback associated with the listener.\n * @param callback - The callback function to remove.\n */\n unregisterListener<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.off(`${eventType}:${playbackId}`, callback);\n }\n\n /**\n * Checks if a listener is already registered for a specific event and playback.\n *\n * @param eventType - The type of event to check.\n * @param playbackId - The playback ID associated with the listener.\n * @returns True if a listener is already registered, false otherwise.\n */\n isListenerRegistered<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n ): boolean {\n return this.listenerCount(`${eventType}:${playbackId}`) > 0;\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { Sound, SoundListRequest } from \"../interfaces/sounds.types.js\";\n\nexport class Sounds {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all available sounds.\n *\n * @param params - Optional parameters to filter the list of sounds.\n * @returns A promise that resolves to an array of Sound objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(params?: SoundListRequest): Promise<Sound[]> {\n const query = params\n ? `?${new URLSearchParams(params as Record<string, string>).toString()}`\n : \"\";\n\n const sounds = await this.client.get<unknown>(`/sounds${query}`);\n\n if (!Array.isArray(sounds)) {\n throw new Error(\"Resposta da API /sounds n\u00E3o \u00E9 um array.\");\n }\n\n return sounds as Sound[];\n }\n\n /**\n * Retrieves details of a specific sound.\n *\n * @param soundId - The unique identifier of the sound.\n * @returns A promise that resolves to a Sound object containing the details of the specified sound.\n */\n async getDetails(soundId: string): Promise<Sound> {\n return this.client.get<Sound>(`/sounds/${soundId}`);\n }\n}\n", "import { EventEmitter } from \"events\";\nimport WebSocket from \"ws\";\nimport type { WebSocketEvent } from \"./interfaces\";\n\n/**\n * WebSocketClient class for managing WebSocket connections.\n * Extends EventEmitter to provide event-based communication.\n */\nexport class WebSocketClient extends EventEmitter {\n private ws: WebSocket | null = null;\n private isClosedManually = false;\n private isReconnecting = false;\n private messageListeners: ((data: any) => void)[] = [];\n\n /**\n * Creates a new WebSocketClient instance.\n * @param url - The WebSocket server URL to connect to.\n */\n constructor(private url: string) {\n super();\n }\n\n /**\n * Establishes a connection to the WebSocket server.\n * @returns A Promise that resolves when the connection is established, or rejects if an error occurs.\n * @throws Will throw an error if the connection fails.\n */\n async connect(): Promise<void> {\n if (this.isReconnecting) return;\n\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(this.url);\n\n this.ws.on(\"open\", () => {\n console.log(\"WebSocket conectado.\");\n this.isClosedManually = false;\n this.isReconnecting = false;\n resolve();\n });\n\n this.ws.on(\"error\", (err) => {\n console.error(\"Erro na conex\u00E3o WebSocket:\", err);\n reject(err);\n });\n\n this.ws.on(\"close\", (code, reason) => {\n console.warn(`WebSocket desconectado: ${code} - ${reason}`);\n this.isReconnecting = false;\n this.emit(\"close\", { code, reason });\n });\n\n this.ws.on(\"message\", (rawData) => {\n this.handleMessage(rawData);\n });\n });\n }\n\n /**\n * Checks if the WebSocket connection is currently open.\n * @returns True if the connection is open, false otherwise.\n */\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n onMessage(callback: (data: any) => void): void {\n this.messageListeners.push(callback);\n }\n\n /**\n * Adds a listener for WebSocket events.\n * @param event - The event type to listen for.\n * @param callback - The function to call when the event occurs.\n * @returns The WebSocketClient instance for chaining.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.on(event, callback);\n return this;\n }\n\n /**\n * Removes a specific listener from a WebSocket event.\n * @param event - The event type to remove the listener from.\n * @param callback - The function to remove from the event listeners.\n * @returns The WebSocketClient instance for chaining.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.off(event, callback);\n return this;\n }\n\n /**\n * Removes all listeners for a specific event, or all events if no event is specified.\n * @param event - Optional. The event to remove all listeners from.\n * @returns The WebSocketClient instance for chaining.\n */\n removeAllListeners(event?: string | symbol): this {\n super.removeAllListeners(event);\n return this;\n }\n\n /**\n * Handles incoming WebSocket messages.\n * @param rawData - The raw data received from the WebSocket.\n */\n private handleMessage(rawData: WebSocket.Data): void {\n try {\n const decodedData = JSON.parse(rawData.toString()) as WebSocketEvent;\n if (decodedData?.type) {\n this.emit(decodedData.type, decodedData); // Emite evento baseado no tipo\n this.emit(\"message\", decodedData); // Emite um evento gen\u00E9rico para mensagens\n } else {\n console.warn(\"Mensagem recebida sem tipo:\", decodedData);\n }\n } catch (err) {\n console.error(\"Erro ao decodificar mensagem do WebSocket:\", err);\n }\n }\n\n /**\n * Sends data through the WebSocket connection.\n * @param data - The data to send.\n * @throws Will throw an error if the WebSocket is not connected.\n */\n send(data: any): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error(\"WebSocket n\u00E3o est\u00E1 conectado.\");\n }\n\n this.ws.send(data, (err) => {\n if (err) {\n console.error(\"Erro ao enviar dados pelo WebSocket:\", err);\n }\n });\n }\n\n /**\n * Closes the WebSocket connection manually.\n */\n close(): void {\n if (this.ws) {\n this.isClosedManually = true;\n this.ws.close();\n this.ws = null;\n console.log(\"WebSocket fechado manualmente.\");\n }\n }\n}\n", "import { type IBackOffOptions, backOff } from \"exponential-backoff\";\nimport { BaseClient } from \"./baseClient.js\";\nimport type {\n Application,\n ApplicationDetails,\n AriApplication,\n AriClientConfig,\n AsteriskInfo,\n Channel,\n ChannelVar,\n Endpoint,\n EndpointDetails,\n ExternalMediaOptions,\n Logging,\n Module,\n OriginateRequest,\n RTPStats,\n RecordingOptions,\n SnoopOptions,\n Sound,\n SoundListRequest,\n Variable,\n WebSocketEvent,\n WebSocketEventType,\n} from \"./interfaces\";\nimport type {\n Playback as APIPlayback,\n PlaybackControlRequest,\n} from \"./interfaces/playbacks.types\";\nimport { Applications } from \"./resources/applications.js\";\nimport { Asterisk } from \"./resources/asterisk\";\nimport { Bridges } from \"./resources/bridges\";\nimport { type ChannelInstance, Channels } from \"./resources/channels.js\";\nimport { Endpoints } from \"./resources/endpoints\";\nimport { type PlaybackInstance, Playbacks } from \"./resources/playbacks\";\nimport { Sounds } from \"./resources/sounds\";\nimport { isChannelEvent } from \"./utils\";\nimport { WebSocketClient } from \"./websocketClient.js\";\n\nexport class AriClient {\n private eventListeners: Map<string, (data: any) => void> = new Map();\n private wsClients: Map<string, WebSocketClient> = new Map(); // Map para armazenar conex\u00F5es por app\n private readonly baseClient: BaseClient;\n private isReconnecting: Map<string, boolean> = new Map(); // Estado de reconex\u00E3o por app\n private webSocketReady: Map<string, Promise<void>> = new Map(); // Rastreamento do estado de cada conex\u00E3o\n private channelInstances: Map<string, ChannelInstance> = new Map();\n private pendingListeners: {\n event: WebSocketEvent[\"type\"];\n callback: (data: any) => void;\n }[] = [];\n private processPendingListeners(): void {\n for (const [app, wsClient] of this.wsClients.entries()) {\n if (!wsClient.isConnected()) {\n console.warn(`WebSocket para o app '${app}' ainda n\u00E3o est\u00E1 conectado.`);\n continue;\n }\n\n while (this.pendingListeners.length > 0) {\n const { event, callback } = this.pendingListeners.shift()!;\n console.log(`Registrando listener para '${app}' no evento: ${event}`);\n wsClient.on(event, callback);\n }\n }\n }\n\n public channels: Channels;\n public endpoints: Endpoints;\n public applications: Applications;\n public playbacks: Playbacks;\n public sounds: Sounds;\n public asterisk: Asterisk;\n public bridges: Bridges;\n\n constructor(private config: AriClientConfig) {\n const httpProtocol = config.secure ? \"https\" : \"http\";\n const normalizedHost = config.host.replace(/^https?:\\/\\//, \"\");\n const baseUrl = `${httpProtocol}://${normalizedHost}:${config.port}/ari`;\n\n this.baseClient = new BaseClient(baseUrl, config.username, config.password);\n this.channels = new Channels(this.baseClient, this);\n this.endpoints = new Endpoints(this.baseClient);\n this.applications = new Applications(this.baseClient);\n this.playbacks = new Playbacks(this.baseClient);\n this.sounds = new Sounds(this.baseClient);\n this.asterisk = new Asterisk(this.baseClient);\n this.bridges = new Bridges(this.baseClient);\n }\n\n // Getter para wsClients\n public getWebSocketClients(): Map<string, WebSocketClient> {\n return this.wsClients;\n }\n\n /**\n * Registra um listener para eventos de WebSocket relacionados a canais.\n * @param eventType Tipo de evento.\n * @param callback Callback a ser executado quando o evento for recebido.\n */\n public onChannelEvent<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n if (this.wsClients.size === 0) {\n console.warn(\n \"Nenhuma conex\u00E3o WebSocket est\u00E1 ativa. O listener ser\u00E1 pendente.\",\n );\n this.pendingListeners.push({ event: eventType, callback });\n return;\n }\n\n for (const [app, wsClient] of this.wsClients.entries()) {\n console.log(`Registrando evento '${eventType}' no app '${app}'`);\n wsClient.on(eventType, callback);\n }\n }\n\n /**\n * Registra listeners globais para eventos de WebSocket.\n */\n public on<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n console.log(`Registrando listener global para evento: ${eventType}`);\n\n const wrappedCallback = (event: WebSocketEvent) => {\n if (isChannelEvent(event)) {\n const channelId = event.channel.id;\n\n if (channelId) {\n if (!this.channelInstances.has(channelId)) {\n const channelInstance = this.createChannelInstance(channelId);\n this.channelInstances.set(channelId, channelInstance);\n }\n\n event.instanceChannel = this.channelInstances.get(channelId);\n event.instanceChannel?.emit(event.type, event); // Propaga para o instanceChannel\n }\n }\n\n callback(event as Extract<WebSocketEvent, { type: T }>);\n };\n\n for (const [_app, wsClient] of this.wsClients.entries()) {\n wsClient.on(eventType, wrappedCallback);\n }\n\n this.eventListeners.set(eventType, wrappedCallback);\n }\n\n /**\n * Type guard to check if the given data object contains a valid channel property.\n * This function is used to narrow down the type of the data object and ensure it has a channel with an id.\n *\n * @param data - The object to be checked for the presence of a channel property.\n * @returns A type predicate indicating whether the data object contains a valid channel.\n * Returns true if the data object has a channel property with an id, false otherwise.\n */\n private hasChannel(data: any): data is { channel: Channel } {\n return data?.channel?.id !== undefined;\n }\n\n // M\u00E9todo para criar uma inst\u00E2ncia de ChannelInstance\n private createChannelInstance(channelId: string): ChannelInstance {\n return this.channels.createChannelInstance(channelId);\n }\n\n private handleWebSocketEvent(event: WebSocketEvent): void {\n console.log(\"Evento recebido no WebSocket:\", event.type, event);\n const { type, ...data } = event;\n\n if (this.hasChannel(data)) {\n const channelId = data.channel.id;\n\n if (channelId) {\n // Verifica se j\u00E1 existe uma inst\u00E2ncia de ChannelInstance\n if (!this.channelInstances.has(channelId)) {\n const channelInstance = this.createChannelInstance(channelId);\n this.channelInstances.set(channelId, channelInstance);\n }\n\n // Retorna apenas os dados do `Channel` para compatibilidade\n const channelInstance = this.channelInstances.get(channelId);\n if (channelInstance) {\n data.channel = { ...data.channel, ...channelInstance }; // Combina os dados do `Channel` com `ChannelInstance`\n }\n }\n }\n\n const listener = this.eventListeners.get(type);\n if (listener) {\n listener(data);\n }\n }\n\n /**\n * Connects to the ARI WebSocket for a specific application.\n * This function establishes a WebSocket connection to the Asterisk ARI, sets up event listeners,\n * and ensures the application is registered. It uses an exponential backoff strategy for connection attempts.\n *\n * @param app - The name of the application to connect to. This is required and used to identify the application in ARI.\n * @param subscribedEvents - Optional array of WebSocketEventType to subscribe to specific events.\n * If not provided or empty, it subscribes to all events.\n * @returns A Promise that resolves when the WebSocket connection is successfully established and the application is registered.\n * @throws Error if the 'app' parameter is not provided, or if connection attempts fail after multiple retries.\n */\n /**\n * Connects to the ARI WebSocket for one or more applications.\n * Establishes a WebSocket connection for each app and subscribes to events.\n *\n * @param apps - Array of application names to connect to.\n * @param subscribedEvents - Optional array of events to subscribe to.\n * If not provided or empty, subscribes to all events.\n * @returns A Promise that resolves when all connections are established.\n */\n async connectWebSocket(\n apps: string[],\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void[]> {\n if (!Array.isArray(apps) || apps.length === 0) {\n throw new Error(\"\u00C9 necess\u00E1rio fornecer pelo menos um aplicativo.\");\n }\n\n return Promise.all(\n apps.map(async (app) => {\n if (this.wsClients.has(app)) {\n console.log(`Conex\u00E3o WebSocket para '${app}' j\u00E1 existe. Ignorando.`);\n return; // Reutiliza conex\u00E3o existente\n }\n\n await this.connectSingleWebSocket(app, subscribedEvents);\n }),\n );\n }\n\n /**\n * Establishes a single WebSocket connection for a given app.\n */\n private async connectSingleWebSocket(\n app: string,\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void> {\n if (!app) {\n throw new Error(\"O nome do aplicativo \u00E9 obrigat\u00F3rio.\");\n }\n\n // Verifique se j\u00E1 existe um WebSocket para o app\n if (this.wsClients.has(app)) {\n console.log(`Conex\u00E3o WebSocket para '${app}' j\u00E1 existe. Reutilizando...`);\n return; // Reutiliza a conex\u00E3o existente\n }\n\n const protocol = this.config.secure ? \"wss\" : \"ws\";\n const eventsParam =\n subscribedEvents && subscribedEvents.length > 0\n ? `&event=${subscribedEvents.join(\",\")}`\n : \"&subscribeAll=true\";\n const wsUrl = `${protocol}://${encodeURIComponent(\n this.config.username,\n )}:${encodeURIComponent(this.config.password)}@${\n this.config.host\n }:${this.config.port}/ari/events?app=${app}${eventsParam}`;\n\n const wsClient = new WebSocketClient(wsUrl);\n\n try {\n await wsClient.connect();\n console.log(`WebSocket conectado para o app: ${app}`);\n\n // Registra eventos do WebSocket\n this.integrateWebSocketEvents(app, wsClient);\n\n // Garante que o app est\u00E1 registrado\n await this.ensureAppRegistered(app);\n\n // Adiciona ao Map de clientes\n this.wsClients.set(app, wsClient);\n } catch (error) {\n console.error(`Erro ao conectar WebSocket para '${app}':`, error);\n throw error;\n }\n }\n\n /**\n * Integrates WebSocket events with playback listeners.\n */\n private integrateWebSocketEvents(\n app: string,\n wsClient: WebSocketClient,\n ): void {\n if (!wsClient) {\n throw new Error(\n `WebSocket client para o app '${app}' n\u00E3o est\u00E1 conectado.`,\n );\n }\n\n // Verifica se os eventos j\u00E1 foram registrados\n if (wsClient.listenerCount(\"PlaybackStarted\") > 0) {\n console.log(`[${app}] Eventos j\u00E1 registrados. Ignorando.`);\n return; // Evita registrar eventos novamente\n }\n\n const eventHandlers: Partial<\n Record<WebSocketEventType, (data: WebSocketEvent) => void>\n > = {\n PlaybackStarted: (data) => {\n if (\"playbackId\" in data) {\n console.log(`[${app}] PlaybackStarted:`, data);\n }\n },\n PlaybackFinished: (data) => {\n if (\"playbackId\" in data) {\n console.log(`[${app}] PlaybackFinished:`, data);\n }\n },\n ChannelDtmfReceived: (data) => {\n if (data.type === \"ChannelDtmfReceived\" && \"digit\" in data) {\n console.log(`[${app}] DTMF recebido: ${data.digit}`);\n } else {\n console.warn(\n `[${app}] Evento inesperado em ChannelDtmfReceived`,\n data,\n );\n }\n },\n ChannelStateChange: (data) => {\n if (\"channel\" in data) {\n console.log(`[${app}] Estado do canal alterado:`, data.channel);\n }\n },\n };\n\n for (const [eventType, handler] of Object.entries(eventHandlers)) {\n if (handler) {\n wsClient.on(eventType as WebSocketEventType, handler);\n }\n }\n\n console.log(`[${app}] Todos os eventos do WebSocket foram registrados.`);\n }\n\n /**\n * Ensures the ARI application is registered.\n *\n * @param app - The application name to ensure is registered.\n * @returns {Promise<void>}\n */\n async ensureAppRegistered(app: string): Promise<void> {\n try {\n const apps = await this.baseClient.get<AriApplication[]>(\"/applications\");\n const appExists = apps.some((a: { name: string }) => a.name === app);\n\n if (!appExists) {\n console.log(`Registrando o aplicativo ARI: ${app}`);\n await this.baseClient.post(\"/applications\", { app });\n console.log(`Aplicativo ${app} registrado com sucesso.`);\n } else {\n console.log(`Aplicativo ${app} j\u00E1 est\u00E1 registrado.`);\n }\n } catch (error) {\n console.error(`Erro ao garantir o registro do aplicativo ${app}:`, error);\n throw error;\n }\n }\n\n /**\n * Checks if the WebSocket connection is active.\n *\n * @returns {boolean} True if connected, false otherwise.\n */\n anyWebSocketConnected(): boolean {\n // Verifica se todos os WebSockets em wsClients est\u00E3o conectados\n return Array.from(this.wsClients.values()).every((wsClient) =>\n wsClient.isConnected(),\n );\n }\n\n isWebSocketConnected(app: string): boolean {\n const wsClient = this.wsClients.get(app);\n return wsClient ? wsClient.isConnected() : false;\n }\n\n /**\n * Closes the WebSocket connection and removes all associated listeners.\n *\n * This function terminates the active WebSocket connection if one exists,\n * and cleans up by removing all event listeners attached to it. After calling\n * this function, the WebSocket client will be set to null, effectively\n * ending the connection and preparing for potential future connections.\n *\n * @returns {void} This function doesn't return a value.\n */\n closeWebSocket(app: string): void {\n const wsClient = this.wsClients.get(app);\n if (wsClient) {\n wsClient.close();\n this.wsClients.delete(app); // Remove o WebSocket do Map\n console.log(`WebSocket para o app '${app}' foi fechado.`);\n } else {\n console.warn(`WebSocket para o app '${app}' n\u00E3o encontrado.`);\n }\n }\n\n closeAllWebSockets(): void {\n this.wsClients.forEach((wsClient, app) => {\n wsClient.close();\n console.log(`WebSocket para o app '${app}' foi fechado.`);\n });\n this.wsClients.clear(); // Limpa o Map\n console.log(\"Todos os WebSockets foram fechados.\");\n }\n\n /**\n * Retrieves a list of active channels from the Asterisk ARI.\n *\n * @returns {Promise<Channel[]>} A promise resolving to the list of active channels.\n */\n /**\n * Lists all active channels.\n */\n async listChannels(): Promise<Channel[]> {\n return this.channels.list();\n }\n\n async hangupChannel(channelId: string): Promise<void> {\n return this.channels.hangup(channelId);\n }\n\n /**\n * Creates a new channel.\n */\n async originateChannel(data: OriginateRequest): Promise<Channel> {\n return this.channels.originate(data);\n }\n\n /**\n * Continues the dialplan for a specific channel.\n */\n async continueChannelDialplan(\n channelId: string,\n context?: string,\n extension?: string,\n priority?: number,\n label?: string,\n ): Promise<void> {\n return this.channels.continueDialplan(\n channelId,\n context,\n extension,\n priority,\n label,\n );\n }\n\n /**\n * Moves a channel to another Stasis application.\n */\n async moveChannelToApplication(\n channelId: string,\n app: string,\n appArgs?: string,\n ): Promise<void> {\n return this.channels.moveToApplication(channelId, app, appArgs);\n }\n\n /**\n * Sets a channel variable.\n */\n async setChannelVariable(\n channelId: string,\n variable: string,\n value: string,\n ): Promise<void> {\n return this.channels.setChannelVariable(channelId, variable, value);\n }\n\n /**\n * Gets a channel variable.\n */\n async getChannelVariable(\n channelId: string,\n variable: string,\n ): Promise<ChannelVar> {\n return this.channels.getChannelVariable(channelId, variable);\n }\n\n /**\n * Starts music on hold for a channel.\n */\n async startChannelMusicOnHold(channelId: string): Promise<void> {\n return this.channels.startMusicOnHold(channelId);\n }\n\n /**\n * Stops music on hold for a channel.\n */\n async stopChannelMusicOnHold(channelId: string): Promise<void> {\n return this.channels.stopMusicOnHold(channelId);\n }\n\n /**\n * Records audio from a channel.\n */\n async recordAudio(\n channelId: string,\n options: RecordingOptions,\n ): Promise<Channel> {\n return this.channels.record(channelId, options);\n }\n\n /**\n * Starts snooping on a channel.\n */\n async snoopChannel(\n channelId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n return this.channels.snoopChannel(channelId, options);\n }\n\n /**\n * Starts snooping on a channel with a specific snoop ID.\n */\n async snoopChannelWithId(\n channelId: string,\n snoopId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n return this.channels.snoopChannelWithId(channelId, snoopId, options);\n }\n\n /**\n * Initiates a dial operation on a previously created channel.\n * This function attempts to connect the specified channel to its configured destination.\n *\n * @param channelId - The unique identifier of the channel to dial.\n * @param caller - Optional. The caller ID to use for the outgoing call. If not provided, the default caller ID for the channel will be used.\n * @param timeout - Optional. The maximum time in seconds to wait for the dial operation to complete. If not specified, the system's default timeout will be used.\n * @returns A Promise that resolves when the dial operation has been initiated successfully. Note that this does not guarantee that the call was answered, only that dialing has begun.\n * @throws Will throw an error if the dial operation fails, e.g., if the channel doesn't exist or is in an invalid state.\n */\n async dialChannel(\n channelId: string,\n caller?: string,\n timeout?: number,\n ): Promise<void> {\n return this.channels.dial(channelId, caller, timeout);\n }\n\n /**\n * Retrieves RTP statistics for a channel.\n */\n async getRTPStatistics(channelId: string): Promise<RTPStats> {\n return this.channels.getRTPStatistics(channelId);\n }\n\n /**\n * Creates a channel to an external media source/sink.\n */\n async createExternalMedia(options: ExternalMediaOptions): Promise<Channel> {\n return this.channels.createExternalMedia(options);\n }\n\n /**\n * Redirects a channel to a different location.\n */\n async redirectChannel(channelId: string, endpoint: string): Promise<void> {\n return this.channels.redirectChannel(channelId, endpoint);\n }\n\n /**\n * Sends a ringing indication to a channel.\n */\n async ringChannel(channelId: string): Promise<void> {\n return this.channels.ringChannel(channelId);\n }\n\n /**\n * Stops the ringing indication on a specified channel in the Asterisk system.\n *\n * This function sends a request to the Asterisk server to cease the ringing\n * indication on a particular channel. This is typically used when you want to\n * stop the ringing sound on a channel without answering or hanging up the call.\n *\n * @param channelId - The unique identifier of the channel on which to stop the ringing.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n *\n * @returns A Promise that resolves when the ringing has been successfully stopped on the specified channel.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async stopRingChannel(channelId: string): Promise<void> {\n return this.channels.stopRingChannel(channelId);\n }\n\n /**\n * Sends DTMF (Dual-Tone Multi-Frequency) tones to a specified channel.\n *\n * This function allows sending DTMF tones to a channel, which can be used for various purposes\n * such as interacting with IVR systems or sending signals during a call.\n *\n * @param channelId - The unique identifier of the channel to send DTMF tones to.\n * @param dtmf - A string representing the DTMF tones to send (e.g., \"123#\").\n * @param options - Optional parameters to control the timing of DTMF tones.\n * @param options.before - The time (in milliseconds) to wait before sending DTMF.\n * @param options.between - The time (in milliseconds) to wait between each DTMF tone.\n * @param options.duration - The duration (in milliseconds) of each DTMF tone.\n * @param options.after - The time (in milliseconds) to wait after sending all DTMF tones.\n * @returns A Promise that resolves when the DTMF tones have been successfully sent.\n */\n async sendDTMF(\n channelId: string,\n dtmf: string,\n options?: {\n before?: number;\n between?: number;\n duration?: number;\n after?: number;\n },\n ): Promise<void> {\n return this.channels.sendDTMF(channelId, dtmf, options);\n }\n\n /**\n * Mutes a channel in the Asterisk system.\n *\n * This function initiates a mute operation on the specified channel, preventing\n * audio transmission in the specified direction(s).\n *\n * @param channelId - The unique identifier of the channel to be muted.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n * @param direction - The direction of audio to mute. Can be one of:\n * - \"both\": Mute both incoming and outgoing audio (default)\n * - \"in\": Mute only incoming audio\n * - \"out\": Mute only outgoing audio\n *\n * @returns A Promise that resolves when the mute operation has been successfully completed.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async muteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n return this.channels.muteChannel(channelId, direction);\n }\n\n /**\n * Unmutes a channel in the Asterisk system.\n *\n * This function removes the mute status from a specified channel, allowing audio\n * transmission to resume in the specified direction(s).\n *\n * @param channelId - The unique identifier of the channel to be unmuted.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n * @param direction - The direction of audio to unmute. Can be one of:\n * - \"both\": Unmute both incoming and outgoing audio (default)\n * - \"in\": Unmute only incoming audio\n * - \"out\": Unmute only outgoing audio\n *\n * @returns A Promise that resolves when the unmute operation has been successfully completed.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async unmuteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n return this.channels.unmuteChannel(channelId, direction);\n }\n\n /**\n * Puts a specified channel on hold.\n *\n * This function initiates a hold operation on the specified channel in the Asterisk system.\n * When a channel is put on hold, typically the audio is muted or replaced with hold music,\n * depending on the system configuration.\n *\n * @param channelId - The unique identifier of the channel to be put on hold.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n *\n * @returns A Promise that resolves when the hold operation has been successfully initiated.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async holdChannel(channelId: string): Promise<void> {\n return this.channels.holdChannel(channelId);\n }\n\n /**\n * Removes a specified channel from hold.\n *\n * This function initiates an unhold operation on the specified channel in the Asterisk system.\n * When a channel is taken off hold, it typically resumes normal audio transmission,\n * allowing the parties to continue their conversation.\n *\n * @param channelId - The unique identifier of the channel to be taken off hold.\n * This should be a string that uniquely identifies the channel in the Asterisk system.\n *\n * @returns A Promise that resolves when the unhold operation has been successfully initiated.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n */\n async unholdChannel(channelId: string): Promise<void> {\n return this.channels.unholdChannel(channelId);\n }\n\n /**\n * Creates a new channel in the Asterisk system using the provided originate request data.\n * This function initiates a new communication channel based on the specified parameters.\n *\n * @param data - An object containing the originate request data for channel creation.\n * This includes details such as the endpoint to call, the context to use,\n * and any variables to set on the new channel.\n * @param data.endpoint - The endpoint to call (e.g., \"SIP/1234\").\n * @param data.extension - The extension to dial after the channel is created.\n * @param data.context - The dialplan context to use for the new channel.\n * @param data.priority - The priority to start at in the dialplan.\n * @param data.app - The application to execute on the channel (alternative to extension/context/priority).\n * @param data.appArgs - The arguments to pass to the application, if 'app' is specified.\n * @param data.callerId - The caller ID to set on the new channel.\n * @param data.timeout - The timeout (in seconds) to wait for the channel to be answered.\n * @param data.variables - An object containing key-value pairs of channel variables to set.\n * @param data.channelId - An optional ID to assign to the new channel.\n * @param data.otherChannelId - The ID of another channel to bridge with after creation.\n *\n * @returns A Promise that resolves to the created Channel object.\n * The Channel object contains details about the newly created channel,\n * such as its unique identifier, state, and other relevant information.\n *\n * @throws Will throw an error if the channel creation fails for any reason,\n * such as invalid parameters or system issues.\n */\n async createChannel(data: OriginateRequest): Promise<Channel> {\n return this.channels.createChannel(data);\n }\n\n /**\n * Originates a new channel with a specified ID using the provided originate request data.\n *\n * @param channelId - The desired unique identifier for the new channel.\n * @param data - The originate request data containing channel creation parameters.\n * @returns A promise that resolves to the created Channel object.\n */\n async originateWithId(\n channelId: string,\n data: OriginateRequest,\n ): Promise<Channel> {\n return this.channels.originateWithId(channelId, data);\n }\n\n // M\u00E9todos relacionados a endpoints:\n\n /**\n * Lists all endpoints.\n *\n * @returns {Promise<Endpoint[]>} A promise resolving to the list of endpoints.\n */\n async listEndpoints(): Promise<Endpoint[]> {\n return this.endpoints.list();\n }\n\n /**\n * Retrieves details of a specific endpoint.\n *\n * @param technology - The technology of the endpoint.\n * @param resource - The resource name of the endpoint.\n * @returns {Promise<EndpointDetails>} A promise resolving to the details of the endpoint.\n */\n async getEndpointDetails(\n technology: string,\n resource: string,\n ): Promise<EndpointDetails> {\n return this.endpoints.getDetails(technology, resource);\n }\n\n /**\n * Sends a message to an endpoint.\n *\n * @param technology - The technology of the endpoint.\n * @param resource - The resource name of the endpoint.\n * @param body - The message body to send.\n * @returns {Promise<void>} A promise resolving when the message is sent.\n */\n async sendMessageToEndpoint(\n technology: string,\n resource: string,\n body: any,\n ): Promise<void> {\n return this.endpoints.sendMessage(technology, resource, body);\n }\n\n // M\u00E9todos relacionados a applications\n /**\n * Lists all applications.\n *\n * @returns {Promise<Application[]>} A promise resolving to the list of applications.\n */\n async listApplications(): Promise<Application[]> {\n return this.applications.list();\n }\n\n /**\n * Retrieves details of a specific application.\n *\n * @param appName - The name of the application.\n * @returns {Promise<ApplicationDetails>} A promise resolving to the application details.\n */\n async getApplicationDetails(appName: string): Promise<ApplicationDetails> {\n return this.applications.getDetails(appName);\n }\n\n /**\n * Sends a message to a specific application.\n *\n * @param appName - The name of the application.\n * @param body - The message body to send.\n * @returns {Promise<void>} A promise resolving when the message is sent successfully.\n */\n async sendMessageToApplication(appName: string, body: any): Promise<void> {\n return this.applications.sendMessage(appName, body);\n }\n\n // M\u00E9todos relacionados a playbacks\n /**\n * Retrieves details of a specific playback.\n *\n * @param playbackId - The unique identifier of the playback.\n * @returns {Promise<Playback>} A promise resolving to the playback details.\n */\n async getPlaybackDetails(playbackId: string): Promise<APIPlayback> {\n return this.playbacks.getDetails(playbackId);\n }\n\n /**\n * Controls a specific playback in the Asterisk server.\n * This function allows manipulation of an ongoing playback, such as pausing, resuming, or skipping.\n *\n * @param playbackId - The unique identifier of the playback to control.\n * This should be a string that uniquely identifies the playback in the Asterisk system.\n * @param controlRequest - An object containing the control operation details.\n * This object should conform to the PlaybackControlRequest interface,\n * which includes an 'operation' property specifying the control action to perform.\n * @returns A Promise that resolves when the control operation is successfully executed.\n * The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected with an error object.\n * @throws Will throw an error if the playback control operation fails, e.g., if the playback doesn't exist\n * or the requested operation is invalid.\n */\n async controlPlayback(\n playbackId: string,\n controlRequest: PlaybackControlRequest,\n ): Promise<void> {\n const { operation } = controlRequest; // Extrai a opera\u00E7\u00E3o do objeto\n return this.playbacks.control(playbackId, operation);\n }\n\n /**\n * Stops a specific playback in the Asterisk server.\n *\n * @param playbackId - The unique identifier of the playback to stop.\n * @returns A Promise that resolves when the playback is successfully stopped.\n */\n async stopPlayback(playbackId: string): Promise<void> {\n return this.playbacks.stop(playbackId);\n }\n\n /**\n * Retrieves a list of all available sounds in the Asterisk server.\n *\n * @param params - Optional parameters to filter the list of sounds.\n * @returns A Promise that resolves to an array of Sound objects representing the available sounds.\n */\n async listSounds(params?: SoundListRequest): Promise<Sound[]> {\n return this.sounds.list(params);\n }\n\n /**\n * Retrieves detailed information about a specific sound in the Asterisk server.\n *\n * @param soundId - The unique identifier of the sound to retrieve details for.\n * @returns A Promise that resolves to a Sound object containing the details of the specified sound.\n */\n async getSoundDetails(soundId: string): Promise<Sound> {\n return this.sounds.getDetails(soundId);\n }\n\n /**\n * Retrieves general information about the Asterisk server.\n *\n * @returns A Promise that resolves to an AsteriskInfo object containing server information.\n */\n async getAsteriskInfo(): Promise<AsteriskInfo> {\n return this.asterisk.getInfo();\n }\n\n /**\n * Retrieves a list of all loaded modules in the Asterisk server.\n *\n * @returns A Promise that resolves to an array of Module objects representing the loaded modules.\n */\n async listModules(): Promise<Module[]> {\n return this.asterisk.listModules();\n }\n\n /**\n * Manages a specific module in the Asterisk server by loading, unloading, or reloading it.\n *\n * @param moduleName - The name of the module to manage.\n * @param action - The action to perform on the module: \"load\", \"unload\", or \"reload\".\n * @returns A Promise that resolves when the module management action is completed successfully.\n */\n async manageModule(\n moduleName: string,\n action: \"load\" | \"unload\" | \"reload\",\n ): Promise<void> {\n return this.asterisk.manageModule(moduleName, action);\n }\n\n /**\n * Retrieves a list of all configured logging channels in the Asterisk server.\n *\n * @returns A Promise that resolves to an array of Logging objects representing the configured logging channels.\n */\n async listLoggingChannels(): Promise<Logging[]> {\n return this.asterisk.listLoggingChannels();\n }\n\n /**\n * Adds or removes a log channel in the Asterisk server.\n *\n * @param logChannelName - The name of the log channel to manage.\n * @param action - The action to perform: \"add\" to create a new log channel or \"remove\" to delete an existing one.\n * @param configuration - Optional configuration object for adding a log channel. Ignored when removing a channel.\n * @param configuration.type - The type of the log channel.\n * @param configuration.configuration - Additional configuration details for the log channel.\n * @returns A Promise that resolves when the log channel management action is completed successfully.\n */\n async manageLogChannel(\n logChannelName: string,\n action: \"add\" | \"remove\",\n configuration?: { type?: string; configuration?: string },\n ): Promise<void> {\n return this.asterisk.manageLogChannel(\n logChannelName,\n action,\n configuration,\n );\n }\n\n /**\n * Retrieves the value of a global variable from the Asterisk server.\n *\n * @param variableName - The name of the global variable to retrieve.\n * @returns A Promise that resolves to a Variable object containing the name and value of the global variable.\n */\n async getGlobalVariable(variableName: string): Promise<Variable> {\n return this.asterisk.getGlobalVariable(variableName);\n }\n\n /**\n * Sets a global variable in the Asterisk server.\n *\n * This function allows you to set or update the value of a global variable\n * in the Asterisk server. Global variables are accessible throughout the\n * entire Asterisk system and can be used for various purposes such as\n * configuration settings or sharing data between different parts of the system.\n *\n * @param variableName - The name of the global variable to set or update.\n * This should be a string identifying the variable uniquely.\n * @param value - The value to assign to the global variable. This can be any\n * string value, including empty strings.\n * @returns A Promise that resolves when the global variable has been successfully\n * set. The promise resolves to void, indicating no specific return value.\n * If an error occurs during the operation, the promise will be rejected\n * with an error object.\n */\n async setGlobalVariable(variableName: string, value: string): Promise<void> {\n return this.asterisk.setGlobalVariable(variableName, value);\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `ChannelInstance` para manipular canais localmente.\n *\n * @param channelId - O ID do canal, se dispon\u00EDvel. Caso contr\u00E1rio, a inst\u00E2ncia ser\u00E1 para um canal ainda n\u00E3o criado.\n * @returns Uma inst\u00E2ncia de `ChannelInstance` vinculada ao cliente atual.\n */\n Channel(channelId?: string): ChannelInstance {\n return this.channels.createChannelInstance(channelId);\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance` para manipular playbacks.\n *\n * @param playbackId - O ID do playback, se dispon\u00EDvel. Caso contr\u00E1rio, a inst\u00E2ncia ser\u00E1 para um playback ainda n\u00E3o inicializado.\n * @returns Uma inst\u00E2ncia de `PlaybackInstance` vinculada ao cliente atual.\n */\n Playback(playbackId?: string): PlaybackInstance {\n return this.playbacks.Playback(playbackId);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["axios", "import_events", "toQueryParams", "client", "toQueryParams", "import_events", "import_events", "WebSocket", "channelInstance"]
|
|
3
|
+
"sources": ["../../node_modules/exponential-backoff/src/options.ts", "../../node_modules/exponential-backoff/src/jitter/full/full.jitter.ts", "../../node_modules/exponential-backoff/src/jitter/no/no.jitter.ts", "../../node_modules/exponential-backoff/src/jitter/jitter.factory.ts", "../../node_modules/exponential-backoff/src/delay/delay.base.ts", "../../node_modules/exponential-backoff/src/delay/skip-first/skip-first.delay.ts", "../../node_modules/exponential-backoff/src/delay/always/always.delay.ts", "../../node_modules/exponential-backoff/src/delay/delay.factory.ts", "../../node_modules/exponential-backoff/src/backoff.ts", "../../src/index.ts", "../../src/ari-client/ariClient.ts", "../../src/ari-client/baseClient.ts", "../../src/ari-client/resources/applications.ts", "../../src/ari-client/resources/asterisk.ts", "../../src/ari-client/resources/bridges.ts", "../../src/ari-client/resources/channels.ts", "../../src/ari-client/utils.ts", "../../src/ari-client/resources/endpoints.ts", "../../src/ari-client/resources/playbacks.ts", "../../src/ari-client/resources/sounds.ts", "../../src/ari-client/websocketClient.ts"],
|
|
4
|
+
"sourcesContent": [null, null, null, null, null, null, null, null, null, "// Exporta a classe principal AriClient\nexport { AriClient } from \"./ari-client/ariClient.js\";\n\n// Exporta as classes dos recursos, caso o usu\u00E1rio precise us\u00E1-las diretamente\nexport { Channels, ChannelInstance } from \"./ari-client/resources/channels.js\";\nexport { Endpoints } from \"./ari-client/resources/endpoints.js\";\nexport { Applications } from \"./ari-client/resources/applications.js\";\nexport { Sounds } from \"./ari-client/resources/sounds.js\";\nexport {\n Playbacks,\n PlaybackInstance,\n} from \"./ari-client/resources/playbacks.js\";\nexport { Asterisk } from \"./ari-client/resources/asterisk.js\";\nexport { Bridges } from \"./ari-client/resources/bridges.js\";\n\n// Exporta interfaces importantes para tipagem\nexport type {\n AriClientConfig,\n Channel,\n Endpoint,\n Playback,\n Application,\n Sound,\n AsteriskInfo,\n Module,\n Logging,\n Variable,\n WebSocketEvent,\n WebSocketEventType,\n OriginateRequest,\n PlaybackOptions,\n RTPStats,\n RecordingOptions,\n SnoopOptions,\n ExternalMediaOptions,\n ChannelPlayback,\n ChannelVar,\n ChannelDialplan,\n AriApplication,\n EndpointDetails,\n PlaybackControlRequest,\n ApplicationDetails,\n SoundListRequest,\n PlayMediaRequest,\n Bridge,\n BridgePlayback,\n CreateBridgeRequest,\n RemoveChannelRequest,\n AddChannelRequest,\n ChannelEvent,\n PlaybackEvent,\n} from \"./ari-client/interfaces/index.js\";\n", "import { type IBackOffOptions, backOff } from \"exponential-backoff\";\nimport { BaseClient } from \"./baseClient.js\";\nimport type {\n AriApplication,\n AriClientConfig,\n Channel,\n WebSocketEvent,\n WebSocketEventType,\n} from \"./interfaces\";\nimport { Applications } from \"./resources/applications.js\";\nimport { Asterisk } from \"./resources/asterisk\";\nimport { Bridges } from \"./resources/bridges\";\nimport { type ChannelInstance, Channels } from \"./resources/channels.js\";\nimport { Endpoints } from \"./resources/endpoints\";\nimport { type PlaybackInstance, Playbacks } from \"./resources/playbacks\";\nimport { Sounds } from \"./resources/sounds\";\nimport { isChannelEvent } from \"./utils\";\nimport { WebSocketClient } from \"./websocketClient.js\";\n\nexport class AriClient {\n private eventListeners: Map<string, (data: any) => void> = new Map();\n private wsClients: Map<string, WebSocketClient> = new Map(); // Map para armazenar conex\u00F5es por app\n private readonly baseClient: BaseClient;\n private isReconnecting: Map<string, boolean> = new Map(); // Estado de reconex\u00E3o por app\n private webSocketReady: Map<string, Promise<void>> = new Map(); // Rastreamento do estado de cada conex\u00E3o\n private channelInstances: Map<string, ChannelInstance> = new Map();\n private pendingListeners: {\n event: WebSocketEvent[\"type\"];\n callback: (data: any) => void;\n }[] = [];\n private processPendingListeners(): void {\n for (const [app, wsClient] of this.wsClients.entries()) {\n if (!wsClient.isConnected()) {\n console.warn(`WebSocket para o app '${app}' ainda n\u00E3o est\u00E1 conectado.`);\n continue; // Pule apps sem conex\u00E3o\n }\n\n // Processar listeners pendentes\n while (this.pendingListeners.length > 0) {\n const { event, callback } = this.pendingListeners.shift()!;\n\n // Evita duplicar listeners\n if (wsClient.listenerCount(event) > 0) {\n console.log(\n `Listener j\u00E1 registrado para o evento '${event}' no app '${app}'. Ignorando duplicata.`,\n );\n continue;\n }\n\n console.log(`Registrando listener para '${app}' no evento: ${event}`);\n wsClient.on(event, callback);\n }\n }\n }\n\n private async reconnectWebSocket(app: string): Promise<void> {\n console.log(`Tentando reconectar o WebSocket para o app '${app}'...`);\n\n try {\n await this.connectSingleWebSocket(app);\n this.processPendingListeners(); // Reprocessa listeners ap\u00F3s reconex\u00E3o\n console.log(`Reconex\u00E3o bem-sucedida para o app '${app}'.`);\n } catch (error) {\n console.error(`Erro ao reconectar o WebSocket para '${app}':`, error);\n }\n }\n\n public channels: Channels;\n public endpoints: Endpoints;\n public applications: Applications;\n public playbacks: Playbacks;\n public sounds: Sounds;\n public asterisk: Asterisk;\n public bridges: Bridges;\n\n constructor(private config: AriClientConfig) {\n const httpProtocol = config.secure ? \"https\" : \"http\";\n const normalizedHost = config.host.replace(/^https?:\\/\\//, \"\");\n const baseUrl = `${httpProtocol}://${normalizedHost}:${config.port}/ari`;\n\n this.baseClient = new BaseClient(baseUrl, config.username, config.password);\n this.channels = new Channels(this.baseClient, this);\n this.playbacks = new Playbacks(this.baseClient, this);\n this.endpoints = new Endpoints(this.baseClient);\n this.applications = new Applications(this.baseClient);\n this.sounds = new Sounds(this.baseClient);\n this.asterisk = new Asterisk(this.baseClient);\n this.bridges = new Bridges(this.baseClient);\n }\n\n // Getter para wsClients\n public getWebSocketClients(): Map<string, WebSocketClient> {\n return this.wsClients;\n }\n\n /**\n * Registra listeners globais para eventos de WebSocket.\n */\n public on<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n console.log(`Registrando listener global para evento: ${eventType}`);\n\n const wrappedCallback = (event: WebSocketEvent) => {\n if (isChannelEvent(event)) {\n const channelId = event.channel.id;\n\n if (channelId) {\n if (!this.channelInstances.has(channelId)) {\n const channelInstance = this.createChannelInstance(channelId);\n this.channelInstances.set(channelId, channelInstance);\n }\n\n event.instanceChannel = this.channelInstances.get(channelId);\n event.instanceChannel?.emit(event.type, event); // Propaga para o instanceChannel\n }\n }\n\n callback(event as Extract<WebSocketEvent, { type: T }>);\n };\n\n for (const [_app, wsClient] of this.wsClients.entries()) {\n wsClient.on(eventType, wrappedCallback);\n }\n\n this.eventListeners.set(eventType, wrappedCallback);\n }\n\n /**\n * Type guard to check if the given data object contains a valid channel property.\n * This function is used to narrow down the type of the data object and ensure it has a channel with an id.\n *\n * @param data - The object to be checked for the presence of a channel property.\n * @returns A type predicate indicating whether the data object contains a valid channel.\n * Returns true if the data object has a channel property with an id, false otherwise.\n */\n private hasChannel(data: any): data is { channel: Channel } {\n return data?.channel?.id !== undefined;\n }\n\n // M\u00E9todo para criar uma inst\u00E2ncia de ChannelInstance\n private createChannelInstance(channelId: string): ChannelInstance {\n return this.channels.Channel(channelId);\n }\n\n private handleWebSocketEvent(event: WebSocketEvent): void {\n console.log(\"Evento recebido no WebSocket:\", event.type, event);\n const { type, ...data } = event;\n\n if (this.hasChannel(data)) {\n const channelId = data.channel.id;\n\n if (channelId) {\n // Verifica se j\u00E1 existe uma inst\u00E2ncia de ChannelInstance\n if (!this.channelInstances.has(channelId)) {\n const channelInstance = this.createChannelInstance(channelId);\n this.channelInstances.set(channelId, channelInstance);\n }\n\n // Retorna apenas os dados do `Channel` para compatibilidade\n const channelInstance = this.channelInstances.get(channelId);\n if (channelInstance) {\n data.channel = { ...data.channel, ...channelInstance }; // Combina os dados do `Channel` com `ChannelInstance`\n }\n }\n }\n\n const listener = this.eventListeners.get(type);\n if (listener) {\n listener(data);\n }\n }\n\n /**\n * Connects to the ARI WebSocket for a specific application.\n * This function establishes a WebSocket connection to the Asterisk ARI, sets up event listeners,\n * and ensures the application is registered. It uses an exponential backoff strategy for connection attempts.\n *\n * @param app - The name of the application to connect to. This is required and used to identify the application in ARI.\n * @param subscribedEvents - Optional array of WebSocketEventType to subscribe to specific events.\n * If not provided or empty, it subscribes to all events.\n * @returns A Promise that resolves when the WebSocket connection is successfully established and the application is registered.\n * @throws Error if the 'app' parameter is not provided, or if connection attempts fail after multiple retries.\n */\n /**\n * Connects to the ARI WebSocket for one or more applications.\n * Establishes a WebSocket connection for each app and subscribes to events.\n *\n * @param apps - Array of application names to connect to.\n * @param subscribedEvents - Optional array of events to subscribe to.\n * If not provided or empty, subscribes to all events.\n * @returns A Promise that resolves when all connections are established.\n */\n async connectWebSocket(\n apps: string[],\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void[]> {\n if (!Array.isArray(apps) || apps.length === 0) {\n throw new Error(\"\u00C9 necess\u00E1rio fornecer pelo menos um aplicativo.\");\n }\n\n return Promise.all(\n apps.map(async (app) => {\n if (this.wsClients.has(app)) {\n console.log(`Conex\u00E3o WebSocket para '${app}' j\u00E1 existe. Ignorando.`);\n return; // Reutiliza conex\u00E3o existente\n }\n\n await this.connectSingleWebSocket(app, subscribedEvents);\n }),\n );\n }\n\n /**\n * Establishes a single WebSocket connection for a given app.\n */\n private async connectSingleWebSocket(\n app: string,\n subscribedEvents?: WebSocketEventType[],\n ): Promise<void> {\n if (!app) {\n throw new Error(\"O nome do aplicativo \u00E9 obrigat\u00F3rio.\");\n }\n\n // Evitar m\u00FAltiplas tentativas simult\u00E2neas para o mesmo app\n if (this.webSocketReady.get(app)) {\n console.log(`Conex\u00E3o WebSocket para '${app}' j\u00E1 est\u00E1 ativa.`);\n return this.webSocketReady.get(app)!;\n }\n\n const protocol = this.config.secure ? \"wss\" : \"ws\";\n const eventsParam =\n subscribedEvents && subscribedEvents.length > 0\n ? `&event=${subscribedEvents.join(\",\")}`\n : \"&subscribeAll=true\";\n const wsUrl = `${protocol}://${encodeURIComponent(\n this.config.username,\n )}:${encodeURIComponent(this.config.password)}@${\n this.config.host\n }:${this.config.port}/ari/events?app=${app}${eventsParam}`;\n\n // Configura\u00E7\u00E3o de backoff\n const backoffOptions: IBackOffOptions = {\n delayFirstAttempt: false,\n startingDelay: 1000,\n timeMultiple: 2,\n maxDelay: 30000,\n numOfAttempts: 10,\n jitter: \"full\",\n retry: (error: any, attemptNumber: number) => {\n console.warn(\n `Tentativa ${attemptNumber} falhou para '${app}': ${error.message}`,\n );\n\n // Verifica se algum WebSocket no wsClients ainda n\u00E3o est\u00E1 conectado\n return (\n !this.wsClients.has(app) || !this.wsClients.get(app)?.isConnected()\n );\n },\n };\n\n // Promessa para gerenciar a conex\u00E3o\n const webSocketPromise = new Promise<void>(async (resolve, reject) => {\n try {\n if (this.isReconnecting.get(app)) {\n console.warn(`J\u00E1 est\u00E1 tentando reconectar para o app '${app}'.`);\n return;\n }\n\n this.isReconnecting.set(app, true);\n\n const wsClient = new WebSocketClient(wsUrl);\n\n await backOff(async () => {\n if (!wsClient) {\n throw new Error(\"WebSocketClient instance is null.\");\n }\n\n await wsClient.connect();\n console.log(`WebSocket conectado para o app: ${app}`);\n\n // Integrar eventos do WebSocket\n this.integrateWebSocketEvents(app, wsClient);\n\n // Garante que o app est\u00E1 registrado\n await this.ensureAppRegistered(app);\n\n // Adiciona o WebSocket ao Map\n this.wsClients.set(app, wsClient);\n\n // Chamar processPendingListeners ap\u00F3s a conex\u00E3o\n this.processPendingListeners();\n }, backoffOptions);\n\n resolve(); // Conex\u00E3o bem-sucedida\n } catch (error) {\n console.error(`Erro ao conectar WebSocket para '${app}':`, error);\n reject(error);\n } finally {\n this.isReconnecting.delete(app);\n }\n });\n\n this.webSocketReady.set(app, webSocketPromise);\n return webSocketPromise;\n }\n\n /**\n * Integrates WebSocket events with playback listeners.\n */\n private integrateWebSocketEvents(\n app: string,\n wsClient: WebSocketClient,\n ): void {\n if (!wsClient) {\n throw new Error(\n `WebSocket client para o app '${app}' n\u00E3o est\u00E1 conectado.`,\n );\n }\n\n // Verifica se os eventos j\u00E1 foram registrados\n if (wsClient.listenerCount(\"PlaybackStarted\") > 0) {\n console.log(`[${app}] Eventos j\u00E1 registrados. Ignorando.`);\n return; // Evita registrar eventos novamente\n }\n\n const eventHandlers: Partial<\n Record<WebSocketEventType, (data: WebSocketEvent) => void>\n > = {\n PlaybackStarted: (data) => {\n if (\"playbackId\" in data) {\n console.log(`[${app}] PlaybackStarted:`, data);\n }\n },\n PlaybackFinished: (data) => {\n if (\"playbackId\" in data) {\n console.log(`[${app}] PlaybackFinished:`, data);\n }\n },\n ChannelDtmfReceived: (data) => {\n if (data.type === \"ChannelDtmfReceived\" && \"digit\" in data) {\n console.log(`[${app}] DTMF recebido: ${data.digit}`);\n } else {\n console.warn(\n `[${app}] Evento inesperado em ChannelDtmfReceived`,\n data,\n );\n }\n },\n ChannelStateChange: (data) => {\n if (\"channel\" in data) {\n console.log(`[${app}] Estado do canal alterado:`, data.channel);\n }\n },\n };\n\n for (const [eventType, handler] of Object.entries(eventHandlers)) {\n if (handler) {\n wsClient.on(eventType as WebSocketEventType, handler);\n }\n }\n\n console.log(`[${app}] Todos os eventos do WebSocket foram registrados.`);\n }\n\n /**\n * Ensures the ARI application is registered.\n *\n * @param app - The application name to ensure is registered.\n * @returns {Promise<void>}\n */\n async ensureAppRegistered(app: string): Promise<void> {\n try {\n const apps = await this.baseClient.get<AriApplication[]>(\"/applications\");\n const appExists = apps.some((a: { name: string }) => a.name === app);\n\n if (!appExists) {\n console.log(`Registrando o aplicativo ARI: ${app}`);\n await this.baseClient.post(\"/applications\", { app });\n console.log(`Aplicativo ${app} registrado com sucesso.`);\n } else {\n console.log(`Aplicativo ${app} j\u00E1 est\u00E1 registrado.`);\n }\n } catch (error) {\n console.error(`Erro ao garantir o registro do aplicativo ${app}:`, error);\n throw error;\n }\n }\n\n /**\n * Checks if the WebSocket connection is active.\n *\n * @returns {boolean} True if connected, false otherwise.\n */\n anyWebSocketConnected(): boolean {\n // Verifica se todos os WebSockets em wsClients est\u00E3o conectados\n return Array.from(this.wsClients.values()).every((wsClient) =>\n wsClient.isConnected(),\n );\n }\n\n isWebSocketConnected(app: string): boolean {\n const wsClient = this.wsClients.get(app);\n return wsClient ? wsClient.isConnected() : false;\n }\n\n /**\n * Closes the WebSocket connection and removes all associated listeners.\n *\n * This function terminates the active WebSocket connection if one exists,\n * and cleans up by removing all event listeners attached to it. After calling\n * this function, the WebSocket client will be set to null, effectively\n * ending the connection and preparing for potential future connections.\n *\n * @returns {void} This function doesn't return a value.\n */\n closeWebSocket(app: string): void {\n const wsClient = this.wsClients.get(app);\n if (wsClient) {\n wsClient.close();\n this.wsClients.delete(app); // Remove o WebSocket do Map\n console.log(`WebSocket para o app '${app}' foi fechado.`);\n } else {\n console.warn(`WebSocket para o app '${app}' n\u00E3o encontrado.`);\n }\n }\n\n closeAllWebSockets(): void {\n this.wsClients.forEach((wsClient, app) => {\n wsClient.close();\n console.log(`WebSocket para o app '${app}' foi fechado.`);\n });\n this.wsClients.clear(); // Limpa o Map\n console.log(\"Todos os WebSockets foram fechados.\");\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `ChannelInstance` para manipular canais localmente.\n *\n * @param channelId - O ID do canal, se dispon\u00EDvel. Caso contr\u00E1rio, a inst\u00E2ncia ser\u00E1 para um canal ainda n\u00E3o criado.\n * @returns Uma inst\u00E2ncia de `ChannelInstance` vinculada ao cliente atual.\n */\n Channel(channelId?: string): ChannelInstance {\n return this.channels.Channel(channelId);\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance` para manipular playbacks.\n *\n * @param playbackId - O ID do playback, se dispon\u00EDvel. Caso contr\u00E1rio, a inst\u00E2ncia ser\u00E1 para um playback ainda n\u00E3o inicializado.\n * @returns Uma inst\u00E2ncia de `PlaybackInstance` vinculada ao cliente atual.\n */\n Playback(playbackId?: string): PlaybackInstance {\n return this.playbacks.Playback(playbackId);\n }\n}\n", "import { EventEmitter } from \"events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport type { WebSocketEvent } from \"./interfaces\";\nimport type { WebSocketClient } from \"./websocketClient\";\n\nexport class BaseClient {\n private client: AxiosInstance;\n private eventEmitter = new EventEmitter();\n private wsClients: Map<string, WebSocketClient> = new Map(); // Gerencia os WebSocket clients\n\n constructor(baseUrl: string, username: string, password: string) {\n this.client = axios.create({\n baseURL: baseUrl,\n auth: { username, password },\n });\n }\n\n /**\n * Executes a GET request.\n * @param path - The API endpoint path.\n */\n async get<T>(path: string): Promise<T> {\n const response = await this.client.get<T>(path);\n return response.data;\n }\n\n /**\n * Executes a POST request.\n * @param path - The API endpoint path.\n * @param data - Optional payload to send with the request.\n */\n async post<T>(path: string, data?: unknown): Promise<T> {\n const response = await this.client.post<T>(path, data);\n return response.data;\n }\n\n /**\n * Executes a PUT request.\n * @param path - The API endpoint path.\n * @param data - Payload to send with the request.\n */\n async put<T>(path: string, data: unknown): Promise<T> {\n const response = await this.client.put<T>(path, data);\n return response.data;\n }\n\n /**\n * Executes a DELETE request.\n * @param path - The API endpoint path.\n */\n async delete<T>(path: string): Promise<T> {\n const response = await this.client.delete<T>(path);\n return response.data;\n }\n\n // Gerenciamento de WebSocket clients\n\n /**\n * Adiciona um WebSocket client ao gerenciador.\n * @param app - Nome do aplicativo ou contexto associado.\n * @param wsClient - Inst\u00E2ncia do WebSocketClient.\n */\n addWebSocketClient(app: string, wsClient: WebSocketClient): void {\n if (this.wsClients.has(app)) {\n throw new Error(`J\u00E1 existe um WebSocket client registrado para '${app}'`);\n }\n this.wsClients.set(app, wsClient);\n console.log(`WebSocket client adicionado para '${app}'`);\n }\n\n /**\n * Remove um WebSocket client do gerenciador.\n * @param app - Nome do aplicativo ou contexto associado.\n */\n removeWebSocketClient(app: string): void {\n if (!this.wsClients.has(app)) {\n throw new Error(`Nenhum WebSocket client encontrado para '${app}'`);\n }\n this.wsClients.delete(app);\n console.log(`WebSocket client removido para '${app}'`);\n }\n\n /**\n * Obt\u00E9m todos os WebSocket clients.\n * @returns Um Map contendo todos os WebSocket clients registrados.\n */\n getWebSocketClients(): Map<string, WebSocketClient> {\n return this.wsClients;\n }\n\n /**\n * Obt\u00E9m um WebSocket client espec\u00EDfico.\n * @param app - Nome do aplicativo ou contexto associado.\n * @returns O WebSocket client correspondente.\n */\n getWebSocketClient(app: string): WebSocketClient | undefined {\n return this.wsClients.get(app);\n }\n\n // Gerenciamento de eventos WebSocket\n\n onWebSocketEvent(callback: (event: WebSocketEvent) => void): void {\n console.log(\"Registrando callback para eventos do WebSocket\");\n this.eventEmitter.on(\"websocketEvent\", (event) => {\n console.log(\"Evento recebido no BaseClient:\", event);\n callback(event);\n });\n }\n\n emitWebSocketEvent(event: WebSocketEvent): void {\n console.log(\"Emitindo evento do WebSocket:\", event);\n this.eventEmitter.emit(\"websocketEvent\", event);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n Application,\n ApplicationDetails,\n} from \"../interfaces/applications.types.js\";\n\nexport interface ApplicationMessage {\n event: string;\n data?: Record<string, any>;\n}\n\nexport class Applications {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all applications.\n * \n * @returns A promise that resolves to an array of Application objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(): Promise<Application[]> {\n const applications = await this.client.get<unknown>(\"/applications\");\n\n if (!Array.isArray(applications)) {\n throw new Error(\"Resposta da API /applications n\u00E3o \u00E9 um array.\");\n }\n\n return applications as Application[];\n }\n\n /**\n * Retrieves details of a specific application.\n * \n * @param appName - The name of the application to retrieve details for.\n * @returns A promise that resolves to an ApplicationDetails object.\n * @throws {Error} If there's an error fetching the application details.\n */\n async getDetails(appName: string): Promise<ApplicationDetails> {\n try {\n return await this.client.get<ApplicationDetails>(\n `/applications/${appName}`,\n );\n } catch (error) {\n console.error(`Erro ao obter detalhes do aplicativo ${appName}:`, error);\n throw error;\n }\n }\n\n /**\n * Sends a message to a specific application.\n * \n * @param appName - The name of the application to send the message to.\n * @param body - The message to be sent, containing an event and optional data.\n * @returns A promise that resolves when the message is successfully sent.\n */\n async sendMessage(appName: string, body: ApplicationMessage): Promise<void> {\n await this.client.post<void>(`/applications/${appName}/messages`, body);\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { AsteriskInfo, Logging, Module, Variable } from \"../interfaces\";\n\nfunction toQueryParams<T>(options: T): string {\n return new URLSearchParams(\n Object.entries(options as Record<string, string>)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, String(value)]),\n ).toString();\n}\n\nexport class Asterisk {\n constructor(private client: BaseClient) {}\n\n /**\n * Retrieves information about the Asterisk server.\n */\n async getInfo(): Promise<AsteriskInfo> {\n return this.client.get<AsteriskInfo>(\"/asterisk/info\");\n }\n\n /**\n * Lists all loaded modules in the Asterisk server.\n */\n async listModules(): Promise<Module[]> {\n return this.client.get<Module[]>(\"/asterisk/modules\");\n }\n\n /**\n * Manages a specific module in the Asterisk server.\n *\n * @param moduleName - The name of the module to manage.\n * @param action - The action to perform on the module: \"load\", \"unload\", or \"reload\".\n * @returns A promise that resolves when the action is completed successfully.\n * @throws {Error} Throws an error if the HTTP method or action is invalid.\n */\n async manageModule(\n moduleName: string,\n action: \"load\" | \"unload\" | \"reload\",\n ): Promise<void> {\n const url = `/asterisk/modules/${moduleName}`;\n switch (action) {\n case \"load\":\n await this.client.post<void>(`${url}?action=load`);\n break;\n case \"unload\":\n await this.client.delete<void>(url);\n break;\n case \"reload\":\n await this.client.put<void>(url, {});\n break;\n default:\n throw new Error(`A\u00E7\u00E3o inv\u00E1lida: ${action}`);\n }\n }\n\n /**\n * Retrieves all configured logging channels.\n */\n async listLoggingChannels(): Promise<Logging[]> {\n return this.client.get<Logging[]>(\"/asterisk/logging\");\n }\n\n /**\n * Adds or removes a log channel in the Asterisk server.\n */\n async manageLogChannel(\n logChannelName: string,\n action: \"add\" | \"remove\",\n configuration?: { type?: string; configuration?: string },\n ): Promise<void> {\n const queryParams = toQueryParams(configuration || {});\n return this.client.post<void>(\n `/asterisk/logging/${logChannelName}?action=${encodeURIComponent(action)}&${queryParams}`,\n );\n }\n\n /**\n * Retrieves the value of a global variable.\n */\n async getGlobalVariable(variableName: string): Promise<Variable> {\n return this.client.get<Variable>(\n `/asterisk/variables?variable=${encodeURIComponent(variableName)}`,\n );\n }\n\n /**\n * Sets a global variable.\n */\n async setGlobalVariable(variableName: string, value: string): Promise<void> {\n return this.client.post<void>(\n `/asterisk/variables?variable=${encodeURIComponent(variableName)}&value=${encodeURIComponent(value)}`,\n );\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type {\n AddChannelRequest,\n Bridge,\n BridgePlayback,\n CreateBridgeRequest,\n PlayMediaRequest,\n RemoveChannelRequest,\n} from \"../interfaces/bridges.types.js\";\n\nexport class Bridges {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all active bridges.\n */\n async list(): Promise<Bridge[]> {\n return this.client.get<Bridge[]>(\"/bridges\");\n }\n\n /**\n * Creates a new bridge.\n */\n async createBridge(request: CreateBridgeRequest): Promise<Bridge> {\n return this.client.post<Bridge>(\"/bridges\", request);\n }\n\n /**\n * Retrieves details of a specific bridge.\n */\n async getDetails(bridgeId: string): Promise<Bridge> {\n return this.client.get<Bridge>(`/bridges/${bridgeId}`);\n }\n\n /**\n * Destroys (deletes) a specific bridge.\n */\n async destroy(bridgeId: string): Promise<void> {\n return this.client.delete<void>(`/bridges/${bridgeId}`);\n }\n\n /**\n * Adds a channel or multiple channels to a bridge.\n */\n async addChannels(\n bridgeId: string,\n request: AddChannelRequest,\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n channel: Array.isArray(request.channel)\n ? request.channel.join(\",\")\n : request.channel,\n ...(request.role && { role: request.role }),\n }).toString();\n\n await this.client.post<void>(\n `/bridges/${bridgeId}/addChannel?${queryParams}`,\n );\n }\n\n /**\n * Removes a channel or multiple channels from a bridge.\n */\n async removeChannels(\n bridgeId: string,\n request: RemoveChannelRequest,\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n channel: Array.isArray(request.channel)\n ? request.channel.join(\",\")\n : request.channel,\n }).toString();\n\n await this.client.post<void>(\n `/bridges/${bridgeId}/removeChannel?${queryParams}`,\n );\n }\n\n /**\n * Plays media to a bridge.\n */\n async playMedia(\n bridgeId: string,\n request: PlayMediaRequest,\n ): Promise<BridgePlayback> {\n const queryParams = new URLSearchParams({\n ...(request.lang && { lang: request.lang }),\n ...(request.offsetms && { offsetms: request.offsetms.toString() }),\n ...(request.skipms && { skipms: request.skipms.toString() }),\n ...(request.playbackId && { playbackId: request.playbackId }),\n }).toString();\n\n return this.client.post<BridgePlayback>(\n `/bridges/${bridgeId}/play?${queryParams}`,\n { media: request.media },\n );\n }\n\n /**\n * Stops media playback on a bridge.\n */\n async stopPlayback(bridgeId: string, playbackId: string): Promise<void> {\n await this.client.delete<void>(`/bridges/${bridgeId}/play/${playbackId}`);\n }\n\n /**\n * Sets the video source for a bridge.\n */\n async setVideoSource(bridgeId: string, channelId: string): Promise<void> {\n await this.client.post<void>(\n `/bridges/${bridgeId}/videoSource?channelId=${encodeURIComponent(channelId)}`,\n );\n }\n\n /**\n * Clears the video source for a bridge.\n */\n async clearVideoSource(bridgeId: string): Promise<void> {\n await this.client.delete<void>(`/bridges/${bridgeId}/videoSource`);\n }\n}\n", "import { EventEmitter } from \"events\";\nimport type { AriClient } from \"../ariClient\";\nimport type { BaseClient } from \"../baseClient.js\";\nimport type {\n Channel,\n ChannelPlayback,\n ChannelVar,\n ExternalMediaOptions,\n OriginateRequest,\n PlaybackOptions,\n RTPStats,\n RecordingOptions,\n SnoopOptions,\n WebSocketEvent,\n} from \"../interfaces\";\nimport { isChannelEvent, toQueryParams } from \"../utils\";\nimport type { PlaybackInstance } from \"./playbacks\";\n\nexport class ChannelInstance extends EventEmitter {\n private channelData: Channel | null = null;\n public id: string; // ID do canal\n\n constructor(\n private client: AriClient,\n private baseClient: BaseClient,\n private channelId: string = `channel-${Date.now()}`, // Gera um ID padr\u00E3o se n\u00E3o fornecido\n ) {\n super();\n\n this.id = channelId || `channel-${Date.now()}`; // Inicializa o ID do canal\n\n const wsClients = this.client.getWebSocketClients();\n const wsClient = Array.from(wsClients.values()).find((client) =>\n client.isConnected(),\n );\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para o canal: ${this.id}`,\n );\n }\n\n wsClient.on(\"message\", (event: WebSocketEvent) => {\n if (isChannelEvent(event, this.id)) {\n console.log(`Evento recebido no ChannelInstance: ${event.type}`, event);\n this.emit(event.type, event); // Emite evento para o ChannelInstance\n }\n });\n }\n\n /**\n * Adiciona um listener para eventos de canal.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.on(event, callback);\n return this;\n }\n\n /**\n * Adiciona um listener para ser chamado apenas uma vez.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.once(event, callback);\n return this;\n }\n\n /**\n * Remove um listener espec\u00EDfico.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.off(event, callback);\n return this;\n }\n\n async answer(): Promise<void> {\n await this.baseClient.post<void>(`/channels/${this.id}/answer`);\n }\n\n /**\n * Origina um canal f\u00EDsico no Asterisk.\n */\n async originate(data: OriginateRequest): Promise<Channel> {\n if (this.channelData) {\n throw new Error(\"O canal j\u00E1 foi criado.\");\n }\n\n const channel = await this.baseClient.post<Channel>(\"/channels\", data);\n this.channelData = channel;\n\n return channel;\n }\n\n /**\n * Obt\u00E9m os detalhes do canal.\n */\n async getDetails(): Promise<Channel> {\n if (this.channelData) {\n return this.channelData;\n }\n\n if (!this.id) {\n throw new Error(\"Nenhum ID de canal associado a esta inst\u00E2ncia.\");\n }\n\n const details = await this.baseClient.get<Channel>(`/channels/${this.id}`);\n this.channelData = details; // Armazena os detalhes para evitar m\u00FAltiplas chamadas\n return details;\n }\n\n async getVariable(variable: string): Promise<ChannelVar> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n return this.baseClient.get<ChannelVar>(\n `/channels/${this.id}/variable?variable=${encodeURIComponent(variable)}`,\n );\n }\n\n /**\n * Encerra o canal, se ele j\u00E1 foi criado.\n */\n async hangup(): Promise<void> {\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails();\n }\n\n if (!this.channelData?.id) {\n throw new Error(\"N\u00E3o foi poss\u00EDvel inicializar o canal. ID inv\u00E1lido.\");\n }\n\n await this.baseClient.delete(`/channels/${this.channelData.id}`);\n }\n\n /**\n * Reproduz m\u00EDdia no canal.\n */\n async play(\n options: { media: string; lang?: string },\n playback?: PlaybackInstance,\n ): Promise<PlaybackInstance> {\n // Verifica se o canal foi inicializado\n if (!this.channelData) {\n console.log(\"Canal n\u00E3o inicializado, buscando detalhes...\");\n this.channelData = await this.getDetails(); // Inicializa automaticamente\n }\n\n if (!playback) {\n playback = this.client.Playback();\n }\n\n if (!this.channelData?.id) {\n throw new Error(\"N\u00E3o foi poss\u00EDvel inicializar o canal. ID inv\u00E1lido.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playback.id}`,\n options,\n );\n\n return playback;\n }\n\n /**\n * Reproduz m\u00EDdia em um canal.\n */\n async playMedia(\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n if (!this.channelData) {\n throw new Error(\"O canal ainda n\u00E3o foi criado.\");\n }\n\n const queryParams = options\n ? `?${new URLSearchParams(options as Record<string, string>).toString()}`\n : \"\";\n\n return this.baseClient.post<ChannelPlayback>(\n `/channels/${this.channelData.id}/play${queryParams}`,\n { media },\n );\n }\n\n /**\n * Para a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async stopPlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/play/${playbackId}`,\n );\n }\n\n /**\n * Pausa a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async pausePlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Retoma a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async resumePlayback(playbackId: string): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/pause`,\n );\n }\n\n /**\n * Retrocede a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async rewindPlayback(playbackId: string, skipMs: number): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/rewind`,\n { skipMs },\n );\n }\n\n /**\n * Avan\u00E7a a reprodu\u00E7\u00E3o de m\u00EDdia.\n */\n async fastForwardPlayback(playbackId: string, skipMs: number): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/play/${playbackId}/forward`,\n { skipMs },\n );\n }\n\n /**\n * Muta o canal.\n */\n async muteChannel(direction: \"both\" | \"in\" | \"out\" = \"both\"): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(\n `/channels/${this.channelData.id}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Desmuta o canal.\n */\n async unmuteChannel(\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(\n `/channels/${this.channelData.id}/mute?direction=${direction}`,\n );\n }\n\n /**\n * Coloca o canal em espera.\n */\n async holdChannel(): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.post<void>(`/channels/${this.channelData.id}/hold`);\n }\n\n /**\n * Remove o canal da espera.\n */\n async unholdChannel(): Promise<void> {\n if (!this.channelData?.id) {\n throw new Error(\"Canal n\u00E3o associado a esta inst\u00E2ncia.\");\n }\n\n await this.baseClient.delete<void>(`/channels/${this.channelData.id}/hold`);\n }\n}\n\nexport class Channels extends EventEmitter {\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {\n super();\n }\n\n Channel(channelId?: string): ChannelInstance {\n return new ChannelInstance(this.client, this.baseClient, channelId);\n }\n\n /**\n * Origina um canal f\u00EDsico diretamente, sem uma inst\u00E2ncia de `ChannelInstance`.\n */\n async originate(data: OriginateRequest): Promise<Channel> {\n return this.baseClient.post<Channel>(\"/channels\", data);\n }\n\n /**\n * Obt\u00E9m detalhes de um canal espec\u00EDfico.\n */\n async getDetails(channelId: string): Promise<Channel> {\n return this.baseClient.get<Channel>(`/channels/${channelId}`);\n }\n\n /**\n * Lista todos os canais ativos.\n */\n async list(): Promise<Channel[]> {\n const channels = await this.baseClient.get<unknown>(\"/channels\");\n if (!Array.isArray(channels)) {\n throw new Error(\"Resposta da API /channels n\u00E3o \u00E9 um array.\");\n }\n return channels as Channel[];\n }\n\n /**\n * Encerra um canal espec\u00EDfico.\n */\n async hangup(\n channelId: string,\n options?: { reason_code?: string; reason?: string },\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n ...(options?.reason_code && { reason_code: options.reason_code }),\n ...(options?.reason && { reason: options.reason }),\n });\n\n return this.baseClient.delete<void>(\n `/channels/${channelId}?${queryParams.toString()}`,\n );\n }\n\n /**\n * Inicia a escuta em um canal.\n */\n async snoopChannel(\n channelId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/snoop?${queryParams}`,\n );\n }\n\n async startSilence(channelId: string): Promise<void> {\n return this.baseClient.post<void>(`/channels/${channelId}/silence`);\n }\n\n async stopSilence(channelId: string): Promise<void> {\n return this.baseClient.delete<void>(`/channels/${channelId}/silence`);\n }\n\n async getRTPStatistics(channelId: string): Promise<RTPStats> {\n return this.baseClient.get<RTPStats>(\n `/channels/${channelId}/rtp_statistics`,\n );\n }\n\n async createExternalMedia(options: ExternalMediaOptions): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/externalMedia?${queryParams}`,\n );\n }\n\n async playWithId(\n channelId: string,\n playbackId: string,\n media: string,\n options?: PlaybackOptions,\n ): Promise<ChannelPlayback> {\n const queryParams = options ? `?${toQueryParams(options)}` : \"\";\n return this.baseClient.post<ChannelPlayback>(\n `/channels/${channelId}/play/${playbackId}${queryParams}`,\n { media },\n );\n }\n\n async snoopChannelWithId(\n channelId: string,\n snoopId: string,\n options: SnoopOptions,\n ): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/snoop/${snoopId}?${queryParams}`,\n );\n }\n\n async startMohWithClass(channelId: string, mohClass: string): Promise<void> {\n const queryParams = `mohClass=${encodeURIComponent(mohClass)}`;\n await this.baseClient.post<void>(\n `/channels/${channelId}/moh?${queryParams}`,\n );\n }\n\n async getChannelVariable(\n channelId: string,\n variable: string,\n ): Promise<ChannelVar> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n return this.baseClient.get<ChannelVar>(\n `/channels/${channelId}/variable?variable=${encodeURIComponent(variable)}`,\n );\n }\n\n async setChannelVariable(\n channelId: string,\n variable: string,\n value?: string,\n ): Promise<void> {\n if (!variable) {\n throw new Error(\"The 'variable' parameter is required.\");\n }\n const queryParams = new URLSearchParams({\n variable,\n ...(value && { value }),\n });\n await this.baseClient.post<void>(\n `/channels/${channelId}/variable?${queryParams}`,\n );\n }\n\n async moveToApplication(\n channelId: string,\n app: string,\n appArgs?: string,\n ): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/move`, {\n app,\n appArgs,\n });\n }\n\n async continueDialplan(\n channelId: string,\n context?: string,\n extension?: string,\n priority?: number,\n label?: string,\n ): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/continue`, {\n context,\n extension,\n priority,\n label,\n });\n }\n\n async stopMusicOnHold(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/moh`);\n }\n\n async startMusicOnHold(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/moh`);\n }\n\n async record(channelId: string, options: RecordingOptions): Promise<Channel> {\n const queryParams = toQueryParams(options);\n return this.baseClient.post<Channel>(\n `/channels/${channelId}/record?${queryParams}`,\n );\n }\n\n async dial(\n channelId: string,\n caller?: string,\n timeout?: number,\n ): Promise<void> {\n const queryParams = new URLSearchParams({\n ...(caller && { caller }),\n ...(timeout && { timeout: timeout.toString() }),\n });\n await this.baseClient.post<void>(\n `/channels/${channelId}/dial?${queryParams}`,\n );\n }\n\n async redirectChannel(channelId: string, endpoint: string): Promise<void> {\n await this.baseClient.post<void>(\n `/channels/${channelId}/redirect?endpoint=${encodeURIComponent(endpoint)}`,\n );\n }\n\n async answerChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/answer`);\n }\n\n async ringChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/ring`);\n }\n\n async stopRingChannel(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/ring`);\n }\n\n async sendDTMF(\n channelId: string,\n dtmf: string,\n options?: {\n before?: number;\n between?: number;\n duration?: number;\n after?: number;\n },\n ): Promise<void> {\n const queryParams = toQueryParams({ dtmf, ...options });\n await this.baseClient.post<void>(\n `/channels/${channelId}/dtmf?${queryParams}`,\n );\n }\n\n async muteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n await this.baseClient.post<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n async unmuteChannel(\n channelId: string,\n direction: \"both\" | \"in\" | \"out\" = \"both\",\n ): Promise<void> {\n await this.baseClient.delete<void>(\n `/channels/${channelId}/mute?direction=${direction}`,\n );\n }\n\n async holdChannel(channelId: string): Promise<void> {\n await this.baseClient.post<void>(`/channels/${channelId}/hold`);\n }\n\n async unholdChannel(channelId: string): Promise<void> {\n await this.baseClient.delete<void>(`/channels/${channelId}/hold`);\n }\n\n async createChannel(data: OriginateRequest): Promise<Channel> {\n return this.baseClient.post<Channel>(\"/channels/create\", data);\n }\n\n async originateWithId(\n channelId: string,\n data: OriginateRequest,\n ): Promise<Channel> {\n return this.baseClient.post<Channel>(`/channels/${channelId}`, data);\n }\n}\n", "import type { Channel, Playback, WebSocketEvent } from \"./interfaces\";\n\nexport function toQueryParams<T>(options: T): string {\n return new URLSearchParams(\n Object.entries(options as Record<string, string>)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, value as string]),\n ).toString();\n}\n\nexport function isPlaybackEvent(\n event: WebSocketEvent,\n playbackId?: string,\n): event is Extract<WebSocketEvent, { playbackId: string }> {\n return (\n event.type.startsWith(\"Playback\") &&\n \"playbackId\" in event &&\n event.playbackId !== undefined &&\n (!playbackId || event.playbackId === playbackId)\n );\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 /*\n if (!hasChannel || (channelId && !matchesChannelId)) {\n console.log(\n `Evento ignorado no isChannelEvent: tipo=${event.type}, canal esperado=${channelId}, evento recebido=`,\n event,\n );\n }\n */\n\n return hasChannel && (!channelId || event.channel?.id === channelId);\n}\n\nexport const channelEvents = [\n \"ChannelCreated\",\n \"ChannelDestroyed\",\n \"ChannelEnteredBridge\",\n \"ChannelLeftBridge\",\n \"ChannelStateChange\",\n \"ChannelDtmfReceived\",\n \"ChannelDialplan\",\n \"ChannelCallerId\",\n \"ChannelUserevent\",\n \"ChannelHangupRequest\",\n \"ChannelVarset\",\n \"ChannelTalkingStarted\",\n \"ChannelTalkingFinished\",\n \"ChannelHold\",\n \"ChannelUnhold\",\n];\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { Endpoint, EndpointDetails } from \"../interfaces/endpoints.types\";\n\nexport class Endpoints {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all available endpoints.\n *\n * @returns A promise that resolves to an array of Endpoint objects representing all available endpoints.\n * @throws {Error} If the API response is not an array.\n */\n async list(): Promise<Endpoint[]> {\n const endpoints = await this.client.get<unknown>(\"/endpoints\");\n\n if (!Array.isArray(endpoints)) {\n throw new Error(\"Resposta da API /endpoints n\u00E3o \u00E9 um array.\");\n }\n\n return endpoints as Endpoint[];\n }\n\n /**\n * Retrieves details of a specific endpoint.\n *\n * @param technology - The technology of the endpoint (e.g., \"PJSIP\").\n * @param resource - The specific resource name of the endpoint (e.g., \"9001\").\n * @returns A promise that resolves to an EndpointDetails object containing the details of the specified endpoint.\n */\n async getDetails(\n technology: string,\n resource: string,\n ): Promise<EndpointDetails> {\n return this.client.get<EndpointDetails>(\n `/endpoints/${technology}/${resource}`,\n );\n }\n\n /**\n * Sends a message to a specific endpoint.\n *\n * @param technology - The technology of the endpoint (e.g., \"PJSIP\").\n * @param resource - The specific resource name of the endpoint (e.g., \"9001\").\n * @param message - The message payload to send to the endpoint.\n * @returns A promise that resolves when the message has been successfully sent.\n */\n async sendMessage(\n technology: string,\n resource: string,\n message: Record<string, unknown>,\n ): Promise<void> {\n await this.client.post<void>(\n `/endpoints/${technology}/${resource}/sendMessage`,\n message,\n );\n }\n}\n", "import { EventEmitter } from \"events\";\nimport type { AriClient } from \"../ariClient\";\nimport type { BaseClient } from \"../baseClient.js\";\nimport type { Playback, WebSocketEvent } from \"../interfaces\";\nimport { isPlaybackEvent } from \"../utils\";\n\nexport class PlaybackInstance extends EventEmitter {\n private playbackData: Playback | null = null;\n public id: string; // Garantimos que o ID esteja dispon\u00EDvel\n\n constructor(\n private client: AriClient,\n private baseClient: BaseClient,\n private playbackId: string,\n ) {\n super();\n this.id = playbackId || `playback-${Date.now()}`; // Inicializa o ID\n // Associar eventos ao playback\n const wsClients = this.client.getWebSocketClients();\n const wsClient = Array.from(wsClients.values()).find((client) =>\n client.isConnected(),\n );\n\n if (!wsClient) {\n throw new Error(\n `Nenhum WebSocket conectado dispon\u00EDvel para o playback: ${this.id}`,\n );\n }\n\n wsClient.on(\"message\", (event: WebSocketEvent) => {\n if (isPlaybackEvent(event, this.id)) {\n console.log(`Evento recebido no ChannelInstance: ${event.type}`, event);\n this.emit(event.type, event); // Emite evento para o ChannelInstance\n }\n });\n }\n\n /**\n * Obt\u00E9m os detalhes do playback.\n */\n async getDetails(): Promise<Playback> {\n if (!this.playbackId && !this.playbackData) {\n throw new Error(\"Nenhum playback associado a esta inst\u00E2ncia.\");\n }\n\n const details = await this.baseClient.get<Playback>(\n `/playbacks/${this.id}`,\n );\n this.playbackData = details;\n return details;\n }\n\n /**\n * Controla o playback.\n */\n async control(\n operation: \"pause\" | \"unpause\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n if (!this.playbackId) {\n throw new Error(\"Nenhum playback associado para controlar.\");\n }\n\n await this.baseClient.post<void>(\n `/playbacks/${this.id}/control?operation=${operation}`,\n );\n }\n\n async stop(): Promise<void> {\n if (!this.playbackId) {\n throw new Error(\"Nenhum playback associado para encerrar.\");\n }\n\n await this.baseClient.delete<void>(`/playbacks/${this.playbackId}`);\n this.emit(\"PlaybackStopped\", this.playbackData);\n }\n\n /**\n * Adiciona um listener para eventos de playback.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.on(event, callback);\n return this;\n }\n\n /**\n * Adiciona um listener para ser chamado apenas uma vez.\n */\n once<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.once(event, callback);\n return this;\n }\n\n /**\n * Remove um listener espec\u00EDfico.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.off(event, callback);\n return this;\n }\n}\n\nexport class Playbacks extends EventEmitter {\n constructor(\n private baseClient: BaseClient,\n private client: AriClient,\n ) {\n super();\n }\n\n /**\n * Inicializa uma nova inst\u00E2ncia de `PlaybackInstance`.\n */\n Playback(playbackId?: string): PlaybackInstance {\n const id = playbackId || `playback-${Date.now()}`;\n return new PlaybackInstance(this.client, this.baseClient, id);\n }\n\n /**\n * Obt\u00E9m os clientes WebSocket dispon\u00EDveis.\n */\n getWebSocketClients() {\n return this.client.getWebSocketClients();\n }\n\n /**\n * Emite eventos de playback.\n * Atualizado para gerenciar eventos espec\u00EDficos para `PlaybackInstance`.\n */\n emitPlaybackEvent<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n data: Extract<WebSocketEvent, { type: T }>,\n ): void {\n if (\"playbackId\" in data) {\n const playbackId = data.playbackId;\n if (playbackId) {\n this.emit(`${eventType}:${playbackId}`, data);\n }\n }\n this.emit(eventType, data);\n }\n\n /**\n * Retrieves details of a specific playback.\n *\n * @param playbackId - The unique identifier of the playback.\n * @returns A promise that resolves to a Playback object containing the details of the specified playback.\n */\n async getDetails(playbackId: string): Promise<Playback> {\n return this.baseClient.get<Playback>(`/playbacks/${playbackId}`);\n }\n\n /**\n * Controls a specific playback by performing various operations such as pause, resume, restart, reverse, forward, or stop.\n *\n * @param playbackId - The unique identifier of the playback to control.\n * @param operation - The operation to perform on the playback. Possible values are:\n * - \"pause\": Pauses the playback.\n * - \"unpause\": Resumes a paused playback.\n * - \"restart\": Restarts the playback from the beginning.\n * - \"reverse\": Reverses the playback direction.\n * - \"forward\": Moves the playback forward.\n * - \"stop\": Stops the playback.\n * @returns A promise that resolves when the control operation is successfully executed.\n */\n async control(\n playbackId: string,\n operation: \"pause\" | \"unpause\" | \"reverse\" | \"forward\",\n ): Promise<void> {\n await this.baseClient.post<void>(\n `/playbacks/${playbackId}/control?operation=${operation}`,\n );\n }\n\n /**\n * Stops a specific playback.\n *\n * @param playbackId - The unique identifier of the playback to stop.\n * @returns A promise that resolves when the playback is successfully stopped.\n */\n async stop(playbackId: string): Promise<void> {\n await this.baseClient.delete<void>(`/playbacks/${playbackId}`);\n }\n\n /**\n * Registers a listener for playback events.\n * The listener is triggered for events such as \"PlaybackFinished\".\n *\n * @param eventType - The type of event to listen for.\n * @param playbackId - The ID of the playback to associate with this listener.\n * @param callback - The callback function to execute when the event occurs.\n */\n registerListener<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.on(`${eventType}:${playbackId}`, callback);\n }\n\n /**\n * Unregisters a listener for playback events.\n *\n * @param eventType - The type of event to stop listening for.\n * @param playbackId - The ID of the playback associated with the listener.\n * @param callback - The callback function to remove.\n */\n unregisterListener<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): void {\n this.off(`${eventType}:${playbackId}`, callback);\n }\n\n /**\n * Checks if a listener is already registered for a specific event and playback.\n *\n * @param eventType - The type of event to check.\n * @param playbackId - The playback ID associated with the listener.\n * @returns True if a listener is already registered, false otherwise.\n */\n isListenerRegistered<T extends WebSocketEvent[\"type\"]>(\n eventType: T,\n playbackId: string,\n ): boolean {\n return this.listenerCount(`${eventType}:${playbackId}`) > 0;\n }\n}\n", "import type { BaseClient } from \"../baseClient.js\";\nimport type { Sound, SoundListRequest } from \"../interfaces/sounds.types.js\";\n\nexport class Sounds {\n constructor(private client: BaseClient) {}\n\n /**\n * Lists all available sounds.\n *\n * @param params - Optional parameters to filter the list of sounds.\n * @returns A promise that resolves to an array of Sound objects.\n * @throws {Error} If the API response is not an array.\n */\n async list(params?: SoundListRequest): Promise<Sound[]> {\n const query = params\n ? `?${new URLSearchParams(params as Record<string, string>).toString()}`\n : \"\";\n\n const sounds = await this.client.get<unknown>(`/sounds${query}`);\n\n if (!Array.isArray(sounds)) {\n throw new Error(\"Resposta da API /sounds n\u00E3o \u00E9 um array.\");\n }\n\n return sounds as Sound[];\n }\n\n /**\n * Retrieves details of a specific sound.\n *\n * @param soundId - The unique identifier of the sound.\n * @returns A promise that resolves to a Sound object containing the details of the specified sound.\n */\n async getDetails(soundId: string): Promise<Sound> {\n return this.client.get<Sound>(`/sounds/${soundId}`);\n }\n}\n", "import { EventEmitter } from \"events\";\nimport { type IBackOffOptions, backOff } from \"exponential-backoff\";\nimport WebSocket from \"ws\";\nimport type { WebSocketEvent } from \"./interfaces\";\n\n/**\n * WebSocketClient class for managing WebSocket connections.\n * Extends EventEmitter to provide event-based communication.\n */\nexport class WebSocketClient extends EventEmitter {\n private ws: WebSocket | null = null;\n private isClosedManually = false;\n private isReconnecting = false;\n private messageListeners: ((data: any) => void)[] = [];\n maxReconnectAttempts = 30;\n private reconnectAttempts = 0; // Para gerenciar tentativas de reconex\u00E3o\n\n /**\n * Creates a new WebSocketClient instance.\n * @param url - The WebSocket server URL to connect to.\n */\n constructor(private url: string) {\n super();\n }\n\n private async reconnect(): Promise<void> {\n console.log(\"Iniciando processo de reconex\u00E3o...\");\n\n const backoffOptions: IBackOffOptions = {\n delayFirstAttempt: false,\n startingDelay: 1000, // 1 segundo inicial\n timeMultiple: 2, // Multiplicador exponencial\n maxDelay: 30000, // 30 segundos de atraso m\u00E1ximo\n numOfAttempts: this.maxReconnectAttempts, // Limite de tentativas\n jitter: \"full\",\n retry: (error: any, attemptNumber: number) => {\n console.warn(\n `Tentativa ${attemptNumber} de reconex\u00E3o falhou: ${error.message}`,\n );\n return !this.isClosedManually; // Tenta novamente apenas se o WebSocket n\u00E3o foi fechado manualmente\n },\n };\n\n try {\n await backOff(async () => {\n console.log(`Tentando reconectar (#${this.reconnectAttempts + 1})...`);\n await this.connect(); // Tenta reconectar\n console.log(\"Reconex\u00E3o bem-sucedida.\");\n }, backoffOptions);\n\n // Reconex\u00E3o bem-sucedida, reseta o estado\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n } catch (error) {\n console.error(\n `Reconex\u00E3o falhou ap\u00F3s ${this.maxReconnectAttempts} tentativas.`,\n error,\n );\n this.isReconnecting = false; // Garante que o estado seja atualizado mesmo em falha\n }\n }\n\n /**\n * Establishes a connection to the WebSocket server.\n * @returns A Promise that resolves when the connection is established, or rejects if an error occurs.\n * @throws Will throw an error if the connection fails.\n */\n async connect(): Promise<void> {\n if (this.isReconnecting) return; // Impede m\u00FAltiplas reconex\u00F5es simult\u00E2neas\n\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(this.url);\n\n this.ws.on(\"open\", () => {\n console.log(\"WebSocket conectado.\");\n this.isClosedManually = false;\n this.isReconnecting = false;\n this.reconnectAttempts = 0; // Resetar tentativas ap\u00F3s sucesso\n resolve();\n });\n\n this.ws.on(\"error\", (err) => {\n console.error(\"Erro na conex\u00E3o WebSocket:\", err);\n reject(err);\n });\n\n this.ws.on(\"close\", (code, reason) => {\n console.warn(`WebSocket desconectado: ${code} - ${reason}`);\n this.emit(\"close\", { code, reason });\n\n if (!this.isClosedManually) {\n this.reconnect(); // Tenta reconectar se n\u00E3o foi fechado manualmente\n }\n });\n\n this.ws.on(\"message\", (rawData) => {\n this.handleMessage(rawData);\n });\n });\n }\n\n /**\n * Checks if the WebSocket connection is currently open.\n * @returns True if the connection is open, false otherwise.\n */\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n onMessage(callback: (data: any) => void): void {\n this.messageListeners.push(callback);\n }\n\n /**\n * Adds a listener for WebSocket events.\n * @param event - The event type to listen for.\n * @param callback - The function to call when the event occurs.\n * @returns The WebSocketClient instance for chaining.\n */\n on<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.on(event, callback);\n return this;\n }\n\n /**\n * Removes a specific listener from a WebSocket event.\n * @param event - The event type to remove the listener from.\n * @param callback - The function to remove from the event listeners.\n * @returns The WebSocketClient instance for chaining.\n */\n off<T extends WebSocketEvent[\"type\"]>(\n event: T,\n callback: (data: Extract<WebSocketEvent, { type: T }>) => void,\n ): this {\n super.off(event, callback);\n return this;\n }\n\n /**\n * Removes all listeners for a specific event, or all events if no event is specified.\n * @param event - Optional. The event to remove all listeners from.\n * @returns The WebSocketClient instance for chaining.\n */\n removeAllListeners(event?: string | symbol): this {\n super.removeAllListeners(event);\n return this;\n }\n\n /**\n * Handles incoming WebSocket messages.\n * @param rawData - The raw data received from the WebSocket.\n */\n private handleMessage(rawData: WebSocket.Data): void {\n try {\n const decodedData = JSON.parse(rawData.toString()) as WebSocketEvent;\n if (decodedData?.type) {\n this.emit(decodedData.type, decodedData); // Emite evento baseado no tipo\n this.emit(\"message\", decodedData); // Emite um evento gen\u00E9rico para mensagens\n } else {\n console.warn(\"Mensagem recebida sem tipo:\", decodedData);\n }\n } catch (err) {\n console.error(\"Erro ao decodificar mensagem do WebSocket:\", err);\n }\n }\n\n /**\n * Sends data through the WebSocket connection.\n * @param data - The data to send.\n * @throws Will throw an error if the WebSocket is not connected.\n */\n send(data: any): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error(\"WebSocket n\u00E3o est\u00E1 conectado.\");\n }\n\n this.ws.send(data, (err) => {\n if (err) {\n console.error(\"Erro ao enviar dados pelo WebSocket:\", err);\n }\n });\n }\n\n /**\n * Closes the WebSocket connection manually.\n */\n close(): void {\n if (this.ws) {\n this.isClosedManually = true;\n this.ws.close();\n this.ws = null;\n console.log(\"WebSocket fechado manualmente.\");\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,QAAM,iBAAkC;MACtC,mBAAmB;MACnB,QAAQ;MACR,UAAU;MACV,eAAe;MACf,OAAO,WAAA;AAAM,eAAA;MAAA;MACb,eAAe;MACf,cAAc;;AAGhB,aAAgB,oBAAoB,SAAuB;AACzD,UAAM,YAAS,SAAA,SAAA,CAAA,GAAyB,cAAc,GAAK,OAAO;AAElE,UAAI,UAAU,gBAAgB,GAAG;AAC/B,kBAAU,gBAAgB;;AAG5B,aAAO;IACT;AARA,IAAAA,SAAA,sBAAA;;;;;;;;;ACxBA,aAAgB,WAAW,OAAa;AACpC,UAAM,gBAAgB,KAAK,OAAM,IAAK;AACtC,aAAO,KAAK,MAAM,aAAa;IACnC;AAHA,IAAAC,SAAA,aAAA;;;;;;;;;ACAA,aAAgB,SAAS,OAAa;AAClC,aAAO;IACX;AAFA,IAAAC,SAAA,WAAA;;;;;;;;;ACCA,QAAA,gBAAA;AACA,QAAA,cAAA;AAIA,aAAgB,cAAc,SAAwB;AACpD,cAAQ,QAAQ,QAAQ;QACtB,KAAK;AACH,iBAAO,cAAA;QAET,KAAK;QACL;AACE,iBAAO,YAAA;;IAEb;AATA,IAAAC,SAAA,gBAAA;;;;;;;;;ACJA,QAAA,mBAAA;AAEA,QAAA;;MAAA,WAAA;AAEE,iBAAAC,OAAoB,SAAwB;AAAxB,eAAA,UAAA;AADV,eAAA,UAAU;QAC2B;AAExC,QAAAA,OAAA,UAAA,QAAP,WAAA;AAAA,cAAA,QAAA;AACE,iBAAO,IAAI,QAAQ,SAAA,SAAO;AAAI,mBAAA,WAAW,SAAS,MAAK,aAAa;UAAtC,CAAuC;QACvE;AAEO,QAAAA,OAAA,UAAA,mBAAP,SAAwB,SAAe;AACrC,eAAK,UAAU;QACjB;AAEA,eAAA,eAAYA,OAAA,WAAA,iBAAa;eAAzB,WAAA;AACE,gBAAM,SAAS,iBAAA,cAAc,KAAK,OAAO;AACzC,mBAAO,OAAO,KAAK,KAAK;UAC1B;;;;AAEA,eAAA,eAAYA,OAAA,WAAA,SAAK;eAAjB,WAAA;AACE,gBAAM,WAAW,KAAK,QAAQ;AAC9B,gBAAM,OAAO,KAAK,QAAQ;AAC1B,gBAAM,QAAQ,KAAK;AACnB,gBAAM,QAAQ,WAAW,KAAK,IAAI,MAAM,KAAK;AAE7C,mBAAO,KAAK,IAAI,OAAO,KAAK,QAAQ,QAAQ;UAC9C;;;;AAEA,eAAA,eAAcA,OAAA,WAAA,wBAAoB;eAAlC,WAAA;AACE,mBAAO,KAAK;UACd;;;;AACF,eAAAA;MAAA,EA7BA;;AAAsB,IAAAC,SAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACJtB,QAAA,eAAA;AAEA,QAAA;;MAAA,SAAA,QAAA;AAAoC,kBAAAC,iBAAA,MAAA;AAApC,iBAAAA,kBAAA;;QAYA;AAXiB,QAAAA,gBAAA,UAAA,QAAb,WAAA;;;AACI,qBAAA,CAAA,GAAO,KAAK,iBAAiB,OAAO,OAAA,UAAM,MAAK,KAAA,IAAA,CAAE;;;;AAGrD,eAAA,eAAYA,gBAAA,WAAA,kBAAc;eAA1B,WAAA;AACI,mBAAO,KAAK,YAAY;UAC5B;;;;AAEA,eAAA,eAAcA,gBAAA,WAAA,wBAAoB;eAAlC,WAAA;AACI,mBAAO,KAAK,UAAU;UAC1B;;;;AACJ,eAAAA;MAAA,EAZoC,aAAA,KAAK;;AAA5B,IAAAC,SAAA,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;ACFb,QAAA,eAAA;AAEA,QAAA;;MAAA,SAAA,QAAA;AAAiC,kBAAAC,cAAA,MAAA;AAAjC,iBAAAA,eAAA;;QAAwC;AAAA,eAAAA;MAAA,EAAP,aAAA,KAAK;;AAAzB,IAAAC,SAAA,cAAA;;;;;;;;;ACDb,QAAA,qBAAA;AACA,QAAA,iBAAA;AAGA,aAAgB,aAAa,SAA0B,SAAe;AAClE,UAAM,QAAQ,eAAe,OAAO;AACpC,YAAM,iBAAiB,OAAO;AAC9B,aAAO;IACX;AAJA,IAAAC,SAAA,eAAA;AAMA,aAAS,eAAe,SAAwB;AAC5C,UAAI,CAAC,QAAQ,mBAAmB;AAC5B,eAAO,IAAI,mBAAA,eAAe,OAAO;;AAGrC,aAAO,IAAI,eAAA,YAAY,OAAO;IAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjBA,QAAA,YAAA;AAKA,QAAA,kBAAA;AAIA,aAAsBC,SACpB,SACA,SAA4B;AAA5B,UAAA,YAAA,QAAA;AAAA,kBAAA,CAAA;MAA4B;;;;;;AAEtB,iCAAmB,UAAA,oBAAoB,OAAO;AAC9C,cAAAA,WAAU,IAAI,QAAQ,SAAS,gBAAgB;AAE9C,qBAAA,CAAA,GAAMA,SAAQ,QAAO,CAAE;;AAA9B,qBAAA,CAAA,GAAO,GAAA,KAAA,CAAuB;;;;;AAPhC,IAAAC,SAAA,UAAAD;AAUA,QAAA;;MAAA,WAAA;AAGE,iBAAAE,SACU,SACA,SAAwB;AADxB,eAAA,UAAA;AACA,eAAA,UAAA;AAJF,eAAA,gBAAgB;QAKrB;AAEU,QAAAA,SAAA,UAAA,UAAb,WAAA;;;;;;uBACS,CAAC,KAAK,oBAAmB,QAAA,CAAA,GAAA,CAAA;;;;AAE5B,yBAAA,CAAA,GAAM,KAAK,WAAU,CAAE;;AAAvB,qBAAA,KAAA;AACO,yBAAA,CAAA,GAAM,KAAK,QAAO,CAAE;;AAA3B,yBAAA,CAAA,GAAO,GAAA,KAAA,CAAoB;;;AAE3B,uBAAK;AACe,yBAAA,CAAA,GAAM,KAAK,QAAQ,MAAM,KAAG,KAAK,aAAa,CAAC;;AAA7D,gCAAc,GAAA,KAAA;AAEpB,sBAAI,CAAC,eAAe,KAAK,qBAAqB;AAC5C,0BAAM;;;;;;AAKZ,wBAAM,IAAI,MAAM,uBAAuB;;;;;AAGzC,eAAA,eAAYA,SAAA,WAAA,uBAAmB;eAA/B,WAAA;AACE,mBAAO,KAAK,iBAAiB,KAAK,QAAQ;UAC5C;;;;AAEc,QAAAA,SAAA,UAAA,aAAd,WAAA;;;;;;AACQ,0BAAQ,gBAAA,aAAa,KAAK,SAAS,KAAK,aAAa;AAC3D,yBAAA,CAAA,GAAM,MAAM,MAAK,CAAE;;AAAnB,qBAAA,KAAA;;;;;;;;;AAEJ,eAAAA;MAAA,EAlCA;;;;;;ACnBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAC,8BAA8C;;;ACA9C,oBAA6B;AAC7B,mBAA0C;AAInC,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EACA,eAAe,IAAI,2BAAa;AAAA,EAChC,YAA0C,oBAAI,IAAI;AAAA;AAAA,EAE1D,YAAY,SAAiB,UAAkB,UAAkB;AAC/D,SAAK,SAAS,aAAAC,QAAM,OAAO;AAAA,MACzB,SAAS;AAAA,MACT,MAAM,EAAE,UAAU,SAAS;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAO,MAA0B;AACrC,UAAM,WAAW,MAAM,KAAK,OAAO,IAAO,IAAI;AAC9C,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAQ,MAAc,MAA4B;AACtD,UAAM,WAAW,MAAM,KAAK,OAAO,KAAQ,MAAM,IAAI;AACrD,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAO,MAAc,MAA2B;AACpD,UAAM,WAAW,MAAM,KAAK,OAAO,IAAO,MAAM,IAAI;AACpD,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAU,MAA0B;AACxC,UAAM,WAAW,MAAM,KAAK,OAAO,OAAU,IAAI;AACjD,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBAAmB,KAAa,UAAiC;AAC/D,QAAI,KAAK,UAAU,IAAI,GAAG,GAAG;AAC3B,YAAM,IAAI,MAAM,qDAAkD,GAAG,GAAG;AAAA,IAC1E;AACA,SAAK,UAAU,IAAI,KAAK,QAAQ;AAChC,YAAQ,IAAI,qCAAqC,GAAG,GAAG;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,KAAmB;AACvC,QAAI,CAAC,KAAK,UAAU,IAAI,GAAG,GAAG;AAC5B,YAAM,IAAI,MAAM,4CAA4C,GAAG,GAAG;AAAA,IACpE;AACA,SAAK,UAAU,OAAO,GAAG;AACzB,YAAQ,IAAI,mCAAmC,GAAG,GAAG;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAoD;AAClD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,KAA0C;AAC3D,WAAO,KAAK,UAAU,IAAI,GAAG;AAAA,EAC/B;AAAA;AAAA,EAIA,iBAAiB,UAAiD;AAChE,YAAQ,IAAI,gDAAgD;AAC5D,SAAK,aAAa,GAAG,kBAAkB,CAAC,UAAU;AAChD,cAAQ,IAAI,kCAAkC,KAAK;AACnD,eAAS,KAAK;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,mBAAmB,OAA6B;AAC9C,YAAQ,IAAI,iCAAiC,KAAK;AAClD,SAAK,aAAa,KAAK,kBAAkB,KAAK;AAAA,EAChD;AACF;;;ACtGO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzC,MAAM,OAA+B;AACnC,UAAM,eAAe,MAAM,KAAK,OAAO,IAAa,eAAe;AAEnE,QAAI,CAAC,MAAM,QAAQ,YAAY,GAAG;AAChC,YAAM,IAAI,MAAM,qDAA+C;AAAA,IACjE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAW,SAA8C;AAC7D,QAAI;AACF,aAAO,MAAM,KAAK,OAAO;AAAA,QACvB,iBAAiB,OAAO;AAAA,MAC1B;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAwC,OAAO,KAAK,KAAK;AACvE,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAY,SAAiB,MAAyC;AAC1E,UAAM,KAAK,OAAO,KAAW,iBAAiB,OAAO,aAAa,IAAI;AAAA,EACxE;AACF;;;ACvDA,SAAS,cAAiB,SAAoB;AAC5C,SAAO,IAAI;AAAA,IACT,OAAO,QAAQ,OAAiC,EAC7C,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,EACzC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,EAC/C,EAAE,SAAS;AACb;AAEO,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA,EAKzC,MAAM,UAAiC;AACrC,WAAO,KAAK,OAAO,IAAkB,gBAAgB;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAiC;AACrC,WAAO,KAAK,OAAO,IAAc,mBAAmB;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aACJ,YACA,QACe;AACf,UAAM,MAAM,qBAAqB,UAAU;AAC3C,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,cAAM,KAAK,OAAO,KAAW,GAAG,GAAG,cAAc;AACjD;AAAA,MACF,KAAK;AACH,cAAM,KAAK,OAAO,OAAa,GAAG;AAClC;AAAA,MACF,KAAK;AACH,cAAM,KAAK,OAAO,IAAU,KAAK,CAAC,CAAC;AACnC;AAAA,MACF;AACE,cAAM,IAAI,MAAM,2BAAkB,MAAM,EAAE;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAA0C;AAC9C,WAAO,KAAK,OAAO,IAAe,mBAAmB;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACJ,gBACA,QACA,eACe;AACf,UAAM,cAAc,cAAc,iBAAiB,CAAC,CAAC;AACrD,WAAO,KAAK,OAAO;AAAA,MACjB,qBAAqB,cAAc,WAAW,mBAAmB,MAAM,CAAC,IAAI,WAAW;AAAA,IACzF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,cAAyC;AAC/D,WAAO,KAAK,OAAO;AAAA,MACjB,gCAAgC,mBAAmB,YAAY,CAAC;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,cAAsB,OAA8B;AAC1E,WAAO,KAAK,OAAO;AAAA,MACjB,gCAAgC,mBAAmB,YAAY,CAAC,UAAU,mBAAmB,KAAK,CAAC;AAAA,IACrG;AAAA,EACF;AACF;;;ACpFO,IAAM,UAAN,MAAc;AAAA,EACnB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA,EAKzC,MAAM,OAA0B;AAC9B,WAAO,KAAK,OAAO,IAAc,UAAU;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAA+C;AAChE,WAAO,KAAK,OAAO,KAAa,YAAY,OAAO;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,UAAmC;AAClD,WAAO,KAAK,OAAO,IAAY,YAAY,QAAQ,EAAE;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,UAAiC;AAC7C,WAAO,KAAK,OAAO,OAAa,YAAY,QAAQ,EAAE;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,UACA,SACe;AACf,UAAM,cAAc,IAAI,gBAAgB;AAAA,MACtC,SAAS,MAAM,QAAQ,QAAQ,OAAO,IAClC,QAAQ,QAAQ,KAAK,GAAG,IACxB,QAAQ;AAAA,MACZ,GAAI,QAAQ,QAAQ,EAAE,MAAM,QAAQ,KAAK;AAAA,IAC3C,CAAC,EAAE,SAAS;AAEZ,UAAM,KAAK,OAAO;AAAA,MAChB,YAAY,QAAQ,eAAe,WAAW;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,UACA,SACe;AACf,UAAM,cAAc,IAAI,gBAAgB;AAAA,MACtC,SAAS,MAAM,QAAQ,QAAQ,OAAO,IAClC,QAAQ,QAAQ,KAAK,GAAG,IACxB,QAAQ;AAAA,IACd,CAAC,EAAE,SAAS;AAEZ,UAAM,KAAK,OAAO;AAAA,MAChB,YAAY,QAAQ,kBAAkB,WAAW;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,UACA,SACyB;AACzB,UAAM,cAAc,IAAI,gBAAgB;AAAA,MACtC,GAAI,QAAQ,QAAQ,EAAE,MAAM,QAAQ,KAAK;AAAA,MACzC,GAAI,QAAQ,YAAY,EAAE,UAAU,QAAQ,SAAS,SAAS,EAAE;AAAA,MAChE,GAAI,QAAQ,UAAU,EAAE,QAAQ,QAAQ,OAAO,SAAS,EAAE;AAAA,MAC1D,GAAI,QAAQ,cAAc,EAAE,YAAY,QAAQ,WAAW;AAAA,IAC7D,CAAC,EAAE,SAAS;AAEZ,WAAO,KAAK,OAAO;AAAA,MACjB,YAAY,QAAQ,SAAS,WAAW;AAAA,MACxC,EAAE,OAAO,QAAQ,MAAM;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,UAAkB,YAAmC;AACtE,UAAM,KAAK,OAAO,OAAa,YAAY,QAAQ,SAAS,UAAU,EAAE;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,UAAkB,WAAkC;AACvE,UAAM,KAAK,OAAO;AAAA,MAChB,YAAY,QAAQ,0BAA0B,mBAAmB,SAAS,CAAC;AAAA,IAC7E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,UAAiC;AACtD,UAAM,KAAK,OAAO,OAAa,YAAY,QAAQ,cAAc;AAAA,EACnE;AACF;;;ACxHA,IAAAC,iBAA6B;;;ACEtB,SAASC,eAAiB,SAAoB;AACnD,SAAO,IAAI;AAAA,IACT,OAAO,QAAQ,OAAiC,EAC7C,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,EACzC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,KAAe,CAAC;AAAA,EACjD,EAAE,SAAS;AACb;AAEO,SAAS,gBACd,OACA,YAC0D;AAC1D,SACE,MAAM,KAAK,WAAW,UAAU,KAChC,gBAAgB,SAChB,MAAM,eAAe,WACpB,CAAC,cAAc,MAAM,eAAe;AAEzC;AAQO,SAAS,eACd,OACA,WACwD;AAExD,QAAM,aAAa,aAAa,SAAS,MAAM,SAAS,OAAO;AAW/D,SAAO,eAAe,CAAC,aAAa,MAAM,SAAS,OAAO;AAC5D;;;AD3BO,IAAM,kBAAN,cAA8B,4BAAa;AAAA;AAAA,EAIhD,YACU,QACA,YACA,YAAoB,WAAW,KAAK,IAAI,CAAC,IACjD;AACA,UAAM;AAJE;AACA;AACA;AAIR,SAAK,KAAK,aAAa,WAAW,KAAK,IAAI,CAAC;AAE5C,UAAM,YAAY,KAAK,OAAO,oBAAoB;AAClD,UAAM,WAAW,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,MAAK,CAACC,YACpDA,QAAO,YAAY;AAAA,IACrB;AAEA,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;AAAA,QACR,0DAAuD,KAAK,EAAE;AAAA,MAChE;AAAA,IACF;AAEA,aAAS,GAAG,WAAW,CAAC,UAA0B;AAChD,UAAI,eAAe,OAAO,KAAK,EAAE,GAAG;AAClC,gBAAQ,IAAI,uCAAuC,MAAM,IAAI,IAAI,KAAK;AACtE,aAAK,KAAK,MAAM,MAAM,KAAK;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EA7BQ,cAA8B;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAiCP,GACE,OACA,UACM;AACN,UAAM,GAAG,OAAO,QAAQ;AACxB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KACE,OACA,UACM;AACN,UAAM,KAAK,OAAO,QAAQ;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IACE,OACA,UACM;AACN,UAAM,IAAI,OAAO,QAAQ;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAwB;AAC5B,UAAM,KAAK,WAAW,KAAW,aAAa,KAAK,EAAE,SAAS;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,MAA0C;AACxD,QAAI,KAAK,aAAa;AACpB,YAAM,IAAI,MAAM,2BAAwB;AAAA,IAC1C;AAEA,UAAM,UAAU,MAAM,KAAK,WAAW,KAAc,aAAa,IAAI;AACrE,SAAK,cAAc;AAEnB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA+B;AACnC,QAAI,KAAK,aAAa;AACpB,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,mDAAgD;AAAA,IAClE;AAEA,UAAM,UAAU,MAAM,KAAK,WAAW,IAAa,aAAa,KAAK,EAAE,EAAE;AACzE,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,UAAuC;AACvD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AACA,WAAO,KAAK,WAAW;AAAA,MACrB,aAAa,KAAK,EAAE,sBAAsB,mBAAmB,QAAQ,CAAC;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAwB;AAC5B,QAAI,CAAC,KAAK,aAAa;AACrB,cAAQ,IAAI,iDAA8C;AAC1D,WAAK,cAAc,MAAM,KAAK,WAAW;AAAA,IAC3C;AAEA,QAAI,CAAC,KAAK,aAAa,IAAI;AACzB,YAAM,IAAI,MAAM,6DAAoD;AAAA,IACtE;AAEA,UAAM,KAAK,WAAW,OAAO,aAAa,KAAK,YAAY,EAAE,EAAE;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KACJ,SACA,UAC2B;AAE3B,QAAI,CAAC,KAAK,aAAa;AACrB,cAAQ,IAAI,iDAA8C;AAC1D,WAAK,cAAc,MAAM,KAAK,WAAW;AAAA,IAC3C;AAEA,QAAI,CAAC,UAAU;AACb,iBAAW,KAAK,OAAO,SAAS;AAAA,IAClC;AAEA,QAAI,CAAC,KAAK,aAAa,IAAI;AACzB,YAAM,IAAI,MAAM,6DAAoD;AAAA,IACtE;AAEA,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,KAAK,YAAY,EAAE,SAAS,SAAS,EAAE;AAAA,MACpD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,OACA,SAC0B;AAC1B,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,IAAI,MAAM,kCAA+B;AAAA,IACjD;AAEA,UAAM,cAAc,UAChB,IAAI,IAAI,gBAAgB,OAAiC,EAAE,SAAS,CAAC,KACrE;AAEJ,WAAO,KAAK,WAAW;AAAA,MACrB,aAAa,KAAK,YAAY,EAAE,QAAQ,WAAW;AAAA,MACnD,EAAE,MAAM;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,YAAmC;AACpD,QAAI,CAAC,KAAK,aAAa,IAAI;AACzB,YAAM,IAAI,MAAM,6CAAuC;AAAA,IACzD;AAEA,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,KAAK,YAAY,EAAE,SAAS,UAAU;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,YAAmC;AACrD,QAAI,CAAC,KAAK,aAAa,IAAI;AACzB,YAAM,IAAI,MAAM,6CAAuC;AAAA,IACzD;AAEA,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,KAAK,YAAY,EAAE,SAAS,UAAU;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,YAAmC;AACtD,QAAI,CAAC,KAAK,aAAa,IAAI;AACzB,YAAM,IAAI,MAAM,6CAAuC;AAAA,IACzD;AAEA,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,KAAK,YAAY,EAAE,SAAS,UAAU;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,YAAoB,QAA+B;AACtE,QAAI,CAAC,KAAK,aAAa,IAAI;AACzB,YAAM,IAAI,MAAM,6CAAuC;AAAA,IACzD;AAEA,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,KAAK,YAAY,EAAE,SAAS,UAAU;AAAA,MACnD,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,YAAoB,QAA+B;AAC3E,QAAI,CAAC,KAAK,aAAa,IAAI;AACzB,YAAM,IAAI,MAAM,6CAAuC;AAAA,IACzD;AAEA,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,KAAK,YAAY,EAAE,SAAS,UAAU;AAAA,MACnD,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,YAAmC,QAAuB;AAC1E,QAAI,CAAC,KAAK,aAAa,IAAI;AACzB,YAAM,IAAI,MAAM,6CAAuC;AAAA,IACzD;AAEA,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,KAAK,YAAY,EAAE,mBAAmB,SAAS;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,YAAmC,QACpB;AACf,QAAI,CAAC,KAAK,aAAa,IAAI;AACzB,YAAM,IAAI,MAAM,6CAAuC;AAAA,IACzD;AAEA,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,KAAK,YAAY,EAAE,mBAAmB,SAAS;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAA6B;AACjC,QAAI,CAAC,KAAK,aAAa,IAAI;AACzB,YAAM,IAAI,MAAM,6CAAuC;AAAA,IACzD;AAEA,UAAM,KAAK,WAAW,KAAW,aAAa,KAAK,YAAY,EAAE,OAAO;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAA+B;AACnC,QAAI,CAAC,KAAK,aAAa,IAAI;AACzB,YAAM,IAAI,MAAM,6CAAuC;AAAA,IACzD;AAEA,UAAM,KAAK,WAAW,OAAa,aAAa,KAAK,YAAY,EAAE,OAAO;AAAA,EAC5E;AACF;AAEO,IAAM,WAAN,cAAuB,4BAAa;AAAA,EACzC,YACU,YACA,QACR;AACA,UAAM;AAHE;AACA;AAAA,EAGV;AAAA,EAEA,QAAQ,WAAqC;AAC3C,WAAO,IAAI,gBAAgB,KAAK,QAAQ,KAAK,YAAY,SAAS;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,MAA0C;AACxD,WAAO,KAAK,WAAW,KAAc,aAAa,IAAI;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,WAAqC;AACpD,WAAO,KAAK,WAAW,IAAa,aAAa,SAAS,EAAE;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAA2B;AAC/B,UAAM,WAAW,MAAM,KAAK,WAAW,IAAa,WAAW;AAC/D,QAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,YAAM,IAAI,MAAM,iDAA2C;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,WACA,SACe;AACf,UAAM,cAAc,IAAI,gBAAgB;AAAA,MACtC,GAAI,SAAS,eAAe,EAAE,aAAa,QAAQ,YAAY;AAAA,MAC/D,GAAI,SAAS,UAAU,EAAE,QAAQ,QAAQ,OAAO;AAAA,IAClD,CAAC;AAED,WAAO,KAAK,WAAW;AAAA,MACrB,aAAa,SAAS,IAAI,YAAY,SAAS,CAAC;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,WACA,SACkB;AAClB,UAAM,cAAcC,eAAc,OAAO;AACzC,WAAO,KAAK,WAAW;AAAA,MACrB,aAAa,SAAS,UAAU,WAAW;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,WAAkC;AACnD,WAAO,KAAK,WAAW,KAAW,aAAa,SAAS,UAAU;AAAA,EACpE;AAAA,EAEA,MAAM,YAAY,WAAkC;AAClD,WAAO,KAAK,WAAW,OAAa,aAAa,SAAS,UAAU;AAAA,EACtE;AAAA,EAEA,MAAM,iBAAiB,WAAsC;AAC3D,WAAO,KAAK,WAAW;AAAA,MACrB,aAAa,SAAS;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,SAAiD;AACzE,UAAM,cAAcA,eAAc,OAAO;AACzC,WAAO,KAAK,WAAW;AAAA,MACrB,2BAA2B,WAAW;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,WACA,YACA,OACA,SAC0B;AAC1B,UAAM,cAAc,UAAU,IAAIA,eAAc,OAAO,CAAC,KAAK;AAC7D,WAAO,KAAK,WAAW;AAAA,MACrB,aAAa,SAAS,SAAS,UAAU,GAAG,WAAW;AAAA,MACvD,EAAE,MAAM;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,WACA,SACA,SACkB;AAClB,UAAM,cAAcA,eAAc,OAAO;AACzC,WAAO,KAAK,WAAW;AAAA,MACrB,aAAa,SAAS,UAAU,OAAO,IAAI,WAAW;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,WAAmB,UAAiC;AAC1E,UAAM,cAAc,YAAY,mBAAmB,QAAQ,CAAC;AAC5D,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,SAAS,QAAQ,WAAW;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,WACA,UACqB;AACrB,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AACA,WAAO,KAAK,WAAW;AAAA,MACrB,aAAa,SAAS,sBAAsB,mBAAmB,QAAQ,CAAC;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,WACA,UACA,OACe;AACf,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AACA,UAAM,cAAc,IAAI,gBAAgB;AAAA,MACtC;AAAA,MACA,GAAI,SAAS,EAAE,MAAM;AAAA,IACvB,CAAC;AACD,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,SAAS,aAAa,WAAW;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,kBACJ,WACA,KACA,SACe;AACf,UAAM,KAAK,WAAW,KAAW,aAAa,SAAS,SAAS;AAAA,MAC9D;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBACJ,WACA,SACA,WACA,UACA,OACe;AACf,UAAM,KAAK,WAAW,KAAW,aAAa,SAAS,aAAa;AAAA,MAClE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,WAAkC;AACtD,UAAM,KAAK,WAAW,OAAa,aAAa,SAAS,MAAM;AAAA,EACjE;AAAA,EAEA,MAAM,iBAAiB,WAAkC;AACvD,UAAM,KAAK,WAAW,KAAW,aAAa,SAAS,MAAM;AAAA,EAC/D;AAAA,EAEA,MAAM,OAAO,WAAmB,SAA6C;AAC3E,UAAM,cAAcA,eAAc,OAAO;AACzC,WAAO,KAAK,WAAW;AAAA,MACrB,aAAa,SAAS,WAAW,WAAW;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAM,KACJ,WACA,QACA,SACe;AACf,UAAM,cAAc,IAAI,gBAAgB;AAAA,MACtC,GAAI,UAAU,EAAE,OAAO;AAAA,MACvB,GAAI,WAAW,EAAE,SAAS,QAAQ,SAAS,EAAE;AAAA,IAC/C,CAAC;AACD,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,SAAS,SAAS,WAAW;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,WAAmB,UAAiC;AACxE,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,SAAS,sBAAsB,mBAAmB,QAAQ,CAAC;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,WAAkC;AACpD,UAAM,KAAK,WAAW,KAAW,aAAa,SAAS,SAAS;AAAA,EAClE;AAAA,EAEA,MAAM,YAAY,WAAkC;AAClD,UAAM,KAAK,WAAW,KAAW,aAAa,SAAS,OAAO;AAAA,EAChE;AAAA,EAEA,MAAM,gBAAgB,WAAkC;AACtD,UAAM,KAAK,WAAW,OAAa,aAAa,SAAS,OAAO;AAAA,EAClE;AAAA,EAEA,MAAM,SACJ,WACA,MACA,SAMe;AACf,UAAM,cAAcA,eAAc,EAAE,MAAM,GAAG,QAAQ,CAAC;AACtD,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,SAAS,SAAS,WAAW;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAM,YACJ,WACA,YAAmC,QACpB;AACf,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,SAAS,mBAAmB,SAAS;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,WACA,YAAmC,QACpB;AACf,UAAM,KAAK,WAAW;AAAA,MACpB,aAAa,SAAS,mBAAmB,SAAS;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,WAAkC;AAClD,UAAM,KAAK,WAAW,KAAW,aAAa,SAAS,OAAO;AAAA,EAChE;AAAA,EAEA,MAAM,cAAc,WAAkC;AACpD,UAAM,KAAK,WAAW,OAAa,aAAa,SAAS,OAAO;AAAA,EAClE;AAAA,EAEA,MAAM,cAAc,MAA0C;AAC5D,WAAO,KAAK,WAAW,KAAc,oBAAoB,IAAI;AAAA,EAC/D;AAAA,EAEA,MAAM,gBACJ,WACA,MACkB;AAClB,WAAO,KAAK,WAAW,KAAc,aAAa,SAAS,IAAI,IAAI;AAAA,EACrE;AACF;;;AErkBO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzC,MAAM,OAA4B;AAChC,UAAM,YAAY,MAAM,KAAK,OAAO,IAAa,YAAY;AAE7D,QAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC7B,YAAM,IAAI,MAAM,kDAA4C;AAAA,IAC9D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WACJ,YACA,UAC0B;AAC1B,WAAO,KAAK,OAAO;AAAA,MACjB,cAAc,UAAU,IAAI,QAAQ;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,YACJ,YACA,UACA,SACe;AACf,UAAM,KAAK,OAAO;AAAA,MAChB,cAAc,UAAU,IAAI,QAAQ;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;;;ACxDA,IAAAC,iBAA6B;AAMtB,IAAM,mBAAN,cAA+B,4BAAa;AAAA;AAAA,EAIjD,YACU,QACA,YACA,YACR;AACA,UAAM;AAJE;AACA;AACA;AAGR,SAAK,KAAK,cAAc,YAAY,KAAK,IAAI,CAAC;AAE9C,UAAM,YAAY,KAAK,OAAO,oBAAoB;AAClD,UAAM,WAAW,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,MAAK,CAACC,YACpDA,QAAO,YAAY;AAAA,IACrB;AAEA,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;AAAA,QACR,6DAA0D,KAAK,EAAE;AAAA,MACnE;AAAA,IACF;AAEA,aAAS,GAAG,WAAW,CAAC,UAA0B;AAChD,UAAI,gBAAgB,OAAO,KAAK,EAAE,GAAG;AACnC,gBAAQ,IAAI,uCAAuC,MAAM,IAAI,IAAI,KAAK;AACtE,aAAK,KAAK,MAAM,MAAM,KAAK;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EA5BQ,eAAgC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAgCP,MAAM,aAAgC;AACpC,QAAI,CAAC,KAAK,cAAc,CAAC,KAAK,cAAc;AAC1C,YAAM,IAAI,MAAM,gDAA6C;AAAA,IAC/D;AAEA,UAAM,UAAU,MAAM,KAAK,WAAW;AAAA,MACpC,cAAc,KAAK,EAAE;AAAA,IACvB;AACA,SAAK,eAAe;AACpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACJ,WACe;AACf,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAEA,UAAM,KAAK,WAAW;AAAA,MACpB,cAAc,KAAK,EAAE,sBAAsB,SAAS;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAEA,UAAM,KAAK,WAAW,OAAa,cAAc,KAAK,UAAU,EAAE;AAClE,SAAK,KAAK,mBAAmB,KAAK,YAAY;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,GACE,OACA,UACM;AACN,UAAM,GAAG,OAAO,QAAQ;AACxB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KACE,OACA,UACM;AACN,UAAM,KAAK,OAAO,QAAQ;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IACE,OACA,UACM;AACN,UAAM,IAAI,OAAO,QAAQ;AACzB,WAAO;AAAA,EACT;AACF;AAEO,IAAM,YAAN,cAAwB,4BAAa;AAAA,EAC1C,YACU,YACA,QACR;AACA,UAAM;AAHE;AACA;AAAA,EAGV;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,YAAuC;AAC9C,UAAM,KAAK,cAAc,YAAY,KAAK,IAAI,CAAC;AAC/C,WAAO,IAAI,iBAAiB,KAAK,QAAQ,KAAK,YAAY,EAAE;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB;AACpB,WAAO,KAAK,OAAO,oBAAoB;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBACE,WACA,MACM;AACN,QAAI,gBAAgB,MAAM;AACxB,YAAM,aAAa,KAAK;AACxB,UAAI,YAAY;AACd,aAAK,KAAK,GAAG,SAAS,IAAI,UAAU,IAAI,IAAI;AAAA,MAC9C;AAAA,IACF;AACA,SAAK,KAAK,WAAW,IAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,YAAuC;AACtD,WAAO,KAAK,WAAW,IAAc,cAAc,UAAU,EAAE;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,QACJ,YACA,WACe;AACf,UAAM,KAAK,WAAW;AAAA,MACpB,cAAc,UAAU,sBAAsB,SAAS;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,YAAmC;AAC5C,UAAM,KAAK,WAAW,OAAa,cAAc,UAAU,EAAE;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBACE,WACA,YACA,UACM;AACN,SAAK,GAAG,GAAG,SAAS,IAAI,UAAU,IAAI,QAAQ;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBACE,WACA,YACA,UACM;AACN,SAAK,IAAI,GAAG,SAAS,IAAI,UAAU,IAAI,QAAQ;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,qBACE,WACA,YACS;AACT,WAAO,KAAK,cAAc,GAAG,SAAS,IAAI,UAAU,EAAE,IAAI;AAAA,EAC5D;AACF;;;ACzOO,IAAM,SAAN,MAAa;AAAA,EAClB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASzC,MAAM,KAAK,QAA6C;AACtD,UAAM,QAAQ,SACV,IAAI,IAAI,gBAAgB,MAAgC,EAAE,SAAS,CAAC,KACpE;AAEJ,UAAM,SAAS,MAAM,KAAK,OAAO,IAAa,UAAU,KAAK,EAAE;AAE/D,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,YAAM,IAAI,MAAM,+CAAyC;AAAA,IAC3D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,SAAiC;AAChD,WAAO,KAAK,OAAO,IAAW,WAAW,OAAO,EAAE;AAAA,EACpD;AACF;;;ACpCA,IAAAC,iBAA6B;AAC7B,iCAA8C;AAC9C,gBAAsB;AAOf,IAAM,kBAAN,cAA8B,4BAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYhD,YAAoB,KAAa;AAC/B,UAAM;AADY;AAAA,EAEpB;AAAA,EAbQ,KAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAA4C,CAAC;AAAA,EACrD,uBAAuB;AAAA,EACf,oBAAoB;AAAA,EAU5B,MAAc,YAA2B;AACvC,YAAQ,IAAI,uCAAoC;AAEhD,UAAM,iBAAkC;AAAA,MACtC,mBAAmB;AAAA,MACnB,eAAe;AAAA;AAAA,MACf,cAAc;AAAA;AAAA,MACd,UAAU;AAAA;AAAA,MACV,eAAe,KAAK;AAAA;AAAA,MACpB,QAAQ;AAAA,MACR,OAAO,CAAC,OAAY,kBAA0B;AAC5C,gBAAQ;AAAA,UACN,aAAa,aAAa,4BAAyB,MAAM,OAAO;AAAA,QAClE;AACA,eAAO,CAAC,KAAK;AAAA,MACf;AAAA,IACF;AAEA,QAAI;AACF,gBAAM,oCAAQ,YAAY;AACxB,gBAAQ,IAAI,yBAAyB,KAAK,oBAAoB,CAAC,MAAM;AACrE,cAAM,KAAK,QAAQ;AACnB,gBAAQ,IAAI,4BAAyB;AAAA,MACvC,GAAG,cAAc;AAGjB,WAAK,oBAAoB;AACzB,WAAK,iBAAiB;AAAA,IACxB,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,+BAAyB,KAAK,oBAAoB;AAAA,QAClD;AAAA,MACF;AACA,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAyB;AAC7B,QAAI,KAAK,eAAgB;AAEzB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAK,KAAK,IAAI,UAAAC,QAAU,KAAK,GAAG;AAEhC,WAAK,GAAG,GAAG,QAAQ,MAAM;AACvB,gBAAQ,IAAI,sBAAsB;AAClC,aAAK,mBAAmB;AACxB,aAAK,iBAAiB;AACtB,aAAK,oBAAoB;AACzB,gBAAQ;AAAA,MACV,CAAC;AAED,WAAK,GAAG,GAAG,SAAS,CAAC,QAAQ;AAC3B,gBAAQ,MAAM,iCAA8B,GAAG;AAC/C,eAAO,GAAG;AAAA,MACZ,CAAC;AAED,WAAK,GAAG,GAAG,SAAS,CAAC,MAAM,WAAW;AACpC,gBAAQ,KAAK,2BAA2B,IAAI,MAAM,MAAM,EAAE;AAC1D,aAAK,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEnC,YAAI,CAAC,KAAK,kBAAkB;AAC1B,eAAK,UAAU;AAAA,QACjB;AAAA,MACF,CAAC;AAED,WAAK,GAAG,GAAG,WAAW,CAAC,YAAY;AACjC,aAAK,cAAc,OAAO;AAAA,MAC5B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAuB;AACrB,WAAO,KAAK,IAAI,eAAe,UAAAA,QAAU;AAAA,EAC3C;AAAA,EAEA,UAAU,UAAqC;AAC7C,SAAK,iBAAiB,KAAK,QAAQ;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GACE,OACA,UACM;AACN,UAAM,GAAG,OAAO,QAAQ;AACxB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IACE,OACA,UACM;AACN,UAAM,IAAI,OAAO,QAAQ;AACzB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,OAA+B;AAChD,UAAM,mBAAmB,KAAK;AAC9B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,SAA+B;AACnD,QAAI;AACF,YAAM,cAAc,KAAK,MAAM,QAAQ,SAAS,CAAC;AACjD,UAAI,aAAa,MAAM;AACrB,aAAK,KAAK,YAAY,MAAM,WAAW;AACvC,aAAK,KAAK,WAAW,WAAW;AAAA,MAClC,OAAO;AACL,gBAAQ,KAAK,+BAA+B,WAAW;AAAA,MACzD;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAM,8CAA8C,GAAG;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,MAAiB;AACpB,QAAI,CAAC,KAAK,MAAM,KAAK,GAAG,eAAe,UAAAA,QAAU,MAAM;AACrD,YAAM,IAAI,MAAM,qCAA+B;AAAA,IACjD;AAEA,SAAK,GAAG,KAAK,MAAM,CAAC,QAAQ;AAC1B,UAAI,KAAK;AACP,gBAAQ,MAAM,wCAAwC,GAAG;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,KAAK,IAAI;AACX,WAAK,mBAAmB;AACxB,WAAK,GAAG,MAAM;AACd,WAAK,KAAK;AACV,cAAQ,IAAI,gCAAgC;AAAA,IAC9C;AAAA,EACF;AACF;;;AVlLO,IAAM,YAAN,MAAgB;AAAA,EAwDrB,YAAoB,QAAyB;AAAzB;AAClB,UAAM,eAAe,OAAO,SAAS,UAAU;AAC/C,UAAM,iBAAiB,OAAO,KAAK,QAAQ,gBAAgB,EAAE;AAC7D,UAAM,UAAU,GAAG,YAAY,MAAM,cAAc,IAAI,OAAO,IAAI;AAElE,SAAK,aAAa,IAAI,WAAW,SAAS,OAAO,UAAU,OAAO,QAAQ;AAC1E,SAAK,WAAW,IAAI,SAAS,KAAK,YAAY,IAAI;AAClD,SAAK,YAAY,IAAI,UAAU,KAAK,YAAY,IAAI;AACpD,SAAK,YAAY,IAAI,UAAU,KAAK,UAAU;AAC9C,SAAK,eAAe,IAAI,aAAa,KAAK,UAAU;AACpD,SAAK,SAAS,IAAI,OAAO,KAAK,UAAU;AACxC,SAAK,WAAW,IAAI,SAAS,KAAK,UAAU;AAC5C,SAAK,UAAU,IAAI,QAAQ,KAAK,UAAU;AAAA,EAC5C;AAAA,EApEQ,iBAAmD,oBAAI,IAAI;AAAA,EAC3D,YAA0C,oBAAI,IAAI;AAAA;AAAA,EACzC;AAAA,EACT,iBAAuC,oBAAI,IAAI;AAAA;AAAA,EAC/C,iBAA6C,oBAAI,IAAI;AAAA;AAAA,EACrD,mBAAiD,oBAAI,IAAI;AAAA,EACzD,mBAGF,CAAC;AAAA,EACC,0BAAgC;AACtC,eAAW,CAAC,KAAK,QAAQ,KAAK,KAAK,UAAU,QAAQ,GAAG;AACtD,UAAI,CAAC,SAAS,YAAY,GAAG;AAC3B,gBAAQ,KAAK,yBAAyB,GAAG,mCAA6B;AACtE;AAAA,MACF;AAGA,aAAO,KAAK,iBAAiB,SAAS,GAAG;AACvC,cAAM,EAAE,OAAO,SAAS,IAAI,KAAK,iBAAiB,MAAM;AAGxD,YAAI,SAAS,cAAc,KAAK,IAAI,GAAG;AACrC,kBAAQ;AAAA,YACN,4CAAyC,KAAK,aAAa,GAAG;AAAA,UAChE;AACA;AAAA,QACF;AAEA,gBAAQ,IAAI,8BAA8B,GAAG,gBAAgB,KAAK,EAAE;AACpE,iBAAS,GAAG,OAAO,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,KAA4B;AAC3D,YAAQ,IAAI,+CAA+C,GAAG,MAAM;AAEpE,QAAI;AACF,YAAM,KAAK,uBAAuB,GAAG;AACrC,WAAK,wBAAwB;AAC7B,cAAQ,IAAI,yCAAsC,GAAG,IAAI;AAAA,IAC3D,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAwC,GAAG,MAAM,KAAK;AAAA,IACtE;AAAA,EACF;AAAA,EAEO;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAkBA,sBAAoD;AACzD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,GACL,WACA,UACM;AACN,YAAQ,IAAI,4CAA4C,SAAS,EAAE;AAEnE,UAAM,kBAAkB,CAAC,UAA0B;AACjD,UAAI,eAAe,KAAK,GAAG;AACzB,cAAM,YAAY,MAAM,QAAQ;AAEhC,YAAI,WAAW;AACb,cAAI,CAAC,KAAK,iBAAiB,IAAI,SAAS,GAAG;AACzC,kBAAM,kBAAkB,KAAK,sBAAsB,SAAS;AAC5D,iBAAK,iBAAiB,IAAI,WAAW,eAAe;AAAA,UACtD;AAEA,gBAAM,kBAAkB,KAAK,iBAAiB,IAAI,SAAS;AAC3D,gBAAM,iBAAiB,KAAK,MAAM,MAAM,KAAK;AAAA,QAC/C;AAAA,MACF;AAEA,eAAS,KAA6C;AAAA,IACxD;AAEA,eAAW,CAAC,MAAM,QAAQ,KAAK,KAAK,UAAU,QAAQ,GAAG;AACvD,eAAS,GAAG,WAAW,eAAe;AAAA,IACxC;AAEA,SAAK,eAAe,IAAI,WAAW,eAAe;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,WAAW,MAAyC;AAC1D,WAAO,MAAM,SAAS,OAAO;AAAA,EAC/B;AAAA;AAAA,EAGQ,sBAAsB,WAAoC;AAChE,WAAO,KAAK,SAAS,QAAQ,SAAS;AAAA,EACxC;AAAA,EAEQ,qBAAqB,OAA6B;AACxD,YAAQ,IAAI,iCAAiC,MAAM,MAAM,KAAK;AAC9D,UAAM,EAAE,MAAM,GAAG,KAAK,IAAI;AAE1B,QAAI,KAAK,WAAW,IAAI,GAAG;AACzB,YAAM,YAAY,KAAK,QAAQ;AAE/B,UAAI,WAAW;AAEb,YAAI,CAAC,KAAK,iBAAiB,IAAI,SAAS,GAAG;AACzC,gBAAMC,mBAAkB,KAAK,sBAAsB,SAAS;AAC5D,eAAK,iBAAiB,IAAI,WAAWA,gBAAe;AAAA,QACtD;AAGA,cAAM,kBAAkB,KAAK,iBAAiB,IAAI,SAAS;AAC3D,YAAI,iBAAiB;AACnB,eAAK,UAAU,EAAE,GAAG,KAAK,SAAS,GAAG,gBAAgB;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,eAAe,IAAI,IAAI;AAC7C,QAAI,UAAU;AACZ,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,iBACJ,MACA,kBACiB;AACjB,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAAG;AAC7C,YAAM,IAAI,MAAM,uDAAiD;AAAA,IACnE;AAEA,WAAO,QAAQ;AAAA,MACb,KAAK,IAAI,OAAO,QAAQ;AACtB,YAAI,KAAK,UAAU,IAAI,GAAG,GAAG;AAC3B,kBAAQ,IAAI,8BAA2B,GAAG,4BAAyB;AACnE;AAAA,QACF;AAEA,cAAM,KAAK,uBAAuB,KAAK,gBAAgB;AAAA,MACzD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBACZ,KACA,kBACe;AACf,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,2CAAqC;AAAA,IACvD;AAGA,QAAI,KAAK,eAAe,IAAI,GAAG,GAAG;AAChC,cAAQ,IAAI,8BAA2B,GAAG,wBAAkB;AAC5D,aAAO,KAAK,eAAe,IAAI,GAAG;AAAA,IACpC;AAEA,UAAM,WAAW,KAAK,OAAO,SAAS,QAAQ;AAC9C,UAAM,cACJ,oBAAoB,iBAAiB,SAAS,IAC1C,UAAU,iBAAiB,KAAK,GAAG,CAAC,KACpC;AACN,UAAM,QAAQ,GAAG,QAAQ,MAAM;AAAA,MAC7B,KAAK,OAAO;AAAA,IACd,CAAC,IAAI,mBAAmB,KAAK,OAAO,QAAQ,CAAC,IAC3C,KAAK,OAAO,IACd,IAAI,KAAK,OAAO,IAAI,mBAAmB,GAAG,GAAG,WAAW;AAGxD,UAAM,iBAAkC;AAAA,MACtC,mBAAmB;AAAA,MACnB,eAAe;AAAA,MACf,cAAc;AAAA,MACd,UAAU;AAAA,MACV,eAAe;AAAA,MACf,QAAQ;AAAA,MACR,OAAO,CAAC,OAAY,kBAA0B;AAC5C,gBAAQ;AAAA,UACN,aAAa,aAAa,iBAAiB,GAAG,MAAM,MAAM,OAAO;AAAA,QACnE;AAGA,eACE,CAAC,KAAK,UAAU,IAAI,GAAG,KAAK,CAAC,KAAK,UAAU,IAAI,GAAG,GAAG,YAAY;AAAA,MAEtE;AAAA,IACF;AAGA,UAAM,mBAAmB,IAAI,QAAc,OAAO,SAAS,WAAW;AACpE,UAAI;AACF,YAAI,KAAK,eAAe,IAAI,GAAG,GAAG;AAChC,kBAAQ,KAAK,iDAA2C,GAAG,IAAI;AAC/D;AAAA,QACF;AAEA,aAAK,eAAe,IAAI,KAAK,IAAI;AAEjC,cAAM,WAAW,IAAI,gBAAgB,KAAK;AAE1C,kBAAM,qCAAQ,YAAY;AACxB,cAAI,CAAC,UAAU;AACb,kBAAM,IAAI,MAAM,mCAAmC;AAAA,UACrD;AAEA,gBAAM,SAAS,QAAQ;AACvB,kBAAQ,IAAI,mCAAmC,GAAG,EAAE;AAGpD,eAAK,yBAAyB,KAAK,QAAQ;AAG3C,gBAAM,KAAK,oBAAoB,GAAG;AAGlC,eAAK,UAAU,IAAI,KAAK,QAAQ;AAGhC,eAAK,wBAAwB;AAAA,QAC/B,GAAG,cAAc;AAEjB,gBAAQ;AAAA,MACV,SAAS,OAAO;AACd,gBAAQ,MAAM,oCAAoC,GAAG,MAAM,KAAK;AAChE,eAAO,KAAK;AAAA,MACd,UAAE;AACA,aAAK,eAAe,OAAO,GAAG;AAAA,MAChC;AAAA,IACF,CAAC;AAED,SAAK,eAAe,IAAI,KAAK,gBAAgB;AAC7C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,yBACN,KACA,UACM;AACN,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;AAAA,QACR,gCAAgC,GAAG;AAAA,MACrC;AAAA,IACF;AAGA,QAAI,SAAS,cAAc,iBAAiB,IAAI,GAAG;AACjD,cAAQ,IAAI,IAAI,GAAG,yCAAsC;AACzD;AAAA,IACF;AAEA,UAAM,gBAEF;AAAA,MACF,iBAAiB,CAAC,SAAS;AACzB,YAAI,gBAAgB,MAAM;AACxB,kBAAQ,IAAI,IAAI,GAAG,sBAAsB,IAAI;AAAA,QAC/C;AAAA,MACF;AAAA,MACA,kBAAkB,CAAC,SAAS;AAC1B,YAAI,gBAAgB,MAAM;AACxB,kBAAQ,IAAI,IAAI,GAAG,uBAAuB,IAAI;AAAA,QAChD;AAAA,MACF;AAAA,MACA,qBAAqB,CAAC,SAAS;AAC7B,YAAI,KAAK,SAAS,yBAAyB,WAAW,MAAM;AAC1D,kBAAQ,IAAI,IAAI,GAAG,oBAAoB,KAAK,KAAK,EAAE;AAAA,QACrD,OAAO;AACL,kBAAQ;AAAA,YACN,IAAI,GAAG;AAAA,YACP;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,oBAAoB,CAAC,SAAS;AAC5B,YAAI,aAAa,MAAM;AACrB,kBAAQ,IAAI,IAAI,GAAG,+BAA+B,KAAK,OAAO;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAEA,eAAW,CAAC,WAAW,OAAO,KAAK,OAAO,QAAQ,aAAa,GAAG;AAChE,UAAI,SAAS;AACX,iBAAS,GAAG,WAAiC,OAAO;AAAA,MACtD;AAAA,IACF;AAEA,YAAQ,IAAI,IAAI,GAAG,oDAAoD;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,oBAAoB,KAA4B;AACpD,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,WAAW,IAAsB,eAAe;AACxE,YAAM,YAAY,KAAK,KAAK,CAAC,MAAwB,EAAE,SAAS,GAAG;AAEnE,UAAI,CAAC,WAAW;AACd,gBAAQ,IAAI,iCAAiC,GAAG,EAAE;AAClD,cAAM,KAAK,WAAW,KAAK,iBAAiB,EAAE,IAAI,CAAC;AACnD,gBAAQ,IAAI,cAAc,GAAG,0BAA0B;AAAA,MACzD,OAAO;AACL,gBAAQ,IAAI,cAAc,GAAG,4BAAsB;AAAA,MACrD;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,6CAA6C,GAAG,KAAK,KAAK;AACxE,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,wBAAiC;AAE/B,WAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,MAAM,CAAC,aAChD,SAAS,YAAY;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,qBAAqB,KAAsB;AACzC,UAAM,WAAW,KAAK,UAAU,IAAI,GAAG;AACvC,WAAO,WAAW,SAAS,YAAY,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,eAAe,KAAmB;AAChC,UAAM,WAAW,KAAK,UAAU,IAAI,GAAG;AACvC,QAAI,UAAU;AACZ,eAAS,MAAM;AACf,WAAK,UAAU,OAAO,GAAG;AACzB,cAAQ,IAAI,yBAAyB,GAAG,gBAAgB;AAAA,IAC1D,OAAO;AACL,cAAQ,KAAK,yBAAyB,GAAG,sBAAmB;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,qBAA2B;AACzB,SAAK,UAAU,QAAQ,CAAC,UAAU,QAAQ;AACxC,eAAS,MAAM;AACf,cAAQ,IAAI,yBAAyB,GAAG,gBAAgB;AAAA,IAC1D,CAAC;AACD,SAAK,UAAU,MAAM;AACrB,YAAQ,IAAI,qCAAqC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,WAAqC;AAC3C,WAAO,KAAK,SAAS,QAAQ,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,YAAuC;AAC9C,WAAO,KAAK,UAAU,SAAS,UAAU;AAAA,EAC3C;AACF;",
|
|
6
|
+
"names": ["exports", "exports", "exports", "exports", "Delay", "exports", "SkipFirstDelay", "exports", "AlwaysDelay", "exports", "exports", "backOff", "exports", "BackOff", "import_exponential_backoff", "axios", "import_events", "toQueryParams", "client", "toQueryParams", "import_events", "client", "import_events", "WebSocket", "channelInstance"]
|
|
7
7
|
}
|