@koi-design/callkit 1.0.23 → 1.0.24-beta.2

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/index.mjs CHANGED
@@ -168,6 +168,10 @@ var KitEvent = {
168
168
  * Server initiated call
169
169
  */
170
170
  KIT_INVITE: "invite",
171
+ // /**
172
+ // * Referral
173
+ // */
174
+ // KIT_REFER: 'refer',
171
175
  /**
172
176
  * Connecting
173
177
  */
@@ -432,6 +436,17 @@ var Call = class {
432
436
  this.callKit.socket.send(SocketSendEvent.CALL, queryTrain);
433
437
  });
434
438
  }
439
+ /**
440
+ * Refer
441
+ * @param referTo - The referral target. If a `Session`, a REFER w/Replaces is sent.
442
+ * @returns
443
+ */
444
+ async callRefer(referTo, options) {
445
+ if (!this.callKit.config.check())
446
+ return;
447
+ this.callKit.logger.debug("callRefer");
448
+ this.callKit.connect.refer(referTo, options);
449
+ }
435
450
  /**
436
451
  * Hang up
437
452
  * @param isUnprompted Whether to actively hang up
@@ -536,12 +551,7 @@ var Config = class {
536
551
  }
537
552
  };
538
553
  validate = () => {
539
- const {
540
- userPart,
541
- fsIp,
542
- fsPassword,
543
- fsPort
544
- } = this.config.userInfo;
554
+ const { userPart, fsIp, fsPassword, fsPort } = this.config.userInfo;
545
555
  if (!userPart || !fsIp || !fsPort || !fsPassword) {
546
556
  return false;
547
557
  }
@@ -632,12 +642,7 @@ var Logger = class {
632
642
  };
633
643
 
634
644
  // package/connect.ts
635
- import {
636
- UserAgent,
637
- Web,
638
- Registerer,
639
- SessionState
640
- } from "sip.js";
645
+ import { UserAgent, Web, Registerer, SessionState } from "sip.js";
641
646
  function convertObjectStringToJSON(input) {
642
647
  const corrected = input.replace(/(\w+):\s*'(.*?)'/g, '"$1": "$2"').replace(/'/g, '"');
643
648
  return corrected;
@@ -799,13 +804,7 @@ var Connect = class {
799
804
  this.mediaStream = await navigator.mediaDevices.getUserMedia(constrains);
800
805
  return this.mediaStream;
801
806
  };
802
- const {
803
- userPart,
804
- fsIp,
805
- fsPort,
806
- iceInfo,
807
- wsUrl
808
- } = userInfo;
807
+ const { userPart, fsIp, fsPort, iceInfo, wsUrl } = userInfo;
809
808
  const connectConfig = {
810
809
  uri: UserAgent.makeURI(`sip:${userPart}@${fsIp}:${fsPort}`),
811
810
  displayName: userPart,
@@ -906,7 +905,9 @@ var Connect = class {
906
905
  const { request: request2 } = this.currentSession;
907
906
  const headerNames = Object.keys(request2.headers);
908
907
  const xHeaders = {};
909
- headerNames.filter((name) => name.toLocaleLowerCase().startsWith("x-antaios")).forEach((name) => {
908
+ headerNames.filter(
909
+ (name) => name.toLocaleLowerCase().startsWith("x-antaios")
910
+ ).forEach((name) => {
910
911
  xHeaders[name.toLocaleLowerCase()] = request2.getHeader(name);
911
912
  });
912
913
  this.callKit.logger.debug("get invite data", xHeaders);
@@ -932,6 +933,20 @@ var Connect = class {
932
933
  onRegister: () => {
933
934
  this.callKit.logger.debug("connect onRegister");
934
935
  }
936
+ // onRefer: (referral) => {
937
+ // this.callKit.trigger(KitEvent.KIT_REFER, {
938
+ // referAccept: () => {
939
+ // this.setConnectStatus(CallStatus.connecting);
940
+ // referral.accept().then(() => {
941
+ // referral.makeInviter().invite();
942
+ // });
943
+ // },
944
+ // referReject: () => {
945
+ // referral.reject();
946
+ // this.callKit.callCenter.callEnd(true, false);
947
+ // }
948
+ // });
949
+ // }
935
950
  };
936
951
  await this.userAgent.start().catch((err) => {
937
952
  this.callKit.callCenter.callEnd(false, true);
@@ -1139,6 +1154,11 @@ var Connect = class {
1139
1154
  }
1140
1155
  await this.setMute(false);
1141
1156
  }
1157
+ async refer(referTo, options) {
1158
+ this.callKit.logger.debug("connect refer");
1159
+ const target = UserAgent.makeURI(referTo);
1160
+ this.currentSession.refer(target, options);
1161
+ }
1142
1162
  };
1143
1163
 
1144
1164
  // package/socket.ts
@@ -1585,6 +1605,12 @@ var CallKit = class {
1585
1605
  this.logger.debug("call");
1586
1606
  this.callCenter.callStart();
1587
1607
  }
1608
+ async refer(uri, options) {
1609
+ if (!this.config.check())
1610
+ return;
1611
+ this.logger.debug("refer");
1612
+ this.callCenter.callRefer(uri, options);
1613
+ }
1588
1614
  async register() {
1589
1615
  if (!this.config.check())
1590
1616
  return;
@@ -1 +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 EncryptionMethod\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(\n username: string,\n password: string,\n extra: { [key: string]: any } = {\n encryptionMethod: EncryptionMethod.INTERNAL\n }\n ) {\n if (this.config.isLogin()) {\n this.logger.warn('already login');\n return;\n }\n\n let encryptionPassword = '';\n const { encryptionMethod = EncryptionMethod.INTERNAL } = extra;\n switch (encryptionMethod) {\n case EncryptionMethod.NONE:\n encryptionPassword = password;\n break;\n case EncryptionMethod.INTERNAL:\n encryptionPassword = md5(username + md5(password));\n break;\n default:\n encryptionPassword = md5(username + md5(password));\n break;\n }\n\n this.logger.debug('login info:', {\n username,\n password,\n encryptionMethod,\n encryptionPassword\n });\n const user = await this.api\n .login({\n userName: username,\n password: encryptionPassword\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: encryptionPassword,\n encryptionPassword,\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 // encryptionType is in extra\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 EncryptionMethod = {\n NONE: 'NONE',\n INTERNAL: 'INTERNAL'\n};\nexport type EncryptionMethodType =\n (typeof EncryptionMethod)[keyof typeof EncryptionMethod];\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 type { EncryptionMethodType } from './const';\nimport {\n constrainsDefault,\n ErrorCode,\n KitEvent,\n EncryptionMethod\n} 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 encryptionPassword: 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 encryptionMethod: EncryptionMethodType\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 encryptionPassword: EncryptionMethod.INTERNAL,\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 encryptionMethod: EncryptionMethod.INTERNAL\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 encryptionPassword: '',\n userPart: '',\n extno: '',\n agentId: '',\n fsUserId: '',\n fsPassword: '',\n fsIp: '',\n fsPort: '',\n iceInfo: [],\n iceGatheringTimeout: this.config.userInfo.iceGatheringTimeout,\n encryptionMethod: EncryptionMethod.INTERNAL\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":["request"]}
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 EncryptionMethod\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(\n username: string,\n password: string,\n extra: { [key: string]: any } = {\n encryptionMethod: EncryptionMethod.INTERNAL\n }\n ) {\n if (this.config.isLogin()) {\n this.logger.warn('already login');\n return;\n }\n\n let encryptionPassword = '';\n const { encryptionMethod = EncryptionMethod.INTERNAL } = extra;\n switch (encryptionMethod) {\n case EncryptionMethod.NONE:\n encryptionPassword = password;\n break;\n case EncryptionMethod.INTERNAL:\n encryptionPassword = md5(username + md5(password));\n break;\n default:\n encryptionPassword = md5(username + md5(password));\n break;\n }\n\n this.logger.debug('login info:', {\n username,\n password,\n encryptionMethod,\n encryptionPassword\n });\n const user = await this.api\n .login({\n userName: username,\n password: encryptionPassword\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: encryptionPassword,\n encryptionPassword,\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 // encryptionType is in extra\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 refer(uri: string, options?: any) {\n if (!this.config.check()) return;\n this.logger.debug('refer');\n this.callCenter.callRefer(uri, options);\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> =>\n 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 // * Referral\n // */\n // KIT_REFER: 'refer',\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 EncryptionMethod = {\n NONE: 'NONE',\n INTERNAL: 'INTERNAL'\n};\nexport type EncryptionMethodType =\n (typeof EncryptionMethod)[keyof typeof EncryptionMethod];\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 * Refer\n * @param referTo - The referral target. If a `Session`, a REFER w/Replaces is sent.\n * @returns\n */\n async callRefer(referTo: string, options?: any) {\n if (!this.callKit.config.check()) return;\n this.callKit.logger.debug('callRefer');\n this.callKit.connect.refer(referTo, options);\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 )\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 type { EncryptionMethodType } from './const';\nimport {\n constrainsDefault,\n ErrorCode,\n KitEvent,\n EncryptionMethod\n} 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 encryptionPassword: 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 encryptionMethod: EncryptionMethodType;\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 encryptionPassword: EncryptionMethod.INTERNAL,\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 encryptionMethod: EncryptionMethod.INTERNAL\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 encryptionPassword: '',\n userPart: '',\n extno: '',\n agentId: '',\n fsUserId: '',\n fsPassword: '',\n fsIp: '',\n fsPort: '',\n iceInfo: [],\n iceGatheringTimeout: this.config.userInfo.iceGatheringTimeout,\n encryptionMethod: EncryptionMethod.INTERNAL\n };\n this.callKit.trigger(KitEvent.KIT_LOGIN_CHANGE, false);\n }\n };\n\n validate = () => {\n const { userPart, fsIp, fsPassword, fsPort } = 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 { UserAgent, Web, Registerer, SessionState } from 'sip.js';\n\nimport type { CallKit } from '.';\nimport { CallStatus, ErrorCode, KitEvent, SocketSendEvent } 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 { userPart, fsIp, fsPort, iceInfo, wsUrl } = 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) =>\n name.toLocaleLowerCase().startsWith('x-antaios')\n )\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 // onRefer: (referral) => {\n // this.callKit.trigger(KitEvent.KIT_REFER, {\n // referAccept: () => {\n // this.setConnectStatus(CallStatus.connecting);\n // referral.accept().then(() => {\n // referral.makeInviter().invite();\n // });\n // },\n // referReject: () => {\n // referral.reject();\n // this.callKit.callCenter.callEnd(true, false);\n // }\n // });\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 )\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 async refer(referTo: string, options?: any) {\n this.callKit.logger.debug('connect refer');\n const target = UserAgent.makeURI(referTo);\n this.currentSession.refer(target, options);\n // setTimeout(async () => {\n // await this.hangup();\n // }, 2000);\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":["request"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koi-design/callkit",
3
- "version": "1.0.23",
3
+ "version": "1.0.24-beta.2",
4
4
  "description": "callkit",
