@djangocfg/api 2.1.618 → 2.1.621

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/clients.cjs CHANGED
@@ -376,6 +376,29 @@ var REFRESH_KEY = "cfg.auth.refresh_token";
376
376
  var API_KEY_KEY = "cfg.auth.api_key";
377
377
  var storage = true ? cfgStorage : createStorage2("cfg");
378
378
  var isBrowser = typeof window !== "undefined";
379
+ function trace(ev, fields) {
380
+ try {
381
+ const g = globalThis;
382
+ const sink = g.__cfgAuthTrace;
383
+ if (sink) {
384
+ sink(ev, fields);
385
+ return;
386
+ }
387
+ const queue = g.__cfgAuthTraceQ ?? [];
388
+ g.__cfgAuthTraceQ = queue;
389
+ if (queue.length < 100) queue.push([Date.now(), ev, fields]);
390
+ } catch {
391
+ }
392
+ }
393
+ __name(trace, "trace");
394
+ function pathOf(url) {
395
+ try {
396
+ return new URL(url, "http://x").pathname;
397
+ } catch {
398
+ return "";
399
+ }
400
+ }
401
+ __name(pathOf, "pathOf");
379
402
  function secondsUntilExp(token) {
380
403
  const exp = jwtExpMs(token);
381
404
  return exp === null ? void 0 : Math.max(1, Math.floor((exp - Date.now()) / 1e3));
@@ -535,7 +558,10 @@ __name(scheduleExpiryFlip, "scheduleExpiryFlip");
535
558
  function notifySessionChanged() {
536
559
  const next = computeSnapshot();
537
560
  const changed = next.status !== _snapshot.status || next.accessExpiresAt !== _snapshot.accessExpiresAt;
538
- if (changed) _snapshot = next;
561
+ if (changed) {
562
+ _snapshot = next;
563
+ trace("store.snapshot", { status: next.status });
564
+ }
539
565
  scheduleExpiryFlip();
540
566
  if (!changed) return;
541
567
  for (const listener of Array.from(_sessionListeners)) {
@@ -618,6 +644,7 @@ var auth = {
618
644
  return _storage.get(ACCESS_KEY);
619
645
  },
620
646
  setToken(token) {
647
+ trace("store.setToken", { present: token !== null });
621
648
  _storage.set(ACCESS_KEY, token);
622
649
  notifySessionChanged();
623
650
  },
@@ -625,10 +652,12 @@ var auth = {
625
652
  return _storage.get(REFRESH_KEY);
626
653
  },
627
654
  setRefreshToken(token) {
655
+ trace("store.setRefreshToken", { present: token !== null });
628
656
  _storage.set(REFRESH_KEY, token);
629
657
  notifySessionChanged();
630
658
  },
631
659
  clearTokens() {
660
+ trace("store.clearTokens");
632
661
  for (const mode of ["localStorage", "sessionStorage", "cookie"]) {
633
662
  const backend = backendFor(mode);
634
663
  backend.set(ACCESS_KEY, null);
@@ -651,6 +680,7 @@ var auth = {
651
680
  * rotation); `refresh: null` explicitly drops it.
652
681
  */
653
682
  setSession(tokens) {
683
+ trace("store.setSession", { refresh: tokens.refresh === void 0 ? "kept" : tokens.refresh === null ? "dropped" : "set" });
654
684
  _storage.set(ACCESS_KEY, tokens.access);
655
685
  if (tokens.refresh !== void 0) _storage.set(REFRESH_KEY, tokens.refresh);
656
686
  notifySessionChanged();
@@ -789,7 +819,11 @@ async function tryRefresh() {
789
819
  const refresh = auth.getRefreshToken();
790
820
  if (!refresh) return null;
791
821
  const result = await _refreshHandler(refresh);
792
- if (!result?.access) return null;
822
+ if (!result?.access) {
823
+ trace("refresh", { ok: false, why: "no-access" });
824
+ return null;
825
+ }
826
+ trace("refresh", { ok: true, rotated: Boolean(result.refresh) });
793
827
  auth.setToken(result.access);
794
828
  if (result.refresh) auth.setRefreshToken(result.refresh);
795
829
  return result.access;
@@ -802,6 +836,7 @@ async function tryRefresh() {
802
836
  }
803
837
  return await runRefresh();
804
838
  } catch {
839
+ trace("refresh", { ok: false, why: "threw" });
805
840
  return null;
806
841
  } finally {
807
842
  _refreshInflight = null;
@@ -810,7 +845,8 @@ async function tryRefresh() {
810
845
  return _refreshInflight;
811
846
  }
812
847
  __name(tryRefresh, "tryRefresh");
813
- function expireSession(response) {
848
+ function expireSession(response, why) {
849
+ trace("store.expire", { why, status: response.status, path: pathOf(response.url), handlers: _sessionExpiredHandlers.size });
814
850
  auth.clearTokens();
815
851
  for (const cb of Array.from(_sessionExpiredHandlers)) {
816
852
  try {
@@ -952,13 +988,17 @@ function installAuthOnClient(client2) {
952
988
  });
953
989
  client2.interceptors.response.use(async (response, request) => {
954
990
  if (response.status !== 401) return response;
991
+ if (/\/accounts\/(otp|oauth|login|register|token)\b/.test(request.url)) {
992
+ trace("401.passthrough", { path: pathOf(request.url) });
993
+ return response;
994
+ }
955
995
  if (request.headers.get(RETRY_MARKER)) {
956
- expireSession(response);
996
+ expireSession(response, "retry-marker");
957
997
  return response;
958
998
  }
959
999
  const newToken = await tryRefresh();
960
1000
  if (!newToken) {
961
- expireSession(response);
1001
+ expireSession(response, "refresh-failed");
962
1002
  return response;
963
1003
  }
964
1004
  const retry = request.clone();
@@ -970,7 +1010,7 @@ function installAuthOnClient(client2) {
970
1010
  }
971
1011
  try {
972
1012
  const retried = await fetch(retry);
973
- if (retried.status === 401) expireSession(retried);
1013
+ if (retried.status === 401) expireSession(retried, "retry-401");
974
1014
  return retried;
975
1015
  } catch {
976
1016
  return response;