@koi-design/callkit 2.0.0-beta.9 → 2.0.1

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",
@@ -540,6 +545,14 @@ var Call = class {
540
545
  return;
541
546
  if (!this.callKit.config.check())
542
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
+ });
543
556
  this.callKit.connect.hangup(isUnprompted, isError);
544
557
  }
545
558
  async callHold() {
@@ -604,6 +617,59 @@ var Call = class {
604
617
  }
605
618
  };
606
619
 
620
+ // package.json
621
+ var package_default = {
622
+ name: "@koi-design/callkit",
623
+ version: "2.0.1",
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
+
607
673
  // package/config.ts
608
674
  var Config = class {
609
675
  callKit;
@@ -611,7 +677,7 @@ var Config = class {
611
677
  this.callKit = callKit;
612
678
  }
613
679
  config = {
614
- version: "1.0.27",
680
+ version: `V${package_default.version}`,
615
681
  host: "",
616
682
  log: "info",
617
683
  trackLogs: trackLogsDefaultConfig,
@@ -700,7 +766,7 @@ var Config = class {
700
766
  return true;
701
767
  }
702
768
  getTrackLogsConfig() {
703
- return this.getConfig().trackLogs ?? trackLogsDefaultConfig;
769
+ return this.config?.trackLogs ?? trackLogsDefaultConfig;
704
770
  }
705
771
  enableTrackLogs(enabled) {
706
772
  this.config.trackLogs.enabled = enabled;
@@ -732,8 +798,8 @@ var Logger = class {
732
798
  this.startTrackLogsTimer();
733
799
  }
734
800
  startTrackLogsTimer() {
735
- const { interval, enabled } = this.callKit.config.getConfig().trackLogs;
736
- if (!enabled || this.trackLogsTimer) {
801
+ const { interval } = this.callKit.config.getTrackLogsConfig();
802
+ if (this.trackLogsTimer) {
737
803
  return;
738
804
  }
739
805
  this.trackLogsTimer = setInterval(() => {
@@ -803,7 +869,7 @@ var Logger = class {
803
869
  console.log(`%c${logString}`, `color: orange;`);
804
870
  }
805
871
  }
806
- error(msg, extra) {
872
+ error(msg, extra, noTrigger = false) {
807
873
  const errorMsg = msg instanceof Error ? msg.message : msg;
808
874
  const logString = this.catchLog(errorMsg, extra, "error");
809
875
  if (getLevel(this.level) >= getLevel("error")) {
@@ -811,11 +877,13 @@ var Logger = class {
811
877
  }
812
878
  const { errCode, ...rest } = extra?.content ?? {};
813
879
  const errorCode = errCode ?? ErrorCode.UNKNOWN_ERROR;
814
- this.callKit.trigger(KitEvent.KIT_ERROR, {
815
- code: errorCode,
816
- msg: errorMsg,
817
- data: rest
818
- });
880
+ if (!noTrigger) {
881
+ this.callKit.trigger(KitEvent.KIT_ERROR, {
882
+ code: errorCode,
883
+ msg: errorMsg,
884
+ data: rest
885
+ });
886
+ }
819
887
  const error = new Error(errorMsg);
820
888
  error.name = "CallKitError";
821
889
  error.code = errorCode;
@@ -837,7 +905,7 @@ var Logger = class {
837
905
  if (enabled) {
838
906
  this.pendingTrackLogs.push(logString);
839
907
  }
840
- this.callKit.trigger(KitEvent.KIT_LOG, logString);
908
+ this.callKit.trigger(KitEvent.KIT_LOG, logString, true);
841
909
  return logString;
842
910
  }
843
911
  };
@@ -897,43 +965,46 @@ var initUserMedia = () => {
897
965
  var Connect = class {
898
966
  callKit;
899
967
  /**
900
- * 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
901
985
  */
902
986
  connectStatus = CallStatus.init;
903
987
  currentSession;
904
988
  mediaStream;
905
989
  userAgent;
906
990
  registerer;
907
- // current call id for invite data
908
- currentCallId;
909
991
  /**
910
- * Whether it's a re-connected
992
+ *@description Whether it's a re-connected
911
993
  */
912
994
  isReConnected = false;
913
- observeOptionsHeartbeatHandler = null;
914
995
  // sipConnected = false;
915
996
  /**
916
- * Whether it's an outgoing call
997
+ *@description Whether it's an outgoing call
917
998
  */
918
999
  isOutgoing = false;
919
1000
  /**
920
- * Whether it's an active hangup
1001
+ *@description Whether it's an active hangup
921
1002
  */
922
1003
  isUnprompted = false;
923
- isCurrentSessionInvited = false;
924
- reconnectConfig;
925
- /**
926
- * Whether muted
927
- */
928
- isMute = false;
929
- /**
930
- * Whether registered
931
- */
932
- isRegister = false;
933
1004
  /**
934
- * Whether holding
1005
+ *@description Whether the current session is invited
935
1006
  */
936
- isHold = false;
1007
+ hasInvite = false;
937
1008
  constructor(callKit) {
938
1009
  this.callKit = callKit;
939
1010
  const { reconnect = {} } = this.callKit.config.getConfig();
@@ -942,15 +1013,33 @@ var Connect = class {
942
1013
  ...reconnect
943
1014
  };
944
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
+ }
945
1028
  async reset() {
946
1029
  if (this.isHolding()) {
947
- this.setHold(false);
1030
+ await this.setHold(false);
1031
+ }
1032
+ if (this.isMuted()) {
1033
+ await this.setMute(false);
948
1034
  }
949
1035
  if (this.connectStatus !== CallStatus.init) {
950
1036
  this.setConnectStatus(CallStatus.init);
951
1037
  }
952
1038
  if (this.isRegistered()) {
953
- this.unregister();
1039
+ await this.unregister();
1040
+ }
1041
+ if (this.currentCallId) {
1042
+ this.setCallId(null);
954
1043
  }
955
1044
  this.currentSession = void 0;
956
1045
  this.mediaStream = void 0;
@@ -958,7 +1047,7 @@ var Connect = class {
958
1047
  this.registerer = void 0;
959
1048
  this.isOutgoing = false;
960
1049
  this.isUnprompted = false;
961
- this.currentCallId = void 0;
1050
+ this.hasInvite = false;
962
1051
  if (this.mediaStream) {
963
1052
  try {
964
1053
  closeStream(this.mediaStream);
@@ -975,7 +1064,7 @@ var Connect = class {
975
1064
  }
976
1065
  }
977
1066
  this.setConnectStatus(CallStatus.init);
978
- this.clearObserveOptionsHeartbeatInterval();
1067
+ this.clearHeartbeat();
979
1068
  }
980
1069
  getAduioReference() {
981
1070
  const { audioRef } = this.callKit.config.getConfig();
@@ -1040,16 +1129,19 @@ var Connect = class {
1040
1129
  isInit() {
1041
1130
  return this.connectStatus === CallStatus.init;
1042
1131
  }
1043
- clearObserveOptionsHeartbeatInterval() {
1044
- if (this.observeOptionsHeartbeatHandler !== null) {
1045
- clearInterval(this.observeOptionsHeartbeatHandler);
1046
- this.observeOptionsHeartbeatHandler = null;
1132
+ heartbeatInterval;
1133
+ heartbeatFlag = MAX_HEARTBEAT_COUNT;
1134
+ clearHeartbeat() {
1135
+ if (this.heartbeatInterval) {
1136
+ clearInterval(this.heartbeatInterval);
1137
+ this.heartbeatInterval = null;
1047
1138
  }
1139
+ this.heartbeatFlag = MAX_HEARTBEAT_COUNT;
1048
1140
  }
1049
- heartbeatFlag = MAX_HEARTBEAT_COUNT;
1050
1141
  startHeartbeat() {
1051
1142
  this.heartbeatFlag = MAX_HEARTBEAT_COUNT;
1052
- setTimeout(() => {
1143
+ this.clearHeartbeat();
1144
+ this.heartbeatInterval = setInterval(() => {
1053
1145
  this.heartbeatFlag -= 1;
1054
1146
  if (this.heartbeatFlag <= 0) {
1055
1147
  this.heartbeatFlag = MAX_HEARTBEAT_COUNT;
@@ -1082,13 +1174,13 @@ var Connect = class {
1082
1174
  });
1083
1175
  return;
1084
1176
  }
1177
+ this.callKit.reset();
1085
1178
  this.callKit.logger.error("connectStatus is not init", {
1086
1179
  caller: "Connect.register",
1087
1180
  content: {
1088
1181
  errCode: ErrorCode.CONNECT_CALL_STATUS_ERROR
1089
1182
  }
1090
1183
  });
1091
- this.callKit.reset();
1092
1184
  return;
1093
1185
  }
1094
1186
  this.callKit.logger.info("connect register", {
@@ -1098,13 +1190,13 @@ var Connect = class {
1098
1190
  }
1099
1191
  });
1100
1192
  await this.permission().catch((err) => {
1193
+ this.callKit.reset();
1101
1194
  this.callKit.logger.error(err, {
1102
1195
  caller: "Connect.register",
1103
1196
  content: {
1104
1197
  errCode: ErrorCode.WEBRTC_USER_MEDIA_ERROR
1105
1198
  }
1106
1199
  });
1107
- this.callKit.reset();
1108
1200
  });
1109
1201
  const { userInfo, constrains } = this.callKit.config.getConfig();
1110
1202
  const localStreamFactory = async () => {
@@ -1170,19 +1262,19 @@ var Connect = class {
1170
1262
  const observeSocketStatus = (userAgent, extra) => {
1171
1263
  const { that = this } = extra;
1172
1264
  const core = userAgent.userAgentCore;
1173
- const originalReceiveRequest = core.receiveRequest.bind(core);
1174
- core.receiveRequest = (request2) => {
1265
+ const originalReceiveIncomingRequestFromTransport = core.receiveIncomingRequestFromTransport.bind(core);
1266
+ core.receiveIncomingRequestFromTransport = (request2) => {
1175
1267
  if (request2.method === "OPTIONS") {
1176
1268
  that.startHeartbeat();
1177
1269
  }
1178
- that.callKit.logger.info(`SIP Receive Request: ${request2.method}`, {
1179
- caller: "Connect.register.observeSocketStatus",
1270
+ that.callKit.logger.info(`SIP Receive: ${request2?.method}`, {
1271
+ caller: "Connect.register.observeSocketStatus.receiveRequest",
1180
1272
  type: "SIP",
1181
1273
  content: {
1182
1274
  request: request2
1183
1275
  }
1184
1276
  });
1185
- return originalReceiveRequest(request2);
1277
+ return originalReceiveIncomingRequestFromTransport(request2);
1186
1278
  };
1187
1279
  const { transport } = userAgent;
1188
1280
  if (transport) {
@@ -1281,9 +1373,6 @@ var Connect = class {
1281
1373
  }
1282
1374
  });
1283
1375
  this.currentSession = invite;
1284
- if (this.isOutgoing) {
1285
- this.isCurrentSessionInvited = false;
1286
- }
1287
1376
  this.currentSession.stateChange.addListener((state) => {
1288
1377
  switch (state) {
1289
1378
  case import_sip.SessionState.Establishing:
@@ -1329,11 +1418,8 @@ var Connect = class {
1329
1418
  sessionState: state
1330
1419
  }
1331
1420
  });
1332
- if (this.isUnprompted) {
1333
- if (this.isCurrentSessionInvited) {
1334
- this.currentSession.reject();
1335
- }
1336
- } else {
1421
+ this.hasInvite = false;
1422
+ if (!this.isUnprompted) {
1337
1423
  this.callKit.callCenter.callEnd();
1338
1424
  }
1339
1425
  this.isUnprompted = false;
@@ -1368,14 +1454,17 @@ var Connect = class {
1368
1454
  const info = getInviteData();
1369
1455
  try {
1370
1456
  const inviteData = formatGetInviteData(info);
1371
- this.currentCallId = inviteData?.callUuid;
1372
- this.callKit.logger.info("get invite data", {
1373
- caller: "Connect.register.onInvite",
1374
- content: {
1375
- inviteData,
1376
- currentCallId: this.currentCallId
1377
- }
1378
- });
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
+ }
1379
1468
  } catch (error) {
1380
1469
  this.callKit.logger.info(error, {
1381
1470
  caller: "Connect.register.onInvite",
@@ -1388,14 +1477,18 @@ var Connect = class {
1388
1477
  getInviteData
1389
1478
  });
1390
1479
  } else {
1480
+ this.hasInvite = true;
1391
1481
  const reject = () => {
1392
- 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;
1393
1486
  this.callKit.callCenter.callEnd(true, false);
1394
1487
  };
1395
1488
  this.callKit.trigger(KitEvent.KIT_INVITE, {
1396
1489
  accept: () => {
1397
- this.isCurrentSessionInvited = true;
1398
1490
  this.callKit.trigger(KitEvent.CALL_CONNECTING, /* @__PURE__ */ new Date());
1491
+ this.hasInvite = false;
1399
1492
  this.currentSession.accept(options);
1400
1493
  },
1401
1494
  reject,
@@ -1410,15 +1503,13 @@ var Connect = class {
1410
1503
  caller: "Connect.register",
1411
1504
  type: "SIP",
1412
1505
  content: {
1413
- version: `V${this.callKit.config.getConfig().version}`
1506
+ version: `${this.callKit.config.getConfig().version}`
1414
1507
  }
1415
1508
  });
1416
- const version = `V${this.callKit.config.getConfig().version}`;
1417
1509
  await this.registerer.register().then(() => {
1418
- this.callKit.socket.send(SocketSendEvent.START, {
1419
- version
1420
- });
1510
+ this.callKit.socket.send(SocketSendEvent.START);
1421
1511
  }).catch(async (err) => {
1512
+ this.callKit.reset();
1422
1513
  this.callKit.logger.error(err?.message, {
1423
1514
  caller: "Connect.register",
1424
1515
  type: "SIP",
@@ -1426,7 +1517,6 @@ var Connect = class {
1426
1517
  errCode: ErrorCode.WEBRTC_REGISTER_ERROR
1427
1518
  }
1428
1519
  });
1429
- this.callKit.reset();
1430
1520
  });
1431
1521
  },
1432
1522
  onDisconnect: (error) => {
@@ -1458,6 +1548,7 @@ var Connect = class {
1458
1548
  that: this
1459
1549
  });
1460
1550
  await this.userAgent.start().catch((err) => {
1551
+ this.callKit.reset();
1461
1552
  this.callKit.logger.error(err, {
1462
1553
  caller: "Connect.register",
1463
1554
  type: "SIP",
@@ -1465,13 +1556,13 @@ var Connect = class {
1465
1556
  errCode: ErrorCode.WEBRTC_USER_AGENT_ERROR
1466
1557
  }
1467
1558
  });
1468
- this.callKit.reset();
1469
1559
  });
1470
1560
  }
1471
1561
  reconnectTimer;
1472
1562
  reconnectAttempts = 0;
1473
1563
  startReconnectTimer() {
1474
- if (this.reconnectAttempts >= this.reconnectConfig.maxAttempts) {
1564
+ if (this.reconnectAttempts >= this.reconnectConfig.maxAttempts && this.callKit.config.isLogin()) {
1565
+ this.callKit.reset();
1475
1566
  this.callKit.logger.error("Reconnect failed max attempts", {
1476
1567
  caller: "Connect.startReconnectTimer",
1477
1568
  type: "SIP",
@@ -1481,7 +1572,6 @@ var Connect = class {
1481
1572
  delay: this.reconnectConfig.delay
1482
1573
  }
1483
1574
  });
1484
- this.callKit.reset();
1485
1575
  return;
1486
1576
  }
1487
1577
  this.callKit.logger.info("Reconnect timer started", {
@@ -1495,8 +1585,8 @@ var Connect = class {
1495
1585
  });
1496
1586
  this.reconnectAttempts += 1;
1497
1587
  this.reconnectTimer = setTimeout(() => {
1498
- if (this.reconnectTimer) {
1499
- this.userAgent.reconnect();
1588
+ if (this.reconnectTimer && this.callKit.config.isLogin()) {
1589
+ this.userAgent?.reconnect();
1500
1590
  this.callKit.logger.info("Reconnect attempt", {
1501
1591
  caller: "Connect.startReconnectTimer",
1502
1592
  type: "SIP",
@@ -1541,6 +1631,7 @@ var Connect = class {
1541
1631
  return;
1542
1632
  }
1543
1633
  await this.registerer.unregister({ all: true }).catch((err) => {
1634
+ this.callKit.reset();
1544
1635
  this.callKit.logger.error(err, {
1545
1636
  caller: "Connect.unregister",
1546
1637
  type: "SIP",
@@ -1548,7 +1639,6 @@ var Connect = class {
1548
1639
  errCode: ErrorCode.WEBRTC_CANCEL_REGISTER_ERROR
1549
1640
  }
1550
1641
  });
1551
- this.callKit.reset();
1552
1642
  });
1553
1643
  }
1554
1644
  async call(callback) {
@@ -1614,18 +1704,24 @@ var Connect = class {
1614
1704
  connectStatus: this.connectStatus
1615
1705
  }
1616
1706
  });
1617
- if (this.connectStatus === CallStatus.init)
1618
- return;
1619
1707
  this.isOutgoing = false;
1620
1708
  this.isUnprompted = isUnprompted;
1709
+ this.setHold(false);
1710
+ this.setMute(false);
1711
+ if (this.connectStatus === CallStatus.init)
1712
+ return;
1621
1713
  try {
1622
1714
  if (isUnprompted) {
1623
- const shouldSendBye = (
1624
- // this.sipConnected ||
1625
- this.isRinging() || this.isCalling() || this.isHolding()
1626
- );
1715
+ const shouldSendBye = this.isRinging() || this.isCalling();
1627
1716
  if (shouldSendBye) {
1628
- await this.currentSession?.bye();
1717
+ if (this.hasInvite) {
1718
+ if (this.currentSession?.state !== import_sip.SessionState.Terminated && this.currentSession?.state !== import_sip.SessionState.Terminating) {
1719
+ this.currentSession.reject();
1720
+ }
1721
+ this.hasInvite = false;
1722
+ } else {
1723
+ await this.currentSession?.bye();
1724
+ }
1629
1725
  }
1630
1726
  }
1631
1727
  closeStream(this.mediaStream);
@@ -1637,6 +1733,8 @@ var Connect = class {
1637
1733
  this.setConnectStatus(CallStatus.init);
1638
1734
  this.callKit.trigger(KitEvent.CALL_END, /* @__PURE__ */ new Date());
1639
1735
  } catch (err) {
1736
+ this.callKit.trigger(KitEvent.CALL_END, /* @__PURE__ */ new Date());
1737
+ this.callKit.reset();
1640
1738
  this.callKit.logger.error(err, {
1641
1739
  caller: "Connect.hangup",
1642
1740
  type: "SIP",
@@ -1646,8 +1744,6 @@ var Connect = class {
1646
1744
  isUnprompted
1647
1745
  }
1648
1746
  });
1649
- this.callKit.trigger(KitEvent.CALL_END, /* @__PURE__ */ new Date());
1650
- this.callKit.reset();
1651
1747
  }
1652
1748
  }
1653
1749
  /**
@@ -1743,61 +1839,6 @@ var Connect = class {
1743
1839
  });
1744
1840
  this.callKit.trigger(KitEvent.KIT_SET_HOLD, hold);
1745
1841
  }
1746
- // /**
1747
- // * Set mute
1748
- // * @param mute Whether to mute
1749
- // * @deprecated just send socket event to server to mute or unmute
1750
- // */
1751
- // async setMute(mute: boolean) {
1752
- // this.callKit.logger.info('connect setMute', {
1753
- // caller: 'Connect.setMute',
1754
- // type: 'SIP',
1755
- // content: {
1756
- // mute
1757
- // }
1758
- // });
1759
- // if (!this.currentSession) {
1760
- // this.callKit.logger.error('No active session', {
1761
- // caller: 'Connect.setMute',
1762
- // type: 'SIP',
1763
- // content: {
1764
- // errCode: ErrorCode.WEBRTC_MUTE_STATUS_ERROR
1765
- // }
1766
- // });
1767
- // this.callKit.reset();
1768
- // return;
1769
- // }
1770
- // try {
1771
- // // Get SessionDescriptionHandler
1772
- // const sdh = this.currentSession.sessionDescriptionHandler;
1773
- // if (!sdh || !('peerConnection' in sdh)) {
1774
- // throw new Error('Invalid session description handler');
1775
- // }
1776
- // // Get PeerConnection
1777
- // const pc = (sdh as any).peerConnection as RTCPeerConnection;
1778
- // // Get local audio track and set status
1779
- // const audioSender = pc
1780
- // .getSenders()
1781
- // .find((sender) => sender.track?.kind === 'audio');
1782
- // if (audioSender && audioSender.track) {
1783
- // audioSender.track.enabled = !mute;
1784
- // // Update status and trigger event
1785
- // this.isMute = mute;
1786
- // this.callKit.trigger(KitEvent.KIT_SET_MUTE, mute);
1787
- // } else {
1788
- // throw new Error('No audio track found');
1789
- // }
1790
- // } catch (error) {
1791
- // this.callKit.logger.error('Failed to set mute state', {
1792
- // caller: 'Connect.setMute',
1793
- // type: 'SIP',
1794
- // content: {
1795
- // err: error.message,
1796
- // errCode: ErrorCode.WEBRTC_MUTE_ERROR
1797
- // }
1798
- // });
1799
- // }
1800
- // }
1801
1842
  async setMute(mute) {
1802
1843
  if (this.isMute === mute) {
1803
1844
  this.callKit.logger.warn("Already muted", {
@@ -1931,16 +1972,17 @@ var Socket = class {
1931
1972
  type: "INCALL",
1932
1973
  content: { ev }
1933
1974
  });
1934
- this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
1935
- event: "INCALL_CONNECT_ERROR",
1936
- err: ev
1937
- });
1938
1975
  if (this.socketError) {
1939
1976
  return;
1940
1977
  }
1941
1978
  this.handleDisconnect();
1942
1979
  }
1943
1980
  onError(ev) {
1981
+ this.socketError = true;
1982
+ this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
1983
+ event: "INCALL_CONNECT_ERROR",
1984
+ err: ev
1985
+ });
1944
1986
  this.callKit.logger.error("socket onError", {
1945
1987
  caller: "Socket.onError",
1946
1988
  type: "INCALL",
@@ -1949,7 +1991,6 @@ var Socket = class {
1949
1991
  data: ev
1950
1992
  }
1951
1993
  });
1952
- this.socketError = true;
1953
1994
  }
1954
1995
  confirmAck(data) {
1955
1996
  const { ack, messageId } = data;
@@ -1961,11 +2002,26 @@ var Socket = class {
1961
2002
  }
1962
2003
  onMessage(ev) {
1963
2004
  const data = JSON.parse(ev.data);
2005
+ let content = {};
2006
+ try {
2007
+ if (data.data) {
2008
+ content = JSON.parse(data.data);
2009
+ }
2010
+ } catch (error) {
2011
+ this.callKit.logger.info("socket onMessage parse error", {
2012
+ caller: "Socket.onMessage",
2013
+ type: "INCALL",
2014
+ content: {
2015
+ data: data.data
2016
+ }
2017
+ });
2018
+ content = data.data;
2019
+ }
1964
2020
  this.callKit.logger.info("socket onMessage", {
1965
2021
  caller: "Socket.onMessage",
1966
2022
  type: "INCALL",
1967
2023
  content: {
1968
- data: data.data,
2024
+ data: content,
1969
2025
  event: data.event
1970
2026
  }
1971
2027
  });
@@ -1979,7 +2035,7 @@ var Socket = class {
1979
2035
  caller: "Socket.onMessage",
1980
2036
  type: "INCALL",
1981
2037
  content: {
1982
- data: data.data,
2038
+ data: content,
1983
2039
  event: SocketReceiveEvent.START_CONFIRM
1984
2040
  }
1985
2041
  });
@@ -1990,7 +2046,7 @@ var Socket = class {
1990
2046
  caller: "Socket.onMessage",
1991
2047
  type: "INCALL",
1992
2048
  content: {
1993
- data: data.data,
2049
+ data: content,
1994
2050
  event: SocketReceiveEvent.CALL_SUCCESS
1995
2051
  }
1996
2052
  });
@@ -2000,20 +2056,28 @@ var Socket = class {
2000
2056
  caller: "Socket.onMessage",
2001
2057
  type: "INCALL",
2002
2058
  content: {
2003
- data: data.data,
2059
+ data: content,
2004
2060
  errCode: ErrorCode.SOCKET_CALL_ERROR
2005
2061
  }
2006
2062
  });
2007
2063
  }
2008
2064
  if (data.event === SocketReceiveEvent.CUSTOMER_RINGING) {
2009
2065
  this.callKit.trigger(KitEvent.CALL_RINGING, /* @__PURE__ */ new Date());
2066
+ this.callKit.logger.info(data.msg, {
2067
+ caller: `Socket.onMessage:${data.event}`,
2068
+ type: "INCALL",
2069
+ content: {
2070
+ data: content,
2071
+ event: SocketReceiveEvent.CUSTOMER_RINGING
2072
+ }
2073
+ });
2010
2074
  }
2011
2075
  if (data.event === SocketReceiveEvent.CUSTOMER_PICK_UP) {
2012
2076
  this.callKit.logger.info(data.msg, {
2013
2077
  caller: "Socket.onMessage",
2014
2078
  type: "INCALL",
2015
2079
  content: {
2016
- data: data.data,
2080
+ data: content,
2017
2081
  event: SocketReceiveEvent.CUSTOMER_PICK_UP
2018
2082
  }
2019
2083
  });
@@ -2024,7 +2088,7 @@ var Socket = class {
2024
2088
  caller: "Socket.onMessage",
2025
2089
  type: "INCALL",
2026
2090
  content: {
2027
- data: data.data,
2091
+ data: content,
2028
2092
  event: SocketReceiveEvent.AGENT_PICK_UP
2029
2093
  }
2030
2094
  });
@@ -2032,16 +2096,16 @@ var Socket = class {
2032
2096
  }
2033
2097
  if (data.event === SocketReceiveEvent.CUSTOMER_HANG_UP) {
2034
2098
  this.callKit.logger.info(data.msg, {
2035
- caller: "Socket.onMessage",
2099
+ caller: `Socket.onMessage:${data.event}`,
2036
2100
  type: "INCALL",
2037
2101
  content: {
2038
- data: data.data,
2102
+ data: content,
2039
2103
  event: SocketReceiveEvent.CUSTOMER_HANG_UP
2040
2104
  }
2041
2105
  });
2042
2106
  this.callKit.trigger(KitEvent.CALL_HANG_UP, /* @__PURE__ */ new Date());
2043
- if (data.data?.callUuid) {
2044
- this.callKit.connect.socketTriggerHangup(data.data.callUuid);
2107
+ if (content?.callUuid) {
2108
+ this.callKit.connect.socketTriggerHangup(content.callUuid);
2045
2109
  }
2046
2110
  }
2047
2111
  if (data.event === SocketReceiveEvent.CUSTOMER_NO_ANSWER) {
@@ -2049,30 +2113,32 @@ var Socket = class {
2049
2113
  caller: "Socket.onMessage",
2050
2114
  type: "INCALL",
2051
2115
  content: {
2052
- data: data.data,
2116
+ data: content,
2053
2117
  event: SocketReceiveEvent.CUSTOMER_NO_ANSWER
2054
2118
  }
2055
2119
  });
2056
2120
  this.callKit.trigger(KitEvent.CALL_NO_ANSWER);
2057
- if (data.data?.callUuid) {
2058
- this.callKit.connect.socketTriggerHangup(data.data.callUuid);
2121
+ if (content?.callUuid) {
2122
+ this.callKit.connect.socketTriggerHangup(content.callUuid);
2059
2123
  }
2060
2124
  }
2061
2125
  if (data.event === SocketReceiveEvent.CALL_CDR) {
2062
2126
  this.callKit.logger.info(data.msg, {
2063
- caller: "Socket.onMessage",
2127
+ caller: `Socket.onMessage:${data.event}`,
2128
+ type: "INCALL",
2064
2129
  content: {
2065
- data: data.data,
2130
+ data: content,
2066
2131
  event: SocketReceiveEvent.CALL_CDR
2067
2132
  }
2068
2133
  });
2069
- this.callKit.trigger(KitEvent.CALL_CDR, data.data);
2134
+ this.callKit.trigger(KitEvent.CALL_CDR, content);
2070
2135
  }
2071
2136
  if (data.event === SocketReceiveEvent.STOP_CONFIRM) {
2072
2137
  this.callKit.logger.info(data.msg, {
2073
- caller: "Socket.onMessage",
2138
+ caller: `Socket.onMessage:${data.event}`,
2139
+ type: "INCALL",
2074
2140
  content: {
2075
- data: data.data,
2141
+ data: content,
2076
2142
  event: SocketReceiveEvent.STOP_CONFIRM
2077
2143
  }
2078
2144
  });
@@ -2080,9 +2146,10 @@ var Socket = class {
2080
2146
  if (data.event === SocketReceiveEvent.CLOSE) {
2081
2147
  const { userInfo } = this.callKit.config.getConfig();
2082
2148
  this.callKit.logger.info(data.msg, {
2083
- caller: "Socket.onMessage",
2149
+ caller: `Socket.onMessage:${data.event}`,
2150
+ type: "INCALL",
2084
2151
  content: {
2085
- data: data.data,
2152
+ data: content,
2086
2153
  event: SocketReceiveEvent.CLOSE
2087
2154
  }
2088
2155
  });
@@ -2091,26 +2158,40 @@ var Socket = class {
2091
2158
  });
2092
2159
  }
2093
2160
  if (data.event === SocketReceiveEvent.ERROR) {
2161
+ this.socketError = true;
2162
+ this.callKit.reset();
2094
2163
  this.callKit.logger.error(data.msg, {
2095
- caller: "Socket.onMessage",
2164
+ caller: `Socket.onMessage:${data.event}`,
2165
+ type: "INCALL",
2096
2166
  content: {
2097
2167
  errCode: ErrorCode.SOKET_SERVER_ERROR,
2098
- data: data.data
2168
+ data: content
2099
2169
  }
2100
2170
  });
2171
+ }
2172
+ if (data.event === SocketReceiveEvent.SESSION_ERROR) {
2101
2173
  this.socketError = true;
2102
2174
  this.callKit.reset();
2175
+ this.callKit.logger.error(data.msg, {
2176
+ caller: `Socket.onMessage:${data.event}`,
2177
+ type: "INCALL",
2178
+ content: {
2179
+ data: content,
2180
+ event: SocketReceiveEvent.SESSION_ERROR
2181
+ }
2182
+ });
2103
2183
  }
2104
2184
  if (data.event === SocketReceiveEvent.AGENT_NO_ANSWER) {
2105
2185
  this.callKit.logger.info(data.msg, {
2106
- caller: "Socket.onMessage",
2186
+ caller: `Socket.onMessage:${data.event}`,
2187
+ type: "INCALL",
2107
2188
  content: {
2108
- data: data.data,
2189
+ data: content,
2109
2190
  event: SocketReceiveEvent.AGENT_NO_ANSWER
2110
2191
  }
2111
2192
  });
2112
- if (data.data?.callUuid) {
2113
- this.callKit.connect.socketTriggerHangup(data.data.callUuid);
2193
+ if (content?.callUuid) {
2194
+ this.callKit.connect.socketTriggerHangup(content.callUuid);
2114
2195
  }
2115
2196
  }
2116
2197
  this.callKit.trigger(KitEvent.SERVER_SOCKET_EVENT, data);
@@ -2120,6 +2201,7 @@ var Socket = class {
2120
2201
  this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2121
2202
  event: "INCALL_NOT_CONNECTED"
2122
2203
  });
2204
+ this.callKit.reset();
2123
2205
  this.callKit.logger.error("socket not connected", {
2124
2206
  caller: "Socket.send",
2125
2207
  type: "INCALL",
@@ -2127,10 +2209,9 @@ var Socket = class {
2127
2209
  errCode: ErrorCode.SOCKET_CONNECT_ERROR
2128
2210
  }
2129
2211
  });
2130
- this.callKit.reset();
2131
2212
  return;
2132
2213
  }
2133
- const { userInfo } = this.callKit.config.getConfig();
2214
+ const { userInfo, version } = this.callKit.config.getConfig();
2134
2215
  const { sessionId, extno, agentId } = userInfo;
2135
2216
  if (!sessionId) {
2136
2217
  this.callKit.logger.error("sessionId is empty", {
@@ -2145,6 +2226,7 @@ var Socket = class {
2145
2226
  const msg = {
2146
2227
  event,
2147
2228
  sessionId,
2229
+ version,
2148
2230
  ...message
2149
2231
  };
2150
2232
  if (SocketSendEvent.CALL === event) {
@@ -2160,8 +2242,7 @@ var Socket = class {
2160
2242
  caller: "Socket.send",
2161
2243
  type: "INCALL",
2162
2244
  content: {
2163
- event,
2164
- message
2245
+ ...msg
2165
2246
  }
2166
2247
  });
2167
2248
  switch (event) {
@@ -2174,24 +2255,6 @@ var Socket = class {
2174
2255
  break;
2175
2256
  }
2176
2257
  }
2177
- async sendMessage(event, message) {
2178
- if (!this.isConnected) {
2179
- this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2180
- event: "INCALL_NOT_CONNECTED"
2181
- });
2182
- this.callKit.logger.error("socket not connected", {
2183
- caller: "Socket.sendMessage",
2184
- type: "INCALL",
2185
- content: {
2186
- errCode: ErrorCode.SOCKET_CONNECT_ERROR
2187
- }
2188
- });
2189
- return;
2190
- }
2191
- const { userInfo } = this.callKit.config.getConfig();
2192
- const { sessionId } = userInfo;
2193
- this.ws?.send(JSON.stringify({ event, sessionId, ...message }));
2194
- }
2195
2258
  ping() {
2196
2259
  if (!this.isConnected)
2197
2260
  return;
@@ -2206,6 +2269,11 @@ var Socket = class {
2206
2269
  const now = Date.now();
2207
2270
  const { pingInterval, pingTimeout } = this.socketConfig;
2208
2271
  if (now - this.lastPingTime > pingInterval + pingTimeout) {
2272
+ if (this.ws && this.isConnected) {
2273
+ this.ws.close(4001, "ping timeout");
2274
+ } else {
2275
+ this.reset();
2276
+ }
2209
2277
  this.callKit.logger.error("socket ping timeout", {
2210
2278
  caller: "Socket.ping",
2211
2279
  type: "INCALL",
@@ -2213,11 +2281,6 @@ var Socket = class {
2213
2281
  errCode: ErrorCode.SOCKET_PING_TIMEOUT
2214
2282
  }
2215
2283
  });
2216
- if (this.ws && this.isConnected) {
2217
- this.ws.close(4001, "ping timeout");
2218
- } else {
2219
- this.reset();
2220
- }
2221
2284
  }
2222
2285
  }
2223
2286
  checkPing() {
@@ -2253,6 +2316,10 @@ var Socket = class {
2253
2316
  }
2254
2317
  attemptReconnect() {
2255
2318
  if (this.reconnectAttempts >= this.socketConfig.maxAttempts) {
2319
+ this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2320
+ event: "INCALL_RECONNECT_ERROR"
2321
+ });
2322
+ this.reset();
2256
2323
  this.callKit.logger.error("Maximum reconnection attempts reached", {
2257
2324
  caller: "Socket.attemptReconnect",
2258
2325
  type: "INCALL",
@@ -2261,10 +2328,6 @@ var Socket = class {
2261
2328
  reconnectAttempts: this.reconnectAttempts
2262
2329
  }
2263
2330
  });
2264
- this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2265
- event: "INCALL_RECONNECT_ERROR"
2266
- });
2267
- this.reset();
2268
2331
  return;
2269
2332
  }
2270
2333
  if (this.reconnectAttempts === 0) {
@@ -2557,9 +2620,16 @@ var CallKit = class {
2557
2620
  */
2558
2621
  async setUserStatus(status) {
2559
2622
  const { agentId } = this.config.getConfig().userInfo;
2623
+ this.logger.info("setUserStatus", {
2624
+ caller: "CallKit.setUserStatus",
2625
+ content: {
2626
+ status,
2627
+ agentId
2628
+ }
2629
+ });
2560
2630
  await this.api.updateUserStatus({
2561
2631
  agentId,
2562
- status
2632
+ userStatus: status
2563
2633
  });
2564
2634
  }
2565
2635
  async reset() {
@@ -2609,13 +2679,19 @@ var CallKit = class {
2609
2679
  }
2610
2680
  });
2611
2681
  }
2612
- trigger(event, data) {
2682
+ trigger(event, data, noLog = false) {
2683
+ if (!noLog) {
2684
+ this.logger.info(`Trigger Event: ${event}`, {
2685
+ caller: "CallKit.trigger",
2686
+ content: data
2687
+ });
2688
+ }
2613
2689
  this.listener.forEach((item) => {
2614
2690
  if (item.event === event) {
2615
2691
  try {
2616
2692
  item.callback(data);
2617
2693
  } catch (err) {
2618
- this.logger.error("Event callback error:", err);
2694
+ this.logger.error("Event callback error:", err, true);
2619
2695
  }
2620
2696
  }
2621
2697
  });