@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.
- package/dist/modules/auth/middleware.d.ts +246 -68
- package/dist/modules/auth/middleware.d.ts.map +1 -1
- package/dist/modules/auth/middleware.js +369 -67
- package/dist/modules/auth/middleware.js.map +1 -1
- package/dist/modules/auth/types.d.ts +4 -3
- package/dist/modules/auth/types.d.ts.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,31 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module modules/auth/middleware
|
|
3
|
-
* @description Hono auth middleware factories
|
|
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
|
-
*
|
|
7
|
-
* to authenticate requests against a better-auth instance (local or remote IdP).
|
|
6
|
+
* ## Session verification strategies
|
|
8
7
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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
|
-
*
|
|
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
|
-
* `
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
|
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 {
|
|
34
|
+
* const verifySession = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
|
|
35
|
+
* const { requireAuth, optionalAuth } = createAuthMiddleware(verifySession)
|
|
26
36
|
*
|
|
27
|
-
* app.get('/api/
|
|
28
|
-
* const user = c.get('user')! // SoulcraftSessionUser
|
|
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
|
-
*
|
|
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
|
-
*
|
|
63
|
-
*
|
|
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
|
-
*
|
|
89
|
+
* The object returned by `createAuthMiddleware()`.
|
|
70
90
|
*/
|
|
71
91
|
export interface AuthMiddleware {
|
|
72
92
|
/**
|
|
73
|
-
* Require authentication. Resolves the
|
|
74
|
-
* valid, attaches the typed user to the Hono context
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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 {
|
|
136
|
-
*
|
|
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(
|
|
211
|
+
export declare function createAuthMiddleware(authOrVerifier: BetterAuthLike | SessionVerifier, options?: AuthMiddlewareOptions): AuthMiddleware;
|
|
140
212
|
/**
|
|
141
|
-
*
|
|
142
|
-
*
|
|
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
|
|
145
|
-
*
|
|
146
|
-
*
|
|
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
|
|
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):
|
|
243
|
+
export declare function createRemoteSessionVerifier(options: RemoteSessionVerifierOptions): SessionVerifier;
|
|
166
244
|
/**
|
|
167
|
-
*
|
|
245
|
+
* Creates a session verifier that always resolves to a synthetic dev session.
|
|
168
246
|
*
|
|
169
|
-
* Intended for products that run as OIDC clients
|
|
170
|
-
*
|
|
171
|
-
*
|
|
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
|
|
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
|
-
*
|
|
183
|
-
*
|
|
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
|
|
264
|
+
* @returns A `SessionVerifier` with the same signature as `createRemoteSessionVerifier`.
|
|
189
265
|
*
|
|
190
|
-
* @example
|
|
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):
|
|
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
|
|
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
|
|
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
|
-
*
|
|
7
|
-
* to authenticate requests against a better-auth instance (local or remote IdP).
|
|
6
|
+
* ## Session verification strategies
|
|
8
7
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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 {
|
|
34
|
+
* const verifySession = createRemoteSessionVerifier({ idpUrl: process.env.SOULCRAFT_IDP_URL! })
|
|
35
|
+
* const { requireAuth, optionalAuth } = createAuthMiddleware(verifySession)
|
|
26
36
|
*
|
|
27
|
-
* app.get('/api/
|
|
28
|
-
* const user = c.get('user')! // SoulcraftSessionUser
|
|
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
|
-
*
|
|
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
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
-
*
|
|
60
|
-
*
|
|
125
|
+
* import { auth } from './better-auth.js'
|
|
126
|
+
* const { requireAuth } = createAuthMiddleware(auth)
|
|
61
127
|
* ```
|
|
62
128
|
*/
|
|
63
|
-
export function createAuthMiddleware(
|
|
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,
|
|
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,
|
|
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
|
-
*
|
|
126
|
-
*
|
|
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
|
|
129
|
-
*
|
|
130
|
-
*
|
|
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
|
|
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
|
-
*
|
|
288
|
+
* Creates a session verifier that always resolves to a synthetic dev session.
|
|
209
289
|
*
|
|
210
|
-
* Intended for products that run as OIDC clients
|
|
211
|
-
*
|
|
212
|
-
*
|
|
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
|
|
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
|
-
*
|
|
224
|
-
*
|
|
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
|
|
307
|
+
* @returns A `SessionVerifier` with the same signature as `createRemoteSessionVerifier`.
|
|
230
308
|
*
|
|
231
|
-
* @example
|
|
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
|
|
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
|
|
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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/server/index.js
CHANGED
|
@@ -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 +
|
|
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';
|
package/dist/server/index.js.map
CHANGED
|
@@ -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;
|
|
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"}
|