@cellarnode/auth 0.9.0 → 0.11.0

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.
@@ -1,3 +1,12 @@
1
- import type { AuthUser, UserType } from "./types.js";
1
+ import type { AuthUser, SessionClaims, UserType } from "./types.js";
2
2
  export declare function validateUserType(user: AuthUser, expected: UserType): boolean;
3
+ /**
4
+ * True if the user/session holds the given entitlement (CEL-599 / Epic A).
5
+ *
6
+ * Accepts an `AuthUser` (from `getMe` / `/auth/me`, where `entitlements` may be
7
+ * absent on older backends) OR a `SessionClaims`-shaped object. Null-safe —
8
+ * returns false for a missing source or a source with no entitlements. Mirrors
9
+ * the `validateUserType` guard shape.
10
+ */
11
+ export declare function hasEntitlement(source: AuthUser | SessionClaims | null | undefined, entitlement: string): boolean;
3
12
  //# sourceMappingURL=auth-guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../src/auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAE5E"}
1
+ {"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../src/auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,QAAQ,GAAG,aAAa,GAAG,IAAI,GAAG,SAAS,EACnD,WAAW,EAAE,MAAM,GAClB,OAAO,CAET"}
@@ -1,4 +1,15 @@
1
1
  export function validateUserType(user, expected) {
2
2
  return user.userType === expected;
3
3
  }
4
+ /**
5
+ * True if the user/session holds the given entitlement (CEL-599 / Epic A).
6
+ *
7
+ * Accepts an `AuthUser` (from `getMe` / `/auth/me`, where `entitlements` may be
8
+ * absent on older backends) OR a `SessionClaims`-shaped object. Null-safe —
9
+ * returns false for a missing source or a source with no entitlements. Mirrors
10
+ * the `validateUserType` guard shape.
11
+ */
12
+ export function hasEntitlement(source, entitlement) {
13
+ return source?.entitlements?.includes(entitlement) ?? false;
14
+ }
4
15
  //# sourceMappingURL=auth-guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../src/auth-guard.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,IAAc,EAAE,QAAkB;IACjE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../src/auth-guard.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,IAAc,EAAE,QAAkB;IACjE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACpC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAmD,EACnD,WAAmB;IAEnB,OAAO,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;AAC9D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-store.d.ts","sourceRoot":"","sources":["../src/auth-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,SAAS,EACT,eAAe,EAKhB,MAAM,YAAY,CAAC;AA8DpB,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAuLlE"}