5
5
  "author": "koi",
6
6
  "license": "ISC",
@@ -8,7 +8,7 @@
8
8
  "build": "tsup",
9
9
  "start": "tsup --watch",
10
10
  "dev": "vite",
11
- "lint": "eslint -c .eslintrc.js --ext .jsx,.js,.tsx,.ts ./src --fix",
11
+ "lint": "eslint -c .eslintrc.js --ext .jsx,.js,.tsx,.ts ./package --fix",
12
12
  "prepare": "husky install",
13
13
  "release": "tsup && node scripts/pkg.js"
14
14
  },
@@ -35,13 +35,15 @@
35
35
  "@commitlint/config-conventional": "^9.1.2",
36
36
  "@koi-design/eslint-config-ts": "^0.0.14",
37
37
  "@types/blueimp-md5": "^2.18.2",
38
+ "archiver": "^5.3.1",
38
39
  "eslint": "~8.29.0",
40
+ "eslint-config-prettier": "^10.1.5",
41
+ "eslint-plugin-prettier": "^5.5.0",
39
42
  "husky": "^8.0.1",
40
43
  "lint-staged": "^10.5.4",
41
44
  "prettier": "^2.6.2",
42
45
  "tsup": "6.6.3",
43
46
  "typescript": "^4.6.3",
44
- "vite": "^4",
45
- "archiver": "^5.3.1"
47
+ "vite": "^4"
46
48
  }
47
49
  }