@koi-design/callkit 2.0.2 → 2.0.3

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
@@ -26,20 +26,21 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  ));
27
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
28
 
29
- // package/index.ts
30
- var package_exports = {};
31
- __export(package_exports, {
29
+ // core/index.ts
30
+ var core_exports = {};
31
+ __export(core_exports, {
32
32
  CallKit: () => CallKit
33
33
  });
34
- module.exports = __toCommonJS(package_exports);
34
+ module.exports = __toCommonJS(core_exports);
35
35
  var import_blueimp_md5 = __toESM(require("blueimp-md5"));
36
36
 
37
- // package/axios.ts
37
+ // core/axios.ts
38
38
  var import_axios = __toESM(require("axios"));
39
39
  var instance = import_axios.default.create({
40
40
  headers: {
41
41
  "Content-Type": "application/x-www-form-urlencoded"
42
- }
42
+ },
43
+ timeout: 6e4
43
44
  });
44
45
  instance.interceptors.request.use((config) => config);
45
46
  instance.interceptors.response.use(
@@ -49,25 +50,49 @@ instance.interceptors.response.use(
49
50
  var request = (config) => instance.request(config);
50
51
  var axios_default = request;
51
52
 
52
- // package/api.ts
53
+ // core/api.ts
53
54
  var Api = class {
54
55
  callKit;
55
56
  constructor(callKit) {
56
57
  this.callKit = callKit;
57
58
  }
59
+ isLogining = false;
60
+ isLoginOuting = false;
58
61
  async login(params) {
59
- return this.post({
60
- url: "/auth/agentUser/login",
61
- method: "post",
62
- data: params
63
- });
62
+ if (this.isLogining) {
63
+ return;
64
+ }
65
+ this.isLogining = true;
66
+ try {
67
+ const res = await this.post({
68
+ url: "/auth/agentUser/login",
69
+ method: "post",
70
+ data: params
71
+ });
72
+ this.isLogining = false;
73
+ return res;
74
+ } catch (error) {
75
+ this.isLogining = false;
76
+ throw error;
77
+ }
64
78
  }
65
79
  async loginOut(params) {
66
- return this.post({
67
- url: "/auth/agentUser/loginOut",
68
- method: "post",
69
- data: params
70
- });
80
+ if (this.isLoginOuting) {
81
+ return;
82
+ }
83
+ this.isLoginOuting = true;
84
+ try {
85
+ const res = await this.post({
86
+ url: "/auth/agentUser/loginOut",
87
+ method: "post",
88
+ data: params
89
+ });
90
+ this.isLoginOuting = false;
91
+ return res;
92
+ } catch (error) {
93
+ this.isLoginOuting = false;
94
+ throw error;
95
+ }
71
96
  }
72
97
  async trackLogs(log) {
73
98
  return this.post(
@@ -130,7 +155,7 @@ var Api = class {
130
155
  }
131
156
  };
132
157
 
133
- // package/const.ts
158
+ // core/const.ts
134
159
  var CallStatus = {
135
160
  /**
136
161
  * Initial state/Hang up
@@ -479,7 +504,7 @@ var trackLogsDefaultConfig = {
479
504
  maxSize: 8192
480
505
  };
481
506
 
482
- // package/call.ts
507
+ // core/call.ts
483
508
  var Call = class {
484
509
  callKit;
485
510
  constructor(callKit) {
@@ -620,20 +645,19 @@ var Call = class {
620
645
  // package.json
621
646
  var package_default = {
622
647
  name: "@koi-design/callkit",
623
- version: "2.0.2",
648
+ version: "2.0.3",
624
649
  description: "callkit",
625
650
  author: "koi",
626
651
  license: "ISC",
627
652
  scripts: {
628
653
  build: "tsup",
629
- start: "tsup --watch",
630
654
  dev: "vite",
631
- lint: "eslint -c .eslintrc.js --ext .jsx,.js,.tsx,.ts ./package --fix",
632
- prepare: "husky install",
655
+ lint: "eslint -c ../../.eslintrc.js --ext .jsx,.js,.tsx,.ts ./package --fix",
633
656
  release: "tsup && node scripts/pkg.js"
634
657
  },
635
658
  exports: {
636
659
  ".": {
660
+ types: "./dist/index.d.ts",
637
661
  require: "./dist/index.js",
638
662
  import: "./dist/index.mjs"
639
663
  }
@@ -670,7 +694,7 @@ var package_default = {
670
694
  }
671
695
  };
672
696
 
673
- // package/config.ts
697
+ // core/config.ts
674
698
  var Config = class {
675
699
  callKit;
676
700
  constructor(callKit) {
@@ -686,6 +710,7 @@ var Config = class {
686
710
  socket: "",
687
711
  userInfo: {
688
712
  wsUrl: "",
713
+ logGather: false,
689
714
  sessionId: "",
690
715
  // User
691
716
  username: "",
@@ -740,7 +765,8 @@ var Config = class {
740
765
  fsPort: "",
741
766
  iceInfo: [],
742
767
  iceGatheringTimeout: this.config.userInfo.iceGatheringTimeout,
743
- encryptionMethod: EncryptionMethod.INTERNAL
768
+ encryptionMethod: EncryptionMethod.INTERNAL,
769
+ logGather: false
744
770
  };
745
771
  this.callKit.trigger(KitEvent.KIT_LOGIN_CHANGE, false);
746
772
  }
@@ -773,7 +799,7 @@ var Config = class {
773
799
  }
774
800
  };
775
801
 
776
- // package/logger.ts
802
+ // core/logger.ts
777
803
  var import_json_stringify_safe = __toESM(require("json-stringify-safe"));
778
804
  function getLevel(level) {
779
805
  return LoggerLevelMap[level];
@@ -910,10 +936,10 @@ var Logger = class {
910
936
  }
911
937
  };
912
938
 
913
- // package/connect.ts
939
+ // core/connect.ts
914
940
  var import_sip = require("sip.js");
915
941
 
916
- // package/utils.ts
942
+ // core/utils.ts
917
943
  var formatGetInviteData = (inviteData) => {
918
944
  const extendInfoStr = inviteData["x-antaios-manual-extend_info"] || inviteData["x-antaios-manual-extend-info"];
919
945
  let extendInfoObj = null;
@@ -928,7 +954,7 @@ var formatGetInviteData = (inviteData) => {
928
954
  }
929
955
  };
930
956
 
931
- // package/connect.ts
957
+ // core/connect.ts
932
958
  var DEFAULT_RECONNECT_CONFIG = {
933
959
  maxAttempts: 3,
934
960
  delay: 500
@@ -1458,7 +1484,7 @@ var Connect = class {
1458
1484
  this.setCallId(inviteData.callUuid);
1459
1485
  } else {
1460
1486
  this.setCallId(null);
1461
- this.callKit.logger.error("call id is not exist", {
1487
+ this.callKit.logger.warn("call id is not exist", {
1462
1488
  caller: "Connect.register.onInvite",
1463
1489
  content: {
1464
1490
  inviteData
@@ -1522,9 +1548,7 @@ var Connect = class {
1522
1548
  onDisconnect: (error) => {
1523
1549
  console.log("onDisconnect", error);
1524
1550
  if (error) {
1525
- this.startReconnectTimer();
1526
- } else {
1527
- this.callKit.logger.info("SIP User Agent Disconnected", {
1551
+ this.callKit.logger.info("SIP User Agent Disconnected with error", {
1528
1552
  caller: "Connect.register",
1529
1553
  type: "SIP",
1530
1554
  content: {
@@ -1532,6 +1556,13 @@ var Connect = class {
1532
1556
  errCode: ErrorCode.WEBRTC_USER_AGENT_ERROR
1533
1557
  }
1534
1558
  });
1559
+ this.startReconnectTimer();
1560
+ } else {
1561
+ this.callKit.logger.info("SIP User Agent Disconnected", {
1562
+ caller: "Connect.register",
1563
+ type: "SIP",
1564
+ content: {}
1565
+ });
1535
1566
  }
1536
1567
  },
1537
1568
  onRegister: () => {
@@ -1640,6 +1671,15 @@ var Connect = class {
1640
1671
  }
1641
1672
  });
1642
1673
  });
1674
+ await this.userAgent?.stop().catch((err) => {
1675
+ this.callKit.logger.warn(err, {
1676
+ caller: "Connect.unregister",
1677
+ type: "SIP",
1678
+ content: {
1679
+ errCode: ErrorCode.WEBRTC_CANCEL_REGISTER_ERROR
1680
+ }
1681
+ });
1682
+ });
1643
1683
  }
1644
1684
  async call(callback) {
1645
1685
  this.callKit.logger.info("connect call", {
@@ -1874,14 +1914,17 @@ var Connect = class {
1874
1914
  }
1875
1915
  };
1876
1916
 
1877
- // package/socket.ts
1917
+ // core/socket.ts
1878
1918
  var RECONNECT_CONFIG = {
1879
1919
  enabled: true,
1880
1920
  maxAttempts: 3,
1881
1921
  delay: 500,
1882
1922
  backoffMultiplier: 1.5,
1883
1923
  pingInterval: 3e4,
1884
- pingTimeout: 5e3
1924
+ pingTimeout: 5e3,
1925
+ maxConnectsPerWindow: 5,
1926
+ timeWindow: 6e4
1927
+ // 60 seconds
1885
1928
  };
1886
1929
  var Socket = class {
1887
1930
  callKit;
@@ -1896,6 +1939,8 @@ var Socket = class {
1896
1939
  isReconnecting = false;
1897
1940
  reconnectAttempts = 0;
1898
1941
  socketError = false;
1942
+ // Track connection attempts for rate limiting
1943
+ connectAttemptTimes = [];
1899
1944
  constructor(callKit) {
1900
1945
  this.callKit = callKit;
1901
1946
  const { reconnect } = this.callKit.config.getConfig();
@@ -1936,8 +1981,8 @@ var Socket = class {
1936
1981
  this.ws.onerror = null;
1937
1982
  this.ws.onmessage = null;
1938
1983
  }
1939
- if (this.ws.readyState === WebSocket.CONNECTING || this.ws.readyState === WebSocket.OPEN) {
1940
- this.ws.close();
1984
+ if (this.ws?.readyState === WebSocket.CONNECTING || this.ws?.readyState === WebSocket.OPEN) {
1985
+ this.ws?.close(1e3, "socket close");
1941
1986
  this.callKit.logger.info("socket clear", {
1942
1987
  caller: "Socket.clearWebSocket",
1943
1988
  type: "INCALL",
@@ -1951,6 +1996,7 @@ var Socket = class {
1951
1996
  if (this.ws) {
1952
1997
  this.clearWebSocket();
1953
1998
  }
1999
+ this.connectAttemptTimes.push(Date.now());
1954
2000
  this.ws = new WebSocket(socketUrl);
1955
2001
  this.ws.onopen = (ev) => this.onOpen(ev);
1956
2002
  this.ws.onclose = (ev) => this.onClose(ev);
@@ -2328,6 +2374,7 @@ var Socket = class {
2328
2374
  this.lastPingTime = void 0;
2329
2375
  this.satrtConfirm = false;
2330
2376
  this.socketError = false;
2377
+ this.connectAttemptTimes = [];
2331
2378
  this.clearWebSocket();
2332
2379
  }
2333
2380
  attemptReconnect() {
@@ -2335,6 +2382,29 @@ var Socket = class {
2335
2382
  clearTimeout(this.reconnectTimer);
2336
2383
  this.reconnectTimer = void 0;
2337
2384
  }
2385
+ const { maxConnectsPerWindow, timeWindow } = this.socketConfig;
2386
+ if (maxConnectsPerWindow && timeWindow) {
2387
+ const now = Date.now();
2388
+ this.connectAttemptTimes = this.connectAttemptTimes.filter(
2389
+ (time) => now - time < timeWindow
2390
+ );
2391
+ if (this.connectAttemptTimes.length >= maxConnectsPerWindow) {
2392
+ this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2393
+ event: "INCALL_RECONNECT_ERROR"
2394
+ });
2395
+ this.callKit.logger.warn("Connection rate limit exceeded", {
2396
+ caller: "Socket.attemptReconnect",
2397
+ type: "INCALL",
2398
+ content: {
2399
+ errCode: ErrorCode.SOCKET_RECONNECT_FAILED,
2400
+ attempts: this.connectAttemptTimes.length,
2401
+ maxConnectsPerWindow,
2402
+ timeWindow
2403
+ }
2404
+ });
2405
+ return;
2406
+ }
2407
+ }
2338
2408
  if (this.reconnectAttempts >= this.socketConfig.maxAttempts) {
2339
2409
  this.callKit.trigger(KitEvent.INCALL_CONNECT_EVENT, {
2340
2410
  event: "INCALL_RECONNECT_ERROR"
@@ -2377,7 +2447,7 @@ var Socket = class {
2377
2447
  }
2378
2448
  };
2379
2449
 
2380
- // package/index.ts
2450
+ // core/index.ts
2381
2451
  var CallKit = class {
2382
2452
  api;
2383
2453
  config;