@edge-base/server 0.2.9 → 0.3.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.
Files changed (78) hide show
  1. package/admin-build/_app/immutable/chunks/{BfhqI0W8.js → BSIzoJ5I.js} +1 -1
  2. package/admin-build/_app/immutable/chunks/{CI1lKBjB.js → BeYswbvA.js} +1 -1
  3. package/admin-build/_app/immutable/chunks/{DncT8xH5.js → BkrC_6Ss.js} +1 -1
  4. package/admin-build/_app/immutable/chunks/{DBniE7GN.js → BunyH6GE.js} +1 -1
  5. package/admin-build/_app/immutable/chunks/{C5nMidnK.js → C-zXt-cq.js} +1 -1
  6. package/admin-build/_app/immutable/chunks/{CPLcjNR9.js → C1Mycuvd.js} +1 -1
  7. package/admin-build/_app/immutable/chunks/{0M5txo3l.js → Cek51lkE.js} +3 -3
  8. package/admin-build/_app/immutable/chunks/{_xa30BOD.js → D0mNYcxN.js} +1 -1
  9. package/admin-build/_app/immutable/chunks/D3hdqsfp.js +1 -0
  10. package/admin-build/_app/immutable/chunks/{39YMyjjq.js → DF40xjpj.js} +1 -1
  11. package/admin-build/_app/immutable/chunks/{YGUb3X-Q.js → DOOhHO-v.js} +1 -1
  12. package/admin-build/_app/immutable/chunks/DdjFeYwG.js +1 -0
  13. package/admin-build/_app/immutable/chunks/{DllVADtt.js → Dvlxm2Iq.js} +1 -1
  14. package/admin-build/_app/immutable/chunks/{BN-pHKcH.js → Xm1dHMTE.js} +1 -1
  15. package/admin-build/_app/immutable/chunks/{DUhE3Ynq.js → aPulNooa.js} +1 -1
  16. package/admin-build/_app/immutable/chunks/{DBkor_jM.js → dZsKGnWZ.js} +1 -1
  17. package/admin-build/_app/immutable/entry/{app.BW-Ac3jY.js → app.j1WHBlZX.js} +2 -2
  18. package/admin-build/_app/immutable/entry/start.BgMeGq-q.js +1 -0
  19. package/admin-build/_app/immutable/nodes/{0.CRSQPtos.js → 0.Oo7ZpbR-.js} +1 -1
  20. package/admin-build/_app/immutable/nodes/{1.HmStNbZP.js → 1.zgMnKHns.js} +1 -1
  21. package/admin-build/_app/immutable/nodes/{10.BVlz13nr.js → 10.u5mkRiUe.js} +1 -1
  22. package/admin-build/_app/immutable/nodes/{11.VwQdbWwH.js → 11.9ynAgaxV.js} +1 -1
  23. package/admin-build/_app/immutable/nodes/{12.BFAAgi1f.js → 12.M_EqzJ6s.js} +1 -1
  24. package/admin-build/_app/immutable/nodes/{13.DDdauC84.js → 13.D_NQ9q60.js} +1 -1
  25. package/admin-build/_app/immutable/nodes/{14.D_rXaafJ.js → 14.-vENIJ2w.js} +1 -1
  26. package/admin-build/_app/immutable/nodes/{15.rfFjjiZc.js → 15.DoMCZhGv.js} +1 -1
  27. package/admin-build/_app/immutable/nodes/{16.DDEpGJ4Z.js → 16.6BmnzScq.js} +1 -1
  28. package/admin-build/_app/immutable/nodes/{17.ChQWNtRN.js → 17.q6QQ9N_J.js} +1 -1
  29. package/admin-build/_app/immutable/nodes/{18.Rir_JwlF.js → 18.DUhJ6dKj.js} +1 -1
  30. package/admin-build/_app/immutable/nodes/{19.CF76nxk1.js → 19.CvkvPlGP.js} +1 -1
  31. package/admin-build/_app/immutable/nodes/{20.JQer3KPM.js → 20.cACSbRIl.js} +1 -1
  32. package/admin-build/_app/immutable/nodes/21.DZ7G8rMF.js +1 -0
  33. package/admin-build/_app/immutable/nodes/{22.DUw7X6z_.js → 22.BsQ6xeKr.js} +1 -1
  34. package/admin-build/_app/immutable/nodes/{23.DS3svA-a.js → 23.CNW3mLz5.js} +1 -1
  35. package/admin-build/_app/immutable/nodes/{24.BYOsQM6B.js → 24.CReqtEOy.js} +1 -1
  36. package/admin-build/_app/immutable/nodes/{25.n0pyDBRv.js → 25.BuxVhqlb.js} +1 -1
  37. package/admin-build/_app/immutable/nodes/{26.C-Oo8sYK.js → 26.C-LzPf62.js} +1 -1
  38. package/admin-build/_app/immutable/nodes/{27.BfxbFNkk.js → 27.Dl5RL_tB.js} +1 -1
  39. package/admin-build/_app/immutable/nodes/{28.DyHSN1q7.js → 28.CWfSQgjH.js} +1 -1
  40. package/admin-build/_app/immutable/nodes/{29.CUAmZbCc.js → 29.wUSfh2eQ.js} +1 -1
  41. package/admin-build/_app/immutable/nodes/{3.KQm4VJJg.js → 3.D_laBXeK.js} +1 -1
  42. package/admin-build/_app/immutable/nodes/{30.CQdPre5F.js → 30.DcMhZyQ0.js} +1 -1
  43. package/admin-build/_app/immutable/nodes/{31.BP6raetq.js → 31.CSwhNsNi.js} +1 -1
  44. package/admin-build/_app/immutable/nodes/{4.Glf2jJHB.js → 4.Cq28vPI2.js} +1 -1
  45. package/admin-build/_app/immutable/nodes/{5.BdFtj_-X.js → 5.BTT9B3oI.js} +1 -1
  46. package/admin-build/_app/immutable/nodes/{6.JfnwWq8s.js → 6.iCmmzXZp.js} +1 -1
  47. package/admin-build/_app/immutable/nodes/{7.C-rw9qDh.js → 7.qY5v7qqJ.js} +1 -1
  48. package/admin-build/_app/immutable/nodes/{8.CA7r1Sjs.js → 8.C6p4RvgK.js} +1 -1
  49. package/admin-build/_app/immutable/nodes/{9.B2jgJDkH.js → 9.f548N7zh.js} +1 -1
  50. package/admin-build/_app/version.json +1 -1
  51. package/admin-build/index.html +7 -7
  52. package/openapi.json +305 -3
  53. package/package.json +3 -3
  54. package/src/__tests__/auth-token.test.ts +142 -0
  55. package/src/__tests__/email-provider.test.ts +82 -0
  56. package/src/__tests__/functions-context.test.ts +87 -0
  57. package/src/__tests__/functions-d1-proxy.test.ts +70 -0
  58. package/src/__tests__/functions-route.test.ts +15 -0
  59. package/src/__tests__/room-access-policy.test.ts +26 -0
  60. package/src/__tests__/room-handler-context.test.ts +2 -0
  61. package/src/__tests__/smoke-skip-report.test.ts +1 -1
  62. package/src/durable-objects/room-runtime-base.ts +16 -5
  63. package/src/durable-objects/rooms-do.ts +4 -1
  64. package/src/lib/auth-d1-service.ts +37 -7
  65. package/src/lib/auth-token.ts +66 -0
  66. package/src/lib/email-provider.ts +115 -5
  67. package/src/lib/functions.ts +91 -1
  68. package/src/lib/internal-transport.ts +15 -1
  69. package/src/lib/jwt.ts +2 -0
  70. package/src/routes/admin.ts +8 -1
  71. package/src/routes/auth.ts +111 -19
  72. package/src/routes/room.ts +36 -2
  73. package/src/routes/storage.ts +446 -62
  74. package/src/types.ts +10 -0
  75. package/admin-build/_app/immutable/chunks/B0zJ5_Wk.js +0 -1
  76. package/admin-build/_app/immutable/chunks/DZo4s3wn.js +0 -1
  77. package/admin-build/_app/immutable/entry/start.Bcf0SjPV.js +0 -1
  78. package/admin-build/_app/immutable/nodes/21.CzGYxjpu.js +0 -1
