import { EventEmitter } from 'ee-ts'; import type { AudioProcessingConfig, SipClient } from '../sip'; import { Agent, type AgentStatusEvent } from './agent'; import { type AnswerRequest, Call, CallActions, type CallItem, type CallVariables, type EavesdropRequest, type OutboundCallRequest, type RtpMetrics } from './call'; import { Conversation, type ConversationItem } from './conversation'; import { type MessageNotification } from './notification'; import type { QueueJoinMemberEvent } from './queue'; import { type Reporting, Task, type TaskData } from './task'; import type { UserStatus } from './user'; import { type ScreenResolver } from '../screen'; import { SpyScreen } from './screen'; /** * Налаштування клієнта. * * @interface Config * @property {string} endpoint - URL-адреса кінцевої точки для підключення клієнта. * @property {string} [storageEndpoint] - (Необов'язковий) URL-адреса кінцевої точки для зберігання даних. * @property {string} [token] - (Необов'язковий) Токен для аутентифікації клієнта. * @property {'debug' | 'info' | 'warn' | 'error'} [logLvl] - (Необов'язковий) Рівень логування для клієнта. * @property {boolean} [registerWebDevice] - (Необов'язковий) Вказує, чи слід реєструвати веб-пристрій. * @property {number} [phone] - (Необов'язковий) Номер телефону для реєстрації. * @property {boolean} [debug] - (Необов'язковий) Вказує, чи слід увімкнути режим налагодження. * @property {number} [autoAnswerDelayTime] - (Необов'язковий) Час затримки перед автоматичною відповіддю на дзвінок. * @property {boolean} [echoCancellation] - (Необов'язковий) Вказує, чи слід увімкнути придушення відлуння. * @property {boolean} [noiseSuppression] - (Необов'язковий) Вказує, чи слід увімкнути придушення шуму. * @property {boolean} [autoGainControl] - (Необов'язковий) Вказує, чи слід увімкнути автоматичне регулювання підсилення. */ export interface Config { endpoint: string; storageEndpoint?: string; token?: string; logLvl?: 'debug' | 'info' | 'warn' | 'error'; registerWebDevice?: boolean; phone?: number; debug?: boolean; autoAnswerDelayTime?: number; screenResolver?: ScreenResolver | null; applicationName?: string; echoCancellation?: boolean; noiseSuppression?: boolean; autoGainControl?: boolean; } /** * Запит на дзвінок користувачу. * * @interface UserCallRequest * @property {string | null} [nodeId] - (Необов'язковий) Ідентифікатор вузла, з якого здійснюється дзвінок. Якщо не вказано, значення буде null. * @property {string | null} [parentCallId] - (Необов'язковий) Ідентифікатор батьківського дзвінка, якщо такий існує. * @property {string | null} [sendToCallId] - (Необов'язковий) Ідентифікатор дзвінка, на який потрібно відправити виклик, якщо такий існує. * @property {string} toUserId - Ідентифікатор користувача, якому призначений дзвінок. * @property {boolean} [useVideo] - (Необов'язковий) Вказує, чи буде використовуватись відео під час дзвінка. * @property {boolean} [useScreen] - (Необов'язковий) Вказує, чи буде використовуватись спільний доступ до екрану під час дзвінка. * @property {boolean} [useAudio] - (Необов'язковий) Вказує, чи буде використовуватись аудіо під час дзвінка. * @property {CallVariables} [variables] - (Необов'язковий) Додаткові змінні, які будуть використані під час дзвінка. */ export interface UserCallRequest { nodeId?: string | null; parentCallId?: string | null; sendToCallId?: string | null; toUserId: string; useVideo?: boolean; useScreen?: boolean; useAudio?: boolean; variables?: CallVariables; } /** * Подія SDP (Session Description Protocol). */ export interface SdpEvent { sip_id: string; sdp: { sdp: string; type: string; }; } export declare const WEBSOCKET_EVENT_CALL_MEDIA_METRIC = "call_media_metric"; /** * Статус відповіді. */ export declare enum Response { STATUS_FAIL = "FAIL", STATUS_OK = "OK" } /** * Інформація про сесію. * * Цей інтерфейс описує структуру даних, яка містить інформацію про сесію користувача. */ export interface Session { /** * Унікальний ідентифікатор сесії. */ id: string; /** * Час закінчення дії сесії в секундах (UNIX timestamp). */ expire: number; /** * Ідентифікатор користувача, до якого належить сесія. */ user_id: number; /** * Список ідентифікаторів ролей, які має користувач у межах цієї сесії. */ role_ids: number[]; token: string; } /** * Інформація про з'єднання. * * Цей інтерфейс описує структуру даних, яка містить інформацію про поточне з'єднання з сервером. */ export interface ConnectionInfo { /** * Ідентифікатор сокет-з'єднання. */ sock_id: string; /** * Коміт ідентифікатора збірки сервера. */ server_build_commit: string; /** * Ідентифікатор вузла сервера, з яким встановлено з'єднання. */ server_node_id: string; /** * Версія сервера, з яким встановлено з'єднання. */ server_version: string; /** * Поточний час сервера в секундах (UNIX timestamp). */ server_time: number; /** * Інтервал пінг-запитів у мілісекундах (необов'язкове). */ ping_interval?: number; /** * Інформація про сесію користувача, пов'язану з цим з'єднанням. */ session: Session; /** * Вказує на те, чи підтримує сервер Back-to-Back User Agent (необов'язкове). */ b2bua?: boolean; /** * Вказує, чи дозволено використовувати чат для цього з'єднання (необов'язкове). */ use_chat?: boolean; /** * Вказує, чи дозволено використовувати центр контактів (call center) для цього з'єднання (необов'язкове). */ use_cc?: boolean; rtc_configuration?: RTCConfiguration; } /** * Відповідь списку дзвінків. */ export interface CallListResponse { items?: CallItem[]; next?: boolean; } /** * Відповідь списку завдань. */ export interface TaskListResponse { items: TaskData[]; } /** * Відповідь списку розмов. */ export interface ConversationListResponse { items?: ConversationItem[]; next?: boolean; } /** * Інформація про файл у сховищі. * * Цей інтерфейс описує структуру даних, яка містить інформацію про файл, збережений у сховищі. */ export interface StorageShareFile { /** * Унікальний ідентифікатор файлу. */ id: number; /** * Розмір файлу в байтах. */ size: number; /** * MIME-тип файлу, який вказує на його формат. */ mime: string; /** * Назва файлу. */ name: string; /** * Посилання для доступу до файлу, якщо файл спільний. */ shared: string; } /** * Функція для відстеження прогресу завантаження файлу. */ export type FileUploadProgress = (progress: any) => void; /** * Обробник подій дзвінка. */ export type CallEventHandler = (action: CallActions, call: Call) => void; /** * Обробник подій чату. */ export type ChatEventHandler = (action: string, conversation: Conversation) => void; /** * Обробник подій статусу користувачів. */ export type UsersStatusEventHandler = (state: UserStatus) => void; /** * Обробник подій статусу агента. */ export type AgentStatusEventHandler = (state: AgentStatusEvent, agent: Agent) => void; /** * Обробник подій завдання. */ export type TaskEventHandler = (action: string, task: Task | undefined) => void; /** * Обробник подій роботи. */ export type JobEventHandler = (action: string, task: Task) => void; /** * Обробник подій приєднання абонента до черги. */ export type QueueJoinMemberHandler = (member: QueueJoinMemberEvent) => void; /** * Події клієнта. * * Цей інтерфейс описує набір подій, які можуть бути викликані в процесі роботи клієнта. */ export interface ClientEvents { /** * Викликається при відключенні клієнта. * @param code - Код відключення. * @param err - Інформація про помилку, якщо вона є. */ disconnected(code: number, err: Error | null): void; /** * Викликається при успішному підключенні клієнта. */ connected(): void; /** * Викликається при виникненні помилки. * @param e - Об'єкт помилки. */ error(e: Error): void; /** * Викликається при зміні статусу реєстрації телефону. * @param registered - Булевий статус реєстрації телефону. */ phone_registered(registered: boolean): void; /** * Викликається при зміні статусу підключення телефону. * @param connected - Булевий статус підключення телефону. */ phone_connected(connected: boolean): void; /** * Викликається для оновлення пропущених подій. * @param ev - Об'єкт, що містить інформацію про пропущені події. */ refresh_missed(ev: object): void; /** * Викликається для відображення повідомлення. * @param ev - Об'єкт сповіщення. */ show_message(ev: MessageNotification): void; screenshot(ev: MessageNotification): void; open_link(ev: MessageNotification): void; screen_rec_start(ev: MessageNotification): void; screen_rec_stop(ev: MessageNotification): void; /** * Викликається при отриманні SDP-повідомлення. * @param sock - Ідентифікатор сокету. * @param ev - Об'єкт події SDP. */ sdp(sock: string, ev: SdpEvent): void; /** * Викликається при отриманні вхідного дзвінка. * @param call - Об'єкт дзвінка. */ call_receive(call: Call): void; /** * Викликається при завершенні дзвінка. * @param call - Об'єкт дзвінка. */ call_hangup(call: Call): void; [WEBSOCKET_EVENT_CALL_MEDIA_METRIC](rtp: RtpMetrics): void; } /** * Цей клас Client розширює EventEmitter, який використовується для керування подіями, * що описані в інтерфейсі ClientEvents. Він має декілька полів для збереження стану клієнта, * таких як agent, phone, lastError, lastLatency, а також деякі приватні поля для внутрішнього використання, * такі як socket, connectionInfo, reqSeq, queueRequest, log, eventHandler, callStore, conversationStore, * pingTimer, та toneTimer. * Конструктор класу приймає конфігураційні параметри, які використовуються для ініціалізації клієнта. */ export declare class Client extends EventEmitter { protected readonly _config: Config; agent: Agent; phone?: SipClient; lastError: null | Error; lastLatency: number | null; readonly basePath: string; private socket; private connectionInfo; private reqSeq; private queueRequest; private ackQueue; private log; private eventHandler; private callStore; private spyScreenSessions; private senderScreenStore; private conversationStore; private pingTimer; private toneTimer; private screenResolver; /** * Конструктор для створення екземпляра клієнта. * * @param _config - Конфігураційні параметри клієнта. */ constructor(_config: Config); connect(): Promise; disconnect(): Promise; subscribeCall(handler: CallEventHandler, data?: object): Promise; /** * Підписується на події чату. * * @param handler - Обробник подій чату. * @param data - Додаткові дані для підписки (необов'язково). */ subscribeChat(handler: ChatEventHandler, data?: object): Promise; subscribeUsersStatus(handler: UsersStatusEventHandler, data?: object): Promise; subscribeAgentsStatus(handler: AgentStatusEventHandler, data?: object): Promise; getTask(id: number): Task | undefined; subscribeTask(handler: TaskEventHandler): void; subscribeJob(handler: JobEventHandler): void; unSubscribe(action: string, _handler: CallEventHandler, data?: object): Promise; destroy(): Promise; allCall(): Call[]; allConversations(): Conversation[]; allTask(): Task[]; allJob(): Task[]; allSpyScreenSessions(): SpyScreen[]; callById(id: string): Call | undefined; conversationById(id: string): Conversation | undefined; callBySipId(id: string): Call | undefined; reportingTask(attemptId: number, reporting: Reporting): Promise; agentActiveTasks(agentId: number): Promise; auth(): Promise; ping(): Promise; sessionInfo(): Session; get version(): string; get buildVersion(): string; get canUseChat(): boolean; get canUseCC(): boolean; get instanceId(): string; get autoAnswerDelayTime(): number; agentSession(): Promise; invite(req: OutboundCallRequest): Promise; call(req: OutboundCallRequest): Promise; callRecordId(id: string): Promise; eavesdrop(req: EavesdropRequest): Promise; agentSetOnline(agentId: number, channels?: string[], onDemand?: boolean): Promise; agentSetWaiting(agentId: number, channel: string): Promise; agentSetPause(agentId: number, payload?: any): Promise; agentSetOffline(agentId: number): Promise; inviteToUser(req: UserCallRequest): Promise; answer(id: string, req: AnswerRequest): Promise; request(action: string, data?: object): Promise; ackRequest(action: string, data?: object, timeout?: number): Promise; useWebPhone(): boolean; callDestroyed(call: Call): boolean; conversationDestroyed(conv: Conversation): boolean; reportingChannelTask(task: Task): void; updateAudioProcessing(processing: AudioProcessingConfig): void; registerCallClient(phone: SipClient): Promise; subscribePhone(phone: SipClient): void; phoneIsRegister(): boolean; deviceConfig(name?: string): Promise; storeFile(id: string, files: File[], cb?: FileUploadProgress, channel?: string): Promise; fileUrlDownload(fileId: number, mime: string): string; fileUrlStream(fileId: number, mime: string): string; handleError(e?: Error): void; destroyConversation(conv: Conversation): void; removeSpyScreen(id: string): boolean; spyScreen(agentId: number, conf: RTCConfiguration, cb: (m: MediaStream) => void, timeout?: number): Promise; private onMessage; private handleNotification; private handleAgentStatus; private handleChannelEvents; private deadlinePingTime; private pingServer; private connected; private calculateLatency; private callBySession; private onCallInfoSession; private onNewCallSession; private checkAutoAnswer; private connectToSocket; private handleUserStateEvent; private handleCallEvents; private generateTone; private handleChatEvents; private hasAgentTask; private destroyCall; private fileUrlParams; } //# sourceMappingURL=client.d.ts.map