1
+ {"version":3,"file":"auth-store.d.ts","sourceRoot":"","sources":["../src/auth-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,SAAS,EACT,eAAe,EAKhB,MAAM,YAAY,CAAC;AAuCpB,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAsRlE"}
@@ -1,67 +1,42 @@
1
- import { decodeJwt } from "jose";
2
1
  import { extractAccessToken } from "./extract-token.js";
3
- const VALID_USER_TYPES = new Set([
4
- "importer",
5
- "producer",
6
- "distributor",
7
- "admin",
8
- ]);
9
2
  /**
10
- * Decode a JWT payload into SessionClaims.
3
+ * Map a `/auth/me` AuthUser onto the minimal cached identity.
11
4
  *
12
- * Returns null on any decode failure or if required fields are missing /
13
- * mistyped. Signature verification is intentionally NOT performed — that
14
- * is the backend's job at the next authenticated request. This decode is
15
- * informational only (used for clientId / orgId / userType lookups in the
16
- * UI layer).
5
+ * `AuthUser.id` is the userId. `entitlements` is optional on the wire (older
6
+ * backends omit it) → defaults to `[]`. The element filter guards against a
7
+ * malformed array carrying non-string entries.
17
8
  */
18
- function decodeSessionClaims(token) {
19
- let payload;
20
- try {
21
- payload = decodeJwt(token);
22
- }
23
- catch {
24
- return null;
25
- }
26
- const userId = payload.userId;
27
- const email = payload.email;
28
- const sessionId = payload.sessionId;
29
- const orgIdRaw = payload.orgId;
30
- const rolesRaw = payload.roles;
31
- const userTypeRaw = payload.userType;
32
- if (typeof userId !== "string" || userId.length === 0)
33
- return null;
34
- if (typeof email !== "string")
35
- return null;
36
- if (typeof sessionId !== "string" || sessionId.length === 0)
37
- return null;
38
- const orgId = orgIdRaw === null || orgIdRaw === undefined
39
- ? null
40
- : typeof orgIdRaw === "string"
41
- ? orgIdRaw
42
- : null;
43
- const roles = Array.isArray(rolesRaw)
44
- ? rolesRaw.filter((r) => typeof r === "string")
9
+ function toIdentity(user) {
10
+ const entitlements = Array.isArray(user.entitlements)
11
+ ? user.entitlements.filter((e) => typeof e === "string")
45
12
  : [];
46
- if (typeof userTypeRaw !== "string")
47
- return null;
48
- if (!VALID_USER_TYPES.has(userTypeRaw))
49
- return null;
50
13
  return {
51
- userId,
52
- email,
53
- orgId,
54
- roles,
55
- sessionId,
56
- userType: userTypeRaw,
14
+ userId: user.id,
15
+ orgId: user.orgId ?? null,
16
+ userType: user.userType,
17
+ entitlements,
57
18
  };
58
19
  }
59
20
  export function createAuthStore(config) {
60
21
  const { baseUrl, refreshPath = "/auth/refresh", refreshBuffer = 60 } = config;
61
22
  let accessToken = null;
62
- let claims = null;
23
+ let identity = null;
63
24
  let refreshTimer = null;
64
25
  let refreshPromise = null;
26
+ // Tracks the orgId observed at the last emitted state so `onOrgChange` only
27
+ // fires on an actual transition. `hasEmittedOrgId` disambiguates the two
28
+ // meanings `previousOrgId === null` would otherwise carry — "no org emitted
29
+ // yet" vs "the current org is admin/null". Without it, the FIRST admin
30
+ // identity (orgId null) and an admin login right after `clearToken()` would
31
+ // skip `onOrgChange(null)`. Both are reset on logout so a subsequent login
32
+ // re-fires `onOrgChange` even into the same org.
33
+ let previousOrgId = null;
34
+ let hasEmittedOrgId = false;
35
+ // Monotonic generation counter. Bumped on every token change (set / clear /
36
+ // refresh). An in-flight `/auth/me` resolution only commits if its captured
37
+ // generation still matches — this discards stale identity results when the
38
+ // token changed again before the previous fetch resolved.
39
+ let tokenGeneration = 0;
65
40
  const orgChangeListeners = new Set();
66
41
  const accessTokenSetListeners = new Set();
67
42
  const logoutListeners = new Set();
@@ -105,28 +80,104 @@ export function createAuthStore(config) {
105
80
  }, delay);
106
81
  }
107
82
  /**
108
- * Apply a new access-token value to internal state.
83
+ * Fetch `/auth/me` with the bearer token and return the parsed identity, or
84
+ * null on any failure (network error, non-2xx, malformed body).
109
85
  *
110
- * - Decodes the JWT via `jose.decodeJwt` (no signature verify).
111
- * - Caches the decoded claims.
112
- * - Fires `onOrgChange` listeners ONLY when `orgId` actually changes
113
- * (no-op on a same-orgId refresh).
114
- * - Always fires `onAccessTokenSet` listeners after the token + claims
115
- * are committed.
86
+ * Tolerant by design — mirrors how `performRefresh` swallows errors. A failed
87
+ * `/auth/me` must NOT throw out of `setAccessToken` / `performRefresh`; the
88
+ * caller treats null identity as "logged in but identity unknown" and the
89
+ * getters fall back to null/[].
90
+ */
91
+ async function fetchIdentity(token) {
92
+ try {
93
+ const res = await fetch(`${baseUrl}/auth/me`, {
94
+ method: "GET",
95
+ credentials: "include",
96
+ headers: { Authorization: `Bearer ${token}` },
97
+ });
98
+ if (!res.ok)
99
+ return null;
100
+ const user = (await res.json());
101
+ if (!user || typeof user.id !== "string" || user.id.length === 0) {
102
+ return null;
103
+ }
104
+ return toIdentity(user);
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ /**
111
+ * Commit a freshly-resolved identity and emit the dependent events.
116
112
  *
117
- * Malformed JWTs are tolerated: claims become `null` and `onOrgChange`
118
- * fires with `null` only if the previous orgId was non-null (i.e. the
119
- * effective orgId transitioned).
113
+ * EVENT ORDERING (CRITICAL — consumer realtime hooks depend on it):
114
+ * identity is async, so on a token change the sequence is:
115
+ * 1. set token (synchronous, in `setAccessToken` / `performRefresh`)
116
+ * 2. kick off `fetchIdentity(token)` (async)
117
+ * 3. ON RESOLVE → here:
118
+ * a. cache identity FIRST (so getters return real values)
119
+ * b. emit `onAccessTokenSet(token)` (consumer hooks re-read getOrgId()
120
+ * inside this handler — identity must already be cached)
121
+ * c. emit `onOrgChange(orgId)` IF orgId actually changed vs the last
122
+ * emitted state
123
+ *
124
+ * The `generation` guard discards this commit if the token changed again
125
+ * (set/clear/refresh) while this `/auth/me` was in flight.
120
126
  */
121
- function applyToken(token) {
122
- const previousOrgId = claims?.orgId ?? null;
123
- accessToken = token;
124
- claims = token ? decodeSessionClaims(token) : null;
125
- const nextOrgId = claims?.orgId ?? null;
126
- if (nextOrgId !== previousOrgId) {
127
- emitOrgChange(nextOrgId);
127
+ function commitIdentity(generation, token, nextIdentity) {
128
+ if (generation !== tokenGeneration) {
129
+ // A newer token change superseded this fetch — drop the stale result.
130
+ return;
128
131
  }
132
+ identity = nextIdentity;
133
+ const nextOrgId = nextIdentity?.orgId ?? null;
134
+ // (b) Token-set first — handlers read getOrgId()/getUserId() and must see
135
+ // the just-cached identity.
129
136
  emitAccessTokenSet(token);
137
+ // (c) Org-change on the first emission OR an actual transition. The
138
+ // `!hasEmittedOrgId` guard ensures the first identity (incl. an admin
139
+ // orgId of null) always fires once.
140
+ if (!hasEmittedOrgId || nextOrgId !== previousOrgId) {
141
+ hasEmittedOrgId = true;
142
+ previousOrgId = nextOrgId;
143
+ emitOrgChange(nextOrgId);
144
+ }
145
+ }
146
+ /**
147
+ * Apply a new access token, kicking off async identity resolution.
148
+ *
149
+ * The token is committed synchronously (so `getAccessToken()` is immediately
150
+ * correct); identity + `onAccessTokenSet` + `onOrgChange` settle only after
151
+ * `/auth/me` resolves (see `commitIdentity`).
152
+ */
153
+ function applyToken(token) {
154
+ tokenGeneration += 1;
155
+ const generation = tokenGeneration;
156
+ accessToken = token;
157
+ // Clear the prior session's identity synchronously so the getters return
158
+ // the documented null/[] defaults until the fresh /auth/me resolves —
159
+ // otherwise a token switch (e.g. logging in as a different user) would leak
160
+ // the previous session's userId/orgId/entitlements until the new fetch
161
+ // lands. The realtime consumer hooks read the getters on events (not by
162
+ // polling), so this introduces no flicker: a same-user refresh re-commits
163
+ // the same orgId without firing `onOrgChange`.
164
+ identity = null;
165
+ void fetchIdentity(token).then((next) => commitIdentity(generation, token, next));
166
+ }
167
+ /**
168
+ * Clear all token + identity state synchronously and reset org tracking.
169
+ *
170
+ * `onAccessTokenSet(null)` fires synchronously (no `/auth/me` round-trip on
171
+ * logout). `previousOrgId` is reset so a subsequent login re-fires
172
+ * `onOrgChange` even when the user logs back into the same org.
173
+ */
174
+ function clearToken() {
175
+ tokenGeneration += 1; // invalidate any in-flight /auth/me
176
+ accessToken = null;
177
+ identity = null;
178
+ previousOrgId = null;
179
+ hasEmittedOrgId = false;
180
+ emitAccessTokenSet(null);
130
181
  }
131
182
  async function performRefresh() {
132
183
  try {
@@ -136,7 +187,7 @@ export function createAuthStore(config) {
136
187
  headers: { "Content-Type": "application/json" },
137
188
  });
138
189
  if (!res.ok) {
139
- applyToken(null);
190
+ clearToken();
140
191
  return null;
141
192
  }
142
193
  const json = (await res.json());
@@ -149,7 +200,7 @@ export function createAuthStore(config) {
149
200
  return token;
150
201
  }
151
202
  catch {
152
- applyToken(null);
203
+ clearToken();
153
204
  return null;
154
205
  }
155
206
  }
@@ -165,7 +216,7 @@ export function createAuthStore(config) {
165
216
  scheduleRefresh(expiresIn);
166
217
  },
167
218
  clearAccessToken() {
168
- applyToken(null);
219
+ clearToken();
169
220
  if (refreshTimer) {
170
221
  clearTimeout(refreshTimer);
171
222
  refreshTimer = null;
@@ -184,21 +235,18 @@ export function createAuthStore(config) {
184
235
  });
185
236
  return refreshPromise;
186
237
  },
187
- getSessionClaims() {
188
- // Return a defensive copy so external callers cannot mutate the
189
- // internal claims object (e.g. push to roles, reassign userType).
190
- return claims
191
- ? { ...claims, roles: [...claims.roles] }
192
- : null;
193
- },
194
238
  getUserId() {
195
- return claims?.userId ?? null;
239
+ return identity?.userId ?? null;
196
240
  },
197
241
  getOrgId() {
198
- return claims?.orgId ?? null;
242
+ return identity?.orgId ?? null;
199
243
  },
200
244
  getUserType() {
201
- return claims?.userType ?? null;
245
+ return identity?.userType ?? null;
246
+ },
247
+ getEntitlements() {
248
+ // Defensive copy; [] when logged out or identity unresolved.
249
+ return identity ? [...identity.entitlements] : [];
202
250
  },
203
251
  onOrgChange(listener) {
204
252
  orgChangeListeners.add(listener);
@@ -1 +1 @@
1
- {"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../src/auth-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../src/auth-store.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { createAuthStore } from "./auth-store.js";
2
2
  export { createAuthClient } from "./auth-client.js";
3
3
  export { createAuthApi } from "./auth-api.js";
4
- export { validateUserType } from "./auth-guard.js";
4
+ export { validateUserType, hasEntitlement } from "./auth-guard.js";
5
5
  export { extractAccessToken } from "./extract-token.js";
6
6
  export { AuthError, type AuthUser, type AuthStore, type AuthStoreConfig, type AuthClient, type AuthClientConfig, type AuthApi, type RegisterInput, type RequestOtpResponse, type VerifyOtpResponse, type AuthErrorResponse, type UserType, type DashboardLink, type SessionClaims, type SessionUserType, type OrgChangeListener, type AccessTokenSetListener, type LogoutListener, } from "./types.js";
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { createAuthStore } from "./auth-store.js";
2
2
  export { createAuthClient } from "./auth-client.js";
3
3
  export { createAuthApi } from "./auth-api.js";
4
- export { validateUserType } from "./auth-guard.js";
4
+ export { validateUserType, hasEntitlement } from "./auth-guard.js";
5
5
  export { extractAccessToken } from "./extract-token.js";
6
6
  export { AuthError, } from "./types.js";
7
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,SAAS,GAkBV,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,SAAS,GAkBV,MAAM,YAAY,CAAC"}
package/dist/types.d.ts CHANGED
@@ -6,6 +6,13 @@ export interface AuthUser {
6
6
  userType: "importer" | "producer" | "admin";
7
7
  orgId: string | null;
8
8
  roles: string[];
9
+ /**
10
+ * Per-user entitlements (CEL-599 / Epic A). Optional on the `/auth/me` wire
11
+ * shape: present once the backend's `/auth/me` mapper returns it, absent for
12
+ * older backends. Consumers should read it as `user.entitlements ?? []`, or
13
+ * prefer `authStore.getEntitlements()` (decoded from the JWT, always present).
14
+ */
15
+ entitlements?: string[];
9
16
  createdAt: string;
10
17
  }
11
18
  export interface RegisterInput {
@@ -64,6 +71,13 @@ export interface SessionClaims {
64
71
  roles: string[];
65
72
  sessionId: string;
66
73
  userType: SessionUserType;
74
+ /**
75
+ * Per-user entitlements carried in the JWT (CEL-599 / Epic A) — e.g.
76
+ * `"producer-dashboard"`, `"importer-dashboard"`, `"elabel"`. Always an array
77
+ * on the decoded claims (empty if the token predates entitlements or the user
78
+ * holds none); the backend mints them from the `user_entitlements` table.
79
+ */
80
+ entitlements: string[];
67
81
  }
68
82
  export type OrgChangeListener = (orgId: string | null) => void;
69
83
  export type AccessTokenSetListener = (token: string | null) => void;
@@ -74,14 +88,24 @@ export interface AuthStore {
74
88
  setAccessToken(token: string, expiresIn: number): void;
75
89
  clearAccessToken(): void;
76
90
  ensureAccessToken(forceRefresh?: boolean): Promise<string | null>;
77
- /** Decoded session claims from the current access token, or null. */
78
- getSessionClaims(): SessionClaims | null;
79
- /** userId from the current access token, or null. */
91
+ /**
92
+ * userId of the current session, or null.
93
+ *
94
+ * CEL-622 — sourced from `GET /auth/me` (the public access token is an opaque
95
+ * encrypted JWE and cannot be decoded client-side). Resolves asynchronously
96
+ * after a token is set/refreshed; reads null until `/auth/me` settles.
97
+ */
80
98
  getUserId(): string | null;
81
- /** orgId from the current access token, or null. Admin returns null. */
99
+ /** orgId of the current session, or null. Admin returns null. Sourced from `/auth/me`. */
82
100
  getOrgId(): string | null;
83
- /** userType from the current access token, or null. */
101
+ /** userType of the current session, or null. Sourced from `/auth/me`. */
84
102
  getUserType(): SessionUserType | null;
103
+ /**
104
+ * Per-user entitlements for the current session (CEL-599). Always an array —
105
+ * empty when logged out or when `/auth/me` carries none. Sourced from
106
+ * `/auth/me` (CEL-622), so it reflects the authoritative server-side state.
107
+ */
108
+ getEntitlements(): string[];
85
109
  /** Subscribe to orgId change events. Returns unsubscribe. */
86
110
  onOrgChange(listener: OrgChangeListener): () => void;
87
111
  /** Subscribe to access-token (re-)set events. Fires after the token is set. Returns unsubscribe. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAmCA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEhB;IACA;IAEA;IAJlB,YACkB,MAAc,EACd,IAAY,EAC5B,OAAe,EACC,iBAA0B;QAE1C,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QAEZ,sBAAiB,GAAjB,iBAAiB,CAAS;QAG1C,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA0CA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEhB;IACA;IAEA;IAJlB,YACkB,MAAc,EACd,IAAY,EAC5B,OAAe,EACC,iBAA0B;QAE1C,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QAEZ,sBAAiB,GAAjB,iBAAiB,CAAS;QAG1C,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cellarnode/auth",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "Shared OTP-based authentication — token store, API client, React UI components for CellarNode dashboards.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -42,8 +42,7 @@
42
42
  "typecheck": "tsc --noEmit"
43
43
  },
44
44
  "dependencies": {
45
- "clsx": "^2.1.0",
46
- "jose": "^6.2.3"
45
+ "clsx": "^2.1.0"
47
46
  },
48
47
  "peerDependencies": {
49
48
  "@react-three/fiber": ">=8.0.0",