@koi-design/callkit 2.0.6-beta.1 → 2.1.0-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
@@ -29,7 +29,8 @@ var Api = class {
29
29
  if (this.isLogining) {
30
30
  this.callKit.logger.info("login is already in progress cancel", {
31
31
  caller: "Api.login",
32
- content: { userName: params.userName }
32
+ type: "API",
33
+ content: { userName: params.userName, timestamp: params.timestamp }
33
34
  });
34
35
  return;
35
36
  }
@@ -48,8 +49,9 @@ var Api = class {
48
49
  async loginOut(params) {
49
50
  if (this.isLoginOuting) {
50
51
  this.callKit.logger.info("loginOut is already in progress cancel", {
52
+ type: "API",
51
53
  caller: "Api.loginOut",
52
- content: { sessionId: params.sessionId }
54
+ content: { sessionId: params.sessionId, timestamp: params.timestamp }
53
55
  });
54
56
  return;
55
57
  }
@@ -66,12 +68,23 @@ var Api = class {
66
68
  }
67
69
  }
68
70
  async trackLogs(log) {
69
- return this.post(
70
- { url: "/agent/user/sdkLog", method: "post", data: { content: [log] } },
71
- {
72
- useFormData: true
73
- }
74
- );
71
+ try {
72
+ const { userInfo, host } = this.callKit.config.getConfig();
73
+ const { sessionId } = userInfo;
74
+ const formData = new FormData();
75
+ formData.append("content", JSON.stringify([log]));
76
+ const config = {
77
+ url: `${host}/agent/user/sdkLog`,
78
+ method: "post",
79
+ data: formData,
80
+ headers: {
81
+ ...sessionId ? { sessionId } : {}
82
+ }
83
+ };
84
+ await axios_default(config).catch(() => {
85
+ });
86
+ } catch (error) {
87
+ }
75
88
  }
76
89
  /**
77
90
  *
@@ -85,7 +98,7 @@ var Api = class {
85
98
  data: params
86
99
  });
87
100
  }
88
- async post(config, extra = {}) {
101
+ async post(config, extra = { skipLog: false }) {
89
102
  const { userInfo, host } = this.callKit.config.getConfig();
90
103
  const { sessionId } = userInfo;
91
104
  config.url = `${host}${config.url}`;
@@ -109,30 +122,34 @@ var Api = class {
109
122
  config.headers.sessionId = sessionId;
110
123
  }
111
124
  const startTime = Date.now();
112
- this.callKit.logger.info("API Request Start", {
113
- type: "API",
114
- caller: "API.Request",
115
- content: {
116
- url: config.url,
117
- headers: config.headers,
118
- data: config.data,
119
- extra,
120
- startTime
121
- }
122
- });
125
+ if (!extra.skipLog) {
126
+ this.callKit.logger.info("API Request Start", {
127
+ type: "API",
128
+ caller: "API.Request",
129
+ content: {
130
+ url: config.url,
131
+ headers: config.headers,
132
+ data: config.data,
133
+ extra,
134
+ startTime
135
+ }
136
+ });
137
+ }
123
138
  const res = await axios_default(config).catch(() => {
124
- this.callKit.config.reset();
139
+ this.callKit.config.reset("api request error");
125
140
  });
126
141
  const endTime = Date.now();
127
- this.callKit.logger.info("API Request Finish", {
128
- type: "API",
129
- caller: "API.Request",
130
- content: {
131
- url: config.url,
132
- duration: `${endTime - startTime}ms`,
133
- response: res
134
- }
135
- });
142
+ if (!extra.skipLog) {
143
+ this.callKit.logger.info("API Request Finish", {
144
+ type: "API",
145
+ caller: "API.Request",
146
+ content: {
147
+ url: config.url,
148
+ duration: `${endTime - startTime}ms`,
149
+ response: res
150
+ }
151
+ });
152
+ }
136
153
  if (!res) {
137
154
  this.callKit.reset();
138
155
  throw new Error("Network error");
@@ -142,7 +159,7 @@ var Api = class {
142
159
  return data;
143
160
  }
144
161
  if (code === "100013") {
145
- this.callKit.config.reset();
162
+ this.callKit.config.reset("api request error");
146
163
  }
147
164
  throw new Error(message ?? "Request failed");
148
165
  }
@@ -475,7 +492,8 @@ var SocketReceiveEvent = {
475
492
  * Error
476
493
  */
477
494
  ERROR: "ERROR",
478
- SESSION_ERROR: "SESSION_ERROR"
495
+ SESSION_ERROR: "SESSION_ERROR",
496
+ WAITING_QUEUE: "WAITING_QUEUE"
479
497
  };
480
498
  var EncryptionMethod = {
481
499
  NONE: "NONE",
@@ -498,7 +516,7 @@ var CallSourceType = {
498
516
  var trackLogsDefaultConfig = {
499
517
  enabled: false,
500
518
  interval: 5e3,
501
- maxSize: 8192
519
+ maxSize: 4096
502
520
  };
503
521
  var SOCKET_RECONNECT_CONFIG = {
504
522
  enabled: true,
@@ -510,9 +528,7 @@ var SOCKET_RECONNECT_CONFIG = {
510
528
  var SIP_RECONNECT_CONFIG = {
511
529
  enabled: true,
512
530
  maxAttempts: 3,
513
- delay: 1e3,
514
- enableMessageKeepalive: false,
515
- messageKeepaliveInterval: 3e4
531
+ delay: 1e3
516
532
  };
517
533
 
518
534
  // core/call.ts
@@ -656,13 +672,13 @@ var Call = class {
656
672
  // package.json
657
673
  var package_default = {
658
674
  name: "@koi-design/callkit",
659
- version: "2.0.6-beta.1",
675
+ version: "2.1.0-beta.2",
660
676
  description: "callkit",
661
677
  author: "koi",
662
678
  license: "ISC",
663
679
  scripts: {
664
680
  build: "tsup",
665
- sraet: "vite",
681
+ start: "vite",
666
682
  dev: "tsup --watch",
667
683
  lint: "eslint -c ../../.eslintrc.js --ext .jsx,.js,.tsx,.ts ./package --fix",
668
684
  release: "tsup && node scripts/pkg.js"
@@ -762,7 +778,12 @@ var Config = class {
762
778
  }
763
779
  });
764
780
  };
765
- reset = async () => {
781
+ reset = async (form) => {
782
+ this.callKit.logger.info(`Reset User Info ${form}`, {
783
+ caller: "Config.reset",
784
+ type: "OTHER",
785
+ content: {}
786
+ });
766
787
  if (this.isLogin()) {
767
788
  this.config.userInfo = {
768
789
  wsUrl: "",
@@ -857,7 +878,7 @@ var Logger = class {
857
878
  this.flushTrackLogs();
858
879
  }, interval);
859
880
  }
860
- flushTrackLogs() {
881
+ async flushTrackLogs() {
861
882
  if (this.pendingTrackLogs.length === 0) {
862
883
  return;
863
884
  }
@@ -866,25 +887,22 @@ var Logger = class {
866
887
  try {
867
888
  const chunks = [];
868
889
  let currentChunk = [];
869
- let currentSize = 0;
870
890
  for (const log of this.pendingTrackLogs) {
871
- const logSize = getByteSize(log);
872
- const separator = currentChunk.length > 0 ? "\n" : "";
873
- const separatorSize = getByteSize(separator);
874
- if (currentSize + logSize + separatorSize > maxSize && currentChunk.length > 0) {
891
+ const testChunk = currentChunk.length > 0 ? `${currentChunk.join("\n")}
892
+ ${log}` : log;
893
+ const actualSize = getByteSize(JSON.stringify([testChunk]));
894
+ if (actualSize > maxSize && currentChunk.length > 0) {
875
895
  chunks.push(currentChunk.join("\n"));
876
896
  currentChunk = [log];
877
- currentSize = logSize;
878
897
  } else {
879
898
  currentChunk.push(log);
880
- currentSize += logSize + separatorSize;
881
899
  }
882
900
  }
883
901
  if (currentChunk.length > 0) {
884
902
  chunks.push(currentChunk.join("\n"));
885
903
  }
886
904
  for (const chunk of chunks) {
887
- this.callKit.api.trackLogs(chunk);
905
+ await this.callKit.api.trackLogs(chunk);
888
906
  }
889
907
  this.pendingTrackLogs = [];
890
908
  } catch (error) {
@@ -943,16 +961,22 @@ var Logger = class {
943
961
  }
944
962
  catchLog(msg, extra, level) {
945
963
  const now = /* @__PURE__ */ new Date();
964
+ const { enabled } = this.callKit.config.getTrackLogsConfig();
965
+ const { userInfo } = this.callKit.config.getConfig();
966
+ const content = {
967
+ ...extra?.content ?? {},
968
+ agentId: userInfo?.agentId,
969
+ sessionId: userInfo?.sessionId
970
+ };
946
971
  const log = {
947
972
  timestamp: now.toLocaleString().replace("T", " ").replace(".000Z", ""),
948
973
  level,
949
974
  message: msg,
950
975
  caller: extra?.caller,
951
976
  type: extra?.type,
952
- content: extra?.content ?? {}
977
+ content
953
978
  };
954
979
  const logString = transformLog(log);
955
- const { enabled } = this.callKit.config.getTrackLogsConfig();
956
980
  if (enabled) {
957
981
  this.pendingTrackLogs.push(logString);
958
982
  }
@@ -967,8 +991,7 @@ import {
967
991
  Web,
968
992
  Registerer,
969
993
  SessionState,
970
- RegistererState,
971
- Messager
994
+ RegistererState
972
995
  } from "sip.js";
973
996
 
974
997
  // core/utils.ts
@@ -987,7 +1010,6 @@ var formatGetInviteData = (inviteData) => {
987
1010
  };
988
1011
 
989
1012
  // core/connect.ts
990
- var MAX_HEARTBEAT_COUNT = 6;
991
1013
  function convertObjectStringToJSON(input) {
992
1014
  const corrected = input.replace(/(\w+):\s*'(.*?)'/g, '"$1": "$2"').replace(/'/g, '"');
993
1015
  return corrected;
@@ -1042,6 +1064,10 @@ var Connect = class {
1042
1064
  *@description Whether it's a re-connected
1043
1065
  */
1044
1066
  isReConnected = false;
1067
+ /**
1068
+ *@description Whether it's a referring
1069
+ */
1070
+ isRefering = false;
1045
1071
  // sipConnected = false;
1046
1072
  /**
1047
1073
  *@description Whether it's an outgoing call
@@ -1063,6 +1089,42 @@ var Connect = class {
1063
1089
  }
1064
1090
  // current call id for invite data
1065
1091
  currentCallId = null;
1092
+ getCurrentCallId() {
1093
+ return this.currentCallId;
1094
+ }
1095
+ setRefering(refering) {
1096
+ if (this.isRefering === refering)
1097
+ return;
1098
+ this.callKit.logger.info("setRefering", {
1099
+ caller: "Connect.setRefering",
1100
+ content: {
1101
+ refering
1102
+ }
1103
+ });
1104
+ this.isRefering = refering;
1105
+ }
1106
+ setIsReConnected(isReConnected) {
1107
+ if (this.isReConnected === isReConnected)
1108
+ return;
1109
+ this.callKit.logger.info("setIsReConnected", {
1110
+ caller: "Connect.setIsReConnected",
1111
+ content: {
1112
+ isReConnected
1113
+ }
1114
+ });
1115
+ this.isReConnected = isReConnected;
1116
+ }
1117
+ setOutgoing(outgoing) {
1118
+ if (this.isOutgoing === outgoing)
1119
+ return;
1120
+ this.callKit.logger.info("setOutgoing", {
1121
+ caller: "Connect.setOutgoing",
1122
+ content: {
1123
+ outgoing
1124
+ }
1125
+ });
1126
+ this.isOutgoing = outgoing;
1127
+ }
1066
1128
  setCallId(callId) {
1067
1129
  this.callKit.logger.info("setCallId", {
1068
1130
  caller: "Connect.setCallId",
@@ -1074,9 +1136,15 @@ var Connect = class {
1074
1136
  this.callKit.trigger(KitEvent.KIT_CALL_ID_CHANGE, callId);
1075
1137
  }
1076
1138
  async reset() {
1077
- this.isOutgoing = false;
1139
+ this.setOutgoing(false);
1078
1140
  this.isUnprompted = false;
1079
1141
  this.hasInvite = false;
1142
+ if (this.isRefering) {
1143
+ this.setRefering(false);
1144
+ }
1145
+ if (this.isReConnected) {
1146
+ this.setIsReConnected(false);
1147
+ }
1080
1148
  if (this.isHolding()) {
1081
1149
  await this.setHold(false);
1082
1150
  }
@@ -1112,8 +1180,6 @@ var Connect = class {
1112
1180
  }
1113
1181
  }
1114
1182
  this.setConnectStatus(CallStatus.init);
1115
- this.clearHeartbeat();
1116
- this.stopMessageKeepalive();
1117
1183
  }
1118
1184
  getAduioReference() {
1119
1185
  const { audioRef } = this.callKit.config.getConfig();
@@ -1178,73 +1244,6 @@ var Connect = class {
1178
1244
  isInit() {
1179
1245
  return this.connectStatus === CallStatus.init;
1180
1246
  }
1181
- heartbeatInterval;
1182
- heartbeatFlag = MAX_HEARTBEAT_COUNT;
1183
- messageKeepaliveTimer;
1184
- clearHeartbeat() {
1185
- if (this.heartbeatInterval) {
1186
- clearInterval(this.heartbeatInterval);
1187
- this.heartbeatInterval = null;
1188
- }
1189
- this.heartbeatFlag = MAX_HEARTBEAT_COUNT;
1190
- }
1191
- startHeartbeat() {
1192
- this.heartbeatFlag = MAX_HEARTBEAT_COUNT;
1193
- this.clearHeartbeat();
1194
- this.heartbeatInterval = setInterval(() => {
1195
- this.heartbeatFlag -= 1;
1196
- if (this.heartbeatFlag <= 0) {
1197
- this.heartbeatFlag = MAX_HEARTBEAT_COUNT;
1198
- this.callKit.trigger(KitEvent.SIP_CONNECT_EVENT, {
1199
- event: "OPTIONS_HEARTBEAT_EXPIRED"
1200
- });
1201
- }
1202
- }, 1e3);
1203
- }
1204
- stopMessageKeepalive() {
1205
- if (this.messageKeepaliveTimer) {
1206
- clearInterval(this.messageKeepaliveTimer);
1207
- this.messageKeepaliveTimer = void 0;
1208
- }
1209
- }
1210
- startMessageKeepalive() {
1211
- const { enableMessageKeepalive, messageKeepaliveInterval } = this.reconnectConfig;
1212
- if (!enableMessageKeepalive)
1213
- return;
1214
- this.stopMessageKeepalive();
1215
- this.messageKeepaliveTimer = setInterval(() => {
1216
- this.sendKeepaliveMessage();
1217
- }, messageKeepaliveInterval);
1218
- }
1219
- async sendKeepaliveMessage() {
1220
- try {
1221
- if (!this.isRegistered() || !this.userAgent)
1222
- return;
1223
- const { userInfo } = this.callKit.config.getConfig();
1224
- const { userPart, fsIp, fsPort } = userInfo || {};
1225
- const target = UserAgent.makeURI(`sip:${userPart}@${fsIp}:${fsPort}`);
1226
- if (!target)
1227
- return;
1228
- const messager = new Messager(this.userAgent, target, "");
1229
- await messager.message();
1230
- this.callKit.logger.info("MESSAGE keepalive ok", {
1231
- caller: "Connect.sendKeepaliveMessage",
1232
- type: "SIP",
1233
- content: {}
1234
- });
1235
- } catch (err) {
1236
- this.callKit.logger.error(err, {
1237
- caller: "Connect.sendKeepaliveMessage",
1238
- type: "SIP",
1239
- content: {}
1240
- });
1241
- this.stopMessageKeepalive();
1242
- this.callKit.trigger(KitEvent.SIP_CONNECT_EVENT, {
1243
- event: "MESSAGE_KEEPALIVE_FAILED"
1244
- });
1245
- this.startReconnectTimer();
1246
- }
1247
- }
1248
1247
  socketTriggerHangup(callId) {
1249
1248
  if (!this.isCalling() || callId !== this.currentCallId)
1250
1249
  return;
@@ -1257,6 +1256,136 @@ var Connect = class {
1257
1256
  });
1258
1257
  this.callKit.hangup();
1259
1258
  }
1259
+ /**
1260
+ * Setup registerer and bind stateChange listener
1261
+ * @private
1262
+ */
1263
+ setupRegisterer() {
1264
+ if (!this.userAgent) {
1265
+ this.callKit.logger.warn("userAgent is not initialized", {
1266
+ caller: "Connect.setupRegisterer",
1267
+ content: {
1268
+ errCode: ErrorCode.WEBRTC_USER_AGENT_ERROR
1269
+ }
1270
+ });
1271
+ return;
1272
+ }
1273
+ const { userInfo } = this.callKit.config.getConfig();
1274
+ const { userPart, fsIp, fsPort } = userInfo;
1275
+ const registererOptions = {};
1276
+ this.registerer = new Registerer(this.userAgent, registererOptions);
1277
+ this.registerer.stateChange.addListener((state) => {
1278
+ switch (state) {
1279
+ case RegistererState.Initial:
1280
+ this.callKit.logger.info("registerer stateChange Initial", {
1281
+ caller: "Connect.setupRegisterer.registererStateChange",
1282
+ type: "SIP",
1283
+ content: {
1284
+ registererState: state,
1285
+ isRegistered: this.isRegistered()
1286
+ }
1287
+ });
1288
+ this.setRegister(false);
1289
+ this.setConnectStatus(CallStatus.init);
1290
+ this.callKit.trigger(KitEvent.SIP_REGISTERER_EVENT, {
1291
+ registererState: state,
1292
+ isRegistered: this.isRegistered()
1293
+ });
1294
+ break;
1295
+ case RegistererState.Registered:
1296
+ this.callKit.logger.info("registerer stateChange Registered", {
1297
+ caller: "Connect.setupRegisterer.registererStateChange",
1298
+ type: "SIP",
1299
+ content: {
1300
+ registererState: state,
1301
+ isRegistered: this.isRegistered()
1302
+ }
1303
+ });
1304
+ this.setRegister(true);
1305
+ if (this.isReConnected) {
1306
+ if (this.currentSession && (this.currentSession.state === SessionState.Established || this.currentSession.state === SessionState.Establishing) && this.isCalling()) {
1307
+ const selfUri = `sip:manualCallAgent${userPart}@${fsIp}:${fsPort}`;
1308
+ this.callKit.logger.info(
1309
+ "Reconnected, referring active session to self",
1310
+ {
1311
+ caller: "Connect.setupRegisterer.registererStateChange",
1312
+ type: "SIP",
1313
+ content: {
1314
+ selfUri,
1315
+ sessionState: this.currentSession.state,
1316
+ connectStatus: this.connectStatus
1317
+ }
1318
+ }
1319
+ );
1320
+ this.refer(selfUri).catch((err) => {
1321
+ this.callKit.logger.error(err, {
1322
+ caller: "Connect.setupRegisterer.registererStateChange",
1323
+ type: "SIP",
1324
+ content: {
1325
+ errCode: ErrorCode.WEBRTC_CALL_INVITE_ERROR,
1326
+ selfUri
1327
+ }
1328
+ });
1329
+ });
1330
+ } else {
1331
+ this.callKit.logger.warn(
1332
+ "Reconnected but no active session to refer",
1333
+ {
1334
+ caller: "Connect.setupRegisterer.registererStateChange",
1335
+ type: "SIP",
1336
+ content: {
1337
+ hasCurrentSession: !!this.currentSession,
1338
+ sessionState: this.currentSession?.state,
1339
+ connectStatus: this.connectStatus,
1340
+ isCalling: this.isCalling()
1341
+ }
1342
+ }
1343
+ );
1344
+ }
1345
+ this.setIsReConnected(false);
1346
+ }
1347
+ this.callKit.trigger(KitEvent.SIP_REGISTERER_EVENT, {
1348
+ registererState: state,
1349
+ isRegistered: this.isRegistered()
1350
+ });
1351
+ break;
1352
+ case RegistererState.Terminated:
1353
+ this.callKit.logger.info("registerer stateChange Terminated", {
1354
+ caller: "Connect.setupRegisterer.registererStateChange",
1355
+ type: "SIP",
1356
+ content: {
1357
+ registererState: state,
1358
+ isRegistered: this.isRegistered()
1359
+ }
1360
+ });
1361
+ this.setRegister(false);
1362
+ this.setConnectStatus(CallStatus.init);
1363
+ this.callKit.trigger(KitEvent.SIP_REGISTERER_EVENT, {
1364
+ registererState: state,
1365
+ isRegistered: this.isRegistered()
1366
+ });
1367
+ break;
1368
+ case RegistererState.Unregistered:
1369
+ this.callKit.logger.info("registerer stateChange Unregistered", {
1370
+ caller: "Connect.setupRegisterer.registererStateChange",
1371
+ type: "SIP",
1372
+ content: {
1373
+ isRegistered: this.isRegistered(),
1374
+ registererState: state
1375
+ }
1376
+ });
1377
+ this.setRegister(false);
1378
+ this.setConnectStatus(CallStatus.init);
1379
+ this.callKit.trigger(KitEvent.SIP_REGISTERER_EVENT, {
1380
+ registererState: state,
1381
+ isRegistered: this.isRegistered()
1382
+ });
1383
+ break;
1384
+ default:
1385
+ break;
1386
+ }
1387
+ });
1388
+ }
1260
1389
  async register() {
1261
1390
  if (this.connectStatus !== CallStatus.init) {
1262
1391
  if (this.isRegistered()) {
@@ -1297,7 +1426,7 @@ var Connect = class {
1297
1426
  this.mediaStream = await navigator.mediaDevices.getUserMedia(constrains);
1298
1427
  return this.mediaStream;
1299
1428
  };
1300
- const { userPart, fsIp, fsPort, iceInfo, wsUrl, fsUserId, fsPassword } = userInfo;
1429
+ const { userPart, fsIp, fsPort, iceInfo, wsUrl } = userInfo;
1301
1430
  const connectConfig = {
1302
1431
  uri: UserAgent.makeURI(`sip:${userPart}@${fsIp}:${fsPort}`),
1303
1432
  displayName: userPart,
@@ -1315,9 +1444,7 @@ var Connect = class {
1315
1444
  peerConnectionConfiguration: {
1316
1445
  iceServers: JSON.parse(convertObjectStringToJSON(iceInfo))
1317
1446
  }
1318
- },
1319
- authorizationUsername: fsUserId || userPart,
1320
- authorizationPassword: fsPassword
1447
+ }
1321
1448
  };
1322
1449
  this.callKit.logger.info("connect connectConfig", {
1323
1450
  caller: "Connect.register",
@@ -1360,9 +1487,6 @@ var Connect = class {
1360
1487
  const core = userAgent.userAgentCore;
1361
1488
  const originalReceiveIncomingRequestFromTransport = core.receiveIncomingRequestFromTransport.bind(core);
1362
1489
  core.receiveIncomingRequestFromTransport = (request2) => {
1363
- if (request2.method === "OPTIONS") {
1364
- that.startHeartbeat();
1365
- }
1366
1490
  that.callKit.logger.info(`SIP Receive: ${request2?.method}`, {
1367
1491
  caller: "Connect.register.observeSocketStatus.receiveRequest",
1368
1492
  type: "SIP",
@@ -1372,6 +1496,20 @@ var Connect = class {
1372
1496
  });
1373
1497
  return originalReceiveIncomingRequestFromTransport(request2);
1374
1498
  };
1499
+ const originalReceiveIncomingResponseFromTransport = core.receiveIncomingResponseFromTransport.bind(core);
1500
+ core.receiveIncomingResponseFromTransport = (response) => {
1501
+ that.callKit.logger.info(
1502
+ `SIP Receive Response: ${response?.statusCode} ${response?.reasonPhrase}`,
1503
+ {
1504
+ caller: "Connect.register.observeSocketStatus.receiveResponse",
1505
+ type: "SIP",
1506
+ content: {
1507
+ response
1508
+ }
1509
+ }
1510
+ );
1511
+ return originalReceiveIncomingResponseFromTransport(response);
1512
+ };
1375
1513
  const { transport } = userAgent;
1376
1514
  if (transport) {
1377
1515
  const originalSend = transport.send.bind(transport);
@@ -1387,81 +1525,7 @@ var Connect = class {
1387
1525
  };
1388
1526
  }
1389
1527
  };
1390
- const registererOptions = {};
1391
- this.registerer = new Registerer(this.userAgent, registererOptions);
1392
- this.registerer.stateChange.addListener((state) => {
1393
- switch (state) {
1394
- case RegistererState.Initial:
1395
- this.callKit.logger.info("registerer stateChange Initial", {
1396
- caller: "Connect.register.registererStateChange",
1397
- type: "SIP",
1398
- content: {
1399
- registererState: state,
1400
- isRegistered: this.isRegistered()
1401
- }
1402
- });
1403
- this.setRegister(false);
1404
- this.setConnectStatus(CallStatus.init);
1405
- this.stopMessageKeepalive();
1406
- this.callKit.trigger(KitEvent.SIP_REGISTERER_EVENT, {
1407
- registererState: state,
1408
- isRegistered: this.isRegistered()
1409
- });
1410
- break;
1411
- case RegistererState.Registered:
1412
- this.callKit.logger.info("registerer stateChange Registered", {
1413
- caller: "Connect.register.registererStateChange",
1414
- type: "SIP",
1415
- content: {
1416
- registererState: state,
1417
- isRegistered: this.isRegistered()
1418
- }
1419
- });
1420
- this.setRegister(true);
1421
- this.startMessageKeepalive();
1422
- this.callKit.trigger(KitEvent.SIP_REGISTERER_EVENT, {
1423
- registererState: state,
1424
- isRegistered: this.isRegistered()
1425
- });
1426
- break;
1427
- case RegistererState.Terminated:
1428
- this.callKit.logger.info("registerer stateChange Terminated", {
1429
- caller: "Connect.register.registererStateChange",
1430
- type: "SIP",
1431
- content: {
1432
- registererState: state,
1433
- isRegistered: this.isRegistered()
1434
- }
1435
- });
1436
- this.setRegister(false);
1437
- this.setConnectStatus(CallStatus.init);
1438
- this.stopMessageKeepalive();
1439
- this.callKit.trigger(KitEvent.SIP_REGISTERER_EVENT, {
1440
- registererState: state,
1441
- isRegistered: this.isRegistered()
1442
- });
1443
- break;
1444
- case RegistererState.Unregistered:
1445
- this.callKit.logger.info("registerer stateChange Unregistered", {
1446
- caller: "Connect.register.registererStateChange",
1447
- type: "SIP",
1448
- content: {
1449
- isRegistered: this.isRegistered(),
1450
- registererState: state
1451
- }
1452
- });
1453
- this.setRegister(false);
1454
- this.setConnectStatus(CallStatus.init);
1455
- this.stopMessageKeepalive();
1456
- this.callKit.trigger(KitEvent.SIP_REGISTERER_EVENT, {
1457
- registererState: state,
1458
- isRegistered: this.isRegistered()
1459
- });
1460
- break;
1461
- default:
1462
- break;
1463
- }
1464
- });
1528
+ this.setupRegisterer();
1465
1529
  this.userAgent.delegate = {
1466
1530
  onInvite: (invite) => {
1467
1531
  this.callKit.logger.info("connect onInvite", {
@@ -1469,7 +1533,8 @@ var Connect = class {
1469
1533
  caller: "Connect.register.onInvite",
1470
1534
  content: {
1471
1535
  invite,
1472
- isRegistered: this.isRegistered()
1536
+ isRegistered: this.isRegistered(),
1537
+ isOutgoing: this.isOutgoing
1473
1538
  }
1474
1539
  });
1475
1540
  this.currentSession = invite;
@@ -1547,7 +1612,9 @@ var Connect = class {
1547
1612
  });
1548
1613
  this.callKit.logger.info("get invite data", {
1549
1614
  caller: "Connect.register.onInvite",
1550
- content: xHeaders
1615
+ content: {
1616
+ headers: xHeaders
1617
+ }
1551
1618
  });
1552
1619
  return xHeaders;
1553
1620
  };
@@ -1568,9 +1635,16 @@ var Connect = class {
1568
1635
  } catch (error) {
1569
1636
  this.callKit.logger.info(error, {
1570
1637
  caller: "Connect.register.onInvite",
1571
- content: info
1638
+ content: {
1639
+ headers: info
1640
+ }
1572
1641
  });
1573
1642
  }
1643
+ if (this.isRefering) {
1644
+ this.currentSession.accept(options);
1645
+ this.setRefering(false);
1646
+ return;
1647
+ }
1574
1648
  if (this.isOutgoing) {
1575
1649
  this.currentSession.accept(options);
1576
1650
  this.callKit.trigger(KitEvent.KIT_OUTGOING_INVITE, {
@@ -1606,10 +1680,8 @@ var Connect = class {
1606
1680
  version: `${this.callKit.config.getConfig().version}`
1607
1681
  }
1608
1682
  });
1609
- try {
1610
- await this.registerer.register();
1611
- this.startMessageKeepalive();
1612
- } catch (err) {
1683
+ this.setupRegisterer();
1684
+ await this.registerer.register().catch(async (err) => {
1613
1685
  this.callKit.reset();
1614
1686
  this.callKit.logger.error(err?.message, {
1615
1687
  caller: "Connect.register",
@@ -1618,12 +1690,11 @@ var Connect = class {
1618
1690
  errCode: ErrorCode.WEBRTC_REGISTER_ERROR
1619
1691
  }
1620
1692
  });
1621
- }
1693
+ });
1622
1694
  },
1623
1695
  onDisconnect: (error) => {
1624
- this.stopMessageKeepalive();
1625
1696
  if (error) {
1626
- this.callKit.logger.info("SIP User Agent Disconnected with error", {
1697
+ this.callKit.logger.warn("SIP User Agent Disconnected with error", {
1627
1698
  caller: "Connect.register",
1628
1699
  type: "SIP",
1629
1700
  content: {
@@ -1633,21 +1704,12 @@ var Connect = class {
1633
1704
  });
1634
1705
  this.startReconnectTimer();
1635
1706
  } else {
1636
- this.callKit.logger.info("SIP User Agent Disconnected", {
1707
+ this.callKit.logger.warn("SIP User Agent Disconnected", {
1637
1708
  caller: "Connect.register",
1638
1709
  type: "SIP",
1639
1710
  content: {}
1640
1711
  });
1641
1712
  }
1642
- },
1643
- onRegister: () => {
1644
- this.callKit.logger.info("connect onRegister", {
1645
- caller: "Connect.register",
1646
- type: "SIP",
1647
- content: {
1648
- version: `V${this.callKit.config.getConfig().version}`
1649
- }
1650
- });
1651
1713
  }
1652
1714
  };
1653
1715
  observeSocketStatus(this.userAgent, {
@@ -1693,6 +1755,7 @@ var Connect = class {
1693
1755
  this.reconnectTimer = setTimeout(() => {
1694
1756
  if (this.reconnectTimer && this.callKit.config.isLogin()) {
1695
1757
  this.userAgent?.reconnect();
1758
+ this.setIsReConnected(true);
1696
1759
  this.callKit.logger.info("Reconnect attempt", {
1697
1760
  caller: "Connect.startReconnectTimer",
1698
1761
  type: "SIP",
@@ -1717,7 +1780,6 @@ var Connect = class {
1717
1780
  }
1718
1781
  async stop() {
1719
1782
  await this.userAgent.stop();
1720
- this.stopMessageKeepalive();
1721
1783
  }
1722
1784
  async unregister() {
1723
1785
  this.callKit.logger.info("connect unregister", {
@@ -1727,7 +1789,6 @@ var Connect = class {
1727
1789
  isRegistered: this.isRegistered()
1728
1790
  }
1729
1791
  });
1730
- this.stopMessageKeepalive();
1731
1792
  if (!this.isRegistered() || !this.registerer) {
1732
1793
  this.callKit.logger.warn("No registerer to unregister.", {
1733
1794
  caller: "Connect.unregister",
@@ -1760,20 +1821,20 @@ var Connect = class {
1760
1821
  });
1761
1822
  }
1762
1823
  async call(callback) {
1763
- this.callKit.logger.info("connect call", {
1764
- caller: "Connect.call",
1765
- type: "SIP",
1766
- content: {
1767
- callback
1768
- }
1769
- });
1770
- this.isOutgoing = true;
1824
+ this.setOutgoing(true);
1771
1825
  if (!this.isRegistered()) {
1772
1826
  await this.register();
1773
1827
  }
1774
1828
  this.setConnectStatus(CallStatus.connecting);
1775
1829
  this.callKit.trigger(KitEvent.CALL_CONNECTING, /* @__PURE__ */ new Date());
1776
1830
  const { userInfo } = this.callKit.config.getConfig();
1831
+ this.callKit.logger.info("connect call", {
1832
+ caller: "Connect.call",
1833
+ type: "SIP",
1834
+ content: {
1835
+ userInfo
1836
+ }
1837
+ });
1777
1838
  callback(userInfo);
1778
1839
  }
1779
1840
  /**
@@ -1824,7 +1885,7 @@ var Connect = class {
1824
1885
  connectStatus: this.connectStatus
1825
1886
  }
1826
1887
  });
1827
- this.isOutgoing = false;
1888
+ this.setOutgoing(false);
1828
1889
  this.isUnprompted = isUnprompted;
1829
1890
  this.setHold(false);
1830
1891
  this.setMute(false);
@@ -1852,6 +1913,7 @@ var Connect = class {
1852
1913
  }
1853
1914
  this.setConnectStatus(CallStatus.init);
1854
1915
  this.callKit.trigger(KitEvent.CALL_END, /* @__PURE__ */ new Date());
1916
+ this.setCallId(null);
1855
1917
  } catch (err) {
1856
1918
  this.callKit.trigger(KitEvent.CALL_END, /* @__PURE__ */ new Date());
1857
1919
  this.callKit.reset();
@@ -1978,12 +2040,26 @@ var Connect = class {
1978
2040
  this.callKit.trigger(KitEvent.KIT_SET_MUTE, mute);
1979
2041
  }
1980
2042
  async refer(referTo, extra) {
2043
+ if (!this.currentSession) {
2044
+ const errorMsg = "Cannot refer: currentSession is not available";
2045
+ this.callKit.logger.warn(errorMsg, {
2046
+ caller: "Connect.refer",
2047
+ type: "SIP",
2048
+ content: {
2049
+ errCode: ErrorCode.WEBRTC_CALL_INVITE_ERROR,
2050
+ referTo
2051
+ }
2052
+ });
2053
+ return;
2054
+ }
2055
+ this.setRefering(true);
1981
2056
  this.callKit.logger.info("connect refer", {
1982
2057
  caller: "Connect.refer",
1983
2058
  type: "SIP",
1984
2059
  content: {
1985
2060
  referTo,
1986
- extra
2061
+ extra,
2062
+ sessionState: this.currentSession.state
1987
2063
  }
1988
2064
  });
1989
2065
  let target;
@@ -1995,6 +2071,7 @@ var Connect = class {
1995
2071
  };
1996
2072
 
1997
2073
  // core/socket.ts
2074
+ var EXCLUDE_LOG_EVENTS = [SocketReceiveEvent.WAITING_QUEUE];
1998
2075
  var Socket = class {
1999
2076
  callKit;
2000
2077
  ws;
@@ -2181,9 +2258,9 @@ var Socket = class {
2181
2258
  }
2182
2259
  onMessage(ev) {
2183
2260
  const data = JSON.parse(ev.data);
2184
- let content = {};
2261
+ let content = data.data;
2185
2262
  try {
2186
- if (data.data) {
2263
+ if (typeof data.data === "string" && data.data) {
2187
2264
  content = JSON.parse(data.data);
2188
2265
  }
2189
2266
  } catch (error) {
@@ -2194,17 +2271,19 @@ var Socket = class {
2194
2271
  data: data.data
2195
2272
  }
2196
2273
  });
2197
- content = data.data;
2198
2274
  }
2199
- this.callKit.logger.info(`socket onMessage: ${data.event}`, {
2200
- caller: "Socket.onMessage",
2201
- type: "INCALL",
2202
- content: {
2203
- data: content,
2204
- event: data.event
2205
- }
2206
- });
2275
+ if (!EXCLUDE_LOG_EVENTS.includes(data.event)) {
2276
+ this.callKit.logger.info(`socket onMessage: ${data.event}`, {
2277
+ caller: "Socket.onMessage",
2278
+ type: "INCALL",
2279
+ content: {
2280
+ data: content,
2281
+ event: data.event
2282
+ }
2283
+ });
2284
+ }
2207
2285
  this.confirmAck(data);
2286
+ const callUuid = content?.callUuid || "";
2208
2287
  if (data.event === SocketReceiveEvent.PONG) {
2209
2288
  this.lastPingTime = Date.now();
2210
2289
  return;
@@ -2214,32 +2293,51 @@ var Socket = class {
2214
2293
  this.cleanReconnectState();
2215
2294
  }
2216
2295
  if (data.event === SocketReceiveEvent.CUSTOMER_RINGING) {
2217
- this.callKit.trigger(KitEvent.CALL_RINGING, /* @__PURE__ */ new Date());
2296
+ this.callKit.trigger(KitEvent.CALL_RINGING, {
2297
+ time: /* @__PURE__ */ new Date(),
2298
+ callUuid
2299
+ });
2218
2300
  }
2219
2301
  if (data.event === SocketReceiveEvent.CUSTOMER_PICK_UP) {
2220
- this.callKit.trigger(KitEvent.CALL_PICK_UP, /* @__PURE__ */ new Date());
2302
+ this.callKit.trigger(KitEvent.CALL_PICK_UP, {
2303
+ time: /* @__PURE__ */ new Date(),
2304
+ callUuid
2305
+ });
2221
2306
  }
2222
2307
  if (data.event === SocketReceiveEvent.AGENT_PICK_UP) {
2223
- this.callKit.trigger(KitEvent.AGENT_PICK_UP, /* @__PURE__ */ new Date());
2308
+ this.callKit.trigger(KitEvent.AGENT_PICK_UP, {
2309
+ time: /* @__PURE__ */ new Date(),
2310
+ callUuid
2311
+ });
2224
2312
  }
2225
2313
  if (data.event === SocketReceiveEvent.CUSTOMER_HANG_UP) {
2226
- this.callKit.trigger(KitEvent.CALL_HANG_UP, /* @__PURE__ */ new Date());
2227
- if (content?.callUuid) {
2228
- this.callKit.connect.socketTriggerHangup(content.callUuid);
2314
+ this.callKit.trigger(KitEvent.CALL_HANG_UP, {
2315
+ time: /* @__PURE__ */ new Date(),
2316
+ callUuid
2317
+ });
2318
+ if (callUuid) {
2319
+ this.callKit.connect.socketTriggerHangup(callUuid);
2229
2320
  }
2230
2321
  }
2231
2322
  if (data.event === SocketReceiveEvent.CUSTOMER_NO_ANSWER) {
2232
- this.callKit.trigger(KitEvent.CALL_NO_ANSWER);
2233
- if (content?.callUuid) {
2234
- this.callKit.connect.socketTriggerHangup(content.callUuid);
2323
+ this.callKit.trigger(KitEvent.CALL_NO_ANSWER, {
2324
+ time: /* @__PURE__ */ new Date(),
2325
+ callUuid
2326
+ });
2327
+ if (callUuid) {
2328
+ this.callKit.connect.socketTriggerHangup(callUuid);
2235
2329
  }
2236
2330
  }
2237
2331
  if (data.event === SocketReceiveEvent.CALL_CDR) {
2238
- this.callKit.trigger(KitEvent.CALL_CDR, content);
2332
+ this.callKit.trigger(KitEvent.CALL_CDR, {
2333
+ time: /* @__PURE__ */ new Date(),
2334
+ callUuid,
2335
+ ...content
2336
+ });
2239
2337
  }
2240
2338
  if (data.event === SocketReceiveEvent.CLOSE) {
2241
2339
  const { userInfo } = this.callKit.config.getConfig();
2242
- this.send(SocketSendEvent.END, { agentId: userInfo.agentId });
2340
+ this.send(SocketSendEvent.END, { agentId: userInfo.agentId, callUuid });
2243
2341
  }
2244
2342
  if (data.event === SocketReceiveEvent.ERROR) {
2245
2343
  this.setConnectAuthState("isError", true);
@@ -2249,7 +2347,8 @@ var Socket = class {
2249
2347
  type: "INCALL",
2250
2348
  content: {
2251
2349
  errCode: ErrorCode.SOKET_SERVER_ERROR,
2252
- data: content
2350
+ data: content,
2351
+ callUuid
2253
2352
  }
2254
2353
  });
2255
2354
  }
@@ -2261,21 +2360,29 @@ var Socket = class {
2261
2360
  type: "INCALL",
2262
2361
  content: {
2263
2362
  data: content,
2264
- event: SocketReceiveEvent.SESSION_ERROR
2363
+ event: SocketReceiveEvent.SESSION_ERROR,
2364
+ callUuid
2265
2365
  }
2266
2366
  });
2267
2367
  }
2268
2368
  if (data.event === SocketReceiveEvent.AGENT_NO_ANSWER) {
2269
- if (content?.callUuid) {
2270
- this.callKit.connect.socketTriggerHangup(content.callUuid);
2369
+ if (callUuid) {
2370
+ this.callKit.connect.socketTriggerHangup(callUuid);
2271
2371
  }
2272
2372
  }
2273
2373
  if (data.event === SocketReceiveEvent.AGENT_HANG_UP) {
2274
- if (content?.callUuid) {
2275
- this.callKit.connect.socketTriggerHangup(content.callUuid);
2374
+ if (callUuid) {
2375
+ this.callKit.connect.socketTriggerHangup(callUuid);
2276
2376
  }
2277
2377
  }
2278
- this.callKit.trigger(KitEvent.SERVER_SOCKET_EVENT, data);
2378
+ this.callKit.trigger(
2379
+ KitEvent.SERVER_SOCKET_EVENT,
2380
+ {
2381
+ ...data,
2382
+ callUuid
2383
+ },
2384
+ true
2385
+ );
2279
2386
  }
2280
2387
  send(event, message) {
2281
2388
  if (!this.connectAuthState.isConnected) {
@@ -2323,18 +2430,11 @@ var Socket = class {
2323
2430
  caller: "Socket.send",
2324
2431
  type: "INCALL",
2325
2432
  content: {
2326
- ...msg
2433
+ ...msg,
2434
+ userInfo
2327
2435
  }
2328
2436
  });
2329
- switch (event) {
2330
- case SocketSendEvent.PING:
2331
- this.lastPingTime = Date.now();
2332
- this.ws?.send(JSON.stringify({ event, ...msg }));
2333
- break;
2334
- default:
2335
- this.ws?.send(JSON.stringify({ event, ...msg }));
2336
- break;
2337
- }
2437
+ this.ws?.send(JSON.stringify({ event, ...msg }));
2338
2438
  }
2339
2439
  ping() {
2340
2440
  if (!this.connectAuthState.isConnected)
@@ -2355,13 +2455,15 @@ var Socket = class {
2355
2455
  errCode: ErrorCode.SOCKET_PING_TIMEOUT
2356
2456
  }
2357
2457
  });
2458
+ this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2459
+ event: "INCALL_PING_TIMEOUT"
2460
+ });
2358
2461
  }
2359
2462
  }
2360
2463
  checkPing() {
2361
2464
  if (this.pingTimer) {
2362
2465
  clearInterval(this.pingTimer);
2363
2466
  }
2364
- this.ping();
2365
2467
  const { pingInterval } = this.reconnectConfig;
2366
2468
  this.pingTimer = setInterval(() => {
2367
2469
  this.ping();
@@ -2396,6 +2498,7 @@ var Socket = class {
2396
2498
  this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2397
2499
  event: "INCALL_RECONNECT_ERROR"
2398
2500
  });
2501
+ this.setConnectAuthState("isError", true);
2399
2502
  this.callKit.reset();
2400
2503
  this.callKit.logger.error("Maximum reconnection attempts reached", {
2401
2504
  caller: "Socket.attemptReconnect",
@@ -2524,7 +2627,8 @@ var CallKit = class {
2524
2627
  try {
2525
2628
  const user = await this.api.login({
2526
2629
  userName: username,
2527
- password: encryptionPassword
2630
+ password: encryptionPassword,
2631
+ timestamp: Date.now()
2528
2632
  });
2529
2633
  if (user) {
2530
2634
  this.config.setConfig("userInfo", {
@@ -2570,7 +2674,7 @@ var CallKit = class {
2570
2674
  if (this.config.isLogin()) {
2571
2675
  const { sessionId } = userInfo;
2572
2676
  try {
2573
- await this.api.loginOut({ sessionId });
2677
+ await this.api.loginOut({ sessionId, timestamp: Date.now() });
2574
2678
  } catch (error) {
2575
2679
  this.logger.warn(error, {
2576
2680
  caller: "CallKit.logout",
@@ -2583,7 +2687,7 @@ var CallKit = class {
2583
2687
  if (isReset) {
2584
2688
  await this.reset();
2585
2689
  } else {
2586
- this.config.reset();
2690
+ this.config.reset("logout");
2587
2691
  }
2588
2692
  }
2589
2693
  async call(extno = "", options = {
@@ -2717,7 +2821,7 @@ var CallKit = class {
2717
2821
  * set userstatus
2718
2822
  * @param status
2719
2823
  */
2720
- async setUserStatus(status) {
2824
+ async setUserStatus(status, extra = {}) {
2721
2825
  const { agentId } = this.config.getConfig().userInfo;
2722
2826
  this.logger.info("setUserStatus", {
2723
2827
  caller: "CallKit.setUserStatus",
@@ -2728,7 +2832,9 @@ var CallKit = class {
2728
2832
  });
2729
2833
  await this.api.updateUserStatus({
2730
2834
  agentId,
2731
- userStatus: status
2835
+ userStatus: status,
2836
+ timestamp: Date.now(),
2837
+ ...extra
2732
2838
  });
2733
2839
  }
2734
2840
  /**
@@ -2753,7 +2859,7 @@ var CallKit = class {
2753
2859
  if (this.config.isLogin()) {
2754
2860
  await this.logout({ isReset: false });
2755
2861
  } else {
2756
- await this.config.reset();
2862
+ await this.config.reset("reset");
2757
2863
  }
2758
2864
  await this.socket.reset({ force });
2759
2865
  }
@@ -2791,7 +2897,9 @@ var CallKit = class {
2791
2897
  if (!noLog) {
2792
2898
  this.logger.info(`Trigger Event: ${event}`, {
2793
2899
  caller: "CallKit.trigger",
2794
- content: data
2900
+ content: {
2901
+ data
2902
+ }
2795
2903
  });
2796
2904
  }
2797
2905
  this.listener.forEach((item) => {
@@ -2799,7 +2907,7 @@ var CallKit = class {
2799
2907
  try {
2800
2908
  item.callback(data);
2801
2909
  } catch (err) {
2802
- this.logger.error("Event callback error:", err, true);
2910
+ this.logger.error(`Event callback error: ${event}`, err, true);
2803
2911
  }
2804
2912
  }
2805
2913
  });