@palbase/web 4.0.0 → 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 (48) hide show
  1. package/dist/_mls-wasm.cjs +32 -0
  2. package/dist/_mls-wasm.cjs.map +1 -0
  3. package/dist/_mls-wasm.js +11 -0
  4. package/dist/_mls-wasm.js.map +1 -0
  5. package/dist/{analytics-facade-DwOtlXPP.d.cts → analytics-facade-CaluA4bW.d.cts} +26 -1
  6. package/dist/{analytics-facade-Nk6J9Ncm.d.ts → analytics-facade-Cp3d4QI-.d.ts} +26 -1
  7. package/dist/{chunk-S7NAY3MW.js → chunk-CFDU23TB.js} +3 -10
  8. package/dist/chunk-CFDU23TB.js.map +1 -0
  9. package/dist/chunk-PZ5AY32C.js +10 -0
  10. package/dist/chunk-PZ5AY32C.js.map +1 -0
  11. package/dist/{chunk-NP4NIY7A.js → chunk-TW6YN354.js} +84 -27
  12. package/dist/chunk-TW6YN354.js.map +1 -0
  13. package/dist/gen/cli.cjs +5 -5
  14. package/dist/gen/cli.cjs.map +1 -1
  15. package/dist/gen/cli.js +6 -5
  16. package/dist/gen/cli.js.map +1 -1
  17. package/dist/index.cjs +91 -27
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.cts +3 -3
  20. package/dist/index.d.ts +3 -3
  21. package/dist/index.js +3 -2
  22. package/dist/internal.cjs +90 -26
  23. package/dist/internal.cjs.map +1 -1
  24. package/dist/internal.d.cts +3 -3
  25. package/dist/internal.d.ts +3 -3
  26. package/dist/internal.js +3 -2
  27. package/dist/next/client.cjs +90 -26
  28. package/dist/next/client.cjs.map +1 -1
  29. package/dist/next/client.js +3 -2
  30. package/dist/next/client.js.map +1 -1
  31. package/dist/next/index.cjs +81 -27
  32. package/dist/next/index.cjs.map +1 -1
  33. package/dist/next/index.d.cts +2 -2
  34. package/dist/next/index.d.ts +2 -2
  35. package/dist/next/index.js +3 -2
  36. package/dist/next/index.js.map +1 -1
  37. package/dist/{pb-FG_nV7NR.d.ts → pb-DUK5qy81.d.ts} +1 -1
  38. package/dist/{pb-C9v5dEO6.d.cts → pb-DvV6ftmf.d.cts} +1 -1
  39. package/dist/react/index.cjs +10 -2
  40. package/dist/react/index.cjs.map +1 -1
  41. package/dist/react/index.d.cts +1 -1
  42. package/dist/react/index.d.ts +1 -1
  43. package/dist/react/index.js +3 -2
  44. package/dist/react/index.js.map +1 -1
  45. package/package.json +10 -3
  46. package/dist/chunk-NP4NIY7A.js.map +0 -1
  47. package/dist/chunk-S7NAY3MW.js.map +0 -1
  48. package/dist/pkg/palbe_mls_bg.wasm +0 -0
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
- export { f as AnalyticsProperties, g as AuthChangeEvent, h as AuthState, i as AuthSuccess, A as AuthUser, j as Call, k as CallChangeCallback, l as CallParticipant, m as CallState, C as Chat, n as ChatBackend, o as ChatDraft, p as ChatKind, b as ChatMember, c as ChatMessage, q as ChatMessageKind, r as ChatRole, s as ChatState, t as CommsPrefs, F as FlagsView, M as MagicLinkResult, u as MentionRange, v as MessageDirection, N as NotifyScope, O as OAuthExchangeResult, w as PalbeAnalytics, x as PalbeAuth, y as PalbeCalls, P as PalbeConfig, z as PalbeFlags, B as PalbeMessaging, D as PalbeOAuthConfig, E as PalbeRealtime, G as PresenceState, H as RealtimeChannel, R as RealtimeConnectionState, I as RealtimeHandler, a as RealtimePayload, J as RealtimeStatus, K as RealtimeStatusSnapshot, L as RealtimeSubscription, Q as ResolvedMention, S as ResolvedReply, T as SentReceipt, U as UnreadView, V as Unsubscribe } from './analytics-facade-DwOtlXPP.cjs';
1
+ export { f as AnalyticsProperties, g as AuthChangeEvent, h as AuthState, i as AuthSuccess, A as AuthUser, j as Call, k as CallChangeCallback, l as CallParticipant, m as CallState, C as Chat, n as ChatBackend, o as ChatDraft, p as ChatKind, b as ChatMember, c as ChatMessage, q as ChatMessageKind, r as ChatRole, s as ChatState, t as CommsPrefs, F as FlagsView, M as MagicLinkResult, u as MentionRange, v as MessageDirection, N as NotifyScope, O as OAuthExchangeResult, w as PalbeAnalytics, x as PalbeAuth, y as PalbeCalls, P as PalbeConfig, z as PalbeFlags, B as PalbeMessaging, D as PalbeOAuthConfig, E as PalbeRealtime, G as PresenceState, H as RealtimeChannel, R as RealtimeConnectionState, I as RealtimeHandler, a as RealtimePayload, J as RealtimeStatus, K as RealtimeStatusSnapshot, L as RealtimeSubscription, Q as ResolvedMention, S as ResolvedReply, T as SentReceipt, U as UnreadView, V as Unsubscribe } from './analytics-facade-CaluA4bW.cjs';
2
2
  export { B as BackendError, a as BackendErrorKind, F as FieldError, i as isBackendError } from './errors-fDoNdTrJ.cjs';
