@koi-design/callkit 1.0.22

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../package/index.ts","../package/axios.ts","../package/api.ts","../package/const.ts","../package/call.ts","../package/config.ts","../package/logger.ts","../package/connect.ts","../package/socket.ts","../package/user.ts"],"sourcesContent":["import md5 from 'blueimp-md5';\nimport { Api } from './api';\nimport { Call } from './call';\nimport type { IConfig, WebrtcConstranis } from './config';\nimport { Config } from './config';\nimport type { LoggerLevel } from './logger';\nimport { Logger } from './logger';\nimport { Connect } from './connect';\nimport {\n constrainsDefault,\n ErrorCode,\n KitEvent,\n UserStatus,\n isAutoUpdateUserStatusDefault\n} from './const';\nimport { Socket } from './socket';\nimport { User } from './user';\n\nexport interface CallKitConfig {\n host: string\n audioRef: HTMLAudioElement | (() => HTMLAudioElement)\n socket: string\n constrains?: WebrtcConstranis\n log?: LoggerLevel\n}\n\nexport type ConfigEntity = CallKitConfig & Partial<IConfig>;\n\nexport type kitEventType = (typeof KitEvent)[keyof typeof KitEvent];\n\ninterface Listener {\n event: kitEventType\n callback: (...args: any[]) => void\n}\n\nexport class CallKit {\n api: Api;\n config: Config;\n logger: Logger;\n callCenter: Call;\n connect: Connect;\n socket: Socket;\n user: User;\n\n listener: Listener[] = [];\n\n constructor(options: ConfigEntity) {\n this.config = new Config(this);\n this.config.setConfig('log', options.log);\n this.config.setConfig('audioRef', options.audioRef);\n this.config.setConfig('host', options.host);\n this.config.setConfig(\n 'constrains',\n options.constrains || constrainsDefault\n );\n this.config.setConfig('socket', options.socket);\n this.config.setConfig(\n 'isAutoUpdateUserStatus',\n options.isAutoUpdateUserStatus === undefined\n ? isAutoUpdateUserStatusDefault\n : options.isAutoUpdateUserStatus\n );\n this.logger = new Logger(this, options.log);\n\n this.logger.debug('callKit init', options);\n this.api = new Api(this);\n this.connect = new Connect(this);\n this.callCenter = new Call(this);\n this.socket = new Socket(this);\n this.user = new User(this);\n }\n\n async login(username: string, password: string, extra: object = {}) {\n if (this.config.isLogin()) {\n this.logger.warn('already login');\n return;\n }\n this.logger.debug('login info:', {\n username,\n password\n });\n const user = await this.api\n .login({\n userName: username,\n password: md5(username + md5(password))\n })\n .catch((err) => {\n this.logger.error(err, { errCode: ErrorCode.API_USER_LOGIN_ERROR });\n });\n\n if (user) {\n this.config.setConfig('userInfo', {\n wsUrl: `wss://${user.wsUrl}`,\n sessionId: user.sessionId,\n username,\n password,\n agentId: user.agentId,\n fsUserId: user.fsUserId,\n userPart: user.userPart,\n fsPassword: user.fsPassword,\n fsIp: user.fsIp,\n fsPort: user.fsPort,\n iceInfo: user.iceInfo,\n iceGatheringTimeout: user.iceGatheringTimeout,\n ...extra\n });\n this.socket.init();\n this.trigger(KitEvent.KIT_LOGIN_CHANGE, true);\n this.user.setUserStatus(UserStatus.offline);\n }\n }\n\n async logout() {\n if (!this.config.check()) return;\n this.logger.debug('logout');\n await this.user.setUserStatus(UserStatus.offline);\n if (this.config.isLogin()) {\n const { sessionId } = this.config.getConfig().userInfo;\n this.api.loginOut({ sessionId }).catch((err) => {\n this.logger.error(err, { errCode: ErrorCode.API_USER_LOGOUT_ERROR });\n });\n }\n\n await this.hangup();\n this.socket.reset(false);\n this.connect.reset();\n this.config.reset();\n this.trigger(KitEvent.KIT_LOGIN_CHANGE, false);\n }\n\n async call(extno?: string | number) {\n if (!this.config.check()) return;\n if (!this.connect.isRegistered()) {\n this.logger.warn('Currently not registered');\n return;\n }\n if (extno) {\n this.config.setUserInfo('extno', extno);\n }\n\n this.logger.debug('call');\n this.callCenter.callStart();\n }\n\n async register() {\n if (!this.config.check()) return;\n this.logger.debug('register');\n // this.callKit.trigger(KitEvent.KIT_REGISTER_CHANGE, register);\n this.connect.register();\n await this.user.setUserStatus(UserStatus.online);\n }\n\n async unregister() {\n if (!this.config.check()) return;\n this.logger.debug('unregister');\n // this.callKit.trigger(KitEvent.KIT_CALL_STATUS_CHANGE, status);\n this.connect.unregister();\n await this.user.setUserStatus(UserStatus.offline);\n }\n\n async hangup() {\n if (!this.config.check()) return;\n this.logger.debug('hangup', this.connect.connectStatus);\n if (\n !this.connect.isConnecting()\n && !this.connect.isRinging()\n && !this.connect.isCalling()\n && !this.connect.isHolding()\n ) {\n this.logger.warn('Currently not in a call');\n return;\n }\n await this.callCenter.callEnd(true);\n // this.callKit.trigger(KitEvent.KIT_REGISTER_CHANGE, register);\n // this.callKit.trigger(KitEvent.KIT_CALL_STATUS_CHANGE, status);\n // this.callKit.trigger(KitEvent.CALL_END, new Date());\n this.user.setUserStatus(UserStatus.catNap);\n }\n\n hold() {\n if (!this.config.check()) return;\n this.logger.debug('hold');\n // this.callKit.trigger(KitEvent.KIT_REGISTER_CHANGE, register);\n // this.callKit.trigger(KitEvent.KIT_CALL_STATUS_CHANGE, status);\n this.callCenter.callHold();\n }\n\n unhold() {\n if (!this.config.check()) return;\n this.logger.debug('unhold');\n // this.callKit.trigger(KitEvent.KIT_REGISTER_CHANGE, register);\n // this.callKit.trigger(KitEvent.KIT_CALL_STATUS_CHANGE, status);\n this.callCenter.callUnhold();\n }\n\n async setFree() {\n if (!this.config.check()) return;\n this.logger.debug('setFree');\n // this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, UserStatus.offline);\n // this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, status);\n await this.user.setUserStatus(UserStatus.online);\n }\n\n async setSleep() {\n if (!this.config.check()) return;\n this.logger.debug('setSleep');\n // this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, UserStatus.offline);\n // this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, status);\n await this.user.setUserStatus(UserStatus.catNap);\n }\n\n async setBusy() {\n if (!this.config.check()) return;\n this.logger.debug('setBusy');\n // this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, UserStatus.offline);\n // this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, status);\n await this.user.setUserStatus(UserStatus.busy);\n }\n\n async reset() {\n this.logger.debug('reset');\n this.connect.reset();\n if (this.config.isLogin()) {\n // this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, UserStatus.offline);\n // this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, status);\n await this.user.setUserStatus(UserStatus.online);\n } else {\n // this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, UserStatus.offline);\n // this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, status);\n await this.user.setUserStatus(UserStatus.offline);\n }\n }\n\n on(event: kitEventType, callback: (...args: any[]) => void) {\n this.logger.debug(`on ${event}`);\n this.listener.push({\n event,\n callback\n });\n }\n\n off(event: kitEventType, callback?: (...args: any[]) => void) {\n this.logger.debug(`off ${event}`);\n if (callback) {\n this.listener = this.listener.filter(\n (item) => !(item.event === event && item.callback === callback)\n );\n } else {\n this.listener = this.listener.filter((item) => item.event !== event);\n }\n }\n\n removeAllListeners() {\n this.listener = this.listener.splice(0, this.listener.length);\n this.logger.debug('removeAllListeners');\n }\n\n trigger(event: kitEventType, data?: any) {\n this.logger.debug(`trigger ${event}`, { data });\n this.listener.forEach((item) => {\n if (item.event === event) {\n try {\n item.callback(data);\n } catch (err) {\n this.logger.error('Event callback error:', err);\n }\n }\n });\n }\n}\n","import type { AxiosRequestConfig } from 'axios';\nimport axios from 'axios';\n\nconst instance = axios.create({\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n});\n\ninstance.interceptors.request.use((config) => config);\n\ninstance.interceptors.response.use(\n (response) => response.data,\n (error) => Promise.reject(error)\n);\n\nconst request = (config: AxiosRequestConfig): Promise<any> => instance.request(config);\n\nexport default request;\n","import type { AxiosRequestConfig } from 'axios';\nimport request from './axios';\nimport type { CallKit } from '.';\n\nexport class Api {\n private callKit: CallKit;\n constructor(callKit: CallKit) {\n this.callKit = callKit;\n }\n\n async login(params: { userName: string; password: string }) {\n return this.post({\n url: '/auth/agentUser/login',\n method: 'post',\n data: params\n });\n }\n\n async loginOut(params: { sessionId: string }) {\n return this.post({\n url: '/auth/agentUser/loginOut',\n method: 'post',\n data: params\n });\n }\n\n /**\n *\n * @param params agentId userStatus\n * @description userStatus: Logout(1, \"unregistered\"), Free(2, \"free\"), Break(3, \"nap\"), Busy(4, \"busy\")\n * @returns\n */\n async setUserStatus(params: any) {\n return this.post({\n url: '/agent/user/changeStatus',\n method: 'post',\n data: params\n });\n }\n\n private async post(config: AxiosRequestConfig) {\n this.callKit.logger.debug(`Request ${config.url}:`, config.data);\n const { userInfo, host } = this.callKit.config.getConfig();\n const { sessionId } = userInfo;\n config.url = `${host}${config.url}`;\n config.headers = {\n ...config.headers,\n 'Content-Type': 'application/x-www-form-urlencoded'\n };\n\n if (\n config.headers['Content-Type'] === 'application/x-www-form-urlencoded'\n ) {\n config.data = new URLSearchParams(config.data).toString();\n }\n\n if (sessionId) {\n config.headers.sessionId = sessionId;\n }\n const res = await request(config).catch(() => {\n // Network error\n this.callKit.config.reset();\n });\n if (!res) {\n this.callKit.config.reset();\n throw new Error('Network error');\n }\n const { code, data, message } = res;\n if (code === '000000') {\n return data;\n }\n // Authentication failed, need to re-login\n if (code === '100013') {\n this.callKit.config.reset();\n }\n throw new Error(message ?? 'Request failed');\n }\n}\n","import type { WebrtcConstranis } from './config';\n\nexport const UserStatus = {\n /**\n * Offline\n */\n offline: 1,\n /**\n * Online & Idle\n */\n online: 2,\n /**\n * Nap\n */\n catNap: 3,\n /**\n * Busy\n */\n busy: 4,\n /**\n * Training\n */\n training: 5,\n /**\n * Processing\n */\n processing: 6\n};\n\nexport const CallStatus = {\n /**\n * Initial state/Hang up\n */\n init: 0,\n /**\n * Registered\n */\n registered: 1,\n /**\n * Connecting\n */\n connecting: 2,\n /**\n * Call on hold\n */\n holding: 3,\n /**\n * Ringing\n */\n ringing: 4,\n /**\n * In call\n */\n calling: 5\n};\n\nexport const KitEvent = {\n /**\n * User status change\n */\n KIT_USER_STATUS_CHANGE: 'userStatusChange',\n /**\n * User login status change\n */\n KIT_LOGIN_CHANGE: 'loginChange',\n /**\n * Registration status change\n */\n KIT_REGISTER_CHANGE: 'registerChange',\n /**\n * Call status change\n */\n KIT_CALL_STATUS_CHANGE: 'callStatusChange',\n /**\n * Hold status change\n */\n KIT_SET_HOLD: 'holdChange',\n /**\n * Mute status change\n */\n KIT_SET_MUTE: 'muteChange',\n /**\n * Error\n */\n KIT_ERROR: 'error',\n /**\n * Server initiated call\n */\n KIT_INVITE: 'invite',\n /**\n * Connecting\n */\n CALL_CONNECTING: 'connecting',\n /**\n * Customer ringing\n */\n CALL_RINGING: 'ringing',\n\n /**\n * Agent pick up\n */\n AGENT_PICK_UP: 'agentPickUp',\n /**\n * Customer answer\n */\n CALL_PICK_UP: 'pickUp',\n /**\n * Customer no response\n */\n CALL_NO_ANSWER: 'noAnswer',\n\n /**\n * Customer hang up\n */\n CALL_HANG_UP: 'hangUp',\n\n /**\n * Call end\n */\n CALL_END: 'callEnd',\n /**\n * Call detail record push\n */\n CALL_CDR: 'callCdr',\n\n /**\n * Forward all socket events\n */\n SERVER_SOCKET_EVENT: 'socketEvent',\n\n /**\n * User status change\n */\n USER_STATUS_CHANGE: 'userStatusChange'\n};\n\nexport const ErrorCode = {\n /**\n * Unknown error\n */\n UNKNOWN_ERROR: -1,\n /**\n * API user login failed\n */\n API_USER_LOGIN_ERROR: 1000001,\n /**\n * API user status update failed\n */\n API_USER_STATUS_UPDATE_ERROR: 1000002,\n\n /**\n * API user logout failed\n */\n API_USER_LOGOUT_ERROR: 1000003,\n\n /**\n * connectStatus call status error\n */\n CONNECT_CALL_STATUS_ERROR: 2000001,\n /**\n * User not logged in\n */\n USER_NOT_LOGIN: 2000002,\n /**\n * Browser version too low, does not support webrtc getUserMedia\n */\n WEBRTC_USER_MEDIA_ERROR: 2000003,\n /**\n * Call hold failed\n */\n WEBRTC_HOLE_STATUS_ERROR: 2000004,\n /**\n * Audio player does not exist\n */\n WEBRTC_AUDIO_PLAYER_ERROR: 2000005,\n /**\n * Audio playback failed\n */\n WEBRTC_AUDIO_PLAY_ERROR: 2000006,\n /**\n * User agent startup failed\n */\n WEBRTC_USER_AGENT_ERROR: 2000007,\n /**\n * Call request failed\n */\n WEBRTC_CALL_INVITE_ERROR: 2000008,\n /**\n * Register request failed\n */\n WEBRTC_REGISTER_ERROR: 2000009,\n /**\n * Mute failed\n */\n WEBRTC_MUTE_STATUS_ERROR: 2000010,\n /**\n * Unregister failed\n */\n WEBRTC_CANCEL_REGISTER_ERROR: 2000011,\n\n /**\n * Mute failed\n */\n WEBRTC_MUTE_ERROR: 2000012,\n\n /**\n * Socket connection error\n */\n SOCKET_CONNECT_ERROR: 3000001,\n /**\n * Ping timeout\n */\n SOCKET_PING_TIMEOUT: 3000002,\n /**\n * Server error\n */\n SOKET_SERVER_ERROR: 3000003,\n /**\n * API call failed\n */\n SOCKET_CALL_ERROR: 3000004,\n /**\n * Reconnection limit exceeded\n */\n SOCKET_RECONNECT_FAILED: 3000005\n};\n\nexport const LoggerLevelMap = {\n debug: 9,\n log: 4,\n warn: 3,\n error: 2,\n silent: 1\n};\n\n// Send events\nexport const SocketSendEvent = {\n /**\n * ping\n */\n PING: 'PING',\n /**\n * Start\n */\n START: 'START',\n /**\n * Hang up\n */\n AGENT_HANGUP: 'AGENT_HANG_UP',\n /**\n * Cancel\n */\n CALL_CANCEL: 'AGENT_CANCEL',\n /**\n * Hold\n */\n HOLD: 'AGENT_HOLD',\n /**\n * Unhold\n */\n UNHOLD: 'AGENT_UN_HOLD',\n /**\n * Call\n */\n CALL: 'CALL',\n /**\n * End\n */\n END: 'STOP'\n};\n\n// Receive events\nexport const SocketReceiveEvent = {\n /**\n * Response\n */\n PONG: 'PONG',\n /**\n * Start confirmation\n */\n START_CONFIRM: 'START_CONFIRM',\n /**\n * Call success\n */\n CALL_SUCCESS: 'CALL_SUCCESS',\n /**\n * Call failed\n */\n CALL_FAILED: 'CALL_FAILED',\n /**\n * Customer ringing\n */\n CUSTOMER_RINGING: 'CUSTOMER_RINGING',\n\n /**\n * Agent pick up\n */\n AGENT_PICK_UP: 'AGENT_PICK_UP',\n /**\n * Customer pick up\n */\n CUSTOMER_PICK_UP: 'CUSTOMER_PICK_UP',\n /**\n * Customer no answer\n */\n CUSTOMER_NO_ANSWER: 'CUSTOMER_NO_ANSWER',\n /**\n * Customer hang up\n */\n CUSTOMER_HANG_UP: 'CUSTOMER_HANG_UP',\n /**\n * Agent no answer\n */\n AGENT_NO_ANSWER: 'AGENT_NO_ANSWER',\n /**\n * Call detail record push\n */\n CALL_CDR: 'CALL_CDR',\n /**\n * Stop confirmation\n */\n STOP_CONFIRM: 'STOP_CONFIRM',\n /**\n * Close\n */\n CLOSE: 'CLOSE',\n /**\n * Error\n */\n ERROR: 'ERROR'\n};\n\nexport const constrainsDefault: WebrtcConstranis = {\n audio: {\n autoGainControl: true,\n // Noise suppression\n noiseSuppression: true,\n // Set echo cancellation\n echoCancellation: true\n },\n video: false\n};\n\nexport const isAutoUpdateUserStatusDefault: Boolean = true;\n","import { CallStatus, SocketSendEvent } from './const';\nimport { type CallKit } from './index';\n\nexport class Call {\n private callKit: CallKit;\n constructor(callKit: CallKit) {\n this.callKit = callKit;\n }\n\n async callStart() {\n if (!this.callKit.config.check()) return;\n this.callKit.logger.debug('callStart');\n if (!this.callKit.socket.satrtConfirm) {\n this.callKit.logger.warn('server not confirm start');\n return;\n }\n this.callKit.connect.call(async (user) => {\n const queryTrain = {\n agentId: user.agentId,\n phoneNum: user.extno\n };\n this.callKit.socket.send(SocketSendEvent.CALL, queryTrain);\n });\n }\n\n /**\n * Hang up\n * @param isUnprompted Whether to actively hang up\n * @param isError Whether an error occurred\n * @returns\n */\n async callEnd(isUnprompted = false, isError = false) {\n // init registered doesn't need to go through hangup\n if (\n this.callKit.connect.connectStatus === CallStatus.init\n || this.callKit.connect.connectStatus === CallStatus.registered\n ) return;\n if (!this.callKit.config.check()) return;\n this.callKit.connect.hangup(isUnprompted, isError);\n }\n\n async callHold() {\n if (!this.callKit.config.check()) return;\n if (!this.callKit.connect.isCalling()) {\n this.callKit.logger.warn('Current state cannot be held');\n return;\n }\n this.callKit.connect.hold();\n this.callKit.socket.send(SocketSendEvent.HOLD);\n this.callKit.connect.setConnectStatus(CallStatus.holding);\n }\n\n async callUnhold() {\n if (!this.callKit.config.check()) return;\n if (!this.callKit.connect.isHolding()) {\n this.callKit.logger.warn('Current state cannot unhold');\n return;\n }\n this.callKit.connect.unhold();\n this.callKit.socket.send(SocketSendEvent.UNHOLD);\n this.callKit.connect.setConnectStatus(CallStatus.calling);\n }\n}\n","import type { CallKit } from '.';\nimport { constrainsDefault, ErrorCode, KitEvent } from './const';\nimport { type LoggerLevel } from './logger';\nimport type { SocketConfig } from './socket';\n\nexport interface WebrtcConstranis {\n audio: {\n autoGainControl?: boolean\n noiseSuppression?: boolean\n echoCancellation?: boolean\n }\n video: false\n}\n\nexport interface IConfig {\n version: string\n host: string\n log: LoggerLevel\n audioRef?: HTMLAudioElement | (() => HTMLAudioElement)\n constrains: WebrtcConstranis\n socket: string\n reconnect?: SocketConfig\n userInfo: {\n wsUrl: string\n sessionId: string\n username: string\n password: string\n extno: string\n userPart: string\n agentId: string\n fsUserId: string\n fsPassword: string\n fsIp: string\n fsPort: string\n iceInfo: string[]\n iceGatheringTimeout: number\n }\n isAutoUpdateUserStatus: boolean\n}\n\nexport class Config {\n callKit: CallKit;\n constructor(callKit: CallKit) {\n this.callKit = callKit;\n }\n\n config: IConfig = {\n version: '1.0.2',\n host: '',\n log: 'debug',\n audioRef: undefined,\n constrains: constrainsDefault,\n socket: '',\n userInfo: {\n wsUrl: '',\n\n sessionId: '',\n // User\n username: '',\n // Password\n password: '',\n\n // Extension number\n extno: '',\n\n userPart: '',\n\n agentId: '',\n\n fsUserId: '',\n\n fsPassword: '',\n fsIp: '',\n fsPort: '',\n iceInfo: [],\n iceGatheringTimeout: 0\n },\n // EXECUTE setUserStatus\n isAutoUpdateUserStatus: true\n };\n\n getConfig = () => this.config;\n\n setConfig = async (key: string, value: any) => {\n this.config[key] = value;\n };\n\n setUserInfo = async (key: string, value: any) => {\n this.config.userInfo[key] = value;\n this.callKit.logger.debug(`setUserInfo: key: ${key}, value: ${value}`);\n };\n\n reset = () => {\n if (this.isLogin()) {\n this.config.userInfo = {\n wsUrl: '',\n sessionId: '',\n username: '',\n password: '',\n userPart: '',\n extno: '',\n agentId: '',\n fsUserId: '',\n fsPassword: '',\n fsIp: '',\n fsPort: '',\n iceInfo: [],\n iceGatheringTimeout: this.config.userInfo.iceGatheringTimeout\n };\n this.callKit.trigger(KitEvent.KIT_LOGIN_CHANGE, false);\n }\n };\n\n validate = () => {\n const {\n userPart, fsIp, fsPassword, fsPort\n } = this.config.userInfo;\n if (!userPart || !fsIp || !fsPort || !fsPassword) {\n return false;\n }\n return true;\n };\n\n isLogin = () => this.validate();\n\n check() {\n if (!this.isLogin()) {\n this.callKit.logger.error('User not logged in', {\n errCode: ErrorCode.USER_NOT_LOGIN\n });\n return false;\n }\n return true;\n }\n}\n","import type { CallKit } from '.';\nimport { ErrorCode, KitEvent, LoggerLevelMap } from './const';\n\nexport type LoggerLevel = 'debug' | 'log' | 'warn' | 'error' | 'silent';\n\nfunction getLevel(level: LoggerLevel) {\n return LoggerLevelMap[level];\n}\n\nexport class Logger {\n prefix = 'CallKit';\n level: LoggerLevel = 'debug';\n\n private callKit: CallKit;\n constructor(callKit: CallKit, level?: LoggerLevel) {\n this.callKit = callKit;\n this.level = level || 'debug';\n }\n\n setLevel(level: LoggerLevel) {\n this.level = level;\n }\n\n debug(msg: any, extra?: Object) {\n if (getLevel(this.level) >= getLevel('debug')) {\n this.output('blue')(msg, extra);\n }\n }\n\n log(msg: any, extra?: Object) {\n if (getLevel(this.level) >= getLevel('log')) {\n this.output('green')(msg, extra);\n }\n }\n\n warn(msg: any, extra?: Object) {\n if (getLevel(this.level) >= getLevel('warn')) {\n this.output('orange')(msg, extra);\n }\n }\n\n error(msg: any, extra?: any) {\n const message = msg?.message ?? msg;\n\n if (getLevel(this.level) >= getLevel('error')) {\n this.output('red')(message, extra);\n }\n\n const { errCode, ...rest } = extra;\n const errorCode = errCode ?? ErrorCode.UNKNOWN_ERROR;\n\n this.callKit.trigger(KitEvent.KIT_ERROR, {\n code: errorCode,\n msg: message,\n data: rest\n });\n this.callKit.reset();\n\n const error = new Error(message);\n error.name = 'CallKitError';\n (error as any).code = errorCode;\n (error as any).data = rest;\n throw error;\n }\n\n output(color: string) {\n return (msg: any, extra: Object = {}) => {\n const now = new Date();\n if (Object.keys(extra).length > 0) {\n console.log(\n `%c[${this.prefix}] %c ${msg} %o %c ${now.toLocaleString()}`,\n `color: ${color};`,\n 'color:block;',\n extra,\n 'color:#999;'\n );\n } else {\n console.log(\n `%c[${this.prefix}] %c ${msg} %c ${now.toLocaleString()}`,\n `color: ${color};`,\n 'color:block;',\n 'color:#999;'\n );\n }\n };\n }\n}\n","import type { Invitation, UserAgentOptions } from 'sip.js';\n\nimport {\n UserAgent, Web, Registerer, SessionState\n} from 'sip.js';\n\nimport type { CallKit } from '.';\nimport {\n CallStatus, ErrorCode, KitEvent, SocketSendEvent\n} from './const';\n\nfunction convertObjectStringToJSON(input) {\n // Use regular expressions to add double quotes to keys and values\n const corrected = input\n .replace(/(\\w+):\\s*'(.*?)'/g, '\"$1\": \"$2\"')\n .replace(/'/g, '\"');\n\n return corrected;\n}\n\nconst closeStream = (stream) => {\n if (stream) stream.getTracks().forEach((track) => track.stop());\n};\n\nconst initUserMedia = (): void => {\n if (typeof navigator.mediaDevices === 'undefined') {\n (navigator as any).mediaDevices = {} as MediaDevices;\n }\n if (typeof navigator.mediaDevices.getUserMedia === 'undefined') {\n navigator.mediaDevices.getUserMedia = (\n constraints: MediaStreamConstraints\n ): Promise<MediaStream> => {\n const getUserMedia\n = (navigator as any).getUserMedia\n || (navigator as any).webkitGetUserMedia\n || (navigator as any).mozGetUserMedia;\n if (!getUserMedia) {\n return Promise.reject(\n new Error('Browser version is too low, please upgrade and try again.')\n );\n }\n return new Promise((resolve, reject) => {\n getUserMedia.call(navigator, constraints, resolve, reject);\n });\n };\n }\n};\n\n// const enableSenderTracks = (session, enable) => {\n// const { sessionDescriptionHandler } = session;\n// sessionDescriptionHandler.enableSenderTracks(enable);\n// };\n\n// const enableReceiverTracks = (session, enable) => {\n// const { sessionDescriptionHandler } = session;\n// sessionDescriptionHandler.enableReceiverTracks(enable);\n// };\n\nexport type CallStatusType = (typeof CallStatus)[keyof typeof CallStatus];\n\nexport class Connect {\n callKit: CallKit;\n\n /**\n * connectStatus: init registered connecting calling\n */\n connectStatus = CallStatus.init;\n currentSession?: Invitation;\n mediaStream?: MediaStream;\n userAgent?: UserAgent;\n registerer?: Registerer;\n\n sipConnected = false;\n /**\n * Whether it's an outgoing call\n */\n isOutgoing = false;\n\n /**\n * Whether it's an active hangup\n */\n isUnprompted = false;\n\n /**\n * Whether registered\n * @param\n * @deprecated Deprecated, please use isRegistered method\n */\n get isRegister() {\n return this.isRegistered();\n }\n\n /**\n * Call hold\n * @param isHold\n */\n isHold = false;\n\n /**\n * Whether muted\n */\n isMute = false;\n\n constructor(callKit: CallKit) {\n this.callKit = callKit;\n }\n\n reset() {\n if (this.connectStatus !== CallStatus.init) {\n this.setConnectStatus(CallStatus.init);\n }\n if (this.isRegistered()) {\n this.unregister();\n }\n\n this.currentSession = undefined;\n this.mediaStream = undefined;\n this.userAgent = undefined;\n this.registerer = undefined;\n this.isOutgoing = false;\n this.isUnprompted = false;\n this.sipConnected = false;\n\n if (this.isHold) {\n this.setHoldStatus(false);\n }\n }\n\n private getAduioReference() {\n const { audioRef } = this.callKit.config.getConfig();\n if (typeof audioRef === 'function') {\n return audioRef();\n }\n return audioRef;\n }\n\n async permission() {\n this.callKit.logger.debug('permission');\n initUserMedia();\n const _stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n closeStream(_stream);\n }\n\n isRegistered() {\n return [\n CallStatus.registered,\n CallStatus.connecting,\n CallStatus.ringing,\n CallStatus.calling,\n CallStatus.holding\n ].includes(this.connectStatus);\n }\n\n /**\n * Making connection\n * @returns\n */\n isConnecting() {\n return this.connectStatus === CallStatus.connecting;\n }\n\n /**\n * In call\n * @returns\n */\n isCalling() {\n return this.connectStatus === CallStatus.calling;\n }\n\n /**\n * Ringing\n */\n isRinging() {\n return this.connectStatus === CallStatus.ringing;\n }\n\n /**\n *\n */\n isHolding() {\n return this.connectStatus === CallStatus.holding;\n }\n\n /**\n * Call ended, call not started\n * @returns\n */\n isInit() {\n return this.connectStatus === CallStatus.init;\n }\n\n async register() {\n if (this.connectStatus !== CallStatus.init) {\n if (this.connectStatus === CallStatus.registered) {\n this.callKit.logger.warn('connectStatus is registered');\n return;\n }\n this.callKit.logger.error('connectStatus is not init', {\n errCode: ErrorCode.CONNECT_CALL_STATUS_ERROR\n });\n this.callKit.callCenter.callEnd();\n return;\n }\n\n this.callKit.logger.debug('connect register');\n\n await this.permission().catch((err) => {\n this.callKit.logger.error(err, {\n errCode: ErrorCode.WEBRTC_USER_MEDIA_ERROR\n });\n });\n\n const { userInfo, constrains } = this.callKit.config.getConfig();\n\n const localStreamFactory = async () => {\n this.mediaStream = await navigator.mediaDevices.getUserMedia(constrains);\n return this.mediaStream;\n };\n\n const {\n userPart, fsIp, fsPort, iceInfo, wsUrl\n } = userInfo;\n\n const connectConfig: UserAgentOptions = {\n uri: UserAgent.makeURI(`sip:${userPart}@${fsIp}:${fsPort}`),\n displayName: userPart,\n transportOptions: {\n wsServers: [wsUrl],\n traceSip: true\n },\n logLevel: 'error',\n allowLegacyNotifications: true,\n contactName: userPart,\n sessionDescriptionHandlerFactory:\n Web.defaultSessionDescriptionHandlerFactory(localStreamFactory),\n sessionDescriptionHandlerFactoryOptions: {\n constraints: constrains,\n iceGatheringTimeout: userInfo.iceGatheringTimeout,\n peerConnectionConfiguration: {\n iceServers: JSON.parse(convertObjectStringToJSON(iceInfo))\n }\n }\n };\n\n this.callKit.logger.debug('connect connectConfig', connectConfig);\n\n this.userAgent = new UserAgent(connectConfig);\n\n const remoteStream = new MediaStream();\n\n const setupRemoteMedia = (session) => {\n const audioRef = this.getAduioReference();\n this.callKit.logger.debug('connect setupRemoteMedia', audioRef);\n session.sessionDescriptionHandler.peerConnection\n .getReceivers()\n .forEach((receiver) => {\n if (receiver.track) {\n remoteStream.addTrack(receiver.track);\n }\n });\n\n if (audioRef) {\n audioRef.srcObject = remoteStream;\n audioRef.play().catch((error) => {\n this.callKit.logger.error(error.message, {\n errCode: ErrorCode.WEBRTC_AUDIO_PLAY_ERROR\n });\n });\n } else {\n this.callKit.logger.error('video is not exist', {\n errCode: ErrorCode.WEBRTC_AUDIO_PLAYER_ERROR\n });\n }\n };\n\n const registererOptions = {};\n this.registerer = new Registerer(this.userAgent, registererOptions);\n\n this.userAgent.delegate = {\n onInvite: (invite) => {\n this.callKit.logger.debug('connect onInvite');\n this.currentSession = invite;\n this.currentSession.stateChange.addListener((state) => {\n switch (state) {\n case SessionState.Establishing:\n this.callKit.logger.debug('connect Establishing');\n break;\n case SessionState.Established:\n this.callKit.logger.debug('connect Established');\n // Hang up before connection\n if (this.connectStatus === CallStatus.registered) {\n this.callKit.logger.warn('call is already hangup');\n return;\n }\n this.sipConnected = true;\n setupRemoteMedia(this.currentSession);\n break;\n case SessionState.Terminating:\n this.callKit.logger.debug('connect Terminating');\n break;\n case SessionState.Terminated:\n this.callKit.logger.debug('connect Terminated');\n if (!this.isUnprompted) {\n this.callKit.callCenter.callEnd();\n }\n this.isUnprompted = false;\n break;\n default:\n break;\n }\n });\n\n const options = {\n sessionDescriptionHandlerOptions: {\n constraints: constrains,\n alwaysAcquireMediaFirst: true\n }\n };\n // Active dialing, automatically answer when connecting\n if (this.isOutgoing) {\n this.currentSession.accept(options);\n } else {\n this.callKit.trigger(KitEvent.KIT_INVITE, {\n accept: () => {\n this.setConnectStatus(CallStatus.connecting);\n this.callKit.trigger(KitEvent.CALL_CONNECTING, new Date());\n this.currentSession.accept(options);\n },\n reject: () => {\n this.currentSession.reject();\n this.callKit.callCenter.callEnd(true, false);\n },\n getInviteData: () => {\n const { request } = this.currentSession;\n const headerNames = Object.keys(request.headers);\n const xHeaders = {};\n headerNames\n .filter((name) => name.toLocaleLowerCase().startsWith('x-antaios'))\n .forEach((name) => {\n xHeaders[name.toLocaleLowerCase()] = request.getHeader(name);\n });\n this.callKit.logger.debug('get invite data', xHeaders);\n return xHeaders;\n }\n });\n }\n },\n onConnect: async () => {\n this.callKit.logger.debug('connect onConnect');\n await this.registerer\n .register()\n .then(() => {\n this.callKit.socket.send(SocketSendEvent.START);\n })\n .catch((err) => {\n this.callKit.logger.error(err?.message, {\n errCode: ErrorCode.WEBRTC_REGISTER_ERROR\n });\n });\n },\n onDisconnect: () => {\n this.callKit.logger.debug('connect onDisconnect');\n this.callKit.callCenter.callEnd();\n },\n onRegister: () => {\n this.callKit.logger.debug('connect onRegister');\n }\n };\n\n await this.userAgent.start().catch((err) => {\n this.callKit.callCenter.callEnd(false, true);\n this.callKit.logger.error(err, {\n errCode: ErrorCode.WEBRTC_USER_AGENT_ERROR\n });\n });\n }\n\n async unregister() {\n this.callKit.logger.debug('connect unregister');\n if (!this.isRegistered() || !this.registerer) {\n this.callKit.logger.warn('No registerer to unregister.');\n return;\n }\n await this.registerer\n .unregister({ all: true })\n .then(() => {\n this.setConnectStatus(CallStatus.init);\n })\n .catch((err) => {\n this.callKit.logger.error(err, {\n errCode: ErrorCode.WEBRTC_CANCEL_REGISTER_ERROR\n });\n });\n }\n\n async call(callback: Function) {\n this.callKit.logger.debug('connect call');\n this.isOutgoing = true;\n if (!this.isRegistered()) {\n await this.register();\n }\n this.setConnectStatus(CallStatus.connecting);\n this.callKit.trigger(KitEvent.CALL_CONNECTING, new Date());\n const { userInfo } = this.callKit.config.getConfig();\n callback(userInfo);\n }\n\n /**\n * Update registration status\n * @param register\n */\n setRegister(register: boolean) {\n this.callKit.logger.debug(`connect setRegister:${register}`);\n this.callKit.trigger(KitEvent.KIT_REGISTER_CHANGE, register);\n }\n\n /**\n * Set call status\n * @param status\n */\n setConnectStatus(status: CallStatusType) {\n this.callKit.logger.debug(`connect setConnectStatus: ${status}`);\n\n if (this.isRegistered() && status === CallStatus.init) {\n this.setRegister(false);\n }\n if (!this.isRegistered() && status !== CallStatus.init) {\n this.setRegister(true);\n }\n\n this.connectStatus = status;\n this.callKit.trigger(KitEvent.KIT_CALL_STATUS_CHANGE, status);\n }\n\n /**\n * Hang up\n * @param isUnprompted Whether actively hanging up\n * @param isError Whether an error occurred\n * @returns\n */\n async hangup(isUnprompted = false, isError = false) {\n this.callKit.logger.debug(`connect hangup isError: ${isError}`);\n if (\n this.connectStatus === CallStatus.init\n || this.connectStatus === CallStatus.registered\n ) return;\n this.isOutgoing = false;\n this.isUnprompted = isUnprompted;\n\n try {\n // 1. First handle Socket signaling\n if (isUnprompted) {\n this.callKit.socket.send(SocketSendEvent.AGENT_HANGUP);\n\n const shouldSendBye\n = this.sipConnected\n || this.isRinging()\n || this.isCalling()\n || this.isHolding();\n\n if (shouldSendBye) {\n await this.currentSession?.bye();\n }\n }\n\n // 2. Clean up media resources\n this.sipConnected = false;\n closeStream(this.mediaStream);\n const audioRef = this.getAduioReference();\n if (audioRef) {\n audioRef.pause();\n audioRef.srcObject = null;\n }\n\n if (isError) {\n this.setConnectStatus(CallStatus.init);\n } else {\n this.setConnectStatus(CallStatus.registered);\n }\n this.callKit.trigger(KitEvent.CALL_END, new Date());\n } catch (err) {\n this.callKit.trigger(KitEvent.CALL_END, new Date());\n }\n }\n\n /**\n * The remote media stream. Undefined if call not answered.\n * @param session - Session to get the media stream from.\n */\n getRemoteMediaStream(session) {\n this.callKit.logger.debug('connect getRemoteMediaStream');\n const sdh = session.sessionDescriptionHandler;\n if (!sdh) {\n return undefined;\n }\n return sdh.remoteMediaStream;\n }\n\n setupRemoteMedia(session) {\n this.callKit.logger.debug('connect setupRemoteMedia');\n const remoteStream = this.getRemoteMediaStream(session);\n const audioRef = this.getAduioReference();\n if (audioRef) {\n audioRef.autoplay = true;\n audioRef.srcObject = remoteStream;\n\n audioRef.play().catch((error) => {\n this.callKit.logger.error(error.message, {\n errCode: ErrorCode.WEBRTC_AUDIO_PLAY_ERROR\n });\n });\n\n remoteStream.onaddtrack = () => {\n this.callKit.logger.debug('Remote media onaddtrack');\n audioRef.load();\n audioRef.play().catch((error) => {\n this.callKit.logger.error(error.message, {\n errCode: ErrorCode.WEBRTC_AUDIO_PLAY_ERROR\n });\n });\n };\n } else {\n this.callKit.logger.error('video is not exist', {\n errCode: ErrorCode.WEBRTC_AUDIO_PLAYER_ERROR\n });\n }\n }\n\n /**\n * Update hold\n * @param hold\n */\n setHoldStatus(hold: boolean) {\n this.callKit.logger.debug('connect setHold', hold);\n this.isHold = hold;\n this.callKit.trigger(KitEvent.KIT_SET_HOLD, hold);\n }\n\n async setHold(hold: boolean) {\n this.setHoldStatus(hold);\n // Hold goes through socket, not sip\n\n // const options = {\n // requestDelegate: {\n // onAccept: () => {\n // this.callKit.logger.debug('setHold onAccept', hold);\n // enableReceiverTracks(this.currentSession, !hold);\n // enableSenderTracks(this.currentSession, !hold);\n // this.setupRemoteMedia(this.currentSession);\n // },\n // onReject: () => {\n // this.callKit.logger.debug('setHold onReject');\n // enableReceiverTracks(this.currentSession, !hold);\n // enableSenderTracks(this.currentSession, !hold);\n // this.setupRemoteMedia(this.currentSession);\n // }\n // }\n // };\n\n // const sessionDescriptionHandlerOptions = this.currentSession.sessionDescriptionHandlerOptionsReInvite;\n\n // (sessionDescriptionHandlerOptions as any).hold = hold;\n // this.currentSession.sessionDescriptionHandlerOptionsReInvite = sessionDescriptionHandlerOptions;\n\n // return this.currentSession\n // .invite(options)\n // .then(() => {\n // enableReceiverTracks(this.currentSession, !hold);\n // enableSenderTracks(this.currentSession, !hold);\n // this.callKit.logger.debug('setHold success');\n // })\n // .catch((err) => {\n // this.callKit.logger.error(err?.message, {\n // errCode: ErrorCode.WEBRTC_CALL_INVITE_ERROR\n // });\n // });\n }\n\n async hold() {\n this.callKit.logger.debug('connect hold');\n if (this.connectStatus !== CallStatus.calling || !this.currentSession) {\n this.callKit.logger.error('Current status is not in call', {\n errCode: ErrorCode.WEBRTC_HOLE_STATUS_ERROR\n });\n return;\n }\n await this.setHold(true);\n }\n\n async unhold() {\n this.callKit.logger.debug('connect unhold');\n await this.setHold(false);\n }\n\n async setMute(mute: boolean) {\n this.callKit.logger.debug('connect setMute', mute);\n\n if (!this.currentSession) {\n this.callKit.logger.error('No active session', {\n errCode: ErrorCode.WEBRTC_MUTE_STATUS_ERROR\n });\n return;\n }\n\n try {\n // Get SessionDescriptionHandler\n const sdh = this.currentSession.sessionDescriptionHandler;\n if (!sdh || !('peerConnection' in sdh)) {\n throw new Error('Invalid session description handler');\n }\n\n // Get PeerConnection\n const pc = (sdh as any).peerConnection as RTCPeerConnection;\n\n // Get local audio track and set status\n const audioSender = pc\n .getSenders()\n .find((sender) => sender.track?.kind === 'audio');\n\n if (audioSender && audioSender.track) {\n audioSender.track.enabled = !mute;\n // Update status and trigger event\n this.isMute = mute;\n this.callKit.trigger(KitEvent.KIT_SET_MUTE, mute);\n } else {\n throw new Error('No audio track found');\n }\n } catch (error) {\n this.callKit.logger.error('Failed to set mute state', {\n errCode: ErrorCode.WEBRTC_MUTE_ERROR,\n error\n });\n }\n }\n\n async mute() {\n this.callKit.logger.debug('connect mute');\n if (this.connectStatus !== CallStatus.calling || !this.currentSession) {\n this.callKit.logger.error('Current status is not in call', {\n errCode: ErrorCode.WEBRTC_MUTE_STATUS_ERROR\n });\n return;\n }\n await this.setMute(true);\n }\n\n async unmute() {\n this.callKit.logger.debug('connect unmute');\n if (this.connectStatus !== CallStatus.calling || !this.currentSession) {\n this.callKit.logger.error('Current status is not in call', {\n errCode: ErrorCode.WEBRTC_MUTE_STATUS_ERROR\n });\n return;\n }\n await this.setMute(false);\n }\n}\n","import type { CallKit } from '.';\nimport {\n SocketSendEvent,\n ErrorCode,\n KitEvent,\n SocketReceiveEvent,\n CallStatus,\n UserStatus\n} from './const';\n\nexport type SocketReceiveEventType =\n (typeof SocketReceiveEvent)[keyof typeof SocketReceiveEvent];\nexport type SocketSendEventType =\n (typeof SocketSendEvent)[keyof typeof SocketSendEvent];\n\nexport interface SocketMessage {\n event: SocketReceiveEventType\n msg: string\n data: object\n}\n\nexport interface SocketConfig {\n enabled: boolean\n maxAttempts: number\n delay: number\n backoffMultiplier: number // Reconnection delay time multiplier growth factor\n pingInterval: number\n pingTimeout: number\n}\n\n/**\n * Default configuration\n */\nconst RECONNECT_CONFIG: SocketConfig = {\n enabled: true,\n maxAttempts: 1,\n delay: 1000,\n backoffMultiplier: 1.5,\n pingInterval: 30000,\n pingTimeout: 5000\n};\n\nexport class Socket {\n private callKit: CallKit;\n private ws?: WebSocket;\n\n private socketConfig: SocketConfig;\n\n lastPingTime = undefined;\n isConnected = false;\n pingTimer?: number;\n\n // Whether received server hangup confirmation\n recivedClose = false;\n // Whether received start confirmation\n satrtConfirm = false;\n private reconnectTimer?: any;\n private isReconnecting = false;\n private reconnectAttempts = 0;\n\n constructor(callKit: CallKit) {\n this.callKit = callKit;\n const { reconnect } = this.callKit.config.getConfig();\n this.socketConfig = {\n ...RECONNECT_CONFIG,\n ...reconnect\n };\n }\n\n init() {\n const { socket } = this.callKit.config.getConfig();\n this.callKit.logger.debug(`socket init: ${socket}`);\n this.connect(socket);\n }\n\n private connect(socketUrl: string) {\n this.ws = new WebSocket(socketUrl);\n this.ws.onopen = (ev: Event) => this.onOpen(ev);\n this.ws.onclose = (ev: CloseEvent) => this.onClose(ev);\n this.ws.onerror = (ev: Event) => this.onError(ev);\n this.ws.onmessage = (ev: MessageEvent) => this.onMessage(ev);\n }\n\n private onOpen(ev: Event) {\n this.callKit.logger.debug('socket onOpen', ev);\n this.isConnected = true;\n this.lastPingTime = Date.now();\n this.checkPing();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n }\n this.reconnectAttempts = 0;\n }\n\n private onClose(ev: CloseEvent) {\n this.callKit.logger.debug('socket onClose', ev);\n this.isConnected = false;\n this.satrtConfirm = false;\n\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = undefined;\n }\n\n this.callKit.connect.hangup();\n\n this.reset();\n }\n\n private onError(ev: Event) {\n this.callKit.logger.error('socket onError', {\n errCode: ErrorCode.SOCKET_CONNECT_ERROR,\n data: ev\n });\n this.isConnected = false;\n\n // Only attempt reconnection on abnormal closure\n if (!this.isReconnecting && this.socketConfig.maxAttempts > 0) {\n this.attemptReconnect();\n } else if (this.reconnectAttempts >= this.socketConfig.maxAttempts) {\n // Reached maximum retry attempts, reset all states\n this.reset();\n this.callKit.logger.error(\n 'Reconnection failed, maximum retry attempts reached',\n {\n errCode: ErrorCode.SOCKET_RECONNECT_FAILED\n }\n );\n }\n\n // Error handling is left to onClose, because close will definitely be triggered after error\n // Do not call attemptReconnect here\n }\n\n private onMessage(ev: MessageEvent<string>) {\n const data = JSON.parse(ev.data);\n this.callKit.logger.debug('socket onMessage', data);\n if (data.event === SocketReceiveEvent.PONG) {\n this.lastPingTime = Date.now();\n return;\n }\n\n if (data.event === SocketReceiveEvent.START_CONFIRM) {\n this.callKit.logger.debug('register success');\n this.satrtConfirm = true;\n this.callKit.connect.setConnectStatus(CallStatus.registered);\n }\n\n if (data.event === SocketReceiveEvent.CALL_SUCCESS) {\n this.recivedClose = false;\n this.callKit.logger.debug('callStart');\n this.callKit.user.setUserStatus(UserStatus.busy);\n }\n\n if (data.event === SocketReceiveEvent.CALL_FAILED) {\n this.callKit.logger.debug(data.msg, {\n errCode: ErrorCode.SOCKET_CALL_ERROR\n });\n this.callKit.user.setUserStatus(UserStatus.online);\n }\n\n if (data.event === SocketReceiveEvent.CUSTOMER_RINGING) {\n this.callKit.logger.debug(data.msg);\n\n if (this.callKit.connect.isConnecting()) {\n this.callKit.trigger(KitEvent.CALL_RINGING, new Date());\n this.callKit.connect.setConnectStatus(CallStatus.ringing);\n }\n }\n if (data.event === SocketReceiveEvent.CUSTOMER_PICK_UP) {\n this.callKit.logger.debug(data.msg);\n if (this.callKit.connect.isRinging()) {\n this.callKit.connect.setConnectStatus(CallStatus.calling);\n this.callKit.trigger(KitEvent.CALL_PICK_UP, new Date());\n }\n }\n\n if (data.event === SocketReceiveEvent.AGENT_PICK_UP) {\n this.callKit.logger.debug(data.msg);\n this.callKit.trigger(KitEvent.AGENT_PICK_UP, new Date());\n }\n\n if (data.event === SocketReceiveEvent.CUSTOMER_HANG_UP) {\n this.callKit.logger.debug(data.msg);\n this.callKit.trigger(KitEvent.CALL_HANG_UP, new Date());\n this.callKit.user.setUserStatus(UserStatus.catNap);\n }\n if (data.event === SocketReceiveEvent.CUSTOMER_NO_ANSWER) {\n this.callKit.logger.debug(data.msg);\n this.callKit.trigger(KitEvent.CALL_NO_ANSWER);\n this.callKit.user.setUserStatus(UserStatus.catNap);\n }\n if (data.event === SocketReceiveEvent.CALL_CDR) {\n this.callKit.logger.debug(data.msg);\n this.callKit.trigger(KitEvent.CALL_CDR, data.data);\n }\n if (data.event === SocketReceiveEvent.STOP_CONFIRM) {\n this.callKit.logger.debug(data.msg);\n this.recivedClose = true;\n }\n if (data.event === SocketReceiveEvent.CLOSE) {\n const { userInfo } = this.callKit.config.getConfig();\n this.callKit.logger.debug(data.msg);\n this.send(SocketSendEvent.END, {\n agentId: userInfo.agentId\n });\n }\n if (data.event === SocketReceiveEvent.ERROR) {\n this.callKit.logger.error(data.msg, {\n errCode: ErrorCode.SOKET_SERVER_ERROR,\n data\n });\n this.callKit.user.setUserStatus(UserStatus.catNap);\n }\n\n if (data.event === SocketReceiveEvent.AGENT_NO_ANSWER) {\n this.callKit.user.setUserStatus(UserStatus.catNap);\n }\n\n this.callKit.trigger(KitEvent.SERVER_SOCKET_EVENT, data);\n }\n\n send(event: SocketSendEventType, message?: any) {\n if (!this.isConnected) {\n this.callKit.logger.error('socket not connected', {\n errCode: ErrorCode.SOCKET_CONNECT_ERROR\n });\n this.callKit.config.reset();\n this.callKit.reset();\n return;\n }\n const { userInfo } = this.callKit.config.getConfig();\n const { sessionId, extno, agentId } = userInfo;\n if (!sessionId) {\n this.callKit.logger.error('sessionId is empty', {\n errCode: ErrorCode.SOCKET_CONNECT_ERROR\n });\n return;\n }\n const msg = {\n event,\n sessionId,\n ...message\n };\n if (SocketSendEvent.CALL === event) {\n msg.phoneNum = extno;\n msg.agentId = agentId;\n }\n\n this.callKit.logger.debug('socket send', msg);\n switch (event) {\n case SocketSendEvent.PING:\n this.lastPingTime = Date.now();\n this.ws?.send(JSON.stringify({ event, ...msg }));\n break;\n default:\n this.ws?.send(JSON.stringify({ event, ...msg }));\n break;\n }\n }\n\n /**\n * Attempt to close socket, need to wait for server confirmation\n * @returns\n */\n async requestClose() {\n return new Promise<boolean>((resolve) => {\n let remainingTime = 5;\n const interval = setInterval(() => {\n remainingTime -= 1;\n if (this.recivedClose || remainingTime <= 0) {\n clearInterval(interval);\n resolve(this.recivedClose);\n }\n }, 1000);\n });\n }\n\n private ping() {\n if (!this.isConnected) return;\n this.send(SocketSendEvent.PING);\n const now = Date.now();\n this.callKit.logger.debug(`socket ping: ${now - this.lastPingTime}ms`);\n // 5s is considered timeout\n const { pingInterval, pingTimeout } = this.socketConfig;\n if (now - this.lastPingTime > pingInterval + pingTimeout) {\n this.callKit.logger.error('socket ping timeout', {\n errCode: ErrorCode.SOCKET_PING_TIMEOUT\n });\n // Do not call reset directly, but actively close the connection and let onClose handle reconnection\n if (this.ws && this.isConnected) {\n this.ws.close(4001, 'ping timeout');\n } else {\n this.reset();\n }\n }\n }\n\n private checkPing() {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n }\n this.ping();\n this.pingTimer = setInterval(() => {\n this.ping();\n }, this.socketConfig.pingInterval);\n }\n\n /**\n *\n * @param isWaitConfirm Whether need to wait for close confirmation\n */\n async reset(isWaitConfirm = true) {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n }\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n }\n this.lastPingTime = undefined;\n this.pingTimer = undefined;\n this.satrtConfirm = false;\n this.isReconnecting = false;\n this.reconnectAttempts = 0;\n\n if (this.ws && this.isConnected) {\n if (isWaitConfirm) {\n await this.requestClose();\n }\n this.recivedClose = false;\n this.callKit.logger.debug('socket destroy');\n this.ws.close();\n this.isConnected = false;\n }\n }\n\n private attemptReconnect() {\n if (this.isReconnecting) {\n return;\n }\n\n this.isReconnecting = true;\n const delay\n = this.socketConfig.delay\n * this.socketConfig.backoffMultiplier ** this.reconnectAttempts;\n\n this.callKit.logger.debug(\n `Preparing reconnection attempt ${\n this.reconnectAttempts + 1\n }, delay: ${delay}ms`\n );\n\n this.reconnectTimer = setTimeout(() => {\n const { socket } = this.callKit.config.getConfig();\n this.connect(socket);\n this.reconnectAttempts += 1;\n this.isReconnecting = false;\n }, delay);\n }\n}\n","import type { CallKit } from '.';\nimport { ErrorCode, KitEvent, UserStatus } from './const';\n\nexport class User {\n private callKit: CallKit;\n\n userStatus: number; // logout(1, \"unregistered\"), idle(2, \"free\"), break(3, \"nap\"), busy(4, \"busy\")\n\n constructor(callKit: CallKit) {\n this.callKit = callKit;\n }\n\n /**\n *\n * @param status logout(1, \"unregistered\"), idle(2, \"free\"), break(3, \"nap\"), busy(4, \"busy\")\n */\n async setUserStatus(status: number) {\n const { isAutoUpdateUserStatus } = this.callKit.config.getConfig();\n if (status === this.userStatus || !isAutoUpdateUserStatus) return;\n return this.updateUserStatus(status);\n }\n\n /**\n * Update user status\n * @param status\n */\n async updateUserStatus(status: number) {\n const { agentId } = this.callKit.config.getConfig().userInfo;\n if (!this.callKit.config.isLogin()) {\n this.userStatus = UserStatus.offline;\n this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, UserStatus.offline);\n return;\n }\n\n await this.callKit.api\n .setUserStatus({\n agentId,\n userStatus: status\n })\n .then(() => {\n this.userStatus = status;\n this.callKit.trigger(KitEvent.KIT_USER_STATUS_CHANGE, status);\n })\n .catch((err) => {\n this.callKit.logger.error(err, {\n errCode: ErrorCode.API_USER_STATUS_UPDATE_ERROR\n });\n });\n }\n}\n"],"mappings":"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","names":["axios","request","md5"]}