@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.mjs CHANGED
@@ -349,6 +349,29 @@ var REFRESH_KEY = "cfg.auth.refresh_token";
349
349
  var API_KEY_KEY = "cfg.auth.api_key";
350
350
  var storage = true ? cfgStorage : createStorage2("cfg");
351
351
  var isBrowser = typeof window !== "undefined";
352
+ function trace(ev, fields) {
353
+ try {
354
+ const g = globalThis;
355
+ const sink = g.__cfgAuthTrace;
356
+ if (sink) {
357
+ sink(ev, fields);
358
+ return;
359
+ }
360
+ const queue = g.__cfgAuthTraceQ ?? [];
361
+ g.__cfgAuthTraceQ = queue;
362
+ if (queue.length < 100) queue.push([Date.now(), ev, fields]);
363
+ } catch {
364
+ }
365
+ }
366
+ __name(trace, "trace");
367
+ function pathOf(url) {
368
+ try {
369
+ return new URL(url, "http://x").pathname;
370
+ } catch {
371
+ return "";
372
+ }
373
+ }
374
+ __name(pathOf, "pathOf");
352
375
  function secondsUntilExp(token) {
353
376
  const exp = jwtExpMs(token);
354
377
  return exp === null ? void 0 : Math.max(1, Math.floor((exp - Date.now()) / 1e3));
@@ -508,7 +531,10 @@ __name(scheduleExpiryFlip, "scheduleExpiryFlip");
508
531
  function notifySessionChanged() {
509
532
  const next = computeSnapshot();
510
533
  const changed = next.status !== _snapshot.status || next.accessExpiresAt !== _snapshot.accessExpiresAt;
511
- if (changed) _snapshot = next;
534
+ if (changed) {
535
+ _snapshot = next;
536
+ trace("store.snapshot", { status: next.status });
537
+ }
512
538
  scheduleExpiryFlip();
513
539
  if (!changed) return;
514
540
  for (const listener of Array.from(_sessionListeners)) {
@@ -591,6 +617,7 @@ var auth = {
591
617
  return _storage.get(ACCESS_KEY);
592
618
  },
593
619
  setToken(token) {
620
+ trace("store.setToken", { present: token !== null });
594
621
  _storage.set(ACCESS_KEY, token);
595
622
  notifySessionChanged();
596
623
  },
@@ -598,10 +625,12 @@ var auth = {
598
625
  return _storage.get(REFRESH_KEY);
599
626
  },
600
627
  setRefreshToken(token) {
628
+ trace("store.setRefreshToken", { present: token !== null });
601
629
  _storage.set(REFRESH_KEY, token);
602
630
  notifySessionChanged();
603
631
  },
604
632
  clearTokens() {
633
+ trace("store.clearTokens");
605
634
  for (const mode of ["localStorage", "sessionStorage", "cookie"]) {
606
635
  const backend = backendFor(mode);
607
636
  backend.set(ACCESS_KEY, null);
@@ -624,6 +653,7 @@ var auth = {
624
653
  * rotation); `refresh: null` explicitly drops it.
625
654
  */
626
655
  setSession(tokens) {
656
+ trace("store.setSession", { refresh: tokens.refresh === void 0 ? "kept" : tokens.refresh === null ? "dropped" : "set" });
627
657
  _storage.set(ACCESS_KEY, tokens.access);
628
658
  if (tokens.refresh !== void 0) _storage.set(REFRESH_KEY, tokens.refresh);
629
659
  notifySessionChanged();
@@ -762,7 +792,11 @@ async function tryRefresh() {
762
792
  const refresh = auth.getRefreshToken();
763
793
  if (!refresh) return null;
764
794
  const result = await _refreshHandler(refresh);
765
- if (!result?.access) return null;
795
+ if (!result?.access) {
796
+ trace("refresh", { ok: false, why: "no-access" });
797
+ return null;
798
+ }
799
+ trace("refresh", { ok: true, rotated: Boolean(result.refresh) });
766
800
  auth.setToken(result.access);
767
801
  if (result.refresh) auth.setRefreshToken(result.refresh);
768
802
  return result.access;
@@ -775,6 +809,7 @@ async function tryRefresh() {
775
809
  }
776
810
  return await runRefresh();
777
811
  } catch {
812
+ trace("refresh", { ok: false, why: "threw" });
778
813
  return null;
779
814
  } finally {
780
815
  _refreshInflight = null;
@@ -783,7 +818,8 @@ async function tryRefresh() {
783
818
  return _refreshInflight;
784
819
  }
785
820
  __name(tryRefresh, "tryRefresh");
786
- function expireSession(response) {
821
+ function expireSession(response, why) {
822
+ trace("store.expire", { why, status: response.status, path: pathOf(response.url), handlers: _sessionExpiredHandlers.size });
787
823
  auth.clearTokens();
788
824
  for (const cb of Array.from(_sessionExpiredHandlers)) {
789
825
  try {
@@ -925,13 +961,17 @@ function installAuthOnClient(client2) {
925
961
  });
926
962
  client2.interceptors.response.use(async (response, request) => {
927
963
  if (response.status !== 401) return response;
964
+ if (/\/accounts\/(otp|oauth|login|register|token)\b/.test(request.url)) {
965
+ trace("401.passthrough", { path: pathOf(request.url) });
966
+ return response;
967
+ }
928
968
  if (request.headers.get(RETRY_MARKER)) {
929
- expireSession(response);
969
+ expireSession(response, "retry-marker");
930
970
  return response;
931
971
  }
932
972
  const newToken = await tryRefresh();
933
973
  if (!newToken) {
934
- expireSession(response);
974
+ expireSession(response, "refresh-failed");
935
975
  return response;
936
976
  }
937
977
  const retry = request.clone();
@@ -943,7 +983,7 @@ function installAuthOnClient(client2) {
943
983
  }
944
984
  try {
945
985
  const retried = await fetch(retry);
946
- if (retried.status === 401) expireSession(retried);
986
+ if (retried.status === 401) expireSession(retried, "retry-401");
947
987
  return retried;
948
988
  } catch {
949
989
  return response;