@koi-design/callkit 2.0.0-beta.6 → 2.0.0-beta.7

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.d.ts CHANGED
@@ -20,27 +20,124 @@ declare class Api {
20
20
  private post;
21
21
  }
22
22
 
23
- declare class Call {
23
+ type LoggerLevel = 'info' | 'success' | 'warn' | 'error' | 'silent';
24
+ interface Log {
25
+ timestamp: string;
26
+ level: LoggerLevel;
27
+ type?: 'INCALL' | 'SIP' | 'API' | 'OTHER';
28
+ message: string;
29
+ caller: string;
30
+ content: Record<string, any>;
31
+ }
32
+ type LogEntity = Omit<Log, 'timestamp' | 'level' | 'message'>;
33
+ declare class Logger {
34
+ prefix: string;
35
+ level: LoggerLevel;
36
+ private pendingTrackLogs;
37
+ private trackLogsTimer;
24
38
  private callKit;
39
+ constructor(callKit: CallKit, level?: LoggerLevel);
40
+ private startTrackLogsTimer;
41
+ private flushTrackLogs;
42
+ destroy(): void;
43
+ setLevel(level: LoggerLevel): void;
44
+ info(msg: string, extra: LogEntity): void;
45
+ success(msg: string, extra: LogEntity): void;
46
+ warn(msg: string, extra: LogEntity): void;
47
+ error(msg: string | Error, extra: LogEntity): void;
48
+ private catchLog;
49
+ }
50
+
51
+ type SocketSendEventType = (typeof SocketSendEvent)[keyof typeof SocketSendEvent];
52
+ interface SocketConfig {
53
+ enabled: boolean;
54
+ maxAttempts: number;
55
+ delay: number;
56
+ backoffMultiplier: number;
57
+ pingInterval: number;
58
+ pingTimeout: number;
59
+ }
60
+ declare class Socket {
61
+ private callKit;
62
+ private ws?;
63
+ private socketConfig;
64
+ lastPingTime: any;
65
+ isConnected: boolean;
66
+ pingTimer?: number;
67
+ satrtConfirm: boolean;
68
+ private reconnectTimer?;
69
+ private isReconnecting;
70
+ private reconnectAttempts;
71
+ private socketError;
25
72
  constructor(callKit: CallKit);
26
- callStart(): Promise<void>;
27
- /**
28
- * Refer
29
- * @param referTo - The referral target. If a `Session`, a REFER w/Replaces is sent.
30
- * @returns
31
- */
32
- callRefer(referTo: string, options?: any): Promise<void>;
73
+ init(): void;
74
+ private handleDisconnect;
75
+ private connect;
76
+ private onOpen;
77
+ private resetReconnectState;
78
+ private onClose;
79
+ private onError;
80
+ private confirmAck;
81
+ private onMessage;
82
+ send(event: SocketSendEventType, message?: any): void;
83
+ sendMessage(event: SocketSendEventType, message?: any): Promise<void>;
84
+ private ping;
85
+ private checkPing;
33
86
  /**
34
- * Hang up
35
- * @param isUnprompted Whether to actively hang up
36
- * @param isError Whether an error occurred
37
- * @returns
87
+ * reset socket connection and all states
38
88
  */
39
- callEnd(isUnprompted?: boolean, isError?: boolean): Promise<void>;
40
- callHold(): Promise<void>;
41
- callUnhold(): Promise<void>;
42
- callMute(): Promise<void>;
43
- callUnmute(): Promise<void>;
89
+ reset(): Promise<void>;
90
+ private attemptReconnect;
91
+ }
92
+
93
+ interface WebrtcConstranis {
94
+ audio: {
95
+ autoGainControl?: boolean;
96
+ noiseSuppression?: boolean;
97
+ echoCancellation?: boolean;
98
+ };
99
+ video: false;
100
+ }
101
+ interface IConfig {
102
+ version: string;
103
+ host: string;
104
+ log: LoggerLevel;
105
+ trackLogs: boolean;
106
+ audioRef?: HTMLAudioElement | (() => HTMLAudioElement);
107
+ constrains: WebrtcConstranis;
108
+ socket: string;
109
+ reconnect?: SocketConfig;
110
+ userInfo: {
111
+ wsUrl: string;
112
+ sessionId: string;
113
+ username: string;
114
+ password: string;
115
+ encryptionPassword: string;
116
+ sourceType: (typeof CallSourceType)[keyof typeof CallSourceType];
117
+ extno: string;
118
+ workOrderId: string;
119
+ userPart: string;
120
+ agentId: string;
121
+ fsUserId: string;
122
+ fsPassword: string;
123
+ fsIp: string;
124
+ fsPort: string;
125
+ iceInfo: string[];
126
+ iceGatheringTimeout: number;
127
+ encryptionMethod: EncryptionMethodType;
128
+ };
129
+ }
130
+ declare class Config {
131
+ callKit: CallKit;
132
+ constructor(callKit: CallKit);
133
+ config: IConfig;
134
+ getConfig: () => IConfig;
135
+ setConfig: (key: string, value: any) => Promise<void>;
136
+ setUserInfo: (key: string, value: any) => Promise<void>;
137
+ reset: () => Promise<void>;
138
+ validate: () => boolean;
139
+ isLogin: () => boolean;
140
+ check(): boolean;
44
141
  }
45
142
 
46
143
  declare const CallStatus: {
@@ -208,124 +305,34 @@ declare const CallSourceType: {
208
305
  workOrderId: number;
209
306
  };
210
307
 
211
- type LoggerLevel = 'info' | 'success' | 'warn' | 'error' | 'silent';
212
- interface Log {
213
- timestamp: string;
214
- level: LoggerLevel;
215
- type?: 'INCALL' | 'SIP' | 'API' | 'OTHER';
216
- message: string;
217
- caller: string;
218
- content: Record<string, any>;
219
- }
220
- type LogEntity = Omit<Log, 'timestamp' | 'level' | 'message'>;
221
- declare class Logger {
222
- prefix: string;
223
- level: LoggerLevel;
224
- private pendingTrackLogs;
225
- private trackLogsTimer;
226
- private callKit;
227
- constructor(callKit: CallKit, level?: LoggerLevel);
228
- private startTrackLogsTimer;
229
- private flushTrackLogs;
230
- destroy(): void;
231
- setLevel(level: LoggerLevel): void;
232
- info(msg: string, extra: LogEntity): void;
233
- success(msg: string, extra: LogEntity): void;
234
- warn(msg: string, extra: LogEntity): void;
235
- error(msg: string | Error, extra: LogEntity): void;
236
- private catchLog;
237
- }
238
-
239
- type SocketSendEventType = (typeof SocketSendEvent)[keyof typeof SocketSendEvent];
240
- interface SocketConfig {
241
- enabled: boolean;
242
- maxAttempts: number;
243
- delay: number;
244
- backoffMultiplier: number;
245
- pingInterval: number;
246
- pingTimeout: number;
308
+ interface CallParams {
309
+ agentId: string;
310
+ sourceType: (typeof CallSourceType)[keyof typeof CallSourceType];
311
+ phoneNum?: string;
312
+ workOrderId?: string;
313
+ extra?: any;
247
314
  }
248
- declare class Socket {
315
+ declare class Call {
249
316
  private callKit;
250
- private ws?;
251
- private socketConfig;
252
- lastPingTime: any;
253
- isConnected: boolean;
254
- pingTimer?: number;
255
- satrtConfirm: boolean;
256
- private reconnectTimer?;
257
- private isReconnecting;
258
- private reconnectAttempts;
259
- private socketError;
260
317
  constructor(callKit: CallKit);
261
- init(): void;
262
- private handleDisconnect;
263
- private connect;
264
- private onOpen;
265
- private resetReconnectState;
266
- private onClose;
267
- private onError;
268
- private confirmAck;
269
- private onMessage;
270
- send(event: SocketSendEventType, message?: any): void;
271
- sendMessage(event: SocketSendEventType, message?: any): Promise<void>;
272
- private ping;
273
- private checkPing;
318
+ callStart(params: Partial<CallParams>): Promise<void>;
274
319
  /**
275
- * reset socket connection and all states
320
+ * Refer
321
+ * @param referTo - The referral target. If a `Session`, a REFER w/Replaces is sent.
322
+ * @returns
276
323
  */
277
- reset(): Promise<void>;
278
- private attemptReconnect;
279
- }
280
-
281
- interface WebrtcConstranis {
282
- audio: {
283
- autoGainControl?: boolean;
284
- noiseSuppression?: boolean;
285
- echoCancellation?: boolean;
286
- };
287
- video: false;
288
- }
289
- interface IConfig {
290
- version: string;
291
- host: string;
292
- log: LoggerLevel;
293
- trackLogs: boolean;
294
- audioRef?: HTMLAudioElement | (() => HTMLAudioElement);
295
- constrains: WebrtcConstranis;
296
- socket: string;
297
- reconnect?: SocketConfig;
298
- userInfo: {
299
- wsUrl: string;
300
- sessionId: string;
301
- username: string;
302
- password: string;
303
- encryptionPassword: string;
304
- sourceType: (typeof CallSourceType)[keyof typeof CallSourceType];
305
- extno: string;
306
- workOrderId: string;
307
- userPart: string;
308
- agentId: string;
309
- fsUserId: string;
310
- fsPassword: string;
311
- fsIp: string;
312
- fsPort: string;
313
- iceInfo: string[];
314
- iceGatheringTimeout: number;
315
- encryptionMethod: EncryptionMethodType;
316
- };
317
- }
318
- declare class Config {
319
- callKit: CallKit;
320
- constructor(callKit: CallKit);
321
- config: IConfig;
322
- getConfig: () => IConfig;
323
- setConfig: (key: string, value: any) => Promise<void>;
324
- setUserInfo: (key: string, value: any) => Promise<void>;
325
- reset: () => void;
326
- validate: () => boolean;
327
- isLogin: () => boolean;
328
- check(): boolean;
324
+ callRefer(referTo: string, options?: any): Promise<void>;
325
+ /**
326
+ * Hang up
327
+ * @param isUnprompted Whether to actively hang up
328
+ * @param isError Whether an error occurred
329
+ * @returns
330
+ */
331
+ callEnd(isUnprompted?: boolean, isError?: boolean): Promise<void>;
332
+ callHold(): Promise<void>;
333
+ callUnhold(): Promise<void>;
334
+ callMute(): Promise<void>;
335
+ callUnmute(): Promise<void>;
329
336
  }
330
337
 
331
338
  type CallStatusType = (typeof CallStatus)[keyof typeof CallStatus];
@@ -368,7 +375,7 @@ declare class Connect {
368
375
  */
369
376
  private isHold;
370
377
  constructor(callKit: CallKit);
371
- reset(): void;
378
+ reset(): Promise<void>;
372
379
  private getAduioReference;
373
380
  permission(): Promise<void>;
374
381
  /**
@@ -454,11 +461,6 @@ interface Listener {
454
461
  event: kitEventType;
455
462
  callback: (...args: any[]) => void;
456
463
  }
457
- interface CallOptions {
458
- sourceType: (typeof CallSourceType)[keyof typeof CallSourceType];
459
- phoneNum?: string;
460
- workOrderId?: string;
461
- }
462
464
  declare class CallKit {
463
465
  api: Api;
464
466
  config: Config;
@@ -471,8 +473,10 @@ declare class CallKit {
471
473
  login(username: string, password: string, extra?: {
472
474
  [key: string]: any;
473
475
  }): Promise<void>;
474
- logout(): Promise<void>;
475
- call(extno?: string | number, options?: CallOptions): Promise<void>;
476
+ logout({ isReset }?: {
477
+ isReset?: boolean;
478
+ }): Promise<void>;
479
+ call(extno?: string | number, options?: Partial<CallParams>): Promise<void>;
476
480
  refer(uri: string, options?: any): Promise<void>;
477
481
  register(): Promise<void>;
478
482
  unregister(): Promise<void>;
@@ -3640,7 +3640,7 @@ var WebCall = (() => {
3640
3640
  constructor(callKit) {
3641
3641
  this.callKit = callKit;
3642
3642
  }
3643
- async callStart() {
3643
+ async callStart(params) {
3644
3644
  if (!this.callKit.config.check())
3645
3645
  return;
3646
3646
  this.callKit.logger.info("callStart", {
@@ -3659,19 +3659,15 @@ var WebCall = (() => {
3659
3659
  return;
3660
3660
  }
3661
3661
  this.callKit.connect.call(async (user) => {
3662
- let queryTrain = {};
3662
+ const queryTrain = {
3663
+ ...params?.extra || {},
3664
+ agentId: user.agentId,
3665
+ sourceType: user.sourceType
3666
+ };
3663
3667
  if (user.sourceType === CallSourceType.phoneNum) {
3664
- queryTrain = {
3665
- agentId: user.agentId,
3666
- phoneNum: user.extno,
3667
- sourceType: user.sourceType
3668
- };
3668
+ queryTrain.phoneNum = user.extno;
3669
3669
  } else if (user.sourceType === CallSourceType.workOrderId) {
3670
- queryTrain = {
3671
- agentId: user.agentId,
3672
- workOrderId: user.workOrderId,
3673
- sourceType: user.sourceType
3674
- };
3670
+ queryTrain.workOrderId = user.workOrderId;
3675
3671
  }
3676
3672
  this.callKit.socket.send(SocketSendEvent.CALL, queryTrain);
3677
3673
  });
@@ -3819,7 +3815,7 @@ var WebCall = (() => {
3819
3815
  }
3820
3816
  });
3821
3817
  };
3822
- reset = () => {
3818
+ reset = async () => {
3823
3819
  if (this.isLogin()) {
3824
3820
  this.config.userInfo = {
3825
3821
  wsUrl: "",
@@ -18499,7 +18495,7 @@ var WebCall = (() => {
18499
18495
  ...reconnect
18500
18496
  };
18501
18497
  }
18502
- reset() {
18498
+ async reset() {
18503
18499
  if (this.isHolding()) {
18504
18500
  this.setHold(false);
18505
18501
  }
@@ -18531,7 +18527,6 @@ var WebCall = (() => {
18531
18527
  });
18532
18528
  }
18533
18529
  }
18534
- this.callKit.config.reset();
18535
18530
  this.setConnectStatus(CallStatus.init);
18536
18531
  this.clearObserveOptionsHeartbeatInterval();
18537
18532
  }
@@ -19656,6 +19651,7 @@ var WebCall = (() => {
19656
19651
  data: data.data
19657
19652
  }
19658
19653
  });
19654
+ this.socketError = true;
19659
19655
  this.callKit.reset();
19660
19656
  }
19661
19657
  if (data.event === SocketReceiveEvent.AGENT_NO_ANSWER) {
@@ -19950,7 +19946,7 @@ var WebCall = (() => {
19950
19946
  });
19951
19947
  }
19952
19948
  }
19953
- async logout() {
19949
+ async logout({ isReset = true } = { isReset: true }) {
19954
19950
  if (!this.config.check())
19955
19951
  return;
19956
19952
  const { userInfo } = this.config.getConfig();
@@ -19973,10 +19969,9 @@ var WebCall = (() => {
19973
19969
  });
19974
19970
  }
19975
19971
  }
19976
- await this.hangup();
19977
- this.connect.reset();
19978
- this.socket.reset();
19979
- this.config.reset();
19972
+ if (isReset) {
19973
+ await this.reset();
19974
+ }
19980
19975
  this.trigger(KitEvent.KIT_LOGIN_CHANGE, false);
19981
19976
  }
19982
19977
  async call(extno = "", options = {
@@ -20010,7 +20005,7 @@ var WebCall = (() => {
20010
20005
  options
20011
20006
  }
20012
20007
  });
20013
- this.callCenter.callStart();
20008
+ this.callCenter.callStart(options);
20014
20009
  }
20015
20010
  async refer(uri, options) {
20016
20011
  if (!this.config.check())
@@ -20127,7 +20122,15 @@ var WebCall = (() => {
20127
20122
  connectStatus: this.connect.connectStatus
20128
20123
  }
20129
20124
  });
20130
- this.connect.reset();
20125
+ if (this.connect.isCalling()) {
20126
+ await this.hangup();
20127
+ }
20128
+ await this.connect.reset();
20129
+ if (this.config.isLogin()) {
20130
+ await this.logout({ isReset: false });
20131
+ }
20132
+ await this.config.reset();
20133
+ await this.socket.reset();
20131
20134
  }
20132
20135
  on(event, callback) {
20133
20136
  this.listener.push({