hs-cti.d.ts 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. /*!
  2. - Name HS_CTI
  3. - FileName hs-cti
  4. - Version 1.0.9
  5. - JS Standard any
  6. - Author platformfe
  7. - Built on 2024/11/16 10:01:11
  8. - GitHub
  9. - Branch main
  10. - CommitID d83889f31bf3f437dd61266d77027454207ee34a
  11. - CommitMessage feat:init
  12. */
  13. /**
  14. * Minimal `EventEmitter` interface that is molded against the Node.js
  15. * `EventEmitter` interface.
  16. */
  17. declare class EventEmitter<
  18. EventTypes extends EventEmitter.ValidEventTypes = string | symbol,
  19. // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint
  20. Context extends any = any
  21. > {
  22. static prefixed: string | boolean
  23. /**
  24. * Return an array listing the events for which the emitter has registered
  25. * listeners.
  26. */
  27. eventNames(): Array<EventEmitter.EventNames<EventTypes>>
  28. /**
  29. * Return the listeners registered for a given event.
  30. */
  31. listeners<T extends EventEmitter.EventNames<EventTypes>>(
  32. event: T
  33. ): Array<EventEmitter.EventListener<EventTypes, T>>
  34. /**
  35. * Return the number of listeners listening to a given event.
  36. */
  37. listenerCount(event: EventEmitter.EventNames<EventTypes>): number
  38. /**
  39. * Calls each of the listeners registered for a given event.
  40. */
  41. emit<T extends EventEmitter.EventNames<EventTypes>>(
  42. event: T,
  43. ...args: EventEmitter.EventArgs<EventTypes, T>
  44. ): boolean
  45. /**
  46. * Add a listener for a given event.
  47. */
  48. on<T extends EventEmitter.EventNames<EventTypes>>(
  49. event: T,
  50. fn: EventEmitter.EventListener<EventTypes, T>,
  51. context?: Context
  52. ): this
  53. addListener<T extends EventEmitter.EventNames<EventTypes>>(
  54. event: T,
  55. fn: EventEmitter.EventListener<EventTypes, T>,
  56. context?: Context
  57. ): this
  58. /**
  59. * Add a one-time listener for a given event.
  60. */
  61. once<T extends EventEmitter.EventNames<EventTypes>>(
  62. event: T,
  63. fn: EventEmitter.EventListener<EventTypes, T>,
  64. context?: Context
  65. ): this
  66. /**
  67. * Remove the listeners of a given event.
  68. */
  69. removeListener<T extends EventEmitter.EventNames<EventTypes>>(
  70. event: T,
  71. fn?: EventEmitter.EventListener<EventTypes, T>,
  72. context?: Context,
  73. once?: boolean
  74. ): this
  75. off<T extends EventEmitter.EventNames<EventTypes>>(
  76. event: T,
  77. fn?: EventEmitter.EventListener<EventTypes, T>,
  78. context?: Context,
  79. once?: boolean
  80. ): this
  81. /**
  82. * Remove all listeners, or those of the specified event.
  83. */
  84. removeAllListeners(event?: EventEmitter.EventNames<EventTypes>): this
  85. }
  86. declare namespace EventEmitter {
  87. export interface ListenerFn<Args extends any[] = any[]> {
  88. (...args: Args): void
  89. }
  90. export interface EventEmitterStatic {
  91. new <
  92. EventTypes extends ValidEventTypes = string | symbol,
  93. Context = any
  94. >(): EventEmitter<EventTypes, Context>
  95. }
  96. /**
  97. * `object` should be in either of the following forms:
  98. * ```
  99. * interface EventTypes {
  100. * 'event-with-parameters': any[]
  101. * 'event-with-example-handler': (...args: any[]) => void
  102. * }
  103. * ```
  104. */
  105. export type ValidEventTypes = string | symbol | object
  106. export type EventNames<T extends ValidEventTypes> = T extends string | symbol
  107. ? T
  108. : keyof T
  109. export type ArgumentMap<T extends object> = {
  110. [K in keyof T]: T[K] extends (...args: any[]) => void
  111. ? Parameters<T[K]>
  112. : T[K] extends any[]
  113. ? T[K]
  114. : any[]
  115. }
  116. export type EventListener<
  117. T extends ValidEventTypes,
  118. K extends EventNames<T>
  119. > = T extends string | symbol
  120. ? (...args: any[]) => void
  121. : (
  122. ...args: ArgumentMap<Exclude<T, string | symbol>>[Extract<K, keyof T>]
  123. ) => void
  124. export type EventArgs<
  125. T extends ValidEventTypes,
  126. K extends EventNames<T>
  127. > = Parameters<EventListener<T, K>>
  128. export const EventEmitter: EventEmitterStatic
  129. }
  130. /** @enum LoggerLevels 日志输出等级 */
  131. declare enum LoggerLevels {
  132. error = 0,
  133. warn = 1,
  134. log = 2,
  135. debug = 3
  136. }
  137. declare global {
  138. interface Window {
  139. ctiLoggerLevel?: LoggerLevels;
  140. HS_CTI_CLIENT_ID?: string;
  141. }
  142. }
  143. /** @class Logger 通用的日志模块 */
  144. declare class Logger {
  145. private _level;
  146. private category;
  147. private label;
  148. constructor(level: LoggerLevels, category: string, label?: string);
  149. error(content: string): void;
  150. warn(content: string): void;
  151. log(content: string): void;
  152. debug(content: string): void;
  153. genericLog(levelToLog: LoggerLevels, content: string): void;
  154. private print;
  155. get level(): LoggerLevels;
  156. set level(newLevel: LoggerLevels);
  157. }
  158. /**
  159. * 默认 'test'
  160. * 'development': 本地(不上报服埋点只打印 log)
  161. * 'test': 测试
  162. * 'production': 生产
  163. */
  164. type ENV = 'development' | 'test' | 'production';
  165. /**
  166. * @enum {string} CTI 初始化场景
  167. * Manual: 手动外呼
  168. * Robot: 机器人外呼
  169. * Monitor: 监听
  170. * Predictive: 预测式外呼
  171. */
  172. declare enum Scene {
  173. Manual = "manual",
  174. Robot = "robot",
  175. Monitor = "monitor",
  176. Predictive = "predictive"
  177. }
  178. type ExcludeScene = Scene.Manual | Scene.Robot | Scene.Predictive;
  179. /**
  180. * @enum {string} CTI 监听场景
  181. * All: 不区分场景
  182. * Manual: 手动外呼
  183. * Robot: 机器人外呼
  184. * Predictive: 预测式外呼
  185. */
  186. declare enum MonitorScene {
  187. All = "all",
  188. Manual = "manual",
  189. Robot = "robot",
  190. Predictive = "predictive"
  191. }
  192. /**
  193. * @interface {} 初始化 SD_CTI 的基本参数
  194. * agent_id: 坐席 ID
  195. * saas_id: 主体标识,例如 'hongshan'
  196. */
  197. interface BaseOptions {
  198. agent_id: string;
  199. saas_id: string;
  200. }
  201. interface BaseHsCTIInitOptions extends BaseOptions {
  202. loggerLevel?: LoggerLevels;
  203. password: string;
  204. env: ENV;
  205. }
  206. interface HsCTIInitOptions extends BaseHsCTIInitOptions {
  207. scene: ExcludeScene;
  208. }
  209. interface RequiredHsCTIInitOptions extends BaseHsCTIInitOptions {
  210. scene: Scene.Monitor;
  211. monitorScene: MonitorScene;
  212. }
  213. /**
  214. * @interface {} 初始化 SD_CTI 需要的参数
  215. * loggerLevel: 日志等级
  216. * password: 临时的鉴权字符串,由业务方写死传进来
  217. * scene: CTI 初始化场景
  218. * monitorScene: 监听场景
  219. * env: 环境变量
  220. */
  221. /**
  222. * @enum {string} Socket 状态
  223. * Initial: 初始状态
  224. * Connecting: Socket 开始建立连接
  225. * Connected: Socket 建立连接成功
  226. * Ready: 向 IM 发送第一个上行 login 消息收到成功回调
  227. * Terminated: Socket 连接断开、各种 Socket 错误流转到本状态
  228. */
  229. declare enum SocketStatus {
  230. Initial = "Initial",
  231. Connecting = "Connecting",
  232. Connected = "Connected",
  233. Ready = "Ready",
  234. ReTry = "ReTry",
  235. Terminated = "Terminated"
  236. }
  237. /**
  238. * @enum {string} SIP 状态
  239. * Initial: 初始状态
  240. * Started: SIP 的 User Agent 创建成功
  241. * Connecting: SIP 底层 Socket 传输 TransportState.Connecting
  242. * Connected: SIP 底层 Socket 传输 TransportState.Connected
  243. * Ready: SIP Registerer 监听注册状态 RegistererState.Registered
  244. * Terminated: SIP Socket 断开、注册失败等各种错误、主动断开连接流转到本状态
  245. */
  246. declare enum SIPStatus {
  247. Initial = "Initial",
  248. Started = "Started",
  249. Connecting = "Connecting",
  250. Connected = "Connected",
  251. Ready = "Ready",
  252. ReTry = "ReTry",
  253. Terminated = "Terminated"
  254. }
  255. /**
  256. * @enum {string} CTI 状态
  257. * Initial: 初始状态
  258. * Ready: SocketStatus Ready && SIPStatus Ready
  259. * Terminated: SocketStatus Terminated || SIPStatus Terminated || 正常调用 unInit 方法卸载
  260. */
  261. declare enum CTIStatus {
  262. Initial = "Initial",
  263. Ready = "Ready",
  264. ReTry = "ReTry",
  265. Terminated = "Terminated"
  266. }
  267. /**
  268. * @enum {string} 通话状态
  269. * 为了防止人工外呼方法被二次调用引发预期以外的问题,增加此状态的流转
  270. * Started: 外呼已开始,此状态下不允许再次发起外呼
  271. * Stopped: 外呼已结束,此状态下可以再次发起外呼
  272. */
  273. declare enum CallStatus {
  274. Started = "Started",
  275. Stopped = "Stopped"
  276. }
  277. /**
  278. * @enum {string} Session 状态
  279. * CTI 目前只有 Invitation(接受会话)的场景,Inviter (主动发起会话)暂时没有
  280. */
  281. declare enum SessionStatus {
  282. /**
  283. * If `Inviter`, INVITE not sent yet.
  284. * If `Invitation`, SDK 收到 INVITE 通话请求,但尚未处理.
  285. */
  286. Initial = "Initial",
  287. /**
  288. * If `Inviter`, sent INVITE and waiting for a final response.
  289. * If `Invitation`, received INVITE and attempting to send 200 final response (but has not sent it yet).
  290. */
  291. Establishing = "Establishing",
  292. /**
  293. * If `Inviter`, sent INVITE and received 200 final response and sent ACK.
  294. * If `Invitation`, SDK 完成接受 INVITE 并发送 200 OK 确认接起,同时接通本地语音流.
  295. */
  296. Established = "Established",
  297. /**
  298. * If `Inviter`, sent INVITE, sent CANCEL and now waiting for 487 final response to ACK (or 200 to ACK & BYE).
  299. * If `Invitation`, received INVITE, sent 200 final response and now waiting on ACK and upon receipt will attempt BYE
  300. * (as the protocol specification requires, before sending a BYE we must receive the ACK - so we are waiting).
  301. */
  302. Terminating = "Terminating",
  303. /**
  304. * If `Inviter`, sent INVITE and received non-200 final response (or sent/received BYE after receiving 200).
  305. * If `Invitation`, SDK 收到 BYE 信令,发送 200 OK 挂断确认,会话结束.
  306. */
  307. Terminated = "Terminated"
  308. }
  309. /**
  310. * @enum {string} CTI 所有错误的分类
  311. * SdkTerminated: SDK 不可用错误,需要重新初始化
  312. * SdkError: SDK 状态可用,其他普通错误
  313. * ServerTerminated: 服务端不可用错误,需要重新初始化,透传服务端 code,msg
  314. * ServerError: 服务端可用,普通错误,透传服务端 code,msg
  315. */
  316. declare enum CTIErrorType {
  317. SdkTerminated = "SdkTerminated",
  318. SdkError = "SdkError",
  319. ServerTerminated = "ServerTerminated",
  320. ServerError = "ServerError"
  321. }
  322. /**
  323. * @enum {string} SdkTerminated 类型错误的 code 枚举
  324. * CTITerminated: SDK 状态不可用,CTIStatus 的状态为 Terminated
  325. * GetUserMedia: 获取坐席媒体权限失败
  326. * GetInitConfig: 调接口获取 CTI 初始化配置失败
  327. * SocketOnError: 监听 socket.io 的 error 事件
  328. * SocketOnConnectError: 监听 socket.io 的 connect_error 事件
  329. * SocketOnDisconnect: 监听 socket.io 的 disconnect 事件
  330. * SocketRepeatLogin: 多页面重复登录,IM 互踢事件
  331. * SIPInitUserAgent: SIP UserAgent 初始化时启动失败
  332. * SIPInitRegister: SIP Register 初始化时注册失败
  333. * SIPUserAgentStateStopped: 监听 SIP UserAgent stateChange 事件状态变更为 Stopped
  334. * SIPTransportStateDisconnected: 监听 SIP Transport StateChange 事件状态变更为 Disconnect
  335. * SIPRegistererStateTerminated: 监听 SIP Registerer StateChange 事件状态变更为 Terminated
  336. * SIPOnDisconnect: 监听 SIP OnDisconnect 事件收到异常退出 error
  337. * SIPInitTransport: SIP Transport 初始化时连接失败
  338. * SipHeartBeatErr: SIP发送心跳OPTIONS事件时收到异常结果
  339. * SIPUnRegistered: 注册SIP时失败
  340. * SocketOnReconnectFailed: Socket重连超过阈值且依然重连失败
  341. */
  342. declare enum HskTerminatedCode {
  343. CTITerminated = "100001",
  344. GetUserMedia = "100002",
  345. GetInitConfig = "100003",
  346. SocketOnError = "110001",
  347. SocketOnConnectError = "110002",
  348. SocketOnDisconnect = "110003",
  349. SocketRepeatLogin = "110004",
  350. SocketOnReconnectFailed = "110007",
  351. SIPInitUserAgent = "120001",
  352. SIPInitRegister = "120002",
  353. SIPUserAgentStateStopped = "120003",
  354. SIPTransportStateDisconnected = "120004",
  355. SIPRegistererStateTerminated = "120005",
  356. SIPOnDisconnect = "120006",
  357. SIPInitTransport = "120007",
  358. SipHeartBeatErr = "120008",
  359. SIPUnRegistered = "120009"
  360. }
  361. /**
  362. * @enum {string} SdkError 类型错误的 code 枚举
  363. * Answer: SIP accept 接起失败
  364. * Bye: SIP bye 挂断失败
  365. * InvitationCancel: SIP Invitation 会话请求被取消
  366. * AssignStream: 播放语音流失败
  367. * FetchError: 修饰器handleApiRes当进入到catch时上报此code
  368. */
  369. declare enum SdkErrorCode {
  370. Answer = "200001",
  371. Bye = "200002",
  372. InvitationCancel = "200003",
  373. AssignStream = "200004",
  374. FetchError = "200005"
  375. }
  376. /**
  377. * @enum {string} CTI 事件推送
  378. * OnCtiError: CTI 错误事件,含前后端所有错误,SDK 推送
  379. * OnSessionStatusChange: 坐席侧 SIP 会话状态变更事件,SDK 推送
  380. * OnInitalSuccess: CTI 初始化成功事件,SDK 推送
  381. * OnAgentWorkReport: 坐席&用户状态变更事件,Server 推送
  382. * OnRingStart: 手动外呼用户未接听时,开始播放回铃音,Server 推送
  383. * OnRingEnd: 手动外呼用户未接听时,播放回铃音结束,Server 推送
  384. * OnAgentReport: 坐席状态变更事件,Server 推送
  385. * OnCallReportInfo: 通话时长及通话次数等信息,Server 推送
  386. * OnDetectedTone: 服务端收到音频信号后推送
  387. */
  388. declare enum CTIEvent {
  389. OnCtiError = "OnCtiError",
  390. OnSessionStatusChange = "OnSessionStatusChange",
  391. OnInitalSuccess = "OnInitalSuccess",
  392. OnAgentWorkReport = "OnAgentWorkReport",
  393. OnRingStart = "OnRingStart",
  394. OnRingEnd = "OnRingEnd",
  395. OnDetectedTone = "OnDetectedTone",
  396. OnAgentReport = "OnAgentReport",
  397. OnCallReportInfo = "OnCallReportInfo",
  398. OnCallRing = "OnCallRing",
  399. OnCallEnd = "OnCallEnd",
  400. OnCallAnswer = "OnCallAnswer",
  401. OnAgentGroupQuery = "OnAgentGroupQuery",
  402. OnMethodResponseEvent = "OnMethodResponseEvent",
  403. OnEventPrompt = "OnEventPrompt",
  404. OnPrompt = "OnPrompt"
  405. }
  406. /** @interface CTIRes CTI 对外方法暴露 promise 结果 */
  407. interface CTIRes {
  408. code: number;
  409. data: any;
  410. msg: string;
  411. }
  412. interface CTIManualCallOptions {
  413. called: string;
  414. caller: string;
  415. ext?: object;
  416. }
  417. /** @class HsCTI 红杉外呼类 */
  418. declare class HsCTI extends EventEmitter {
  419. private logger;
  420. loggerLevel: LoggerLevels;
  421. /** HsCTI 实例 */
  422. static instance: HsCTI | undefined;
  423. scene: Scene;
  424. agent_id: string;
  425. saas_id: string;
  426. /** 接口返回的初始化配置 */
  427. private _initOptions;
  428. /** IM socket的实例 */
  429. private _socket;
  430. /** sip.js UA实例 */
  431. private _sipUserAgent;
  432. private _callId;
  433. private _ctiFlowIdList;
  434. /** 基本参数 */
  435. private _baseParams;
  436. /** 等待提示音播放器 */
  437. private _waitAudio;
  438. /** 振铃提示音播放器 */
  439. private _ringAudio;
  440. /** 结束通话提示音 */
  441. private _byeAudio;
  442. /** 远端音频流播放器 */
  443. private _remoteAudio;
  444. /** CTI状态 */
  445. private _ctiStatus;
  446. private _ctiStatusList;
  447. /** sip状态 */
  448. private _sipStatus;
  449. private _sipStatusList;
  450. /** socket状态 */
  451. private _socketStatus;
  452. private _socketStatusList;
  453. private _callStatus;
  454. private _terminatedStatusList;
  455. private constructor();
  456. get getCTIStatus(): CTIStatus;
  457. get getSocketStatus(): SocketStatus;
  458. get getSIPStatus(): SIPStatus;
  459. static getInstance(hsCTIInitOptions: HsCTIInitOptions | RequiredHsCTIInitOptions): HsCTI;
  460. /** @private 重置实例 */
  461. private initInstanceOptions;
  462. /** @private 优雅关闭 SIP 和 socket */
  463. private clearSocketAndSip;
  464. /**
  465. * @private 设置等待音 src
  466. * @param {AudioName} audioName
  467. * @param {boolean} loop
  468. */
  469. private setAudioSrc;
  470. private playAudio;
  471. private stopLocalAudio;
  472. private stopAudio;
  473. init(): void;
  474. private getInitConfig;
  475. private initSocket;
  476. private handleSocketDownEvent;
  477. /** @private serverEventEmit 统一处理服务端推送的事件 */
  478. private serverEventEmit;
  479. private initSip;
  480. private sipDelegate;
  481. private sessionStateChangeAndTrack;
  482. /**
  483. * @private setCTIStatus CTI 状态流转
  484. * @param {CTIStatus} ctiStatus
  485. */
  486. private setCTIStatus;
  487. /**
  488. * @private setSocketStatus Socket 状态流转
  489. * @param SocketStatusChangeParams Socket 状态流转参数及错误详情等
  490. */
  491. private setSocketStatus;
  492. /**
  493. * @private setSipStatus SIP 状态流转
  494. * @param SIPStatusChangeParams SIP 状态流转参数及错误详情等
  495. */
  496. private setSipStatus;
  497. /**
  498. * @private socketOrSipStatusChange Socket 或 SIP 状态变化可能引起 CTI 状态变化
  499. * @param {SocketStatus} socketStatus
  500. * @param {SIPStatus} sipStatus
  501. */
  502. private socketOrSipStatusChange;
  503. /**
  504. * @private eventEmitAndTrack SDK 对外抛出事件并统一埋点
  505. * @param {CTIEvent} eventName 事件名称
  506. * @param {object} ext 事件参数
  507. * @param { error } error 错误详情或错误辅助信息
  508. */
  509. private eventEmitAndTrack;
  510. /** @private checkIn 服务端签入,CTIStatus Ready 时自动调用,坐席状态变更 */
  511. private checkIn;
  512. /** @public checkOut 服务端签出, unInit 时自动调用,坐席状态变更 */
  513. checkOut(): Promise<CTIRes>;
  514. /** @private _getCtiFlowId 获取手动外呼场景需要的 ctiFlowId */
  515. private getCtiFlowId;
  516. /** @public setIdle 服务端置闲,坐席状态变更 */
  517. setIdle(): Promise<CTIRes>;
  518. /** @public setBusy 服务端置忙,坐席状态变更 */
  519. setBusy(): Promise<CTIRes>;
  520. makeCall(params: CTIManualCallOptions): Promise<CTIRes | undefined>;
  521. private serverCall;
  522. /** @public answer SDK SIP 接起 */
  523. answer(): Promise<CTIRes>;
  524. /** @public bye SDK SIP 挂断 */
  525. bye(): Promise<CTIRes>;
  526. /** @public serverBye 挂断且流转坐席状态 */
  527. serverBye(): Promise<CTIRes | undefined>;
  528. /** @public turnHang 流转坐席状态-通话结束 */
  529. private turnHang;
  530. /** @public getAgentStatus 获取坐席状态 */
  531. getAgentStatus(): Promise<CTIRes>;
  532. /**
  533. * @public loadAgentGroupData 监听-根据监听组 ID 获取监听组成员
  534. * @param {string[]} monitorIds
  535. */
  536. loadAgentGroupData(monitorIds: string[]): Promise<CTIRes>;
  537. /**
  538. * @public listen 监听-服务端发起监听
  539. * @param {string} monitoredAgNo
  540. */
  541. listen(monitoredAgNo: string): Promise<CTIRes>;
  542. /**
  543. * @public setActiveService 机器人外呼-签入人工组
  544. * @param {string} serviceId
  545. */
  546. setActiveService(serviceId: string): Promise<CTIRes>;
  547. /** @public unInit 卸载 SDK,checkOut 成功后断开 socket 和 sip 连接,并销毁 SdCTI 实例 */
  548. unInit(): Promise<void>;
  549. }
  550. /**
  551. * @function getInstance 获取 HsCTI 的实例
  552. * @param HsCTIInitOptions 初始化 HsCTI 的配置
  553. */
  554. declare const getInstance: (HsCTIInitOptions: HsCTIInitOptions | RequiredHsCTIInitOptions) => HsCTI;
  555. export { BaseHsCTIInitOptions, BaseOptions, CTIErrorType, CTIEvent, CTIRes, CTIStatus, CallStatus, ENV, ExcludeScene, HsCTI, HsCTIInitOptions, HskTerminatedCode, Logger, LoggerLevels, MonitorScene, RequiredHsCTIInitOptions, SIPStatus, Scene, SdkErrorCode, SessionStatus, SocketStatus, getInstance };