mitra-interactions-sdk 1.0.60-beta.28 → 1.0.60-beta.29

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
@@ -354,20 +354,23 @@ async function handleResponse(response) {
354
354
  }
355
355
  return data;
356
356
  }
357
+ function withFreshAuth(init) {
358
+ const config = getConfig();
359
+ const headers = { ...init.headers };
360
+ if (config.token) headers["Authorization"] = formatToken(config.token);
361
+ return { ...init, headers };
362
+ }
357
363
  async function fetchWithRefresh(url, init) {
358
364
  const fetchFn = getFetch2();
365
+ if (isTokenExpiring()) {
366
+ const refreshed = await tryRefreshToken();
367
+ if (refreshed) init = withFreshAuth(init);
368
+ }
359
369
  const response = await fetchFn(url, init);
360
370
  if (response.status === 401) {
361
371
  const refreshed = await tryRefreshToken();
362
372
  if (refreshed) {
363
- const newHeaders = { ...buildHeaders() };
364
- const oldHeaders = init.headers;
365
- if (oldHeaders) {
366
- for (const [k, v] of Object.entries(oldHeaders)) {
367
- if (k !== "Authorization") newHeaders[k] = v;
368
- }
369
- }
370
- const retryResponse = await fetchFn(url, { ...init, headers: newHeaders });
373
+ const retryResponse = await fetchFn(url, withFreshAuth(init));
371
374
  return handleResponse(retryResponse);
372
375
  }
373
376
  }
@@ -658,8 +661,25 @@ var AgentTaskSession = class {
658
661
  if (!this._taskId) {
659
662
  return Promise.reject(new Error("AgentTaskSession: sem taskId \u2014 task ainda n\xE3o criada."));
660
663
  }
661
- const url = getTaskWsUrl(this._taskId);
662
- this._wsConnectPromise = new Promise((resolve, reject) => {
664
+ this._wsConnectPromise = (async () => {
665
+ try {
666
+ if (isTokenExpiring()) await tryRefreshToken();
667
+ try {
668
+ return await this._connectWs(this._taskId);
669
+ } catch (err) {
670
+ const refreshed = await tryRefreshToken();
671
+ if (!refreshed) throw err;
672
+ return await this._connectWs(this._taskId);
673
+ }
674
+ } finally {
675
+ this._wsConnectPromise = null;
676
+ }
677
+ })();
678
+ return this._wsConnectPromise;
679
+ }
680
+ _connectWs(taskId) {
681
+ const url = getTaskWsUrl(taskId);
682
+ return new Promise((resolve, reject) => {
663
683
  const socket = new WebSocket(url);
664
684
  let opened = false;
665
685
  const timer = setTimeout(() => {
@@ -668,7 +688,6 @@ var AgentTaskSession = class {
668
688
  socket.close();
669
689
  } catch (e) {
670
690
  }
671
- this._wsConnectPromise = null;
672
691
  reject(new Error("Agent Chat: timeout ao conectar no WebSocket da task"));
673
692
  }
674
693
  }, 15e3);
@@ -676,13 +695,11 @@ var AgentTaskSession = class {
676
695
  opened = true;
677
696
  clearTimeout(timer);
678
697
  this._ws = socket;
679
- this._wsConnectPromise = null;
680
698
  resolve(socket);
681
699
  };
682
700
  socket.onerror = () => {
683
701
  if (!opened) {
684
702
  clearTimeout(timer);
685
- this._wsConnectPromise = null;
686
703
  reject(new Error("Agent Chat: erro ao conectar no WebSocket da task"));
687
704
  }
688
705
  };
@@ -699,7 +716,6 @@ var AgentTaskSession = class {
699
716
  this._handleWsEvent(msg);
700
717
  };
701
718
  });
702
- return this._wsConnectPromise;
703
719
  }
704
720
  // ── Eventos do stream (WsOutboundMessage { type, payload, timestamp }) ──
705
721
  _handleWsEvent(msg) {
@@ -1063,20 +1079,22 @@ function createMitraInstance(initialConfig) {
1063
1079
  return false;
1064
1080
  }
1065
1081
  }
1082
+ function withFreshAuth2(init) {
1083
+ const headers = { ...init.headers };
1084
+ if (_config.token) headers["Authorization"] = formatToken2(_config.token);
1085
+ return { ...init, headers };
1086
+ }
1066
1087
  async function fetchWithRefresh2(url, init) {
1067
1088
  const fetchFn = getFetch3();
1089
+ if (isTokenExpiring(_config.token)) {
1090
+ const refreshed = await tryRefreshToken2();
1091
+ if (refreshed) init = withFreshAuth2(init);
1092
+ }
1068
1093
  const response = await fetchFn(url, init);
1069
1094
  if (response.status === 401) {
1070
1095
  const refreshed = await tryRefreshToken2();
1071
1096
  if (refreshed) {
1072
- const newHeaders = { ...authHeaders() };
1073
- const oldHeaders = init.headers;
1074
- if (oldHeaders) {
1075
- for (const [k, v] of Object.entries(oldHeaders)) {
1076
- if (k !== "Authorization") newHeaders[k] = v;
1077
- }
1078
- }
1079
- const retryResponse = await fetchFn(url, { ...init, headers: newHeaders });
1097
+ const retryResponse = await fetchFn(url, withFreshAuth2(init));
1080
1098
  return handleResponse2(retryResponse);
1081
1099
  }
1082
1100
  }
@@ -1292,6 +1310,14 @@ function hasAppScope(token) {
1292
1310
  if (!payload) return true;
1293
1311
  return typeof payload.app_id === "string" && payload.app_id.length > 0;
1294
1312
  }
1313
+ function isTokenExpiring(token, skewMs = 3e4) {
1314
+ const t = token != null ? token : globalConfig == null ? void 0 : globalConfig.token;
1315
+ if (!t) return false;
1316
+ const payload = decodeJwtPayload(t);
1317
+ const exp = payload == null ? void 0 : payload.exp;
1318
+ if (typeof exp !== "number") return false;
1319
+ return exp * 1e3 - Date.now() < skewMs;
1320
+ }
1295
1321
  function clearRefreshToken() {
1296
1322
  if (globalConfig) {
1297
1323
  const { refreshToken: _drop, ...rest } = globalConfig;