@palbase/web 4.0.1 → 4.0.2

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.
Files changed (38) hide show
  1. package/dist/{analytics-facade-DwOtlXPP.d.cts → analytics-facade-CaluA4bW.d.cts} +26 -1
  2. package/dist/{analytics-facade-Nk6J9Ncm.d.ts → analytics-facade-Cp3d4QI-.d.ts} +26 -1
  3. package/dist/{chunk-NXEPAEF5.js → chunk-CFDU23TB.js} +3 -3
  4. package/dist/chunk-CFDU23TB.js.map +1 -0
  5. package/dist/{chunk-TGDS6VMT.js → chunk-TW6YN354.js} +58 -6
  6. package/dist/chunk-TW6YN354.js.map +1 -0
  7. package/dist/gen/cli.cjs +5 -5
  8. package/dist/gen/cli.cjs.map +1 -1
  9. package/dist/gen/cli.js +5 -5
  10. package/dist/gen/cli.js.map +1 -1
  11. package/dist/index.cjs +55 -3
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +3 -3
  14. package/dist/index.d.ts +3 -3
  15. package/dist/index.js +2 -2
  16. package/dist/internal.cjs +57 -5
  17. package/dist/internal.cjs.map +1 -1
  18. package/dist/internal.d.cts +3 -3
  19. package/dist/internal.d.ts +3 -3
  20. package/dist/internal.js +2 -2
  21. package/dist/next/client.cjs +57 -5
  22. package/dist/next/client.cjs.map +1 -1
  23. package/dist/next/client.js +2 -2
  24. package/dist/next/index.cjs +58 -6
  25. package/dist/next/index.cjs.map +1 -1
  26. package/dist/next/index.d.cts +2 -2
  27. package/dist/next/index.d.ts +2 -2
  28. package/dist/next/index.js +2 -2
  29. package/dist/{pb-FG_nV7NR.d.ts → pb-DUK5qy81.d.ts} +1 -1
  30. package/dist/{pb-C9v5dEO6.d.cts → pb-DvV6ftmf.d.cts} +1 -1
  31. package/dist/react/index.cjs +10 -2
  32. package/dist/react/index.cjs.map +1 -1
  33. package/dist/react/index.d.cts +1 -1
  34. package/dist/react/index.d.ts +1 -1
  35. package/dist/react/index.js +2 -2
  36. package/package.json +2 -2
  37. package/dist/chunk-NXEPAEF5.js.map +0 -1
  38. package/dist/chunk-TGDS6VMT.js.map +0 -1
@@ -6,8 +6,8 @@ import {
6
6
  import {
7
7
  __configure,
8
8
  getRuntime
9
- } from "../chunk-TGDS6VMT.js";
10
- import "../chunk-NXEPAEF5.js";
9
+ } from "../chunk-TW6YN354.js";
10
+ import "../chunk-CFDU23TB.js";
11
11
  import "../chunk-PZ5AY32C.js";
12
12
 
13
13
  // src/next/client.ts
@@ -57,8 +57,8 @@ function asWireAuthResult(raw) {
57
57
  }
58
58
 
59
59
  // src/api-key.ts
60
- var API_KEY_RE = /^pb_([a-z0-9]+)_[cs][A-Za-z0-9]{20}$/;
61
- var PUBLISHABLE_API_KEY_RE = /^pb_([a-z0-9]+)_c[A-Za-z0-9]{20}$/;
60
+ var API_KEY_RE = /^pb_([a-z0-9]{4,24})_[cs][A-Za-z0-9]{20}$/;
61
+ var PUBLISHABLE_API_KEY_RE = /^pb_([a-z0-9]{4,24})_c[A-Za-z0-9]{20}$/;
62
62
  function environmentRefFromApiKey(apiKey) {
63
63
  const m = API_KEY_RE.exec(apiKey);
64
64
  return m ? m[1] ?? "" : "";
@@ -168,7 +168,7 @@ var PalbaseError = class extends Error {
168
168
  }
169
169
  };
170
170
  var PALBASE_DEFAULT_HOST = "api.palbase.studio";
171
- var API_KEY_RE2 = /^pb_([a-z0-9]+)_c[A-Za-z0-9]{20}$/;
171
+ var API_KEY_RE2 = /^pb_([a-z0-9]{4,24})_c[A-Za-z0-9]{20}$/;
172
172
  function parseEnvironmentRef(apiKey) {
173
173
  return API_KEY_RE2.exec(apiKey)?.[1] ?? null;
174
174
  }
@@ -545,6 +545,11 @@ var PERF_EXCLUDED_PREFIX = "/v1/analytics/";
545
545
  function isSelfTraced(path) {
546
546
  return path.startsWith(PERF_EXCLUDED_PREFIX);
547
547
  }
548
+ function isSessionKilled(status, code) {
549
+ if (status === 401) return code === "session_revoked";
550
+ if (status === 403) return code === "subject_fenced" || code === "subject_erased";
551
+ return false;
552
+ }
548
553
  function nowMs() {
549
554
  return typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
550
555
  }