@@ -12,11 +12,13 @@
12
12
  * - KV counter with expirationTtl: 60s
13
13
  */
14
14
  import { OpenAPIHono, createRoute, z, type HonoEnv } from '../lib/hono.js';
15
- import type { RoomNamespaceConfig } from '@edge-base/shared';
15
+ import type { EdgeBaseConfig, RoomHandlerContext, RoomNamespaceConfig } from '@edge-base/shared';
16
16
  import type { Context } from 'hono';
17
17
  import { parseConfig } from '../lib/do-router.js';
18
+ import { buildFunctionContext } from '../lib/functions.js';
18
19
  import { resolveRoomRuntime } from '../lib/room-runtime.js';
19
20
  import { zodDefaultHook, jsonResponseSchema, errorResponseSchema } from '../lib/schemas.js';
21
+ import { resolveRootServiceKey } from '../lib/service-key.js';
20
22
  import {
21
23
  acquirePendingWebSocketSlot,
22
24
  getPendingWebSocketCount,
@@ -111,6 +113,33 @@ function getRoomAuthContext(
111
113
  };
112
114
  }
113
115
 
116
+ function buildRoomRouteAccessContext(
117
+ c: Context<HonoEnv>,
118
+ config: EdgeBaseConfig,
119
+ ): RoomHandlerContext {
120
+ let executionCtx: ExecutionContext | undefined;
121
+ try {
122
+ executionCtx = c.executionCtx;
123
+ } catch {
124
+ executionCtx = undefined;
125
+ }
126
+ const ctx = buildFunctionContext({
127
+ request: c.req.raw,
128
+ auth: getRoomAuthContext(c.get('auth') as never),
129
+ databaseNamespace: c.env.DATABASE,
130
+ authNamespace: c.env.AUTH,
131
+ d1Database: c.env.AUTH_DB,
132
+ kvNamespace: c.env.KV,
133
+ config,
134
+ env: c.env,
135
+ executionCtx,
136
+ serviceKey: resolveRootServiceKey(config, c.env),
137
+ });
138
+ return {
139
+ admin: ctx.admin as never,
140
+ };
141
+ }
142
+
114
143
  export async function proxyRoomDoRequest(
115
144
  c: Context<HonoEnv>,
116
145
  path: string,
@@ -433,9 +462,11 @@ roomRoute.openapi(getRoomMetadata, async (c) => {
433
462
  }
434
463
  if (metadataAccess) {
435
464
  const auth = (c.get('auth') as { id?: string; role?: string; email?: string | null; custom?: Record<string, unknown> | null; isAnonymous?: boolean; meta?: Record<string, unknown> } | null | undefined) ?? null;
465
+ const accessCtx = buildRoomRouteAccessContext(c, config);
436
466
  const allowed = await Promise.resolve(metadataAccess(
437
467
  getRoomAuthContext(auth),
438
468
  roomId,
469
+ accessCtx,
439
470
  )).catch(() => false);
440
471
  if (!allowed) {
441
472
  return c.json({ code: 403, message: 'Denied by room metadata access rule' }, 403);
@@ -493,9 +524,11 @@ roomRoute.openapi(getRoomSummary, async (c) => {
493
524
  }
494
525
  if (metadataAccess) {
495
526
  const auth = (c.get('auth') as { id?: string; role?: string; email?: string | null; custom?: Record<string, unknown> | null; isAnonymous?: boolean; meta?: Record<string, unknown> } | null | undefined) ?? null;
527
+ const accessCtx = buildRoomRouteAccessContext(c, config);
496
528
  const allowed = await Promise.resolve(metadataAccess(
497
529
  getRoomAuthContext(auth),
498
530
  roomId,
531
+ accessCtx,
499
532
  )).catch(() => false);
500
533
  if (!allowed) {
501
534
  return c.json({ code: 403, message: 'Denied by room metadata access rule' }, 403);
@@ -557,8 +590,9 @@ roomRoute.openapi(getRoomSummaries, async (c) => {
557
590
  const deniedIds: string[] = [];
558
591
 
559
592
  if (metadataAccess) {
593
+ const accessCtx = buildRoomRouteAccessContext(c, config);
560
594
  for (const roomId of roomIds) {
561
- const allowed = await Promise.resolve(metadataAccess(authContext, roomId)).catch(() => false);
595
+ const allowed = await Promise.resolve(metadataAccess(authContext, roomId, accessCtx)).catch(() => false);
562
596
  if (allowed) {
563
597
  allowedRoomIds.push(roomId);
564
598
  } else {