3
- export { C as CallOptions, P as PB, U as UploadOptions, a as UploadProgress, p as pb } from './pb-C9v5dEO6.cjs';
3
+ export { C as CallOptions, P as PB, U as UploadOptions, a as UploadProgress, p as pb } from './pb-DvV6ftmf.cjs';
4
4
  export { P as PersistedSession, S as SessionStorageAdapter, l as localStorageSessionStorage, m as memorySessionStorage } from './storage-BPaeSG8K.cjs';
5
5
  export { F as FlagValue } from './pooled-flags-4GtDtsiu.js';
6
6
 
@@ -206,6 +206,6 @@ interface MlsGlue {
206
206
  */
207
207
  declare function initMls(): Promise<MlsGlue>;
208
208
 
209
- declare const VERSION = "4.0.0";
209
+ declare const VERSION = "4.0.2";
210
210
 
211
211
  export { VERSION, initMls };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export { f as AnalyticsProperties, g as AuthChangeEvent, h as AuthState, i as AuthSuccess, A as AuthUser, j as Call, k as CallChangeCallback, l as CallParticipant, m as CallState, C as Chat, n as ChatBackend, o as ChatDraft, p as ChatKind, b as ChatMember, c as ChatMessage, q as ChatMessageKind, r as ChatRole, s as ChatState, t as CommsPrefs, F as FlagsView, M as MagicLinkResult, u as MentionRange, v as MessageDirection, N as NotifyScope, O as OAuthExchangeResult, w as PalbeAnalytics, x as PalbeAuth, y as PalbeCalls, P as PalbeConfig, z as PalbeFlags, B as PalbeMessaging, D as PalbeOAuthConfig, E as PalbeRealtime, G as PresenceState, H as RealtimeChannel, R as RealtimeConnectionState, I as RealtimeHandler, a as RealtimePayload, J as RealtimeStatus, K as RealtimeStatusSnapshot, L as RealtimeSubscription, Q as ResolvedMention, S as ResolvedReply, T as SentReceipt, U as UnreadView, V as Unsubscribe } from './analytics-facade-Nk6J9Ncm.js';
1
+ export { f as AnalyticsProperties, g as AuthChangeEvent, h as AuthState, i as AuthSuccess, A as AuthUser, j as Call, k as CallChangeCallback, l as CallParticipant, m as CallState, C as Chat, n as ChatBackend, o as ChatDraft, p as ChatKind, b as ChatMember, c as ChatMessage, q as ChatMessageKind, r as ChatRole, s as ChatState, t as CommsPrefs, F as FlagsView, M as MagicLinkResult, u as MentionRange, v as MessageDirection, N as NotifyScope, O as OAuthExchangeResult, w as PalbeAnalytics, x as PalbeAuth, y as PalbeCalls, P as PalbeConfig, z as PalbeFlags, B as PalbeMessaging, D as PalbeOAuthConfig, E as PalbeRealtime, G as PresenceState, H as RealtimeChannel, R as RealtimeConnectionState, I as RealtimeHandler, a as RealtimePayload, J as RealtimeStatus, K as RealtimeStatusSnapshot, L as RealtimeSubscription, Q as ResolvedMention, S as ResolvedReply, T as SentReceipt, U as UnreadView, V as Unsubscribe } from './analytics-facade-Cp3d4QI-.js';
2
2
  export { B as BackendError, a as BackendErrorKind, F as FieldError, i as isBackendError } from './errors-fDoNdTrJ.js';
3
- export { C as CallOptions, P as PB, U as UploadOptions, a as UploadProgress, p as pb } from './pb-FG_nV7NR.js';
3
+ export { C as CallOptions, P as PB, U as UploadOptions, a as UploadProgress, p as pb } from './pb-DUK5qy81.js';
4
4
  export { P as PersistedSession, S as SessionStorageAdapter, l as localStorageSessionStorage, m as memorySessionStorage } from './storage-BPaeSG8K.js';
5
5
  export { F as FlagValue } from './pooled-flags-4GtDtsiu.js';
6
6
 
@@ -206,6 +206,6 @@ interface MlsGlue {
206
206
  */
207
207
  declare function initMls(): Promise<MlsGlue>;
208
208
 
209
- declare const VERSION = "4.0.0";
209
+ declare const VERSION = "4.0.2";
210
210
 
211
211
  export { VERSION, initMls };
package/dist/index.js CHANGED
@@ -13,8 +13,9 @@ import {
13
13
  localStorageSessionStorage,
14
14
  memorySessionStorage,
15
15
  pb
16
- } from "./chunk-NP4NIY7A.js";
17
- import "./chunk-S7NAY3MW.js";
16
+ } from "./chunk-TW6YN354.js";
17
+ import "./chunk-CFDU23TB.js";
18
+ import "./chunk-PZ5AY32C.js";
18
19
  export {
19
20
  BackendError,
20
21
  PalbeAnalytics,
package/dist/internal.cjs CHANGED
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/internal.ts
@@ -45,7 +55,7 @@ var PalbaseError = class extends Error {
45
55
  }
46
56
  };
47
57
  var PALBASE_DEFAULT_HOST = "api.palbase.studio";
48
- var API_KEY_RE = /^pb_([a-z0-9]+)_c[A-Za-z0-9]{20}$/;
58
+ var API_KEY_RE = /^pb_([a-z0-9]{4,24})_c[A-Za-z0-9]{20}$/;
49
59
  function parseEnvironmentRef(apiKey) {
50
60
  return API_KEY_RE.exec(apiKey)?.[1] ?? null;
51
61
  }
@@ -422,6 +432,11 @@ var PERF_EXCLUDED_PREFIX = "/v1/analytics/";
422
432
  function isSelfTraced(path) {
423
433
  return path.startsWith(PERF_EXCLUDED_PREFIX);
424
434
  }
435
+ function isSessionKilled(status, code) {
436
+ if (status === 401) return code === "session_revoked";
437
+ if (status === 403) return code === "subject_fenced" || code === "subject_erased";
438
+ return false;
439
+ }
425
440
  function nowMs() {
426
441
  return typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
427
442
  }
@@ -457,7 +472,7 @@ async function palbeRequest(rt, method, path, spec = {}) {
457
472
  let res;
458
473
  try {
459
474
  res = await attempt();
460
- if (res.error?.status === 401 && rt.tokenManager.getRefreshToken() && rt.tokenManager.refreshFunction) {
475
+ if (res.error?.status === 401 && res.error.code !== "session_revoked" && rt.tokenManager.getRefreshToken() && rt.tokenManager.refreshFunction) {
461
476
  try {
462
477
  await rt.tokenManager.refreshSession();
463
478
  } catch (refreshErr) {
@@ -477,6 +492,9 @@ async function palbeRequest(rt, method, path, spec = {}) {
477
492
  if (!isAbort(e)) record(asPalbaseError(e)?.status ?? 0);
478
493
  throw e;
479
494
  }
495
+ if (res.error && isSessionKilled(res.error.status, res.error.code)) {
496
+ rt.auth.reactiveTeardown();
497
+ }
480
498
  record(res.error?.status ?? 200);
481
499
  return unwrap(res);
482
500
  }
@@ -1411,7 +1429,7 @@ var PalbeAnalytics = class {
1411
1429
  };
1412
1430
 
1413
1431
  // src/api-key.ts
1414
- var PUBLISHABLE_API_KEY_RE = /^pb_([a-z0-9]+)_c[A-Za-z0-9]{20}$/;
1432
+ var PUBLISHABLE_API_KEY_RE = /^pb_([a-z0-9]{4,24})_c[A-Za-z0-9]{20}$/;
1415
1433
  function environmentRefFromPublishableApiKey(apiKey) {
1416
1434
  const match = PUBLISHABLE_API_KEY_RE.exec(apiKey);
1417
1435
  return match ? match[1] ?? "" : "";
@@ -1458,7 +1476,8 @@ var PalbeAuth = class {
1458
1476
  if (!this.signedInState) return;
1459
1477
  this.signedInState = false;
1460
1478
  this.cachedUser = null;
1461
- const reason = this.signingOut ? "userInitiated" : "sessionExpired";
1479
+ const reason = this.nextSignOutReason ?? (this.signingOut ? "userInitiated" : "sessionExpired");
1480
+ this.nextSignOutReason = null;
1462
1481
  this.emitState({ status: "signedOut" });
1463
1482
  this.emitEvent({ type: "signedOut", reason });
1464
1483
  } else if (event === "TOKEN_REFRESHED") {
@@ -1471,6 +1490,10 @@ var PalbeAuth = class {
1471
1490
  rt;
1472
1491
  cachedUser = null;
1473
1492
  signingOut = false;
1493
+ // Explicit signedOut reason pinned for the NEXT session clear (deleteAccount /
1494
+ // reactiveTeardown set it before clearSession; the SIGNED_OUT handler consumes
1495
+ // it exactly once, then resets to null → normal signOut/expiry split resumes).
1496
+ nextSignOutReason = null;
1474
1497
  signingIn = false;
1475
1498
  // suppresses AuthClient's TOKEN_REFRESHED during re-signIn
1476
1499
  signedInState = false;
@@ -1518,6 +1541,45 @@ var PalbeAuth = class {
1518
1541
  this.cachedUser = null;
1519
1542
  }
1520
1543
  }
1544
+ /**
1545
+ * Self-service account erasure ("right to be forgotten"). Calls palauth
1546
+ * `DELETE /auth/user` (session-authed + fresh re-auth): password users pass
1547
+ * `{ password }`; passwordless/OAuth users rely on a freshly stepped-up
1548
+ * session. On 202 the erasure workflow is durably queued AND every session is
1549
+ * already revoked server-side — so we tear down local state (mirroring
1550
+ * `signOut()`'s clear, minus the pointless `/logout`) and emit
1551
+ * `signedOut{reason:'accountDeleted'}`.
1552
+ *
1553
+ * On 401 `reauth_required` / 503 `not_configured` (or `erasure_unavailable`)
1554
+ * the request throws BEFORE the teardown line, so the local session is left
1555
+ * fully intact — the deletion did not happen and the user is still signed in.
1556
+ */
1557
+ async deleteAccount(params = {}) {
1558
+ const res = await palbeRequest(this.rt, "DELETE", "/auth/user", {
1559
+ body: params.password ? { password: params.password } : {}
1560
+ });
1561
+ this.nextSignOutReason = "accountDeleted";
1562
+ this.rt.tokenManager.clearSession();
1563
+ this.rt.storage.clear();
1564
+ this.cachedUser = null;
1565
+ return { erasureId: res.erasure_id };
1566
+ }
1567
+ /**
1568
+ * @internal — invoked by the transport choke point (`request.ts`), not app code.
1569
+ * Reactive teardown when the server reports the session is gone: a 403
1570
+ * `subject_fenced`/`subject_erased` (subject being erased) or a 401
1571
+ * `session_revoked`. Clears local state and emits
1572
+ * `signedOut{reason:'sessionInvalid'}` exactly once (deduped by
1573
+ * `signedInState`). An ordinary 403 authz denial does NOT reach here —
1574
+ * `request.ts` matches only the exact session-kill codes.
1575
+ */
1576
+ reactiveTeardown() {
1577
+ if (!this.signedInState) return;
1578
+ this.nextSignOutReason = "sessionInvalid";
1579
+ this.rt.tokenManager.clearSession();
1580
+ this.rt.storage.clear();
1581
+ this.cachedUser = null;
1582
+ }
1521
1583
  async getUser() {
1522
1584
  const raw = await palbeRequest(this.rt, "GET", "/auth/user");
1523
1585
  return mapWireUser(raw);
@@ -6457,31 +6519,29 @@ function date_now() {
6457
6519
  }
6458
6520
 
6459
6521
  // src/messaging/wasm/loader.ts
6460
- var import_meta = {};
6461
6522
  var GLUE_MODULE = "./palbe_mls_bg.js";
6462
6523
  var SNIPPET_MODULE = "./snippets/mls-rs-core-f99cdecbb456b09c/inline0.js";
6463
6524
  var inflight = null;
6464
6525
  var ready = null;
6465
- async function loadWasmModule() {
6466
- const wasmUrl = new URL("./pkg/palbe_mls_bg.wasm", import_meta.url);
6467
- if (wasmUrl.protocol === "file:") {
6468
- const fsSpecifier = ["node", "fs/promises"].join(":");
6469
- const { readFile } = await import(
6470
- /* webpackIgnore: true */
6471
- fsSpecifier
6472
- );
6473
- const bytes = await readFile(wasmUrl);
6474
- return WebAssembly.compile(bytes);
6526
+ function decodeBase64(encoded) {
6527
+ if (typeof encoded !== "string" || encoded.length === 0 || typeof globalThis.atob !== "function") {
6528
+ throw new Error("palbe-mls WASM asset is invalid");
6475
6529
  }
6476
- const response = await fetch(wasmUrl);
6477
- if (typeof WebAssembly.compileStreaming === "function") {
6478
- try {
6479
- return await WebAssembly.compileStreaming(Promise.resolve(response));
6480
- } catch {
6481
- }
6530
+ let binary;
6531
+ try {
6532
+ binary = globalThis.atob(encoded);
6533
+ } catch {
6534
+ throw new Error("palbe-mls WASM asset is invalid");
6535
+ }
6536
+ const bytes = new Uint8Array(binary.length);
6537
+ for (let index = 0; index < binary.length; index += 1) {
6538
+ bytes[index] = binary.charCodeAt(index);
6482
6539
  }
6483
- const buffer = await response.arrayBuffer();
6484
- return WebAssembly.compile(buffer);
6540
+ return bytes.buffer;
6541
+ }
6542
+ async function loadWasmModule() {
6543
+ const asset = await import("#palbase-mls-wasm");
6544
+ return WebAssembly.compile(decodeBase64(asset.default));
6485
6545
  }
6486
6546
  function buildImports() {
6487
6547
  return {
@@ -6492,7 +6552,7 @@ function buildImports() {
6492
6552
  function initMls() {
6493
6553
  if (ready) return Promise.resolve(ready);
6494
6554
  if (inflight) return inflight;
6495
- inflight = (async () => {
6555
+ const attempt = (async () => {
6496
6556
  const module2 = await loadWasmModule();
6497
6557
  const instance = await WebAssembly.instantiate(module2, buildImports());
6498
6558
  const setWasm = __wbg_set_wasm;
@@ -6511,7 +6571,11 @@ function initMls() {
6511
6571
  ready = g;
6512
6572
  return g;
6513
6573
  })();
6514
- return inflight;
6574
+ inflight = attempt;
6575
+ void attempt.catch(() => {
6576
+ if (inflight === attempt) inflight = null;
6577
+ });
6578
+ return attempt;
6515
6579
  }
6516
6580
  function requireMls() {
6517
6581
  if (!ready) {
@@ -8964,7 +9028,7 @@ function defaultSessionStorage(key) {
8964
9028
  }
8965
9029
 
8966
9030
  // src/version.ts
8967
- var VERSION = "4.0.0";
9031
+ var VERSION = "4.0.2";
8968
9032
 
8969
9033
  // src/runtime.ts
8970
9034
  function buildRuntime(config) {