@growth-labs/auth 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,516 @@
1
+ import { createClientSecretBasicAuthHeader } from './utils/client-secret-header.js';
2
+ import { getCookie, setCookie } from './utils/cookies.js';
3
+ import { extractIdentityId } from './utils/identity.js';
4
+ import { resolveInternalIssuer } from './utils/issuer.js';
5
+ import { generatePKCE } from './utils/pkce.js';
6
+ import { generateState, verifyState } from './utils/state.js';
7
+ import { verifyAccessToken } from './utils/tokens.js';
8
+ const DEFAULT_CALLBACK_PATH = '/api/auth/callback';
9
+ const DEFAULT_LOGIN_PATH = '/login';
10
+ const DEFAULT_ACCESS_TOKEN_MAX_AGE = 900;
11
+ const DEFAULT_REFRESH_TOKEN_MAX_AGE = 2_592_000;
12
+ const DEFAULT_TRANSACTION_MAX_AGE = 600;
13
+ const DEFAULT_CLOCK_SKEW = 60;
14
+ export class WorkersAuthServiceUnavailableError extends Error {
15
+ code = 'AUTH_SERVICE_UNAVAILABLE';
16
+ status = 503;
17
+ constructor() {
18
+ super('Auth service unavailable');
19
+ this.name = 'WorkersAuthServiceUnavailableError';
20
+ }
21
+ }
22
+ function normalizeIssuer(value, label) {
23
+ let url;
24
+ try {
25
+ url = new URL(value);
26
+ }
27
+ catch {
28
+ throw new TypeError(`${label} must be an absolute HTTP URL`);
29
+ }
30
+ if ((url.protocol !== 'https:' && url.protocol !== 'http:') ||
31
+ url.username !== '' ||
32
+ url.password !== '' ||
33
+ (url.pathname !== '/' && url.pathname !== '') ||
34
+ url.search !== '' ||
35
+ url.hash !== '') {
36
+ throw new TypeError(`${label} must be an origin without credentials, path, query, or fragment`);
37
+ }
38
+ return url.origin;
39
+ }
40
+ function validateResource(value) {
41
+ let url;
42
+ try {
43
+ url = new URL(value);
44
+ }
45
+ catch {
46
+ throw new TypeError('resource must be an absolute HTTP URL');
47
+ }
48
+ if ((url.protocol !== 'https:' && url.protocol !== 'http:') ||
49
+ url.username !== '' ||
50
+ url.password !== '' ||
51
+ url.hash !== '') {
52
+ throw new TypeError('resource must be an absolute HTTP URL without credentials or fragment');
53
+ }
54
+ return value;
55
+ }
56
+ function isSafeAbsolutePath(path) {
57
+ const lower = path.toLowerCase();
58
+ if (!path.startsWith('/') ||
59
+ path.startsWith('//') ||
60
+ path.includes('\\') ||
61
+ lower.includes('%2f') ||
62
+ lower.includes('%5c')) {
63
+ return false;
64
+ }
65
+ try {
66
+ const parsed = new URL(path, 'https://local.invalid');
67
+ return parsed.origin === 'https://local.invalid';
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ function isSafeLocalRoute(path) {
74
+ if (!isSafeAbsolutePath(path))
75
+ return false;
76
+ const parsed = new URL(path, 'https://local.invalid');
77
+ return parsed.search === '' && parsed.hash === '';
78
+ }
79
+ function safeRedirect(path) {
80
+ return path !== null && isSafeAbsolutePath(path) ? path : '/';
81
+ }
82
+ function positiveSeconds(value, fallback, label) {
83
+ if (value === undefined)
84
+ return fallback;
85
+ if (!Number.isInteger(value) || value <= 0) {
86
+ throw new TypeError(`${label} must be a positive integer number of seconds`);
87
+ }
88
+ return value;
89
+ }
90
+ function normalizeConfig(config) {
91
+ const issuer = normalizeIssuer(config.issuer, 'issuer');
92
+ const issuerInternal = config.issuerInternal
93
+ ? normalizeIssuer(config.issuerInternal, 'issuerInternal')
94
+ : issuer;
95
+ if (typeof config.clientId !== 'string' || config.clientId.trim() === '') {
96
+ throw new TypeError('clientId is required');
97
+ }
98
+ if (typeof config.cookiePrefix !== 'string' || !/^[A-Za-z0-9_-]+$/.test(config.cookiePrefix)) {
99
+ throw new TypeError('cookiePrefix must contain only letters, numbers, underscores, or hyphens');
100
+ }
101
+ const callbackPath = config.callbackPath ?? DEFAULT_CALLBACK_PATH;
102
+ const loginPath = config.loginPath ?? DEFAULT_LOGIN_PATH;
103
+ if (!isSafeLocalRoute(callbackPath))
104
+ throw new TypeError('callbackPath must be a local route');
105
+ if (!isSafeLocalRoute(loginPath))
106
+ throw new TypeError('loginPath must be a local route');
107
+ if (!Array.isArray(config.providers) || config.providers.length === 0) {
108
+ throw new TypeError('at least one provider is required');
109
+ }
110
+ if (config.providers.some((provider) => typeof provider !== 'string' || provider.trim() === '')) {
111
+ throw new TypeError('providers must be non-empty strings');
112
+ }
113
+ const gatedPaths = [...(config.gatedPaths ?? [])];
114
+ for (const pattern of gatedPaths) {
115
+ const route = pattern.endsWith('/*') ? pattern.slice(0, -1) : pattern;
116
+ if (!isSafeLocalRoute(route))
117
+ throw new TypeError('gatedPaths must contain local routes');
118
+ }
119
+ if (config.sessionCookieDomain !== undefined &&
120
+ (!/^(?:\.?[A-Za-z0-9-]+)(?:\.[A-Za-z0-9-]+)*$/.test(config.sessionCookieDomain) ||
121
+ config.sessionCookieDomain.includes('..'))) {
122
+ throw new TypeError('sessionCookieDomain is invalid');
123
+ }
124
+ return {
125
+ issuer,
126
+ issuerInternal,
127
+ clientId: config.clientId,
128
+ clientSecret: config.clientSecret,
129
+ resource: validateResource(config.resource),
130
+ callbackPath,
131
+ cookiePrefix: config.cookiePrefix,
132
+ sessionCookieDomain: config.sessionCookieDomain,
133
+ providers: [...config.providers],
134
+ gatedPaths,
135
+ loginPath,
136
+ accessTokenMaxAge: positiveSeconds(config.accessTokenMaxAge, DEFAULT_ACCESS_TOKEN_MAX_AGE, 'accessTokenMaxAge'),
137
+ refreshTokenMaxAge: positiveSeconds(config.refreshTokenMaxAge, DEFAULT_REFRESH_TOKEN_MAX_AGE, 'refreshTokenMaxAge'),
138
+ transactionMaxAge: positiveSeconds(config.transactionMaxAge, DEFAULT_TRANSACTION_MAX_AGE, 'transactionMaxAge'),
139
+ clockSkew: positiveSeconds(config.clockSkew, DEFAULT_CLOCK_SKEW, 'clockSkew'),
140
+ };
141
+ }
142
+ function requestFrom(input) {
143
+ if (input instanceof Request)
144
+ return input;
145
+ if (input && input.req?.raw instanceof Request)
146
+ return input.req.raw;
147
+ throw new TypeError('expected a Web Request or Hono Context');
148
+ }
149
+ function cookieName(config, suffix) {
150
+ return `${config.cookiePrefix}_${suffix}`;
151
+ }
152
+ function setSecureCookie(response, name, value, path, maxAge, domain) {
153
+ setCookie(response, name, value, {
154
+ path,
155
+ maxAge,
156
+ httpOnly: true,
157
+ secure: true,
158
+ sameSite: 'lax',
159
+ ...(domain ? { domain } : {}),
160
+ });
161
+ }
162
+ function setTransactionCookies(config, response, transaction) {
163
+ const callbackNames = ['pkce', 'callback', 'expires'];
164
+ const callbackValues = [
165
+ transaction.verifier,
166
+ transaction.callback,
167
+ String(transaction.expires),
168
+ ];
169
+ for (let index = 0; index < callbackNames.length; index += 1) {
170
+ setSecureCookie(response, cookieName(config, callbackNames[index]), callbackValues[index], config.callbackPath, config.transactionMaxAge);
171
+ }
172
+ for (const [suffix, value] of [
173
+ ['state', transaction.state],
174
+ ['redirect', transaction.redirect],
175
+ ['provider', transaction.provider],
176
+ ]) {
177
+ setSecureCookie(response, cookieName(config, suffix), value, '/', config.transactionMaxAge);
178
+ }
179
+ }
180
+ function clearTransactionCookies(config, response) {
181
+ for (const suffix of ['pkce', 'callback', 'expires']) {
182
+ setSecureCookie(response, cookieName(config, suffix), '', config.callbackPath, 0);
183
+ }
184
+ for (const suffix of ['state', 'redirect', 'provider']) {
185
+ setSecureCookie(response, cookieName(config, suffix), '', '/', 0);
186
+ }
187
+ }
188
+ function setSessionCookiesNormalized(config, response, tokens) {
189
+ const mutable = cloneMutableResponse(response);
190
+ appendSessionCookiesNormalized(config, mutable, tokens);
191
+ return mutable;
192
+ }
193
+ function appendSessionCookiesNormalized(config, response, tokens) {
194
+ setSecureCookie(response, cookieName(config, 'at'), tokens.AccessToken, '/', config.accessTokenMaxAge, config.sessionCookieDomain);
195
+ setSecureCookie(response, cookieName(config, 'rt'), tokens.RefreshToken, '/', config.refreshTokenMaxAge, config.sessionCookieDomain);
196
+ }
197
+ function clearSessionCookiesNormalized(config, response) {
198
+ const mutable = cloneMutableResponse(response);
199
+ setSecureCookie(mutable, cookieName(config, 'at'), '', '/', 0, config.sessionCookieDomain);
200
+ setSecureCookie(mutable, cookieName(config, 'rt'), '', '/', 0, config.sessionCookieDomain);
201
+ return mutable;
202
+ }
203
+ function cloneMutableResponse(response) {
204
+ return new Response(response.body, {
205
+ status: response.status,
206
+ statusText: response.statusText,
207
+ headers: new Headers(response.headers),
208
+ });
209
+ }
210
+ function clearTerminalTransaction(config, response) {
211
+ clearTransactionCookies(config, response);
212
+ return response;
213
+ }
214
+ function serviceUnavailable(request) {
215
+ const headers = {
216
+ 'Cache-Control': 'private, no-store',
217
+ Pragma: 'no-cache',
218
+ Expires: '0',
219
+ };
220
+ const acceptsJson = request.headers
221
+ .get('accept')
222
+ ?.split(',')
223
+ .some((part) => part.split(';', 1)[0].trim().toLowerCase() === 'application/json');
224
+ if (acceptsJson) {
225
+ return Response.json({ error: 'auth_service_unavailable' }, { status: 503, headers });
226
+ }
227
+ return new Response('Service unavailable', { status: 503, headers });
228
+ }
229
+ async function resolveSecret(config, request) {
230
+ const source = config.clientSecret;
231
+ if (source === undefined)
232
+ return null;
233
+ let value;
234
+ try {
235
+ if (source instanceof Uint8Array) {
236
+ value = source;
237
+ }
238
+ else if (typeof source === 'function') {
239
+ value = await source(request);
240
+ }
241
+ else if ('resolve' in source && typeof source.resolve === 'function') {
242
+ value = await source.resolve(request);
243
+ }
244
+ else if ('get' in source && typeof source.get === 'function') {
245
+ value = await source.get();
246
+ }
247
+ }
248
+ catch {
249
+ throw new WorkersAuthServiceUnavailableError();
250
+ }
251
+ let secret;
252
+ try {
253
+ secret =
254
+ value instanceof Uint8Array
255
+ ? new TextDecoder('utf-8', { fatal: true }).decode(value)
256
+ : typeof value === 'string'
257
+ ? value
258
+ : '';
259
+ }
260
+ catch {
261
+ throw new WorkersAuthServiceUnavailableError();
262
+ }
263
+ if (secret.trim() === '')
264
+ throw new WorkersAuthServiceUnavailableError();
265
+ return secret;
266
+ }
267
+ function principalFromClaims(claims) {
268
+ try {
269
+ const userId = claims.userId ?? extractIdentityId(claims.sub);
270
+ return {
271
+ Subject: claims.sub,
272
+ UserID: userId,
273
+ Email: claims.email,
274
+ Name: claims.name ?? '',
275
+ Image: claims.image ?? '',
276
+ Roles: [...(claims.roles ?? [])],
277
+ Audiences: [...(claims.audiences ?? [])],
278
+ };
279
+ }
280
+ catch {
281
+ return null;
282
+ }
283
+ }
284
+ async function verifyToken(config, token) {
285
+ const claims = await verifyAccessToken(config.issuer, token, {
286
+ audience: config.resource,
287
+ algorithms: ['ES256'],
288
+ jwksIssuer: resolveInternalIssuer(config),
289
+ requireUserToken: true,
290
+ clockSkew: config.clockSkew,
291
+ });
292
+ return claims ? principalFromClaims(claims) : null;
293
+ }
294
+ async function requestTokens(config, request, form) {
295
+ const secret = await resolveSecret(config, request);
296
+ const headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' });
297
+ if (secret !== null) {
298
+ headers.set('Authorization', createClientSecretBasicAuthHeader(config.clientId, secret));
299
+ }
300
+ let response;
301
+ try {
302
+ response = await fetch(`${config.issuerInternal}/token`, {
303
+ method: 'POST',
304
+ headers,
305
+ body: form.toString(),
306
+ });
307
+ }
308
+ catch {
309
+ return null;
310
+ }
311
+ if (!response.ok)
312
+ return null;
313
+ let data;
314
+ try {
315
+ data = await response.json();
316
+ }
317
+ catch {
318
+ return null;
319
+ }
320
+ if (typeof data !== 'object' ||
321
+ data === null ||
322
+ typeof data.access_token !== 'string' ||
323
+ typeof data.refresh_token !== 'string') {
324
+ return null;
325
+ }
326
+ const tokens = {
327
+ AccessToken: data.access_token,
328
+ RefreshToken: data.refresh_token,
329
+ };
330
+ const principal = await verifyToken(config, tokens.AccessToken);
331
+ return principal ? { tokens, principal } : null;
332
+ }
333
+ export async function Authorize(config, requestOrContext, provider, redirectPath) {
334
+ const normalized = normalizeConfig(config);
335
+ if (!normalized.providers.includes(provider))
336
+ throw new TypeError('provider is not configured');
337
+ const request = requestFrom(requestOrContext);
338
+ const requestUrl = new URL(request.url);
339
+ const callback = `${requestUrl.origin}${normalized.callbackPath}`;
340
+ const { verifier, challenge } = await generatePKCE();
341
+ const state = generateState();
342
+ const redirect = safeRedirect(redirectPath);
343
+ const expires = Math.floor(Date.now() / 1000) + normalized.transactionMaxAge;
344
+ const authorizationUrl = new URL(`${normalized.issuer}/authorize`);
345
+ for (const [key, value] of [
346
+ ['response_type', 'code'],
347
+ ['client_id', normalized.clientId],
348
+ ['redirect_uri', callback],
349
+ ['scope', 'openid email profile'],
350
+ ['state', state],
351
+ ['code_challenge', challenge],
352
+ ['code_challenge_method', 'S256'],
353
+ ['provider', provider === 'email-code' ? 'code' : provider],
354
+ ['resource', normalized.resource],
355
+ ]) {
356
+ authorizationUrl.searchParams.set(key, value);
357
+ }
358
+ const response = new Response(null, {
359
+ status: 302,
360
+ headers: { Location: authorizationUrl.toString() },
361
+ });
362
+ setTransactionCookies(normalized, response, {
363
+ verifier,
364
+ callback,
365
+ expires,
366
+ state,
367
+ redirect,
368
+ provider,
369
+ });
370
+ return response;
371
+ }
372
+ export async function Callback(config, requestOrContext) {
373
+ const normalized = normalizeConfig(config);
374
+ const request = requestFrom(requestOrContext);
375
+ const url = new URL(request.url);
376
+ const state = url.searchParams.get('state') ?? '';
377
+ const storedState = getCookie(request, cookieName(normalized, 'state')) ?? '';
378
+ const callback = getCookie(request, cookieName(normalized, 'callback'));
379
+ const expectedCallback = `${url.origin}${normalized.callbackPath}`;
380
+ const storedExpires = getCookie(request, cookieName(normalized, 'expires')) ?? '';
381
+ const expires = /^(?:0|[1-9]\d*)$/.test(storedExpires) ? Number(storedExpires) : Number.NaN;
382
+ if (url.pathname !== normalized.callbackPath || !verifyState(state, storedState)) {
383
+ return new Response('Invalid state parameter', { status: 403 });
384
+ }
385
+ if (callback !== expectedCallback ||
386
+ !Number.isSafeInteger(expires) ||
387
+ Math.floor(Date.now() / 1000) >= expires) {
388
+ return clearTerminalTransaction(normalized, new Response('Invalid state parameter', { status: 403 }));
389
+ }
390
+ const verifier = getCookie(request, cookieName(normalized, 'pkce'));
391
+ if (!verifier) {
392
+ return clearTerminalTransaction(normalized, new Response('Missing PKCE verifier', { status: 400 }));
393
+ }
394
+ const code = url.searchParams.get('code');
395
+ if (url.searchParams.has('error') || !code) {
396
+ return clearTerminalTransaction(normalized, new Response(null, {
397
+ status: 302,
398
+ headers: { Location: `${normalized.loginPath}?error=auth_failed` },
399
+ }));
400
+ }
401
+ const form = new URLSearchParams();
402
+ form.set('grant_type', 'authorization_code');
403
+ form.set('code', code);
404
+ form.set('code_verifier', verifier);
405
+ form.set('redirect_uri', callback);
406
+ form.set('client_id', normalized.clientId);
407
+ form.set('resource', normalized.resource);
408
+ let result;
409
+ try {
410
+ result = await requestTokens(normalized, request, form);
411
+ }
412
+ catch (error) {
413
+ if (error instanceof WorkersAuthServiceUnavailableError) {
414
+ return clearTerminalTransaction(normalized, serviceUnavailable(request));
415
+ }
416
+ throw error;
417
+ }
418
+ if (!result) {
419
+ return clearTerminalTransaction(normalized, new Response(null, {
420
+ status: 302,
421
+ headers: { Location: `${normalized.loginPath}?error=auth_failed` },
422
+ }));
423
+ }
424
+ let response = new Response(null, {
425
+ status: 302,
426
+ headers: { Location: safeRedirect(getCookie(request, cookieName(normalized, 'redirect'))) },
427
+ });
428
+ response = setSessionCookiesNormalized(normalized, response, result.tokens);
429
+ clearTransactionCookies(normalized, response);
430
+ return response;
431
+ }
432
+ async function getSessionNormalized(config, request) {
433
+ const accessToken = getCookie(request, cookieName(config, 'at')) ?? '';
434
+ const refreshToken = getCookie(request, cookieName(config, 'rt')) ?? '';
435
+ if (accessToken) {
436
+ const principal = await verifyToken(config, accessToken);
437
+ if (principal) {
438
+ return {
439
+ Principal: principal,
440
+ Tokens: { AccessToken: accessToken, RefreshToken: refreshToken },
441
+ Refreshed: false,
442
+ };
443
+ }
444
+ }
445
+ if (refreshToken) {
446
+ const form = new URLSearchParams();
447
+ form.set('grant_type', 'refresh_token');
448
+ form.set('refresh_token', refreshToken);
449
+ form.set('client_id', config.clientId);
450
+ form.set('resource', config.resource);
451
+ const result = await requestTokens(config, request, form);
452
+ if (result) {
453
+ return { Principal: result.principal, Tokens: result.tokens, Refreshed: true };
454
+ }
455
+ }
456
+ return { Principal: null, Tokens: null, Refreshed: false };
457
+ }
458
+ export async function getSession(config, requestOrContext) {
459
+ return getSessionNormalized(normalizeConfig(config), requestFrom(requestOrContext));
460
+ }
461
+ export function setSessionCookies(config, response, tokens) {
462
+ return setSessionCookiesNormalized(normalizeConfig(config), response, tokens);
463
+ }
464
+ export function clearSessionCookies(config, response) {
465
+ return clearSessionCookiesNormalized(normalizeConfig(config), response);
466
+ }
467
+ export function Principal(source) {
468
+ if ('Principal' in source)
469
+ return source.Principal;
470
+ return source.get('principal') ?? null;
471
+ }
472
+ function isGated(config, path) {
473
+ return config.gatedPaths.some((pattern) => pattern.endsWith('/*') ? path.startsWith(pattern.slice(0, -1)) : path === pattern);
474
+ }
475
+ export function Middleware(config) {
476
+ const normalized = normalizeConfig(config);
477
+ return async (context, next) => {
478
+ const request = context.req.raw;
479
+ let session;
480
+ try {
481
+ session = await getSessionNormalized(normalized, request);
482
+ }
483
+ catch (error) {
484
+ if (error instanceof WorkersAuthServiceUnavailableError)
485
+ return serviceUnavailable(request);
486
+ throw error;
487
+ }
488
+ context.set('session', session);
489
+ context.set('principal', session.Principal);
490
+ if (!session.Principal && isGated(normalized, new URL(request.url).pathname)) {
491
+ const login = new URL(normalized.loginPath, request.url);
492
+ login.searchParams.set('redirect', new URL(request.url).pathname);
493
+ return context.redirect(login.toString(), 302);
494
+ }
495
+ await next();
496
+ if (session.Refreshed && session.Tokens) {
497
+ context.res = cloneMutableResponse(context.res);
498
+ appendSessionCookiesNormalized(normalized, context.res, session.Tokens);
499
+ }
500
+ };
501
+ }
502
+ export function New(config) {
503
+ const normalized = normalizeConfig(config);
504
+ const stableConfig = normalized;
505
+ return {
506
+ Authorize: (requestOrContext, provider, redirectPath) => Authorize(stableConfig, requestOrContext, provider, redirectPath),
507
+ Callback: (requestOrContext) => Callback(stableConfig, requestOrContext),
508
+ Middleware: () => Middleware(stableConfig),
509
+ Principal,
510
+ getSession: (requestOrContext) => getSession(stableConfig, requestOrContext),
511
+ setSessionCookies: (response, tokens) => setSessionCookies(stableConfig, response, tokens),
512
+ clearSessionCookies: (response) => clearSessionCookies(stableConfig, response),
513
+ };
514
+ }
515
+ export const createWorkersAuth = New;
516
+ //# sourceMappingURL=workers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers.js","sourceRoot":"","sources":["../src/workers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@growth-labs/auth",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "type": "module",
5
5
  "types": "./dist/index.d.ts",
6
6
  "exports": {
@@ -16,6 +16,10 @@
16
16
  "types": "./dist/server.d.ts",
17
17
  "import": "./dist/server.js"
18
18
  },
19
+ "./workers": {
20
+ "types": "./dist/workers.d.ts",
21
+ "import": "./dist/workers.js"
22
+ },
19
23
  "./middleware/*": {
20
24
  "types": "./dist/middleware/*.d.ts",
21
25
  "import": "./dist/middleware/*.js",
@@ -46,7 +50,19 @@
46
50
  },
47
51
  "peerDependencies": {
48
52
  "@growth-labs/analytics": ">=0.5.1",
49
- "astro": "^6.1.10 || ^7.0.0"
53
+ "astro": "^6.1.10 || ^7.0.0",
54
+ "hono": "^4.12.25"
55
+ },
56
+ "peerDependenciesMeta": {
57
+ "@growth-labs/analytics": {
58
+ "optional": true
59
+ },
60
+ "astro": {
61
+ "optional": true
62
+ },
63
+ "hono": {
64
+ "optional": true
65
+ }
50
66
  },
51
67
  "dependencies": {
52
68
  "jose": "^6.0.0",
@@ -54,14 +70,17 @@
54
70
  },
55
71
  "devDependencies": {
56
72
  "astro": "^6.4.6",
73
+ "hono": "^4.12.25",
57
74
  "typescript": "^5.8.0",
58
75
  "vite": "^7.3.5",
59
76
  "vitest": "^4.1.8",
77
+ "wrangler": "^4.92.0",
60
78
  "@growth-labs/analytics": "0.18.4"
61
79
  },
62
80
  "scripts": {
63
81
  "build": "tsc",
64
82
  "check": "biome check src/",
83
+ "spike:hono-worker": "wrangler deploy --dry-run --config __tests__/fixtures/hono-worker-subpaths/wrangler.jsonc --outdir .wrangler/hono-worker-subpaths --metafile",
65
84
  "test": "vitest run",
66
85
  "test:watch": "vitest"
67
86
  }
@@ -0,0 +1,8 @@
1
+ export function createClientSecretBasicAuthHeader(clientId: string, clientSecret: string): string {
2
+ return `Basic ${btoa(`${formEncode(clientId)}:${formEncode(clientSecret)}`)}`
3
+ }
4
+
5
+ function formEncode(value: string): string {
6
+ const params = new URLSearchParams({ value })
7
+ return params.toString().slice('value='.length)
8
+ }
@@ -5,6 +5,7 @@ import {
5
5
  literalClientSecret,
6
6
  } from './client-secret-literal.js'
7
7
 
8
+ export { createClientSecretBasicAuthHeader } from './client-secret-header.js'
8
9
  export type { ClientSecretLiteral }
9
10
  export { isClientSecretLiteral, literalClientSecret }
10
11
 
@@ -140,12 +141,3 @@ export async function resolveClientSecret(
140
141
  // No Request context: resolve without caching (test or internal call).
141
142
  return doResolve(clientSecret)
142
143
  }
143
-
144
- export function createClientSecretBasicAuthHeader(clientId: string, clientSecret: string): string {
145
- return `Basic ${btoa(`${formEncode(clientId)}:${formEncode(clientSecret)}`)}`
146
- }
147
-
148
- function formEncode(value: string): string {
149
- const params = new URLSearchParams({ value })
150
- return params.toString().slice('value='.length)
151
- }
@@ -16,7 +16,12 @@ export function getCookie(request: Request, name: string): string | null {
16
16
  const header = request.headers.get('cookie')
17
17
  if (!header) return null
18
18
  const match = header.match(new RegExp(`(?:^|;\\s*)${name}=([^;]*)`))
19
- return match ? decodeURIComponent(match[1]) : null
19
+ if (!match) return null
20
+ try {
21
+ return decodeURIComponent(match[1])
22
+ } catch {
23
+ return null
24
+ }
20
25
  }
21
26
 
22
27
  export function setCookie(