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

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,129 @@ 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: {
106
+ enabled: boolean;
107
+ interval: number;
108
+ maxSize: number;
109
+ };
110
+ audioRef?: HTMLAudioElement | (() => HTMLAudioElement);
111
+ constrains: WebrtcConstranis;
112
+ socket: string;
113
+ reconnect?: SocketConfig;
114
+ userInfo: {
115
+ wsUrl: string;
116
+ sessionId: string;
117
+ username: string;
118
+ password: string;
119
+ encryptionPassword: string;
120
+ sourceType: (typeof CallSourceType)[keyof typeof CallSourceType];
121
+ extno: string;
122
+ workOrderId: string;
123
+ userPart: string;
124
+ agentId: string;
125
+ fsUserId: string;
126
+ fsPassword: string;
127
+ fsIp: string;
128
+ fsPort: string;
129
+ iceInfo: string[];
130
+ iceGatheringTimeout: number;
131
+ encryptionMethod: EncryptionMethodType;
132
+ };
133
+ }
134
+ declare class Config {
135
+ callKit: CallKit;
136
+ constructor(callKit: CallKit);
137
+ config: IConfig;
138
+ getConfig: () => IConfig;
139
+ setConfig: (key: string, value: any) => Promise<void>;
140
+ setUserInfo: (key: string, value: any) => Promise<void>;
141
+ reset: () => Promise<void>;
142
+ validate: () => boolean;
143
+ isLogin: () => boolean;
144
+ check(): boolean;
145
+ isLogsEnabled(): boolean;
44
146
  }
45
147
 
