@soulcraft/sdk 1.5.0 → 1.5.1

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,31 +1,41 @@
1
1
  /**
2
2
  * @module modules/auth/middleware
3
- * @description Hono auth middleware factories and remote session verification
4
- * for Soulcraft product backends.
3
+ * @description Hono auth middleware factories, remote session verification, and
4
+ * dev/guest session utilities for Soulcraft product backends.
5
5
  *
6
- * Provides framework-agnostic middleware that products mount in their Hono server
7
- * to authenticate requests against a better-auth instance (local or remote IdP).
6
+ * ## Session verification strategies
8
7
  *
9
- * The middleware pattern is product-agnostic Workshop, Venue, and Academy all
10
- * use the same factories, passing their own `auth` instance. This replaces the
11
- * per-product copies of `requireAuth` / `optionalAuth` in Workshop's better-auth.ts.
8
+ * All products share the same `createAuthMiddleware` factory, but each product
9
+ * selects the right session verifier for its deployment context:
12
10
  *
13
- * ## Remote session verification
11
+ * ```
12
+ * Production (all products):
13
+ * createRemoteSessionVerifier({ idpUrl: 'https://auth.soulcraft.com' })
14
+ *
15
+ * Development (all products):
16
+ * createDevSessionVerifier({ role: 'owner' }) // auto-login, no OAuth needed
17
+ *
18
+ * Workshop standalone (legacy / local OAuth):
19
+ * createAuthMiddleware(betterAuthInstance) // BetterAuthLike overload
20
+ * ```
21
+ *
22
+ * ## Dev and guest endpoint factories
14
23
  *
15
- * `createRemoteSessionVerifier` is used by products that delegate authentication
16
- * to the central IdP (`auth.soulcraft.com`) but need to verify sessions without
17
- * running a full better-auth instance. It proxies the session lookup via HTTP with
18
- * an LRU cache to avoid per-request round-trips to the IdP.
24
+ * - `createDevLoginHandler` mounts a `/api/dev/login` endpoint for role-switching
25
+ * during development. Issues a signed dev session cookie. No-ops in production.
26
+ * - `createGuestSessionHandler` mounts a `/api/guest/session` endpoint so Venue
27
+ * visitors can obtain a guest session (platformRole `'guest'`) for anonymous
28
+ * browse and booking flows, before they create an account.
19
29
  *
20
- * @example Hono setup (Workshop)
30
+ * @example Production setup (Venue / Academy)
21
31
  * ```typescript
22
- * import { createAuthMiddleware } from '@soulcraft/sdk/server'
23
- * import { auth } from './better-auth.js'
32
+ * import { createAuthMiddleware, createRemoteSessionVerifier } from '@soulcraft/sdk/server'
24
33
  *
25
- * const { requireAuth, optionalAuth } = createAuthMiddleware(auth)
34
+ * const verifySession = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
35
+ * const { requireAuth, optionalAuth } = createAuthMiddleware(verifySession)
26
36
  *
27
- * app.get('/api/workspaces', requireAuth, async (c) => {
28
- * const user = c.get('user')! // SoulcraftSessionUser, guaranteed non-null
37
+ * app.get('/api/bookings', requireAuth, async (c) => {
38
+ * const user = c.get('user')! // SoulcraftSessionUser
29
39
  * })
30
40
  * ```
31
41
  */
@@ -54,41 +64,48 @@ export interface BetterAuthLike {
54
64
  };
55
65
  }
56
66
  /**
57
- * @description Options for createAuthMiddleware().
67
+ * A session verifier function — the common abstraction for session resolution
68
+ * across all products in non-standalone auth mode.
69
+ *
70
+ * Returned by `createRemoteSessionVerifier` and `createDevSessionVerifier`.
71
+ * `createAuthMiddleware` accepts either a `BetterAuthLike` instance (Workshop
72
+ * standalone mode) or a `SessionVerifier` function (all other products and modes).
73
+ */
74
+ export type SessionVerifier = (cookieHeader: string) => Promise<SoulcraftSession | null>;
75
+ /**
76
+ * Options for `createAuthMiddleware()`.
58
77
  */
59
78
  export interface AuthMiddlewareOptions {
60
79
  /**
61
- * If true, a synthetic dev user is injected in non-production environments,
62
- * bypassing the session check entirely. Set to false to disable dev auto-login
63
- * (e.g. for integration test servers that need real auth even in dev).
80
+ * If true, a synthetic dev user is injected in non-production environments
81
+ * when a `BetterAuthLike` auth instance is provided and session lookup fails.
82
+ * Not used when a `SessionVerifier` function is provided use
83
+ * `createDevSessionVerifier` instead for full dev auto-login in that mode.
64
84
  * @default true
65
85
  */
66
86
  devAutoLogin?: boolean;
67
87
  }
68
88
  /**
69
- * @description The object returned by createAuthMiddleware().
89
+ * The object returned by `createAuthMiddleware()`.
70
90
  */
71
91
  export interface AuthMiddleware {
72
92
  /**
73
- * Require authentication. Resolves the better-auth session. If the session is
74
- * valid, attaches the typed user to the Hono context and calls next(). Returns
75
- * HTTP 401 if unauthenticated.
76
- *
77
- * In development mode (unless devAutoLogin is disabled), a synthetic dev user
78
- * is injected automatically.
93
+ * Require authentication. Resolves the session from request cookies. If the
94
+ * session is valid, attaches the typed user to the Hono context under the
95
+ * `'user'` key and calls `next()`. Returns HTTP 401 if unauthenticated.
79
96
  */
80
97
  requireAuth: (c: AuthContext, next: Next) => Promise<void | Response>;
81
98
  /**
82
99
  * Optional authentication. Resolves the session if one exists, but does not
83
- * reject unauthenticated requests. User will be null for anonymous requests.
100
+ * reject unauthenticated requests. User will be `null` for anonymous requests.
84
101
  */
85
102
  optionalAuth: (c: AuthContext, next: Next) => Promise<void | Response>;
86
103
  }
87
104
  /**
88
- * @description Options for createRemoteSessionVerifier().
105
+ * Options for `createRemoteSessionVerifier()`.
89
106
  */