@@ -580,7 +585,7 @@ async function palbeRequest(rt, method, path, spec = {}) {
580
585
  let res;
581
586
  try {
582
587
  res = await attempt();
583
- if (res.error?.status === 401 && rt.tokenManager.getRefreshToken() && rt.tokenManager.refreshFunction) {
588
+ if (res.error?.status === 401 && res.error.code !== "session_revoked" && rt.tokenManager.getRefreshToken() && rt.tokenManager.refreshFunction) {
584
589
  try {
585
590
  await rt.tokenManager.refreshSession();
586
591
  } catch (refreshErr) {
@@ -600,6 +605,9 @@ async function palbeRequest(rt, method, path, spec = {}) {
600
605
  if (!isAbort(e)) record(asPalbaseError(e)?.status ?? 0);
601
606
  throw e;
602
607
  }
608
+ if (res.error && isSessionKilled(res.error.status, res.error.code)) {
609
+ rt.auth.reactiveTeardown();
610
+ }
603
611
  record(res.error?.status ?? 200);
604
612
  return unwrap(res);
605
613
  }
@@ -1478,7 +1486,8 @@ var PalbeAuth = class {
1478
1486
  if (!this.signedInState) return;
1479
1487
  this.signedInState = false;
1480
1488
  this.cachedUser = null;
1481
- const reason = this.signingOut ? "userInitiated" : "sessionExpired";
1489
+ const reason = this.nextSignOutReason ?? (this.signingOut ? "userInitiated" : "sessionExpired");
1490
+ this.nextSignOutReason = null;
1482
1491
  this.emitState({ status: "signedOut" });
1483
1492
  this.emitEvent({ type: "signedOut", reason });
1484
1493
  } else if (event === "TOKEN_REFRESHED") {
@@ -1491,6 +1500,10 @@ var PalbeAuth = class {
1491
1500
  rt;
1492
1501
  cachedUser = null;
1493
1502
  signingOut = false;
1503
+ // Explicit signedOut reason pinned for the NEXT session clear (deleteAccount /
1504
+ // reactiveTeardown set it before clearSession; the SIGNED_OUT handler consumes
1505
+ // it exactly once, then resets to null → normal signOut/expiry split resumes).
1506
+ nextSignOutReason = null;
1494
1507
  signingIn = false;
1495
1508
  // suppresses AuthClient's TOKEN_REFRESHED during re-signIn
1496
1509
  signedInState = false;
@@ -1538,6 +1551,45 @@ var PalbeAuth = class {
1538
1551
  this.cachedUser = null;
1539
1552
  }
1540
1553
  }
1554
+ /**
1555
+ * Self-service account erasure ("right to be forgotten"). Calls palauth
1556
+ * `DELETE /auth/user` (session-authed + fresh re-auth): password users pass
1557
+ * `{ password }`; passwordless/OAuth users rely on a freshly stepped-up
1558
+ * session. On 202 the erasure workflow is durably queued AND every session is
1559
+ * already revoked server-side — so we tear down local state (mirroring
1560
+ * `signOut()`'s clear, minus the pointless `/logout`) and emit
1561
+ * `signedOut{reason:'accountDeleted'}`.
1562
+ *
1563
+ * On 401 `reauth_required` / 503 `not_configured` (or `erasure_unavailable`)
1564
+ * the request throws BEFORE the teardown line, so the local session is left
1565
+ * fully intact — the deletion did not happen and the user is still signed in.
1566
+ */
1567
+ async deleteAccount(params = {}) {
1568
+ const res = await palbeRequest(this.rt, "DELETE", "/auth/user", {
1569
+ body: params.password ? { password: params.password } : {}
1570
+ });
1571
+ this.nextSignOutReason = "accountDeleted";
1572
+ this.rt.tokenManager.clearSession();
1573
+ this.rt.storage.clear();
1574
+ this.cachedUser = null;
1575
+ return { erasureId: res.erasure_id };
1576
+ }
1577
+ /**
1578
+ * @internal — invoked by the transport choke point (`request.ts`), not app code.
1579
+ * Reactive teardown when the server reports the session is gone: a 403
1580
+ * `subject_fenced`/`subject_erased` (subject being erased) or a 401
1581
+ * `session_revoked`. Clears local state and emits
1582
+ * `signedOut{reason:'sessionInvalid'}` exactly once (deduped by
1583
+ * `signedInState`). An ordinary 403 authz denial does NOT reach here —
1584
+ * `request.ts` matches only the exact session-kill codes.
1585
+ */
1586
+ reactiveTeardown() {
1587
+ if (!this.signedInState) return;
1588
+ this.nextSignOutReason = "sessionInvalid";
1589
+ this.rt.tokenManager.clearSession();
1590
+ this.rt.storage.clear();
1591
+ this.cachedUser = null;
1592
+ }
1541
1593
  async getUser() {
1542
1594
  const raw = await palbeRequest(this.rt, "GET", "/auth/user");
1543
1595
  return mapWireUser(raw);
@@ -8986,7 +9038,7 @@ function defaultSessionStorage(key) {
8986
9038
  }
8987
9039
 
8988
9040
  // src/version.ts
8989
- var VERSION = "4.0.1";
9041
+ var VERSION = "4.0.2";
8990
9042
 
8991
9043
  // src/runtime.ts
8992
9044
  function buildRuntime(config) {