46
148
  declare const CallStatus: {
@@ -208,124 +310,34 @@ declare const CallSourceType: {
208
310
  workOrderId: number;
209
311
  };
210
312
 
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;
313
+ interface CallParams {
314
+ agentId: string;
315
+ sourceType: (typeof CallSourceType)[keyof typeof CallSourceType];
316
+ phoneNum?: string;
317
+ workOrderId?: string;
318
+ extra?: any;
247
319
  }
248
- declare class Socket {
320
+ declare class Call {
249
321
  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
322
  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;
323
+ callStart(params: Partial<CallParams>): Promise<void>;
274
324
  /**
275
- * reset socket connection and all states
325
+ * Refer
326
+ * @param referTo - The referral target. If a `Session`, a REFER w/Replaces is sent.
327
+ * @returns
276
328
  */
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;
329
+ callRefer(referTo: string, options?: any): Promise<void>;
330
+ /**
331
+ * Hang up
332
+ * @param isUnprompted Whether to actively hang up
333
+ * @param isError Whether an error occurred
334
+ * @returns
335
+ */
336
+ callEnd(isUnprompted?: boolean, isError?: boolean): Promise<void>;
337
+ callHold(): Promise<void>;
338
+ callUnhold(): Promise<void>;
339
+ callMute(): Promise<void>;
340
+ callUnmute(): Promise<void>;
329
341
  }
330
342
 
331
343
  type CallStatusType = (typeof CallStatus)[keyof typeof CallStatus];
@@ -368,7 +380,7 @@ declare class Connect {
368
380
  */
369
381
  private isHold;
370
382
  constructor(callKit: CallKit);
371
- reset(): void;
383
+ reset(): Promise<void>;
372
384
  private getAduioReference;
373
385
  permission(): Promise<void>;
374
386
  /**
@@ -454,11 +466,6 @@ interface Listener {
454
466
  event: kitEventType;
455
467
  callback: (...args: any[]) => void;
456
468
  }
457
- interface CallOptions {
458
- sourceType: (typeof CallSourceType)[keyof typeof CallSourceType];
459
- phoneNum?: string;
460
- workOrderId?: string;
461
- }
462
469
  declare class CallKit {
463
470
  api: Api;
464
471
  config: Config;
@@ -471,8 +478,10 @@ declare class CallKit {
471
478
  login(username: string, password: string, extra?: {
472
479
  [key: string]: any;
473
480
  }): Promise<void>;
474
- logout(): Promise<void>;
475
- call(extno?: string | number, options?: CallOptions): Promise<void>;
481
+ logout({ isReset }?: {
482
+ isReset?: boolean;
483
+ }): Promise<void>;
484
+ call(extno?: string | number, options?: Partial<CallParams>): Promise<void>;
476
485
  refer(uri: string, options?: any): Promise<void>;
477
486
  register(): Promise<void>;
478
487
  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
  });
@@ -3778,7 +3774,11 @@ var WebCall = (() => {
3778
3774
  version: "1.0.27",
3779
3775
  host: "",
3780
3776
  log: "info",
3781
- trackLogs: false,
3777
+ trackLogs: {
3778
+ enabled: false,
3779
+ interval: 5e3,
3780
+ maxSize: 8192
3781
+ },
3782
3782
  audioRef: void 0,
3783
3783
  constrains: constrainsDefault,
3784
3784
  socket: "",
@@ -3819,7 +3819,7 @@ var WebCall = (() => {
3819
3819
  }
3820
3820
  });
3821
3821
  };
3822
- reset = () => {
3822
+ reset = async () => {
3823
3823
  if (this.isLogin()) {
3824
3824
  this.config.userInfo = {
3825
3825
  wsUrl: "",
@@ -3863,6 +3863,10 @@ var WebCall = (() => {
3863
3863
  }
3864
3864
  return true;
3865
3865
  }
3866
+ isLogsEnabled() {
3867
+ const { trackLogs } = this.getConfig();
3868
+ return trackLogs?.enabled ?? false;
3869
+ }
3866
3870
  };
3867
3871
 
3868
3872
  // package/logger.ts
@@ -3875,8 +3879,6 @@ var WebCall = (() => {
3875
3879
  const logLevel = String(level).toUpperCase();
3876
3880
  return `${timestamp} [${logLevel}] [${type}] [${caller ?? "unknown"}] [${message}] ${(0, import_json_stringify_safe.default)(content)}`.trim();
3877
3881
  }
3878
- var MAX_SIZE = 8192;
3879
- var FLUSH_INTERVAL = 5e3;
3880
3882
  function getByteSize(str) {
3881
3883
  return new Blob([str]).size;
3882
3884
  }
@@ -3892,28 +3894,35 @@ var WebCall = (() => {
3892
3894
  this.startTrackLogsTimer();
3893
3895
  }
3894
3896
  startTrackLogsTimer() {
3897
+ const { trackLogs } = this.callKit.config.getConfig();
3898
+ if (!trackLogs.enabled) {
3899
+ return;
3900
+ }
3901
+ const { interval } = trackLogs;
3895
3902
  if (this.trackLogsTimer) {
3896
3903
  return;
3897
3904
  }
3898
3905
  this.trackLogsTimer = setInterval(() => {
3899
3906
  this.flushTrackLogs();
3900
- }, FLUSH_INTERVAL);
3907
+ }, interval);
3901
3908
  }
3902
3909
  flushTrackLogs() {
3903
3910
  if (this.pendingTrackLogs.length === 0) {
3904
3911
  return;
3905
3912
  }
3906
- const { trackLogs } = this.callKit.config.getConfig();
3907
- if (trackLogs) {
3913
+ const isLogsEnabled = this.callKit.config.isLogsEnabled();
3914
+ if (isLogsEnabled) {
3908
3915
  try {
3909
3916
  const chunks = [];
3910
3917
  let currentChunk = [];
3911
3918
  let currentSize = 0;
3919
+ const { trackLogs } = this.callKit.config.getConfig();
3920
+ const { maxSize } = trackLogs;
3912
3921
  for (const log of this.pendingTrackLogs) {
3913
3922
  const logSize = getByteSize(log);
3914
3923
  const separator = currentChunk.length > 0 ? "\n" : "";
3915
3924
  const separatorSize = getByteSize(separator);
3916
- if (currentSize + logSize + separatorSize > MAX_SIZE && currentChunk.length > 0) {
3925
+ if (currentSize + logSize + separatorSize > maxSize && currentChunk.length > 0) {
3917
3926
  chunks.push(currentChunk.join("\n"));
3918
3927
  currentChunk = [log];
3919
3928
  currentSize = logSize;
@@ -3992,8 +4001,8 @@ var WebCall = (() => {
3992
4001
  content: extra?.content ?? {}
3993
4002
  };
3994
4003
  const logString = transformLog(log);
3995
- const { trackLogs } = this.callKit.config.getConfig();
3996
- if (trackLogs) {
4004
+ const isLogsEnabled = this.callKit.config.isLogsEnabled();
4005
+ if (isLogsEnabled) {
3997
4006
  this.pendingTrackLogs.push(logString);
3998
4007
  }
3999
4008
  this.callKit.trigger(KitEvent.KIT_LOG, logString);
@@ -18499,7 +18508,7 @@ var WebCall = (() => {
18499
18508
  ...reconnect
18500
18509
  };
18501
18510
  }
18502
- reset() {
18511
+ async reset() {
18503
18512
  if (this.isHolding()) {
18504
18513
  this.setHold(false);
18505
18514
  }
@@ -18531,7 +18540,6 @@ var WebCall = (() => {
18531
18540
  });
18532
18541
  }
18533
18542
  }
18534
- this.callKit.config.reset();
18535
18543
  this.setConnectStatus(CallStatus.init);
18536
18544
  this.clearObserveOptionsHeartbeatInterval();
18537
18545
  }
@@ -19656,6 +19664,7 @@ var WebCall = (() => {
19656
19664
  data: data.data
19657
19665
  }
19658
19666
  });
19667
+ this.socketError = true;
19659
19668
  this.callKit.reset();
19660
19669
  }
19661
19670
  if (data.event === SocketReceiveEvent.AGENT_NO_ANSWER) {
@@ -19950,7 +19959,7 @@ var WebCall = (() => {
19950
19959
  });
19951
19960
  }
19952
19961
  }
19953
- async logout() {
19962
+ async logout({ isReset = true } = { isReset: true }) {
19954
19963
  if (!this.config.check())
19955
19964
  return;
19956
19965
  const { userInfo } = this.config.getConfig();
@@ -19973,10 +19982,9 @@ var WebCall = (() => {
19973
19982
  });
19974
19983
  }
19975
19984
  }
19976
- await this.hangup();
19977
- this.connect.reset();
19978
- this.socket.reset();
19979
- this.config.reset();
19985
+ if (isReset) {
19986
+ await this.reset();
19987
+ }
19980
19988
  this.trigger(KitEvent.KIT_LOGIN_CHANGE, false);
19981
19989
  }
19982
19990
  async call(extno = "", options = {
@@ -20010,7 +20018,7 @@ var WebCall = (() => {
20010
20018
  options
20011
20019
  }
20012
20020
  });
20013
- this.callCenter.callStart();
20021
+ this.callCenter.callStart(options);
20014
20022
  }
20015
20023
  async refer(uri, options) {
20016
20024
  if (!this.config.check())
@@ -20127,7 +20135,15 @@ var WebCall = (() => {
20127
20135
  connectStatus: this.connect.connectStatus
20128
20136
  }
20129
20137
  });
20130
- this.connect.reset();
20138
+ if (this.connect.isCalling()) {
20139
+ await this.hangup();
20140
+ }
20141
+ await this.connect.reset();
20142
+ if (this.config.isLogin()) {
20143
+ await this.logout({ isReset: false });
20144
+ }
20145
+ await this.config.reset();
20146
+ await this.socket.reset();
20131
20147
  }
20132
20148
  on(event, callback) {
20133
20149
  this.listener.push({