90
107
  export interface RemoteSessionVerifierOptions {
91
- /** The central IdP base URL, e.g. "https://auth.soulcraft.com". */
108
+ /** The central IdP base URL, e.g. `"https://auth.soulcraft.com"`. */
92
109
  idpUrl: string;
93
110
  /** Session cache TTL in milliseconds. Default: 30 000 (30 seconds). */
94
111
  cacheTtlMs?: number;
@@ -96,7 +113,7 @@ export interface RemoteSessionVerifierOptions {
96
113
  cacheMax?: number;
97
114
  }
98
115
  /**
99
- * @description Options for createDevSessionVerifier().
116
+ * Options for `createDevSessionVerifier()`.
100
117
  */
101
118
  export interface DevSessionVerifierOptions {
102
119
  /**
@@ -116,40 +133,101 @@ export interface DevSessionVerifierOptions {
116
133
  name?: string;
117
134
  }
118
135
  /**
119
- * @description Creates Hono auth middleware bound to a specific better-auth instance.
136
+ * Options for `createDevLoginHandler()`.
137
+ */
138
+ export interface DevLoginHandlerOptions {
139
+ /**
140
+ * Allowed platform roles. The role must be in this list for the handler to
141
+ * issue a session cookie. Defaults to all non-guest platform roles.
142
+ * @default ['creator','viewer','customer','staff','manager','owner','learner','instructor']
143
+ */
144
+ allowedRoles?: SoulcraftSessionUser['platformRole'][];
145
+ /**
146
+ * Cookie name for the issued dev session.
147
+ * @default 'soulcraft_dev_session'
148
+ */
149
+ cookieName?: string;
150
+ /**
151
+ * Session cookie max-age in seconds.
152
+ * @default 86400 (24 hours)
153
+ */
154
+ maxAgeSeconds?: number;
155
+ }
156
+ /**
157
+ * Options for `createGuestSessionHandler()`.
158
+ */
159
+ export interface GuestSessionHandlerOptions {
160
+ /**
161
+ * Cookie name for the issued guest session.
162
+ * @default 'soulcraft_guest_session'
163
+ */
164
+ cookieName?: string;
165
+ /**
166
+ * Guest session max-age in seconds.
167
+ * @default 3600 (1 hour)
168
+ */
169
+ maxAgeSeconds?: number;
170
+ /**
171
+ * An optional callback invoked when a new guest session is created.
172
+ * Receives the generated guest ID. Useful for analytics or initializing
173
+ * a guest cart/basket in the product's store.
174
+ *
175
+ * @param guestId - The newly generated unique guest ID.
176
+ */
177
+ onGuestCreated?: (guestId: string) => Promise<void> | void;
178
+ }
179
+ /**
180
+ * Creates Hono auth middleware from a `SessionVerifier` function or a `BetterAuthLike`
181
+ * instance.
182
+ *
183
+ * **Preferred form (all products in OIDC-client mode):**
184
+ * Pass a `SessionVerifier` returned by `createRemoteSessionVerifier` or
185
+ * `createDevSessionVerifier`. The middleware reads the request cookie header and
186
+ * passes it to the verifier.
120
187
  *
121
- * Returns `requireAuth` and `optionalAuth` middleware functions. Both functions
122
- * resolve the session from request cookies/headers using better-auth's `getSession`
123
- * API and attach the user to the Hono context under the `'user'` variable key.
188
+ * **Legacy form (Workshop standalone mode):**
189
+ * Pass a `better-auth` instance directly. The middleware calls `auth.api.getSession`.
190
+ * In non-production environments and when `devAutoLogin` is enabled, a synthetic dev
191
+ * user is injected on failed lookups so local dev works without OAuth.
124
192
  *
125
- * In non-production environments (`NODE_ENV !== 'production'`), a synthetic dev
126
- * user is injected automatically to allow local development without OAuth setup.
127
- * Disable this with `options.devAutoLogin = false`.
193
+ * Both forms return identical `{ requireAuth, optionalAuth }` middleware.
128
194
  *
129
- * @param auth - The product's better-auth instance.
130
- * @param options - Optional middleware configuration.
195
+ * @param authOrVerifier - A `better-auth` instance or a `SessionVerifier` function.
196
+ * @param options - Optional middleware configuration (only applies to `BetterAuthLike` form).
131
197
  * @returns Middleware pair: `{ requireAuth, optionalAuth }`.
132
198
  *
133
- * @example
199
+ * @example Verifier form (Venue / Academy / Workshop in OIDC mode)
134
200
  * ```typescript
135
- * const { requireAuth, optionalAuth } = createAuthMiddleware(auth)
136
- * app.get('/api/me', requireAuth, (c) => c.json(c.get('user')))
201
+ * const verifySession = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
202
+ * const { requireAuth } = createAuthMiddleware(verifySession)
203
+ * ```
204
+ *
205
+ * @example BetterAuth form (Workshop dev standalone)
206
+ * ```typescript
207
+ * import { auth } from './better-auth.js'
208
+ * const { requireAuth } = createAuthMiddleware(auth)
137
209
  * ```
138
210
  */
139
- export declare function createAuthMiddleware(auth: BetterAuthLike, options?: AuthMiddlewareOptions): AuthMiddleware;
211
+ export declare function createAuthMiddleware(authOrVerifier: BetterAuthLike | SessionVerifier, options?: AuthMiddlewareOptions): AuthMiddleware;
140
212
  /**
141
- * @description Creates a cached remote session verifier that proxies session lookups
142
- * to the central IdP at `auth.soulcraft.com`.
213
+ * Creates a cached remote session verifier that proxies session lookups to
214
+ * the central IdP at `auth.soulcraft.com`.
143
215
  *
144
- * Used by products that operate as OIDC clients and need to verify sessions without
145
- * running a full better-auth instance locally. Caches successful lookups to avoid
146
- * per-request HTTP calls to the IdP.
216
+ * Used by products that operate as OIDC clients (Venue, Academy, and Workshop
217
+ * in production). Caches successful lookups in an LRU cache to avoid per-request
218
+ * HTTP round-trips to the IdP.
147
219
  *
148
220
  * The verifier sends the cookie header to the IdP's `/api/auth/get-session` endpoint
149
- * and returns the resolved `SoulcraftSession` or null if the session is invalid.
221
+ * and returns the resolved `SoulcraftSession` or `null` if the session is invalid.
222
+ *
223
+ * Pass the returned function directly to `createAuthMiddleware`:
224
+ * ```typescript
225
+ * const verifySession = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
226
+ * const { requireAuth } = createAuthMiddleware(verifySession)
227
+ * ```
150
228
  *
151
229
  * @param options - IdP URL, cache TTL, and max cache size.
152
- * @returns An async function that accepts a cookie header string and returns a session or null.
230
+ * @returns A `SessionVerifier` — async function that accepts a cookie header string.
153
231
  *
154
232
  * @example
155
233
  * ```typescript
@@ -162,35 +240,31 @@ export declare function createAuthMiddleware(auth: BetterAuthLike, options?: Aut
162
240
  * if (!session) return c.json({ error: 'Unauthorized' }, 401)
163
241
  * ```
164
242
  */
165
- export declare function createRemoteSessionVerifier(options: RemoteSessionVerifierOptions): (cookieHeader: string) => Promise<SoulcraftSession | null>;
243
+ export declare function createRemoteSessionVerifier(options: RemoteSessionVerifierOptions): SessionVerifier;
166
244
  /**
167
- * @description Creates a session verifier that always resolves to a synthetic dev session.
245
+ * Creates a session verifier that always resolves to a synthetic dev session.
168
246
  *
169
- * Intended for products that run as OIDC clients (`SOULCRAFT_IDP_URL` set) but need
170
- * local development auth without network calls, SQLite, or real cookies. The returned
171
- * verifier always succeeds — any non-empty cookie header (or empty) resolves to the
172
- * configured synthetic user.
247
+ * Intended for products that run as OIDC clients but need local development auth
248
+ * without OAuth, network calls, SQLite, or real cookies. The returned verifier always
249
+ * succeeds — any request resolves to the configured synthetic user.
173
250
  *
174
- * Designed to be a drop-in replacement for `createRemoteSessionVerifier` in local dev:
251
+ * Designed as a drop-in replacement for `createRemoteSessionVerifier` in local dev:
175
252
  *
176
253
  * ```typescript
177
254
  * const verifySession = process.env.SOULCRAFT_IDP_URL
178
255
  * ? createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL })
179
256
  * : createDevSessionVerifier({ role: 'owner' })
180
- * ```
181
257
  *
182
- * This eliminates the need for a local `better-auth` instance, SQLite database, and
183
- * cookie management when iterating on features in OIDC-client mode.
258
+ * const { requireAuth } = createAuthMiddleware(verifySession)
259
+ * ```
184
260
  *
185
261
  * **Never use in production.** The verifier performs no validation whatsoever.
186
262
  *
187
263
  * @param options - Optional synthetic user configuration.
188
- * @returns An async function with the same signature as `createRemoteSessionVerifier`.
264
+ * @returns A `SessionVerifier` with the same signature as `createRemoteSessionVerifier`.
189
265
  *
190
- * @example SvelteKit hooks.server.ts
266
+ * @example
191
267
  * ```typescript
192
- * import { createRemoteSessionVerifier, createDevSessionVerifier } from '@soulcraft/sdk/server'
193
- *
194
268
  * const verifySession = process.env.SOULCRAFT_IDP_URL
195
269
  * ? createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL })
196
270
  * : createDevSessionVerifier({ role: 'owner' })
@@ -202,5 +276,109 @@ export declare function createRemoteSessionVerifier(options: RemoteSessionVerifi
202
276
  * }
203
277
  * ```
204
278
  */
205
- export declare function createDevSessionVerifier(options?: DevSessionVerifierOptions): (cookieHeader: string) => Promise<SoulcraftSession | null>;
279
+ export declare function createDevSessionVerifier(options?: DevSessionVerifierOptions): SessionVerifier;
280
+ /**
281
+ * Creates a Hono request handler for a dev login endpoint.
282
+ *
283
+ * Mount at `/api/dev/login` to get a role-switching endpoint for local
284
+ * development. Accepts `?role=<platformRole>` and optional `?email=` / `?name=`
285
+ * query params. Issues a signed base64url session cookie that `createAuthMiddleware`
286
+ * (when used with a `SessionVerifier` that reads dev cookies) can resolve.
287
+ *
288
+ * **Guards against production use:** the handler returns HTTP 404 when
289
+ * `NODE_ENV === 'production'` — it is safe to leave mounted in all environments.
290
+ *
291
+ * @param options - Allowed roles, cookie name, and max-age.
292
+ * @returns A Hono-compatible request handler `(c: Context) => Response`.
293
+ *
294
+ * @example
295
+ * ```typescript
296
+ * import { createDevLoginHandler } from '@soulcraft/sdk/server'
297
+ *
298
+ * // In your Hono server setup:
299
+ * app.get('/api/dev/login', createDevLoginHandler({ allowedRoles: ['owner', 'staff', 'customer'] }))
300
+ *
301
+ * // Usage: GET /api/dev/login?role=staff → sets cookie + redirects to /
302
+ * ```
303
+ */
304
+ export declare function createDevLoginHandler(options?: DevLoginHandlerOptions): (c: Context) => Response | Promise<Response>;
305
+ /**
306
+ * Creates a session verifier that reads the cookie issued by `createDevLoginHandler`.
307
+ *
308
+ * Use this together with `createDevLoginHandler` when you want dev role-switching
309
+ * (e.g. clicking "Login as Staff" in a dev UI) rather than a fixed synthetic user.
310
+ *
311
+ * The verifier decodes the base64url cookie value and returns the embedded session.
312
+ * Falls back to `null` (unauthenticated) if the cookie is absent or expired.
313
+ *
314
+ * ```typescript
315
+ * // Only one of these in dev — pick what fits your workflow:
316
+ *
317
+ * // Option A: Fixed dev user, no login UI needed
318
+ * const verifySession = createDevSessionVerifier({ role: 'owner' })
319
+ *
320
+ * // Option B: Role-switching dev login UI
321
+ * app.get('/api/dev/login', createDevLoginHandler({ allowedRoles: ['owner', 'staff', 'customer'] }))
322
+ * const verifySession = createDevCookieVerifier()
323
+ * ```
324
+ *
325
+ * @param cookieName - Must match the `cookieName` passed to `createDevLoginHandler`. Default: `'soulcraft_dev_session'`.
326
+ * @returns A `SessionVerifier` compatible with `createAuthMiddleware`.
327
+ */
328
+ export declare function createDevCookieVerifier(cookieName?: string): SessionVerifier;
329
+ /**
330
+ * Creates a Hono request handler that issues a guest session cookie.
331
+ *
332
+ * Venue visitors can browse and initiate bookings without creating an account.
333
+ * This handler mounts at e.g. `/api/guest/session` and issues a session cookie
334
+ * with `platformRole: 'guest'` and a unique guest ID on each call (if no valid
335
+ * guest session already exists).
336
+ *
337
+ * The guest session cookie can be verified using `createGuestCookieVerifier`,
338
+ * which returns a `SessionVerifier` compatible with `createAuthMiddleware`.
339
+ *
340
+ * @param options - Cookie name, max-age, and optional `onGuestCreated` callback.
341
+ * @returns A Hono-compatible request handler.
342
+ *
343
+ * @example
344
+ * ```typescript
345
+ * import { createGuestSessionHandler, createGuestCookieVerifier, createAuthMiddleware } from '@soulcraft/sdk/server'
346
+ *
347
+ * // Issue guest sessions
348
+ * app.post('/api/guest/session', createGuestSessionHandler({
349
+ * onGuestCreated: async (guestId) => {
350
+ * await db.guests.insert({ id: guestId, createdAt: new Date() })
351
+ * },
352
+ * }))
353
+ *
354
+ * // Verify guest sessions in optional auth (guests can browse)
355
+ * const verifyGuest = createGuestCookieVerifier()
356
+ * const verifySession = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
357
+ *
358
+ * // Compose: check real session first, fall back to guest
359
+ * const { optionalAuth } = createAuthMiddleware(async (cookie) =>
360
+ * await verifySession(cookie) ?? await verifyGuest(cookie)
361
+ * )
362
+ * ```
363
+ */
364
+ export declare function createGuestSessionHandler(options?: GuestSessionHandlerOptions): (c: Context) => Promise<Response>;
365
+ /**
366
+ * Creates a session verifier that reads the cookie issued by `createGuestSessionHandler`.
367
+ *
368
+ * Returns the guest `SoulcraftSession` or `null` if no valid guest cookie is present.
369
+ * Compose with `createRemoteSessionVerifier` to allow both authenticated and guest access:
370
+ *
371
+ * ```typescript
372
+ * const verifyReal = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
373
+ * const verifyGuest = createGuestCookieVerifier()
374
+ *
375
+ * const { optionalAuth } = createAuthMiddleware(async (cookie) =>
376
+ * await verifyReal(cookie) ?? await verifyGuest(cookie)
377
+ * )
378
+ * ```
379
+ *
380
+ * @param cookieName - Must match the `cookieName` passed to `createGuestSessionHandler`. Default: `'soulcraft_guest_session'`.
381
+ * @returns A `SessionVerifier` compatible with `createAuthMiddleware`.
382
+ */
383
+ export declare function createGuestCookieVerifier(cookieName?: string): SessionVerifier;
206
384
  //# sourceMappingURL=middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/modules/auth/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAMzC,uEAAuE;AACvE,eAAO,MAAM,aAAa,EAAG,MAAe,CAAA;AAE5C,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE;QAAE,CAAC,aAAa,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;KAAE,CAAA;CAAE,CAAC,CAAA;AAElG,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE;QACH,UAAU,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE,GAAG,OAAO,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAAC,OAAO,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;aAAE,CAAA;SAAE,GAAG,IAAI,CAAC,CAAA;KACtJ,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;;OAOG;IACH,WAAW,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAA;IAErE;;;OAGG;IACH,YAAY,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAA;CACvE;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAA;IACd,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,IAAI,CAAC,EAAE,oBAAoB,CAAC,cAAc,CAAC,CAAA;IAC3C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,qBAA0B,GAClC,cAAc,CA+DhB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA4D5D;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,yBAA8B,GACtC,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAqB5D"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/modules/auth/middleware.ts"],"names":[],"mappings":"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"}
@@ -1,31 +1,41 @@
1
1
  /**
2
2
  * @module modules/auth/middleware
3
- * @description Hono auth middleware factories and remote session verification
4
- * for Soulcraft product backends.
3
+ * @description Hono auth middleware factories, remote session verification, and
4
+ * dev/guest session utilities for Soulcraft product backends.
5
5
  *
6
- * Provides framework-agnostic middleware that products mount in their Hono server
7
- * to authenticate requests against a better-auth instance (local or remote IdP).
6
+ * ## Session verification strategies
8
7
  *
9
- * The middleware pattern is product-agnostic Workshop, Venue, and Academy all
10
- * use the same factories, passing their own `auth` instance. This replaces the
11
- * per-product copies of `requireAuth` / `optionalAuth` in Workshop's better-auth.ts.
8
+ * All products share the same `createAuthMiddleware` factory, but each product
9
+ * selects the right session verifier for its deployment context:
12
10
  *
13
- * ## Remote session verification
11
+ * ```
12
+ * Production (all products):
13
+ * createRemoteSessionVerifier({ idpUrl: 'https://auth.soulcraft.com' })
14
+ *
15
+ * Development (all products):
16
+ * createDevSessionVerifier({ role: 'owner' }) // auto-login, no OAuth needed
17
+ *
18
+ * Workshop standalone (legacy / local OAuth):
19
+ * createAuthMiddleware(betterAuthInstance) // BetterAuthLike overload
20
+ * ```
14
21
  *
15
- * `createRemoteSessionVerifier` is used by products that delegate authentication
16
- * to the central IdP (`auth.soulcraft.com`) but need to verify sessions without
17
- * running a full better-auth instance. It proxies the session lookup via HTTP with
18
- * an LRU cache to avoid per-request round-trips to the IdP.
22
+ * ## Dev and guest endpoint factories
19
23
  *
20
- * @example Hono setup (Workshop)
24
+ * - `createDevLoginHandler` mounts a `/api/dev/login` endpoint for role-switching
25
+ * during development. Issues a signed dev session cookie. No-ops in production.
26
+ * - `createGuestSessionHandler` — mounts a `/api/guest/session` endpoint so Venue
27
+ * visitors can obtain a guest session (platformRole `'guest'`) for anonymous
28
+ * browse and booking flows, before they create an account.
29
+ *
30
+ * @example Production setup (Venue / Academy)
21
31
  * ```typescript
22
- * import { createAuthMiddleware } from '@soulcraft/sdk/server'
23
- * import { auth } from './better-auth.js'
32
+ * import { createAuthMiddleware, createRemoteSessionVerifier } from '@soulcraft/sdk/server'
24
33
  *
25
- * const { requireAuth, optionalAuth } = createAuthMiddleware(auth)
34
+ * const verifySession = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
35
+ * const { requireAuth, optionalAuth } = createAuthMiddleware(verifySession)
26
36
  *
27
- * app.get('/api/workspaces', requireAuth, async (c) => {
28
- * const user = c.get('user')! // SoulcraftSessionUser, guaranteed non-null
37
+ * app.get('/api/bookings', requireAuth, async (c) => {
38
+ * const user = c.get('user')! // SoulcraftSessionUser
29
39
  * })
30
40
  * ```
31
41
  */
@@ -37,30 +47,108 @@ import { computeEmailHash } from './config.js';
37
47
  /** The Hono context variable key where the resolved user is stored. */
38
48
  export const AUTH_USER_KEY = 'user';
39
49
  // ─────────────────────────────────────────────────────────────────────────────
50
+ // Shared internal helpers
51
+ // ─────────────────────────────────────────────────────────────────────────────
52
+ /** Resolve a raw user record from a better-auth session into a `SoulcraftSessionUser`. */
53
+ function _resolveUser(raw) {
54
+ const email = String(raw['email'] ?? '');
55
+ const emailHash = raw['emailHash']
56
+ ? String(raw['emailHash'])
57
+ : computeEmailHash(email);
58
+ return {
59
+ id: String(raw['id'] ?? ''),
60
+ email,
61
+ name: String(raw['name'] ?? ''),
62
+ image: raw['image'] ?? null,
63
+ platformRole: raw['platformRole'] ?? 'creator',
64
+ emailHash,
65
+ };
66
+ }
67
+ /** Parse a simple `name=value` cookie from a raw cookie header string. */
68
+ function _parseCookie(cookieHeader, name) {
69
+ for (const part of cookieHeader.split(';')) {
70
+ const [k, ...rest] = part.trim().split('=');
71
+ if (k?.trim() === name)
72
+ return rest.join('=').trim();
73
+ }
74
+ return undefined;
75
+ }
76
+ /** Encode a dev/guest session payload as a compact JSON+base64url string (unsigned). */
77
+ function _encodeSessionCookie(session) {
78
+ return Buffer.from(JSON.stringify(session)).toString('base64url');
79
+ }
80
+ /** Decode a session payload encoded by `_encodeSessionCookie`. Returns null on any error. */
81
+ function _decodeSessionCookie(value) {
82
+ try {
83
+ const raw = JSON.parse(Buffer.from(value, 'base64url').toString('utf-8'));
84
+ if (!raw.user || !raw.sessionId || !raw.expiresAt)
85
+ return null;
86
+ if (raw.expiresAt < Date.now())
87
+ return null;
88
+ return raw;
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ }
94
+ // ─────────────────────────────────────────────────────────────────────────────
40
95
  // createAuthMiddleware
41
96
  // ─────────────────────────────────────────────────────────────────────────────
42
97
  /**
43
- * @description Creates Hono auth middleware bound to a specific better-auth instance.
98
+ * Creates Hono auth middleware from a `SessionVerifier` function or a `BetterAuthLike`
99
+ * instance.
100
+ *
101
+ * **Preferred form (all products in OIDC-client mode):**
102
+ * Pass a `SessionVerifier` returned by `createRemoteSessionVerifier` or
103
+ * `createDevSessionVerifier`. The middleware reads the request cookie header and
104
+ * passes it to the verifier.
44
105
  *
45
- * Returns `requireAuth` and `optionalAuth` middleware functions. Both functions
46
- * resolve the session from request cookies/headers using better-auth's `getSession`
47
- * API and attach the user to the Hono context under the `'user'` variable key.
106
+ * **Legacy form (Workshop standalone mode):**
107
+ * Pass a `better-auth` instance directly. The middleware calls `auth.api.getSession`.
108
+ * In non-production environments and when `devAutoLogin` is enabled, a synthetic dev
109
+ * user is injected on failed lookups so local dev works without OAuth.
48
110
  *
49
- * In non-production environments (`NODE_ENV !== 'production'`), a synthetic dev
50
- * user is injected automatically to allow local development without OAuth setup.
51
- * Disable this with `options.devAutoLogin = false`.
111
+ * Both forms return identical `{ requireAuth, optionalAuth }` middleware.
52
112
  *
53
- * @param auth - The product's better-auth instance.
54
- * @param options - Optional middleware configuration.
113
+ * @param authOrVerifier - A `better-auth` instance or a `SessionVerifier` function.
114
+ * @param options - Optional middleware configuration (only applies to `BetterAuthLike` form).
55
115
  * @returns Middleware pair: `{ requireAuth, optionalAuth }`.
56
116
  *
57
- * @example
117
+ * @example Verifier form (Venue / Academy / Workshop in OIDC mode)
118
+ * ```typescript
119
+ * const verifySession = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
120
+ * const { requireAuth } = createAuthMiddleware(verifySession)
121
+ * ```
122
+ *
123
+ * @example BetterAuth form (Workshop dev standalone)
58
124
  * ```typescript
59
- * const { requireAuth, optionalAuth } = createAuthMiddleware(auth)
60
- * app.get('/api/me', requireAuth, (c) => c.json(c.get('user')))
125
+ * import { auth } from './better-auth.js'
126
+ * const { requireAuth } = createAuthMiddleware(auth)
61
127
  * ```
62
128
  */
63
- export function createAuthMiddleware(auth, options = {}) {
129
+ export function createAuthMiddleware(authOrVerifier, options = {}) {
130
+ const isVerifier = typeof authOrVerifier === 'function';
131
+ if (isVerifier) {
132
+ const verify = authOrVerifier;
133
+ const requireAuth = async (c, next) => {
134
+ const cookieHeader = c.req.header('cookie') ?? '';
135
+ const session = await verify(cookieHeader);
136
+ if (!session)
137
+ return c.json({ error: 'Authentication required' }, 401);
138
+ c.set(AUTH_USER_KEY, session.user);
139
+ await next();
140
+ return;
141
+ };
142
+ const optionalAuth = async (c, next) => {
143
+ const cookieHeader = c.req.header('cookie') ?? '';
144
+ const session = await verify(cookieHeader);
145
+ c.set(AUTH_USER_KEY, session?.user ?? null);
146
+ await next();
147
+ };
148
+ return { requireAuth, optionalAuth };
149
+ }
150
+ // BetterAuthLike form (Workshop standalone)
151
+ const auth = authOrVerifier;
64
152
  const devAutoLogin = options.devAutoLogin ?? true;
65
153
  const isDev = process.env['NODE_ENV'] !== 'production';
66
154
  const DEV_USER = {
@@ -71,20 +159,6 @@ export function createAuthMiddleware(auth, options = {}) {
71
159
  emailHash: computeEmailHash('dev@localhost'),
72
160
  platformRole: 'creator',
73
161
  };
74
- function resolveUser(raw) {
75
- const email = String(raw['email'] ?? '');
76
- const emailHash = raw['emailHash']
77
- ? String(raw['emailHash'])
78
- : computeEmailHash(email);
79
- return {
80
- id: String(raw['id'] ?? ''),
81
- email,
82
- name: String(raw['name'] ?? ''),
83
- image: raw['image'] ?? null,
84
- platformRole: raw['platformRole'] ?? 'creator',
85
- emailHash,
86
- };
87
- }
88
162
  const requireAuth = async (c, next) => {
89
163
  if (isDev && devAutoLogin) {
90
164
  if (!c.get(AUTH_USER_KEY))
@@ -96,7 +170,7 @@ export function createAuthMiddleware(auth, options = {}) {
96
170
  if (!session?.user) {
97
171
  return c.json({ error: 'Authentication required' }, 401);
98
172
  }
99
- c.set(AUTH_USER_KEY, resolveUser(session.user));
173
+ c.set(AUTH_USER_KEY, _resolveUser(session.user));
100
174
  await next();
101
175
  return;
102
176
  };
@@ -109,7 +183,7 @@ export function createAuthMiddleware(auth, options = {}) {
109
183
  }
110
184
  const session = await auth.api.getSession({ headers: c.req.raw.headers });
111
185
  if (session?.user) {
112
- c.set(AUTH_USER_KEY, resolveUser(session.user));
186
+ c.set(AUTH_USER_KEY, _resolveUser(session.user));
113
187
  }
114
188
  else {
115
189
  c.set(AUTH_USER_KEY, null);
@@ -122,18 +196,24 @@ export function createAuthMiddleware(auth, options = {}) {
122
196
  // createRemoteSessionVerifier
123
197
  // ─────────────────────────────────────────────────────────────────────────────
124
198
  /**
125
- * @description Creates a cached remote session verifier that proxies session lookups
126
- * to the central IdP at `auth.soulcraft.com`.
199
+ * Creates a cached remote session verifier that proxies session lookups to
200
+ * the central IdP at `auth.soulcraft.com`.
127
201
  *
128
- * Used by products that operate as OIDC clients and need to verify sessions without
129
- * running a full better-auth instance locally. Caches successful lookups to avoid
130
- * per-request HTTP calls to the IdP.
202
+ * Used by products that operate as OIDC clients (Venue, Academy, and Workshop
203
+ * in production). Caches successful lookups in an LRU cache to avoid per-request
204
+ * HTTP round-trips to the IdP.
131
205
  *
132
206
  * The verifier sends the cookie header to the IdP's `/api/auth/get-session` endpoint
133
- * and returns the resolved `SoulcraftSession` or null if the session is invalid.
207
+ * and returns the resolved `SoulcraftSession` or `null` if the session is invalid.
208
+ *
209
+ * Pass the returned function directly to `createAuthMiddleware`:
210
+ * ```typescript
211
+ * const verifySession = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
212
+ * const { requireAuth } = createAuthMiddleware(verifySession)
213
+ * ```
134
214
  *
135
215
  * @param options - IdP URL, cache TTL, and max cache size.
136
- * @returns An async function that accepts a cookie header string and returns a session or null.
216
+ * @returns A `SessionVerifier` — async function that accepts a cookie header string.
137
217
  *
138
218
  * @example
139
219
  * ```typescript
@@ -205,33 +285,29 @@ export function createRemoteSessionVerifier(options) {
205
285
  // createDevSessionVerifier
206
286
  // ─────────────────────────────────────────────────────────────────────────────
207
287
  /**
208
- * @description Creates a session verifier that always resolves to a synthetic dev session.
288
+ * Creates a session verifier that always resolves to a synthetic dev session.
209
289
  *
210
- * Intended for products that run as OIDC clients (`SOULCRAFT_IDP_URL` set) but need
211
- * local development auth without network calls, SQLite, or real cookies. The returned
212
- * verifier always succeeds — any non-empty cookie header (or empty) resolves to the
213
- * configured synthetic user.
290
+ * Intended for products that run as OIDC clients but need local development auth
291
+ * without OAuth, network calls, SQLite, or real cookies. The returned verifier always
292
+ * succeeds — any request resolves to the configured synthetic user.
214
293
  *
215
- * Designed to be a drop-in replacement for `createRemoteSessionVerifier` in local dev:
294
+ * Designed as a drop-in replacement for `createRemoteSessionVerifier` in local dev:
216
295
  *
217
296
  * ```typescript
218
297
  * const verifySession = process.env.SOULCRAFT_IDP_URL
219
298
  * ? createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL })
220
299
  * : createDevSessionVerifier({ role: 'owner' })
221
- * ```
222
300
  *
223
- * This eliminates the need for a local `better-auth` instance, SQLite database, and
224
- * cookie management when iterating on features in OIDC-client mode.
301
+ * const { requireAuth } = createAuthMiddleware(verifySession)
302
+ * ```
225
303
  *
226
304
  * **Never use in production.** The verifier performs no validation whatsoever.
227
305
  *
228
306
  * @param options - Optional synthetic user configuration.
229
- * @returns An async function with the same signature as `createRemoteSessionVerifier`.
307
+ * @returns A `SessionVerifier` with the same signature as `createRemoteSessionVerifier`.
230
308
  *
231
- * @example SvelteKit hooks.server.ts
309
+ * @example
232
310
  * ```typescript
233
- * import { createRemoteSessionVerifier, createDevSessionVerifier } from '@soulcraft/sdk/server'
234
- *
235
311
  * const verifySession = process.env.SOULCRAFT_IDP_URL
236
312
  * ? createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL })
237
313
  * : createDevSessionVerifier({ role: 'owner' })
@@ -263,4 +339,230 @@ export function createDevSessionVerifier(options = {}) {
263
339
  return session;
264
340
  };
265
341
  }
342
+ // ─────────────────────────────────────────────────────────────────────────────
343
+ // createDevLoginHandler
344
+ // ─────────────────────────────────────────────────────────────────────────────
345
+ /**
346
+ * Creates a Hono request handler for a dev login endpoint.
347
+ *
348
+ * Mount at `/api/dev/login` to get a role-switching endpoint for local
349
+ * development. Accepts `?role=<platformRole>` and optional `?email=` / `?name=`
350
+ * query params. Issues a signed base64url session cookie that `createAuthMiddleware`
351
+ * (when used with a `SessionVerifier` that reads dev cookies) can resolve.
352
+ *
353
+ * **Guards against production use:** the handler returns HTTP 404 when
354
+ * `NODE_ENV === 'production'` — it is safe to leave mounted in all environments.
355
+ *
356
+ * @param options - Allowed roles, cookie name, and max-age.
357
+ * @returns A Hono-compatible request handler `(c: Context) => Response`.
358
+ *
359
+ * @example
360
+ * ```typescript
361
+ * import { createDevLoginHandler } from '@soulcraft/sdk/server'
362
+ *
363
+ * // In your Hono server setup:
364
+ * app.get('/api/dev/login', createDevLoginHandler({ allowedRoles: ['owner', 'staff', 'customer'] }))
365
+ *
366
+ * // Usage: GET /api/dev/login?role=staff → sets cookie + redirects to /
367
+ * ```
368
+ */
369
+ export function createDevLoginHandler(options = {}) {
370
+ const DEFAULT_ROLES = [
371
+ 'creator', 'viewer', 'customer', 'staff', 'manager', 'owner', 'learner', 'instructor',
372
+ ];
373
+ const allowedRoles = options.allowedRoles ?? DEFAULT_ROLES;
374
+ const cookieName = options.cookieName ?? 'soulcraft_dev_session';
375
+ const maxAgeSeconds = options.maxAgeSeconds ?? 86_400;
376
+ return function devLoginHandler(c) {
377
+ if (process.env['NODE_ENV'] === 'production') {
378
+ return c.json({ error: 'Not found' }, 404);
379
+ }
380
+ const role = c.req.query('role');
381
+ if (!role || !allowedRoles.includes(role)) {
382
+ return c.json({
383
+ error: `Invalid role. Allowed: ${allowedRoles.join(', ')}`,
384
+ allowedRoles,
385
+ }, 400);
386
+ }
387
+ const email = c.req.query('email') ?? `dev-${role}@soulcraft.com`;
388
+ const name = c.req.query('name') ?? `Dev ${role.charAt(0).toUpperCase() + role.slice(1)}`;
389
+ const redirect = c.req.query('redirect') ?? '/';
390
+ const session = {
391
+ user: {
392
+ id: `dev-user-${role}`,
393
+ email,
394
+ name,
395
+ image: null,
396
+ platformRole: role,
397
+ emailHash: computeEmailHash(email),
398
+ },
399
+ sessionId: `dev-session-${Date.now()}`,
400
+ expiresAt: Date.now() + maxAgeSeconds * 1000,
401
+ };
402
+ const cookieValue = _encodeSessionCookie(session);
403
+ const cookieHeader = [
404
+ `${cookieName}=${cookieValue}`,
405
+ `Path=/`,
406
+ `HttpOnly`,
407
+ `SameSite=Lax`,
408
+ `Max-Age=${maxAgeSeconds}`,
409
+ ].join('; ');
410
+ const response = new Response(null, {
411
+ status: 302,
412
+ headers: {
413
+ Location: redirect,
414
+ 'Set-Cookie': cookieHeader,
415
+ },
416
+ });
417
+ return response;
418
+ };
419
+ }
420
+ // ─────────────────────────────────────────────────────────────────────────────
421
+ // createDevCookieVerifier
422
+ // ─────────────────────────────────────────────────────────────────────────────
423
+ /**
424
+ * Creates a session verifier that reads the cookie issued by `createDevLoginHandler`.
425
+ *
426
+ * Use this together with `createDevLoginHandler` when you want dev role-switching
427
+ * (e.g. clicking "Login as Staff" in a dev UI) rather than a fixed synthetic user.
428
+ *
429
+ * The verifier decodes the base64url cookie value and returns the embedded session.
430
+ * Falls back to `null` (unauthenticated) if the cookie is absent or expired.
431
+ *
432
+ * ```typescript
433
+ * // Only one of these in dev — pick what fits your workflow:
434
+ *
435
+ * // Option A: Fixed dev user, no login UI needed
436
+ * const verifySession = createDevSessionVerifier({ role: 'owner' })
437
+ *
438
+ * // Option B: Role-switching dev login UI
439
+ * app.get('/api/dev/login', createDevLoginHandler({ allowedRoles: ['owner', 'staff', 'customer'] }))
440
+ * const verifySession = createDevCookieVerifier()
441
+ * ```
442
+ *
443
+ * @param cookieName - Must match the `cookieName` passed to `createDevLoginHandler`. Default: `'soulcraft_dev_session'`.
444
+ * @returns A `SessionVerifier` compatible with `createAuthMiddleware`.
445
+ */
446
+ export function createDevCookieVerifier(cookieName = 'soulcraft_dev_session') {
447
+ return async function verifyDevCookie(cookieHeader) {
448
+ const value = _parseCookie(cookieHeader, cookieName);
449
+ if (!value)
450
+ return null;
451
+ return _decodeSessionCookie(value);
452
+ };
453
+ }
454
+ // ─────────────────────────────────────────────────────────────────────────────
455
+ // createGuestSessionHandler
456
+ // ─────────────────────────────────────────────────────────────────────────────
457
+ /**
458
+ * Creates a Hono request handler that issues a guest session cookie.
459
+ *
460
+ * Venue visitors can browse and initiate bookings without creating an account.
461
+ * This handler mounts at e.g. `/api/guest/session` and issues a session cookie
462
+ * with `platformRole: 'guest'` and a unique guest ID on each call (if no valid
463
+ * guest session already exists).
464
+ *
465
+ * The guest session cookie can be verified using `createGuestCookieVerifier`,
466
+ * which returns a `SessionVerifier` compatible with `createAuthMiddleware`.
467
+ *
468
+ * @param options - Cookie name, max-age, and optional `onGuestCreated` callback.
469
+ * @returns A Hono-compatible request handler.
470
+ *
471
+ * @example
472
+ * ```typescript
473
+ * import { createGuestSessionHandler, createGuestCookieVerifier, createAuthMiddleware } from '@soulcraft/sdk/server'
474
+ *
475
+ * // Issue guest sessions
476
+ * app.post('/api/guest/session', createGuestSessionHandler({
477
+ * onGuestCreated: async (guestId) => {
478
+ * await db.guests.insert({ id: guestId, createdAt: new Date() })
479
+ * },
480
+ * }))
481
+ *
482
+ * // Verify guest sessions in optional auth (guests can browse)
483
+ * const verifyGuest = createGuestCookieVerifier()
484
+ * const verifySession = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
485
+ *
486
+ * // Compose: check real session first, fall back to guest
487
+ * const { optionalAuth } = createAuthMiddleware(async (cookie) =>
488
+ * await verifySession(cookie) ?? await verifyGuest(cookie)
489
+ * )
490
+ * ```
491
+ */
492
+ export function createGuestSessionHandler(options = {}) {
493
+ const cookieName = options.cookieName ?? 'soulcraft_guest_session';
494
+ const maxAgeSeconds = options.maxAgeSeconds ?? 3_600;
495
+ const onGuestCreated = options.onGuestCreated;
496
+ return async function guestSessionHandler(c) {
497
+ // Return existing guest session if still valid
498
+ const cookieHeader = c.req.header('cookie') ?? '';
499
+ const existingValue = _parseCookie(cookieHeader, cookieName);
500
+ if (existingValue) {
501
+ const existing = _decodeSessionCookie(existingValue);
502
+ if (existing)
503
+ return c.json({ guestId: existing.user.id, existing: true });
504
+ }
505
+ // Create a new guest session
506
+ const guestId = `guest-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
507
+ const email = `${guestId}@guest.soulcraft.com`;
508
+ const session = {
509
+ user: {
510
+ id: guestId,
511
+ email,
512
+ name: 'Guest',
513
+ image: null,
514
+ platformRole: 'guest',
515
+ emailHash: computeEmailHash(email),
516
+ },
517
+ sessionId: `guest-session-${Date.now()}`,
518
+ expiresAt: Date.now() + maxAgeSeconds * 1000,
519
+ };
520
+ if (onGuestCreated)
521
+ await onGuestCreated(guestId);
522
+ const cookieValue = _encodeSessionCookie(session);
523
+ const cookieHeader2 = [
524
+ `${cookieName}=${cookieValue}`,
525
+ `Path=/`,
526
+ `HttpOnly`,
527
+ `SameSite=Lax`,
528
+ `Max-Age=${maxAgeSeconds}`,
529
+ ].join('; ');
530
+ return new Response(JSON.stringify({ guestId, existing: false }), {
531
+ status: 200,
532
+ headers: {
533
+ 'Content-Type': 'application/json',
534
+ 'Set-Cookie': cookieHeader2,
535
+ },
536
+ });
537
+ };
538
+ }
539
+ // ─────────────────────────────────────────────────────────────────────────────
540
+ // createGuestCookieVerifier
541
+ // ─────────────────────────────────────────────────────────────────────────────
542
+ /**
543
+ * Creates a session verifier that reads the cookie issued by `createGuestSessionHandler`.
544
+ *
545
+ * Returns the guest `SoulcraftSession` or `null` if no valid guest cookie is present.
546
+ * Compose with `createRemoteSessionVerifier` to allow both authenticated and guest access:
547
+ *
548
+ * ```typescript
549
+ * const verifyReal = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
550
+ * const verifyGuest = createGuestCookieVerifier()
551
+ *
552
+ * const { optionalAuth } = createAuthMiddleware(async (cookie) =>
553
+ * await verifyReal(cookie) ?? await verifyGuest(cookie)
554
+ * )
555
+ * ```
556
+ *
557
+ * @param cookieName - Must match the `cookieName` passed to `createGuestSessionHandler`. Default: `'soulcraft_guest_session'`.
558
+ * @returns A `SessionVerifier` compatible with `createAuthMiddleware`.
559
+ */
560
+ export function createGuestCookieVerifier(cookieName = 'soulcraft_guest_session') {
561
+ return async function verifyGuestCookie(cookieHeader) {
562
+ const value = _parseCookie(cookieHeader, cookieName);
563
+ if (!value)
564
+ return null;
565
+ return _decodeSessionCookie(value);
566
+ };
567
+ }
266
568
  //# sourceMappingURL=middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/modules/auth/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/modules/auth/middleware.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@
15
15
  *
16
16
  * - `creator` — Workshop user: creates workspaces, kits, and publishes to Venue
17
17
  * - `viewer` — Read-only consumer of published Workshop content
18
+ * - `guest` — Venue anonymous visitor: can browse and initiate booking without an account
18
19
  * - `customer` — Venue customer: books sessions, manages loyalty account
19
20
  * - `staff` — Venue staff: check in guests, run POS, log sessions
20
21
  * - `manager` — Venue manager: all staff capabilities + analytics, scheduling
@@ -22,7 +23,7 @@
22
23
  * - `learner` — Academy learner: enrolled in courses, tracks progress
23
24
  * - `instructor` — Academy instructor: creates courses, manages live sessions
24
25
  */
25
- export type PlatformRole = 'creator' | 'viewer' | 'customer' | 'staff' | 'manager' | 'owner' | 'learner' | 'instructor';
26
+ export type PlatformRole = 'creator' | 'viewer' | 'guest' | 'customer' | 'staff' | 'manager' | 'owner' | 'learner' | 'instructor';
26
27
  /**
27
28
  * Auth providers supported across the Soulcraft platform.
28
29
  *
@@ -69,13 +70,13 @@ export interface SoulcraftUserFields {
69
70
  */
70
71
  platformRole: PlatformRole;
71
72
  /**
72
- * SHA-256 hex digest of the user's canonical email address.
73
+ * Full SHA-256 hex digest (64 characters) of the user's canonical email address.
73
74
  *
74
75
  * Computed once at account creation and never changes, even if the user updates
75
76
  * their email or switches OAuth providers. Used by Workshop to deterministically
76
77
  * locate the user's Brainy data directory without exposing the email in paths.
77
78
  *
78
- * Path pattern: `{brainyDataPath}/{emailHash.slice(0,8)}/{workspaceId}/`
79
+ * Path pattern: `{brainyDataPath}/{emailHash}/{workspaceId}/`
79
80
  *
80
81
  * @see computeEmailHash in modules/auth/config.ts
81
82
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,QAAQ,GACR,UAAU,GACV,OAAO,GACP,SAAS,GACT,OAAO,GACP,SAAS,GACT,YAAY,CAAA;AAEhB;;;;;;;;GAQG;AACH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAA;AAM5F;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAA;IACV,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,OAAO,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAA;IACpD;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAMD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,EAAE,YAAY,CAAA;IAC1B;;;;;;;;;;OAUG;IACH,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,4DAA4D;IAC5D,YAAY,EAAE,YAAY,CAAA;IAC1B,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAA;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAA;AAMnD;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,mBAAmB,EAAE,qBAAqB,GAAG,IAAI,CAAC,CAAA;IAE7G;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,mBAAmB,EAAE,4BAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAChG"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,QAAQ,GACR,OAAO,GACP,UAAU,GACV,OAAO,GACP,SAAS,GACT,OAAO,GACP,SAAS,GACT,YAAY,CAAA;AAEhB;;;;;;;;GAQG;AACH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAA;AAM5F;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAA;IACV,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,OAAO,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAA;IACpD;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAMD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,EAAE,YAAY,CAAA;IAC1B;;;;;;;;;;OAUG;IACH,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,4DAA4D;IAC5D,YAAY,EAAE,YAAY,CAAA;IAC1B,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAA;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAA;AAMnD;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,mBAAmB,EAAE,qBAAqB,GAAG,IAAI,CAAC,CAAA;IAE7G;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,mBAAmB,EAAE,4BAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAChG"}
@@ -40,8 +40,8 @@ export type { BrainyPostMessageHandlerConfig, BrainyPostMessageHandler, } from '
40
40
  export { createHallModule, generateTurnCredentials, HallClient, } from './hall-handlers.js';
41
41
  export type { HallConnectionOptions, HallModule, TurnCredentialOptions, TurnCredentials, } from './hall-handlers.js';
42
42
  export type { HallRoom, HallRoomEvents, RoomOptions, ConceptInput, RecordingManifest, TranscriptEvent, ConceptMentionEvent, RelationProposedEvent, SpeakerChangedEvent, PeerJoinedEvent, PeerLeftEvent, } from '../modules/hall/types.js';
43
- export { createAuthMiddleware, createRemoteSessionVerifier, createDevSessionVerifier, AUTH_USER_KEY, } from '../modules/auth/middleware.js';
44
- export type { AuthMiddlewareOptions, AuthMiddleware, AuthContext, BetterAuthLike, RemoteSessionVerifierOptions, DevSessionVerifierOptions, } from '../modules/auth/middleware.js';
43
+ export { createAuthMiddleware, createRemoteSessionVerifier, createDevSessionVerifier, createDevLoginHandler, createDevCookieVerifier, createGuestSessionHandler, createGuestCookieVerifier, AUTH_USER_KEY, } from '../modules/auth/middleware.js';
44
+ export type { AuthMiddlewareOptions, AuthMiddleware, AuthContext, BetterAuthLike, SessionVerifier, RemoteSessionVerifierOptions, DevSessionVerifierOptions, DevLoginHandlerOptions, GuestSessionHandlerOptions, } from '../modules/auth/middleware.js';
45
45
  export { createBackchannelLogoutHandler } from '../modules/auth/backchannel.js';
46
46
  export type { BackchannelLogoutConfig, BackchannelAuthLike, } from '../modules/auth/backchannel.js';
47
47
  export { verifyServiceToken, extractBearerToken, } from '../modules/auth/service-token.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,SAAS,GACV,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAA;AACzE,YAAY,EACV,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,GACX,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,qBAAqB,EACrB,UAAU,EACV,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,QAAQ,EACR,cAAc,EACd,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,aAAa,GACd,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,aAAa,GACd,MAAM,+BAA+B,CAAA;AACtC,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,WAAW,EACX,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAC/E,YAAY,EACV,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,gCAAgC,CAAA;AAGvC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AAGzC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAGvD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAG7E,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACxF,YAAY,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,SAAS,GACV,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAA;AACzE,YAAY,EACV,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,GACX,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,qBAAqB,EACrB,UAAU,EACV,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,QAAQ,EACR,cAAc,EACd,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,aAAa,GACd,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,GACd,MAAM,+BAA+B,CAAA;AACtC,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,WAAW,EACX,cAAc,EACd,eAAe,EACf,4BAA4B,EAC5B,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAC/E,YAAY,EACV,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,gCAAgC,CAAA;AAGvC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AAGzC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAGvD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAG7E,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACxF,YAAY,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA"}
@@ -39,8 +39,8 @@ export { createBrainyHandler, createBrainyWsHandler, } from './handlers.js';
39
39
  export { createBrainyPostMessageHandler } from './postmessage-handler.js';
40
40
  // ── Hall module factory + TURN utilities ─────────────────────────────────────
41
41
  export { createHallModule, generateTurnCredentials, HallClient, } from './hall-handlers.js';
42
- // ── Auth middleware + backchannel logout ──────────────────────────────────────
43
- export { createAuthMiddleware, createRemoteSessionVerifier, createDevSessionVerifier, AUTH_USER_KEY, } from '../modules/auth/middleware.js';
42
+ // ── Auth middleware + session factories ───────────────────────────────────────
43
+ export { createAuthMiddleware, createRemoteSessionVerifier, createDevSessionVerifier, createDevLoginHandler, createDevCookieVerifier, createGuestSessionHandler, createGuestCookieVerifier, AUTH_USER_KEY, } from '../modules/auth/middleware.js';
44
44
  export { createBackchannelLogoutHandler } from '../modules/auth/backchannel.js';
45
45
  // ── Service token verification ────────────────────────────────────────────────
46
46
  export { verifyServiceToken, extractBearerToken, } from '../modules/auth/service-token.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAM3B,iFAAiF;AACjF,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAQtB,iFAAiF;AACjF,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAA;AAMzE,gFAAgF;AAChF,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,GACX,MAAM,oBAAoB,CAAA;AAqB3B,iFAAiF;AACjF,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,aAAa,GACd,MAAM,+BAA+B,CAAA;AAStC,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAM/E,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AAEzC,mFAAmF;AACnF,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAElC,iFAAiF;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAQnD,qFAAqF;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAI7E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAExF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAM3B,iFAAiF;AACjF,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAQtB,iFAAiF;AACjF,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAA;AAMzE,gFAAgF;AAChF,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,GACX,MAAM,oBAAoB,CAAA;AAqB3B,iFAAiF;AACjF,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,GACd,MAAM,+BAA+B,CAAA;AAYtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAM/E,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AAEzC,mFAAmF;AACnF,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAElC,iFAAiF;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAQnD,qFAAqF;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAI7E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAExF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soulcraft/sdk",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "The unified Soulcraft platform SDK — data, auth, AI, billing, and notifications",
5
5
  "type": "module",
6
6
  "publishConfig": {