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

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.js CHANGED
@@ -187,6 +187,10 @@ var KitEvent = {
187
187
  * Mute status change
188
188
  */
189
189
  KIT_SET_MUTE: "muteChange",
190
+ /**
191
+ * Call id change
192
+ */
193
+ KIT_CALL_ID_CHANGE: "callIdChange",
190
194
  /**
191
195
  * Error
192
196
  */
@@ -448,7 +452,8 @@ var SocketReceiveEvent = {
448
452
  /**
449
453
  * Error
450
454
  */
451
- ERROR: "ERROR"
455
+ ERROR: "ERROR",
456
+ SESSION_ERROR: "SESSION_ERROR"
452
457
  };
453
458
  var EncryptionMethod = {
454
459
  NONE: "NONE",
@@ -468,6 +473,11 @@ var CallSourceType = {
468
473
  phoneNum: 1,
469
474
  workOrderId: 2
470
475
  };
476
+ var trackLogsDefaultConfig = {
477
+ enabled: false,
478
+ interval: 5e3,
479
+ maxSize: 8192
480
+ };
471
481
 
472
482
  // package/call.ts
473
483
  var Call = class {
@@ -535,6 +545,14 @@ var Call = class {
535
545
  return;
536
546
  if (!this.callKit.config.check())
537
547
  return;
548
+ this.callKit.logger.info("callEnd", {
549
+ caller: "Call.callEnd",
550
+ content: {
551
+ isUnprompted,
552
+ isError,
553
+ connectStatus: this.callKit.connect.connectStatus
554
+ }
555
+ });
538
556
  this.callKit.connect.hangup(isUnprompted, isError);
539
557
  }
540
558
  async callHold() {
@@ -599,6 +617,59 @@ var Call = class {
599
617
  }
600
618
  };
601
619
 
620
+ // package.json
621
+ var package_default = {
622
+ name: "@koi-design/callkit",
623
+ version: "2.0.0",
624
+ description: "callkit",
625
+ author: "koi",
626
+ license: "ISC",
627
+ scripts: {
628
+ build: "tsup",
629
+ start: "tsup --watch",
630
+ dev: "vite",
631
+ lint: "eslint -c .eslintrc.js --ext .jsx,.js,.tsx,.ts ./package --fix",
632
+ prepare: "husky install",
633
+ release: "tsup && node scripts/pkg.js"
634
+ },
635
+ exports: {
636
+ ".": {
637
+ require: "./dist/index.js",
638
+ import: "./dist/index.mjs"
639
+ }
640
+ },
641
+ main: "./dist/index.js",
642
+ module: "./dist/index.mjs",
643
+ types: "./dist/index.d.ts",
644
+ files: [
645
+ "dist"
646
+ ],
647
+ dependencies: {
648
+ axios: "~0.26.1",
649
+ "blueimp-md5": "^2.12.0",
650
+ "eslint-plugin-jsonc": "^2.21.0",
651
+ "json-stringify-safe": "^5.0.1",
652
+ "sip.js": "^0.21.2"
653
+ },
654
+ devDependencies: {
655
+ "@commitlint/cli": "^9.1.2",
656
+ "@commitlint/config-conventional": "^9.1.2",
657
+ "@koi-design/eslint-config-ts": "^0.0.14",
658
+ "@types/blueimp-md5": "^2.18.2",
659
+ archiver: "^5.3.1",
660
+ consola: "^3.4.2",
661
+ eslint: "~8.29.0",
662
+ "eslint-config-prettier": "^10.1.5",
663
+ "eslint-plugin-prettier": "^5.5.0",
664
+ husky: "^8.0.3",
665
+ "lint-staged": "^10.5.4",
666
+ prettier: "^2.6.2",
667
+ tsup: "6.6.3",
668
+ typescript: "^4.6.3",
669
+ vite: "^4"
670
+ }
671
+ };
672
+
602
673
  // package/config.ts
603
674
  var Config = class {
604
675
  callKit;
@@ -606,14 +677,10 @@ var Config = class {
606
677
  this.callKit = callKit;
607
678
  }
608
679
  config = {
609
- version: "1.0.27",
680
+ version: `v${package_default.version}`,
610
681
  host: "",
611
682
  log: "info",
612
- trackLogs: {
613
- enabled: false,
614
- interval: 5e3,
615
- maxSize: 8192
616
- },
683
+ trackLogs: trackLogsDefaultConfig,
617
684
  audioRef: void 0,
618
685
  constrains: constrainsDefault,
619
686
  socket: "",
@@ -698,9 +765,11 @@ var Config = class {
698
765
  }
699
766
  return true;
700
767
  }
701
- isLogsEnabled() {
702
- const { trackLogs } = this.getConfig();
703
- return trackLogs?.enabled ?? false;
768
+ getTrackLogsConfig() {
769
+ return this.config?.trackLogs ?? trackLogsDefaultConfig;
770
+ }
771
+ enableTrackLogs(enabled) {
772
+ this.config.trackLogs.enabled = enabled;
704
773
  }
705
774
  };
706
775
 
@@ -729,11 +798,7 @@ var Logger = class {
729
798
  this.startTrackLogsTimer();
730
799
  }
731
800
  startTrackLogsTimer() {
732
- const { trackLogs } = this.callKit.config.getConfig();
733
- if (!trackLogs.enabled) {
734
- return;
735
- }
736
- const { interval } = trackLogs;
801
+ const { interval } = this.callKit.config.getTrackLogsConfig();
737
802
  if (this.trackLogsTimer) {
738
803
  return;
739
804
  }
@@ -745,14 +810,12 @@ var Logger = class {
745
810
  if (this.pendingTrackLogs.length === 0) {
746
811
  return;
747
812
  }
748
- const isLogsEnabled = this.callKit.config.isLogsEnabled();
749
- if (isLogsEnabled) {
813
+ const { enabled, maxSize } = this.callKit.config.getTrackLogsConfig();
814
+ if (enabled) {
750
815
  try {
751
816
  const chunks = [];
752
817
  let currentChunk = [];
753
818
  let currentSize = 0;
754
- const { trackLogs } = this.callKit.config.getConfig();
755
- const { maxSize } = trackLogs;
756
819
  for (const log of this.pendingTrackLogs) {
757
820
  const logSize = getByteSize(log);
758
821
  const separator = currentChunk.length > 0 ? "\n" : "";
@@ -806,7 +869,7 @@ var Logger = class {
806
869
  console.log(`%c${logString}`, `color: orange;`);
807
870
  }
808
871
  }
809
- error(msg, extra) {
872
+ error(msg, extra, noTrigger = false) {
810
873
  const errorMsg = msg instanceof Error ? msg.message : msg;
811
874
  const logString = this.catchLog(errorMsg, extra, "error");
812
875
  if (getLevel(this.level) >= getLevel("error")) {
@@ -814,11 +877,13 @@ var Logger = class {
814
877
  }
815
878
  const { errCode, ...rest } = extra?.content ?? {};
816
879
  const errorCode = errCode ?? ErrorCode.UNKNOWN_ERROR;
817
- this.callKit.trigger(KitEvent.KIT_ERROR, {
818
- code: errorCode,
819
- msg: errorMsg,
820
- data: rest
821
- });
880
+ if (!noTrigger) {
881
+ this.callKit.trigger(KitEvent.KIT_ERROR, {
882
+ code: errorCode,
883
+ msg: errorMsg,
884
+ data: rest
885
+ });
886
+ }
822
887
  const error = new Error(errorMsg);
823
888
  error.name = "CallKitError";
824
889
  error.code = errorCode;
@@ -836,11 +901,11 @@ var Logger = class {
836
901
  content: extra?.content ?? {}
837
902
  };
838
903
  const logString = transformLog(log);
839
- const isLogsEnabled = this.callKit.config.isLogsEnabled();
840
- if (isLogsEnabled) {
904
+ const { enabled } = this.callKit.config.getTrackLogsConfig();
905
+ if (enabled) {
841
906
  this.pendingTrackLogs.push(logString);
842
907
  }
843
- this.callKit.trigger(KitEvent.KIT_LOG, logString);
908
+ this.callKit.trigger(KitEvent.KIT_LOG, logString, true);
844
909
  return logString;
845
910
  }
846
911
  };
@@ -900,43 +965,46 @@ var initUserMedia = () => {
900
965
  var Connect = class {
901
966
  callKit;
902
967
  /**
903
- * connectStatus: init registered connecting calling
968
+ *@description Reconnect config
969
+ */
970
+ reconnectConfig;
971
+ /**
972
+ *@description Whether muted
973
+ */
974
+ isMute = false;
975
+ /**
976
+ *@description Whether registered
977
+ */
978
+ isRegister = false;
979
+ /**
980
+ *@description Whether holding
981
+ */
982
+ isHold = false;
983
+ /**
984
+ *@description Connect status: init registered connecting calling
904
985
  */
905
986
  connectStatus = CallStatus.init;
906
987
  currentSession;
907
988
  mediaStream;
908
989
  userAgent;
909
990
  registerer;
910
- // current call id for invite data
911
- currentCallId;
912
991
  /**
913
- * Whether it's a re-connected
992
+ *@description Whether it's a re-connected
914
993
  */
915
994
  isReConnected = false;
916
- observeOptionsHeartbeatHandler = null;
917
995
  // sipConnected = false;
918
996
  /**
919
- * Whether it's an outgoing call
997
+ *@description Whether it's an outgoing call
920
998
  */
921
999
  isOutgoing = false;
922
1000
  /**
923
- * Whether it's an active hangup
1001
+ *@description Whether it's an active hangup
924
1002
  */
925
1003
  isUnprompted = false;
926
- isCurrentSessionInvited = false;
927
- reconnectConfig;
928
- /**
929
- * Whether muted
930
- */
931
- isMute = false;
932
1004
  /**
933
- * Whether registered
1005
+ *@description Whether the current session is invited
934
1006
  */
935
- isRegister = false;
936
- /**
937
- * Whether holding
938
- */
939
- isHold = false;
1007
+ hasInvite = false;
940
1008
  constructor(callKit) {
941
1009
  this.callKit = callKit;
942
1010
  const { reconnect = {} } = this.callKit.config.getConfig();
@@ -945,15 +1013,33 @@ var Connect = class {
945
1013
  ...reconnect
946
1014
  };
947
1015
  }
1016
+ // current call id for invite data
1017
+ currentCallId = null;
1018
+ setCallId(callId) {
1019
+ this.callKit.logger.info("setCallId", {
1020
+ caller: "Connect.setCallId",
1021
+ content: {
1022
+ callId
1023
+ }
1024
+ });
1025
+ this.currentCallId = callId;
1026
+ this.callKit.trigger(KitEvent.KIT_CALL_ID_CHANGE, callId);
1027
+ }
948
1028
  async reset() {
949
1029
  if (this.isHolding()) {
950
- this.setHold(false);
1030
+ await this.setHold(false);
1031
+ }
1032
+ if (this.isMuted()) {
1033
+ await this.setMute(false);
951
1034
  }
952
1035
  if (this.connectStatus !== CallStatus.init) {
953
1036
  this.setConnectStatus(CallStatus.init);
954
1037
  }
955
1038
  if (this.isRegistered()) {
956
- this.unregister();
1039
+ await this.unregister();
1040
+ }
1041
+ if (this.currentCallId) {
1042
+ this.setCallId(null);
957
1043
  }
958
1044
  this.currentSession = void 0;
959
1045
  this.mediaStream = void 0;
@@ -961,7 +1047,7 @@ var Connect = class {
961
1047
  this.registerer = void 0;
962
1048
  this.isOutgoing = false;
963
1049
  this.isUnprompted = false;
964
- this.currentCallId = void 0;
1050
+ this.hasInvite = false;
965
1051
  if (this.mediaStream) {
966
1052
  try {
967
1053
  closeStream(this.mediaStream);
@@ -978,7 +1064,7 @@ var Connect = class {
978
1064
  }
979
1065
  }
980
1066
  this.setConnectStatus(CallStatus.init);
981
- this.clearObserveOptionsHeartbeatInterval();
1067
+ this.clearHeartbeat();
982
1068
  }
983
1069
  getAduioReference() {
984
1070
  const { audioRef } = this.callKit.config.getConfig();
@@ -1043,16 +1129,19 @@ var Connect = class {
1043
1129
  isInit() {
1044
1130
  return this.connectStatus === CallStatus.init;
1045
1131
  }
1046
- clearObserveOptionsHeartbeatInterval() {
1047
- if (this.observeOptionsHeartbeatHandler !== null) {
1048
- clearInterval(this.observeOptionsHeartbeatHandler);
1049
- this.observeOptionsHeartbeatHandler = null;
1132
+ heartbeatInterval;
1133
+ heartbeatFlag = MAX_HEARTBEAT_COUNT;
1134
+ clearHeartbeat() {
1135
+ if (this.heartbeatInterval) {
1136
+ clearInterval(this.heartbeatInterval);
1137
+ this.heartbeatInterval = null;
1050
1138
  }
1139
+ this.heartbeatFlag = MAX_HEARTBEAT_COUNT;
1051
1140
  }
1052
- heartbeatFlag = MAX_HEARTBEAT_COUNT;
1053
1141
  startHeartbeat() {
1054
1142
  this.heartbeatFlag = MAX_HEARTBEAT_COUNT;
1055
- setTimeout(() => {
1143
+ this.clearHeartbeat();
1144
+ this.heartbeatInterval = setInterval(() => {
1056
1145
  this.heartbeatFlag -= 1;
1057
1146
  if (this.heartbeatFlag <= 0) {
1058
1147
  this.heartbeatFlag = MAX_HEARTBEAT_COUNT;
@@ -1085,13 +1174,13 @@ var Connect = class {
1085
1174
  });
1086
1175
  return;
1087
1176
  }
1177
+ this.callKit.reset();
1088
1178
  this.callKit.logger.error("connectStatus is not init", {
1089
1179
  caller: "Connect.register",
1090
1180
  content: {
1091
1181
  errCode: ErrorCode.CONNECT_CALL_STATUS_ERROR
1092
1182
  }
1093
1183
  });
1094
- this.callKit.reset();
1095
1184
  return;
1096
1185
  }
1097
1186
  this.callKit.logger.info("connect register", {
@@ -1101,13 +1190,13 @@ var Connect = class {
1101
1190
  }
1102
1191
  });
1103
1192
  await this.permission().catch((err) => {
1193
+ this.callKit.reset();
1104
1194
  this.callKit.logger.error(err, {
1105
1195
  caller: "Connect.register",
1106
1196
  content: {
1107
1197
  errCode: ErrorCode.WEBRTC_USER_MEDIA_ERROR
1108
1198
  }
1109
1199
  });
1110
- this.callKit.reset();
1111
1200
  });
1112
1201
  const { userInfo, constrains } = this.callKit.config.getConfig();
1113
1202
  const localStreamFactory = async () => {
@@ -1173,19 +1262,19 @@ var Connect = class {
1173
1262
  const observeSocketStatus = (userAgent, extra) => {
1174
1263
  const { that = this } = extra;
1175
1264
  const core = userAgent.userAgentCore;
1176
- const originalReceiveRequest = core.receiveRequest.bind(core);
1177
- core.receiveRequest = (request2) => {
1265
+ const originalReceiveIncomingRequestFromTransport = core.receiveIncomingRequestFromTransport.bind(core);
1266
+ core.receiveIncomingRequestFromTransport = (request2) => {
1178
1267
  if (request2.method === "OPTIONS") {
1179
1268
  that.startHeartbeat();
1180
1269
  }
1181
- that.callKit.logger.info(`SIP Receive Request: ${request2.method}`, {
1182
- caller: "Connect.register.observeSocketStatus",
1270
+ that.callKit.logger.info(`SIP Receive: ${request2?.method}`, {
1271
+ caller: "Connect.register.observeSocketStatus.receiveRequest",
1183
1272
  type: "SIP",
1184
1273
  content: {
1185
1274
  request: request2
1186
1275
  }
1187
1276
  });
1188
- return originalReceiveRequest(request2);
1277
+ return originalReceiveIncomingRequestFromTransport(request2);
1189
1278
  };
1190
1279
  const { transport } = userAgent;
1191
1280
  if (transport) {
@@ -1284,9 +1373,6 @@ var Connect = class {
1284
1373
  }
1285
1374
  });
1286
1375
  this.currentSession = invite;
1287
- if (this.isOutgoing) {
1288
- this.isCurrentSessionInvited = false;
1289
- }
1290
1376
  this.currentSession.stateChange.addListener((state) => {
1291
1377
  switch (state) {
1292
1378
  case import_sip.SessionState.Establishing:
@@ -1332,11 +1418,8 @@ var Connect = class {
1332
1418
  sessionState: state
1333
1419
  }
1334
1420
  });
1335
- if (this.isUnprompted) {
1336
- if (this.isCurrentSessionInvited) {
1337
- this.currentSession.reject();
1338
- }
1339
- } else {
1421
+ this.hasInvite = false;
1422
+ if (!this.isUnprompted) {
1340
1423
  this.callKit.callCenter.callEnd();
1341
1424
  }
1342
1425
  this.isUnprompted = false;
@@ -1371,14 +1454,17 @@ var Connect = class {
1371
1454
  const info = getInviteData();
1372
1455
  try {
1373
1456
  const inviteData = formatGetInviteData(info);
1374
- this.currentCallId = inviteData?.callUuid;
1375
- this.callKit.logger.info("get invite data", {
1376
- caller: "Connect.register.onInvite",
1377
- content: {
1378
- inviteData,
1379
- currentCallId: this.currentCallId
1380
- }
1381
- });
1457
+ if (inviteData?.callUuid) {
1458
+ this.setCallId(inviteData.callUuid);
1459
+ } else {
1460
+ this.setCallId(null);
1461
+ this.callKit.logger.error("call id is not exist", {
1462
+ caller: "Connect.register.onInvite",
1463
+ content: {
1464
+ inviteData
1465
+ }
1466
+ });
1467
+ }
1382
1468
  } catch (error) {
1383
1469
  this.callKit.logger.info(error, {
1384
1470
  caller: "Connect.register.onInvite",
@@ -1391,14 +1477,18 @@ var Connect = class {
1391
1477
  getInviteData
1392
1478
  });
1393
1479
  } else {
1480
+ this.hasInvite = true;
1394
1481
  const reject = () => {
1395
- this.currentSession.reject();
1482
+ if (this.currentSession?.state !== import_sip.SessionState.Terminated && this.currentSession?.state !== import_sip.SessionState.Terminating) {
1483
+ this.currentSession.reject();
1484
+ }
1485
+ this.hasInvite = false;
1396
1486
  this.callKit.callCenter.callEnd(true, false);
1397
1487
  };
1398
1488
  this.callKit.trigger(KitEvent.KIT_INVITE, {
1399
1489
  accept: () => {
1400
- this.isCurrentSessionInvited = true;
1401
1490
  this.callKit.trigger(KitEvent.CALL_CONNECTING, /* @__PURE__ */ new Date());
1491
+ this.hasInvite = false;
1402
1492
  this.currentSession.accept(options);
1403
1493
  },
1404
1494
  reject,
@@ -1422,6 +1512,7 @@ var Connect = class {
1422
1512
  version
1423
1513
  });
1424
1514
  }).catch(async (err) => {
1515
+ this.callKit.reset();
1425
1516
  this.callKit.logger.error(err?.message, {
1426
1517
  caller: "Connect.register",
1427
1518
  type: "SIP",
@@ -1429,7 +1520,6 @@ var Connect = class {
1429
1520
  errCode: ErrorCode.WEBRTC_REGISTER_ERROR
1430
1521
  }
1431
1522
  });
1432
- this.callKit.reset();
1433
1523
  });
1434
1524
  },
1435
1525
  onDisconnect: (error) => {
@@ -1461,6 +1551,7 @@ var Connect = class {
1461
1551
  that: this
1462
1552
  });
1463
1553
  await this.userAgent.start().catch((err) => {
1554
+ this.callKit.reset();
1464
1555
  this.callKit.logger.error(err, {
1465
1556
  caller: "Connect.register",
1466
1557
  type: "SIP",
@@ -1468,13 +1559,13 @@ var Connect = class {
1468
1559
  errCode: ErrorCode.WEBRTC_USER_AGENT_ERROR
1469
1560
  }
1470
1561
  });
1471
- this.callKit.reset();
1472
1562
  });
1473
1563
  }
1474
1564
  reconnectTimer;
1475
1565
  reconnectAttempts = 0;
1476
1566
  startReconnectTimer() {
1477
- if (this.reconnectAttempts >= this.reconnectConfig.maxAttempts) {
1567
+ if (this.reconnectAttempts >= this.reconnectConfig.maxAttempts && this.callKit.config.isLogin()) {
1568
+ this.callKit.reset();
1478
1569
  this.callKit.logger.error("Reconnect failed max attempts", {
1479
1570
  caller: "Connect.startReconnectTimer",
1480
1571
  type: "SIP",
@@ -1484,7 +1575,6 @@ var Connect = class {
1484
1575
  delay: this.reconnectConfig.delay
1485
1576
  }
1486
1577
  });
1487
- this.callKit.reset();
1488
1578
  return;
1489
1579
  }
1490
1580
  this.callKit.logger.info("Reconnect timer started", {
@@ -1498,8 +1588,8 @@ var Connect = class {
1498
1588
  });
1499
1589
  this.reconnectAttempts += 1;
1500
1590
  this.reconnectTimer = setTimeout(() => {
1501
- if (this.reconnectTimer) {
1502
- this.userAgent.reconnect();
1591
+ if (this.reconnectTimer && this.callKit.config.isLogin()) {
1592
+ this.userAgent?.reconnect();
1503
1593
  this.callKit.logger.info("Reconnect attempt", {
1504
1594
  caller: "Connect.startReconnectTimer",
1505
1595
  type: "SIP",
@@ -1544,6 +1634,7 @@ var Connect = class {
1544
1634
  return;
1545
1635
  }
1546
1636
  await this.registerer.unregister({ all: true }).catch((err) => {
1637
+ this.callKit.reset();
1547
1638
  this.callKit.logger.error(err, {
1548
1639
  caller: "Connect.unregister",
1549
1640
  type: "SIP",
@@ -1551,7 +1642,6 @@ var Connect = class {
1551
1642
  errCode: ErrorCode.WEBRTC_CANCEL_REGISTER_ERROR
1552
1643
  }
1553
1644
  });
1554
- this.callKit.reset();
1555
1645
  });
1556
1646
  }
1557
1647
  async call(callback) {
@@ -1617,18 +1707,24 @@ var Connect = class {
1617
1707
  connectStatus: this.connectStatus
1618
1708
  }
1619
1709
  });
1620
- if (this.connectStatus === CallStatus.init)
1621
- return;
1622
1710
  this.isOutgoing = false;
1623
1711
  this.isUnprompted = isUnprompted;
1712
+ this.setHold(false);
1713
+ this.setMute(false);
1714
+ if (this.connectStatus === CallStatus.init)
1715
+ return;
1624
1716
  try {
1625
1717
  if (isUnprompted) {
1626
- const shouldSendBye = (
1627
- // this.sipConnected ||
1628
- this.isRinging() || this.isCalling() || this.isHolding()
1629
- );
1718
+ const shouldSendBye = this.isRinging() || this.isCalling();
1630
1719
  if (shouldSendBye) {
1631
- await this.currentSession?.bye();
1720
+ if (this.hasInvite) {
1721
+ if (this.currentSession?.state !== import_sip.SessionState.Terminated && this.currentSession?.state !== import_sip.SessionState.Terminating) {
1722
+ this.currentSession.reject();
1723
+ }
1724
+ this.hasInvite = false;
1725
+ } else {
1726
+ await this.currentSession?.bye();
1727
+ }
1632
1728
  }
1633
1729
  }
1634
1730
  closeStream(this.mediaStream);
@@ -1640,6 +1736,8 @@ var Connect = class {
1640
1736
  this.setConnectStatus(CallStatus.init);
1641
1737
  this.callKit.trigger(KitEvent.CALL_END, /* @__PURE__ */ new Date());
1642
1738
  } catch (err) {
1739
+ this.callKit.trigger(KitEvent.CALL_END, /* @__PURE__ */ new Date());
1740
+ this.callKit.reset();
1643
1741
  this.callKit.logger.error(err, {
1644
1742
  caller: "Connect.hangup",
1645
1743
  type: "SIP",
@@ -1649,8 +1747,6 @@ var Connect = class {
1649
1747
  isUnprompted
1650
1748
  }
1651
1749
  });
1652
- this.callKit.trigger(KitEvent.CALL_END, /* @__PURE__ */ new Date());
1653
- this.callKit.reset();
1654
1750
  }
1655
1751
  }
1656
1752
  /**
@@ -1746,61 +1842,6 @@ var Connect = class {
1746
1842
  });
1747
1843
  this.callKit.trigger(KitEvent.KIT_SET_HOLD, hold);
1748
1844
  }
1749
- // /**
1750
- // * Set mute
1751
- // * @param mute Whether to mute
1752
- // * @deprecated just send socket event to server to mute or unmute
1753
- // */
1754
- // async setMute(mute: boolean) {
1755
- // this.callKit.logger.info('connect setMute', {
1756
- // caller: 'Connect.setMute',
1757
- // type: 'SIP',
1758
- // content: {
1759
- // mute
1760
- // }
1761
- // });
1762
- // if (!this.currentSession) {
1763
- // this.callKit.logger.error('No active session', {
1764
- // caller: 'Connect.setMute',
1765
- // type: 'SIP',
1766
- // content: {
1767
- // errCode: ErrorCode.WEBRTC_MUTE_STATUS_ERROR
1768
- // }
1769
- // });
1770
- // this.callKit.reset();
1771
- // return;
1772
- // }
1773
- // try {
1774
- // // Get SessionDescriptionHandler
1775
- // const sdh = this.currentSession.sessionDescriptionHandler;
1776
- // if (!sdh || !('peerConnection' in sdh)) {
1777
- // throw new Error('Invalid session description handler');
1778
- // }
1779
- // // Get PeerConnection
1780
- // const pc = (sdh as any).peerConnection as RTCPeerConnection;
1781
- // // Get local audio track and set status
1782
- // const audioSender = pc
1783
- // .getSenders()
1784
- // .find((sender) => sender.track?.kind === 'audio');
1785
- // if (audioSender && audioSender.track) {
1786
- // audioSender.track.enabled = !mute;
1787
- // // Update status and trigger event
1788
- // this.isMute = mute;
1789
- // this.callKit.trigger(KitEvent.KIT_SET_MUTE, mute);
1790
- // } else {
1791
- // throw new Error('No audio track found');
1792
- // }
1793
- // } catch (error) {
1794
- // this.callKit.logger.error('Failed to set mute state', {
1795
- // caller: 'Connect.setMute',
1796
- // type: 'SIP',
1797
- // content: {
1798
- // err: error.message,
1799
- // errCode: ErrorCode.WEBRTC_MUTE_ERROR
1800
- // }
1801
- // });
1802
- // }
1803
- // }
1804
1845
  async setMute(mute) {
1805
1846
  if (this.isMute === mute) {
1806
1847
  this.callKit.logger.warn("Already muted", {
@@ -1944,6 +1985,7 @@ var Socket = class {
1944
1985
  this.handleDisconnect();
1945
1986
  }
1946
1987
  onError(ev) {
1988
+ this.socketError = true;
1947
1989
  this.callKit.logger.error("socket onError", {
1948
1990
  caller: "Socket.onError",
1949
1991
  type: "INCALL",
@@ -1952,7 +1994,6 @@ var Socket = class {
1952
1994
  data: ev
1953
1995
  }
1954
1996
  });
1955
- this.socketError = true;
1956
1997
  }
1957
1998
  confirmAck(data) {
1958
1999
  const { ack, messageId } = data;
@@ -1964,11 +2005,26 @@ var Socket = class {
1964
2005
  }
1965
2006
  onMessage(ev) {
1966
2007
  const data = JSON.parse(ev.data);
2008
+ let content = {};
2009
+ try {
2010
+ if (data.data) {
2011
+ content = JSON.parse(data.data);
2012
+ }
2013
+ } catch (error) {
2014
+ this.callKit.logger.info("socket onMessage parse error", {
2015
+ caller: "Socket.onMessage",
2016
+ type: "INCALL",
2017
+ content: {
2018
+ data: data.data
2019
+ }
2020
+ });
2021
+ content = data.data;
2022
+ }
1967
2023
  this.callKit.logger.info("socket onMessage", {
1968
2024
  caller: "Socket.onMessage",
1969
2025
  type: "INCALL",
1970
2026
  content: {
1971
- data: data.data,
2027
+ data: content,
1972
2028
  event: data.event
1973
2029
  }
1974
2030
  });
@@ -1982,7 +2038,7 @@ var Socket = class {
1982
2038
  caller: "Socket.onMessage",
1983
2039
  type: "INCALL",
1984
2040
  content: {
1985
- data: data.data,
2041
+ data: content,
1986
2042
  event: SocketReceiveEvent.START_CONFIRM
1987
2043
  }
1988
2044
  });
@@ -1993,7 +2049,7 @@ var Socket = class {
1993
2049
  caller: "Socket.onMessage",
1994
2050
  type: "INCALL",
1995
2051
  content: {
1996
- data: data.data,
2052
+ data: content,
1997
2053
  event: SocketReceiveEvent.CALL_SUCCESS
1998
2054
  }
1999
2055
  });
@@ -2003,20 +2059,28 @@ var Socket = class {
2003
2059
  caller: "Socket.onMessage",
2004
2060
  type: "INCALL",
2005
2061
  content: {
2006
- data: data.data,
2062
+ data: content,
2007
2063
  errCode: ErrorCode.SOCKET_CALL_ERROR
2008
2064
  }
2009
2065
  });
2010
2066
  }
2011
2067
  if (data.event === SocketReceiveEvent.CUSTOMER_RINGING) {
2012
2068
  this.callKit.trigger(KitEvent.CALL_RINGING, /* @__PURE__ */ new Date());
2069
+ this.callKit.logger.info(data.msg, {
2070
+ caller: `Socket.onMessage:${data.event}`,
2071
+ type: "INCALL",
2072
+ content: {
2073
+ data: content,
2074
+ event: SocketReceiveEvent.CUSTOMER_RINGING
2075
+ }
2076
+ });
2013
2077
  }
2014
2078
  if (data.event === SocketReceiveEvent.CUSTOMER_PICK_UP) {
2015
2079
  this.callKit.logger.info(data.msg, {
2016
2080
  caller: "Socket.onMessage",
2017
2081
  type: "INCALL",
2018
2082
  content: {
2019
- data: data.data,
2083
+ data: content,
2020
2084
  event: SocketReceiveEvent.CUSTOMER_PICK_UP
2021
2085
  }
2022
2086
  });
@@ -2027,7 +2091,7 @@ var Socket = class {
2027
2091
  caller: "Socket.onMessage",
2028
2092
  type: "INCALL",
2029
2093
  content: {
2030
- data: data.data,
2094
+ data: content,
2031
2095
  event: SocketReceiveEvent.AGENT_PICK_UP
2032
2096
  }
2033
2097
  });
@@ -2035,16 +2099,16 @@ var Socket = class {
2035
2099
  }
2036
2100
  if (data.event === SocketReceiveEvent.CUSTOMER_HANG_UP) {
2037
2101
  this.callKit.logger.info(data.msg, {
2038
- caller: "Socket.onMessage",
2102
+ caller: `Socket.onMessage:${data.event}`,
2039
2103
  type: "INCALL",
2040
2104
  content: {
2041
- data: data.data,
2105
+ data: content,
2042
2106
  event: SocketReceiveEvent.CUSTOMER_HANG_UP
2043
2107
  }
2044
2108
  });
2045
2109
  this.callKit.trigger(KitEvent.CALL_HANG_UP, /* @__PURE__ */ new Date());
2046
- if (data.data?.callUuid) {
2047
- this.callKit.connect.socketTriggerHangup(data.data.callUuid);
2110
+ if (content?.callUuid) {
2111
+ this.callKit.connect.socketTriggerHangup(content.callUuid);
2048
2112
  }
2049
2113
  }
2050
2114
  if (data.event === SocketReceiveEvent.CUSTOMER_NO_ANSWER) {
@@ -2052,30 +2116,32 @@ var Socket = class {
2052
2116
  caller: "Socket.onMessage",
2053
2117
  type: "INCALL",
2054
2118
  content: {
2055
- data: data.data,
2119
+ data: content,
2056
2120
  event: SocketReceiveEvent.CUSTOMER_NO_ANSWER
2057
2121
  }
2058
2122
  });
2059
2123
  this.callKit.trigger(KitEvent.CALL_NO_ANSWER);
2060
- if (data.data?.callUuid) {
2061
- this.callKit.connect.socketTriggerHangup(data.data.callUuid);
2124
+ if (content?.callUuid) {
2125
+ this.callKit.connect.socketTriggerHangup(content.callUuid);
2062
2126
  }
2063
2127
  }
2064
2128
  if (data.event === SocketReceiveEvent.CALL_CDR) {
2065
2129
  this.callKit.logger.info(data.msg, {
2066
- caller: "Socket.onMessage",
2130
+ caller: `Socket.onMessage:${data.event}`,
2131
+ type: "INCALL",
2067
2132
  content: {
2068
- data: data.data,
2133
+ data: content,
2069
2134
  event: SocketReceiveEvent.CALL_CDR
2070
2135
  }
2071
2136
  });
2072
- this.callKit.trigger(KitEvent.CALL_CDR, data.data);
2137
+ this.callKit.trigger(KitEvent.CALL_CDR, content);
2073
2138
  }
2074
2139
  if (data.event === SocketReceiveEvent.STOP_CONFIRM) {
2075
2140
  this.callKit.logger.info(data.msg, {
2076
- caller: "Socket.onMessage",
2141
+ caller: `Socket.onMessage:${data.event}`,
2142
+ type: "INCALL",
2077
2143
  content: {
2078
- data: data.data,
2144
+ data: content,
2079
2145
  event: SocketReceiveEvent.STOP_CONFIRM
2080
2146
  }
2081
2147
  });
@@ -2083,9 +2149,10 @@ var Socket = class {
2083
2149
  if (data.event === SocketReceiveEvent.CLOSE) {
2084
2150
  const { userInfo } = this.callKit.config.getConfig();
2085
2151
  this.callKit.logger.info(data.msg, {
2086
- caller: "Socket.onMessage",
2152
+ caller: `Socket.onMessage:${data.event}`,
2153
+ type: "INCALL",
2087
2154
  content: {
2088
- data: data.data,
2155
+ data: content,
2089
2156
  event: SocketReceiveEvent.CLOSE
2090
2157
  }
2091
2158
  });
@@ -2094,26 +2161,40 @@ var Socket = class {
2094
2161
  });
2095
2162
  }
2096
2163
  if (data.event === SocketReceiveEvent.ERROR) {
2164
+ this.socketError = true;
2165
+ this.callKit.reset();
2097
2166
  this.callKit.logger.error(data.msg, {
2098
- caller: "Socket.onMessage",
2167
+ caller: `Socket.onMessage:${data.event}`,
2168
+ type: "INCALL",
2099
2169
  content: {
2100
2170
  errCode: ErrorCode.SOKET_SERVER_ERROR,
2101
- data: data.data
2171
+ data: content
2102
2172
  }
2103
2173
  });
2174
+ }
2175
+ if (data.event === SocketReceiveEvent.SESSION_ERROR) {
2104
2176
  this.socketError = true;
2105
2177
  this.callKit.reset();
2178
+ this.callKit.logger.error(data.msg, {
2179
+ caller: `Socket.onMessage:${data.event}`,
2180
+ type: "INCALL",
2181
+ content: {
2182
+ data: content,
2183
+ event: SocketReceiveEvent.SESSION_ERROR
2184
+ }
2185
+ });
2106
2186
  }
2107
2187
  if (data.event === SocketReceiveEvent.AGENT_NO_ANSWER) {
2108
2188
  this.callKit.logger.info(data.msg, {
2109
- caller: "Socket.onMessage",
2189
+ caller: `Socket.onMessage:${data.event}`,
2190
+ type: "INCALL",
2110
2191
  content: {
2111
- data: data.data,
2192
+ data: content,
2112
2193
  event: SocketReceiveEvent.AGENT_NO_ANSWER
2113
2194
  }
2114
2195
  });
2115
- if (data.data?.callUuid) {
2116
- this.callKit.connect.socketTriggerHangup(data.data.callUuid);
2196
+ if (content?.callUuid) {
2197
+ this.callKit.connect.socketTriggerHangup(content.callUuid);
2117
2198
  }
2118
2199
  }
2119
2200
  this.callKit.trigger(KitEvent.SERVER_SOCKET_EVENT, data);
@@ -2123,6 +2204,7 @@ var Socket = class {
2123
2204
  this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2124
2205
  event: "INCALL_NOT_CONNECTED"
2125
2206
  });
2207
+ this.callKit.reset();
2126
2208
  this.callKit.logger.error("socket not connected", {
2127
2209
  caller: "Socket.send",
2128
2210
  type: "INCALL",
@@ -2130,10 +2212,9 @@ var Socket = class {
2130
2212
  errCode: ErrorCode.SOCKET_CONNECT_ERROR
2131
2213
  }
2132
2214
  });
2133
- this.callKit.reset();
2134
2215
  return;
2135
2216
  }
2136
- const { userInfo } = this.callKit.config.getConfig();
2217
+ const { userInfo, version } = this.callKit.config.getConfig();
2137
2218
  const { sessionId, extno, agentId } = userInfo;
2138
2219
  if (!sessionId) {
2139
2220
  this.callKit.logger.error("sessionId is empty", {
@@ -2148,6 +2229,7 @@ var Socket = class {
2148
2229
  const msg = {
2149
2230
  event,
2150
2231
  sessionId,
2232
+ version,
2151
2233
  ...message
2152
2234
  };
2153
2235
  if (SocketSendEvent.CALL === event) {
@@ -2163,8 +2245,7 @@ var Socket = class {
2163
2245
  caller: "Socket.send",
2164
2246
  type: "INCALL",
2165
2247
  content: {
2166
- event,
2167
- message
2248
+ ...msg
2168
2249
  }
2169
2250
  });
2170
2251
  switch (event) {
@@ -2177,24 +2258,6 @@ var Socket = class {
2177
2258
  break;
2178
2259
  }
2179
2260
  }
2180
- async sendMessage(event, message) {
2181
- if (!this.isConnected) {
2182
- this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2183
- event: "INCALL_NOT_CONNECTED"
2184
- });
2185
- this.callKit.logger.error("socket not connected", {
2186
- caller: "Socket.sendMessage",
2187
- type: "INCALL",
2188
- content: {
2189
- errCode: ErrorCode.SOCKET_CONNECT_ERROR
2190
- }
2191
- });
2192
- return;
2193
- }
2194
- const { userInfo } = this.callKit.config.getConfig();
2195
- const { sessionId } = userInfo;
2196
- this.ws?.send(JSON.stringify({ event, sessionId, ...message }));
2197
- }
2198
2261
  ping() {
2199
2262
  if (!this.isConnected)
2200
2263
  return;
@@ -2209,6 +2272,11 @@ var Socket = class {
2209
2272
  const now = Date.now();
2210
2273
  const { pingInterval, pingTimeout } = this.socketConfig;
2211
2274
  if (now - this.lastPingTime > pingInterval + pingTimeout) {
2275
+ if (this.ws && this.isConnected) {
2276
+ this.ws.close(4001, "ping timeout");
2277
+ } else {
2278
+ this.reset();
2279
+ }
2212
2280
  this.callKit.logger.error("socket ping timeout", {
2213
2281
  caller: "Socket.ping",
2214
2282
  type: "INCALL",
@@ -2216,11 +2284,6 @@ var Socket = class {
2216
2284
  errCode: ErrorCode.SOCKET_PING_TIMEOUT
2217
2285
  }
2218
2286
  });
2219
- if (this.ws && this.isConnected) {
2220
- this.ws.close(4001, "ping timeout");
2221
- } else {
2222
- this.reset();
2223
- }
2224
2287
  }
2225
2288
  }
2226
2289
  checkPing() {
@@ -2256,6 +2319,10 @@ var Socket = class {
2256
2319
  }
2257
2320
  attemptReconnect() {
2258
2321
  if (this.reconnectAttempts >= this.socketConfig.maxAttempts) {
2322
+ this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2323
+ event: "INCALL_RECONNECT_ERROR"
2324
+ });
2325
+ this.reset();
2259
2326
  this.callKit.logger.error("Maximum reconnection attempts reached", {
2260
2327
  caller: "Socket.attemptReconnect",
2261
2328
  type: "INCALL",
@@ -2264,10 +2331,6 @@ var Socket = class {
2264
2331
  reconnectAttempts: this.reconnectAttempts
2265
2332
  }
2266
2333
  });
2267
- this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2268
- event: "INCALL_RECONNECT_ERROR"
2269
- });
2270
- this.reset();
2271
2334
  return;
2272
2335
  }
2273
2336
  if (this.reconnectAttempts === 0) {
@@ -2560,9 +2623,16 @@ var CallKit = class {
2560
2623
  */
2561
2624
  async setUserStatus(status) {
2562
2625
  const { agentId } = this.config.getConfig().userInfo;
2626
+ this.logger.info("setUserStatus", {
2627
+ caller: "CallKit.setUserStatus",
2628
+ content: {
2629
+ status,
2630
+ agentId
2631
+ }
2632
+ });
2563
2633
  await this.api.updateUserStatus({
2564
2634
  agentId,
2565
- status
2635
+ userStatus: status
2566
2636
  });
2567
2637
  }
2568
2638
  async reset() {
@@ -2612,13 +2682,19 @@ var CallKit = class {
2612
2682
  }
2613
2683
  });
2614
2684
  }
2615
- trigger(event, data) {
2685
+ trigger(event, data, noLog = false) {
2686
+ if (!noLog) {
2687
+ this.logger.info(`Trigger Event: ${event}`, {
2688
+ caller: "CallKit.trigger",
2689
+ content: data
2690
+ });
2691
+ }
2616
2692
  this.listener.forEach((item) => {
2617
2693
  if (item.event === event) {
2618
2694
  try {
2619
2695
  item.callback(data);
2620
2696
  } catch (err) {
2621
- this.logger.error("Event callback error:", err);
2697
+ this.logger.error("Event callback error:", err, true);
2622
2698
  }
2623
2699
  }
2624
2700
  });