@beignet/core 0.0.26 → 0.0.27

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 (35) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +49 -5
  3. package/dist/ports/rate-limit.d.ts.map +1 -1
  4. package/dist/ports/rate-limit.js +12 -0
  5. package/dist/ports/rate-limit.js.map +1 -1
  6. package/dist/server/fixtures/run-service-context-script.fixture.d.ts +12 -0
  7. package/dist/server/fixtures/run-service-context-script.fixture.d.ts.map +1 -0
  8. package/dist/server/fixtures/run-service-context-script.fixture.js +36 -0
  9. package/dist/server/fixtures/run-service-context-script.fixture.js.map +1 -0
  10. package/dist/server/hooks/rate-limit.d.ts +17 -3
  11. package/dist/server/hooks/rate-limit.d.ts.map +1 -1
  12. package/dist/server/hooks/rate-limit.js +40 -4
  13. package/dist/server/hooks/rate-limit.js.map +1 -1
  14. package/dist/server/http.d.ts +12 -0
  15. package/dist/server/http.d.ts.map +1 -1
  16. package/dist/server/request-context.d.ts +9 -0
  17. package/dist/server/request-context.d.ts.map +1 -1
  18. package/dist/server/request-context.js +11 -0
  19. package/dist/server/request-context.js.map +1 -1
  20. package/dist/server/server.d.ts +19 -0
  21. package/dist/server/server.d.ts.map +1 -1
  22. package/dist/server/server.js +36 -1
  23. package/dist/server/server.js.map +1 -1
  24. package/dist/tasks/index.d.ts +22 -0
  25. package/dist/tasks/index.d.ts.map +1 -1
  26. package/dist/tasks/index.js.map +1 -1
  27. package/package.json +1 -1
  28. package/skills/app-architecture/SKILL.md +1 -1
  29. package/src/ports/rate-limit.ts +12 -0
  30. package/src/server/fixtures/run-service-context-script.fixture.ts +45 -0
  31. package/src/server/hooks/rate-limit.ts +59 -7
  32. package/src/server/http.ts +10 -0
  33. package/src/server/request-context.ts +15 -0
  34. package/src/server/server.ts +68 -0
  35. package/src/tasks/index.ts +23 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @beignet/core
2
2
 
3
+ ## 0.0.27
4
+
5
+ ### Patch Changes
6
+
7
+ - 88200a0: `beignet task run <name> --tenant <id|slug>` passes the tenant to the app's `createTaskContext` and `stopTaskContext` separately from task input, so tenant selection no longer has to live in task input schemas. `@beignet/core/tasks` exports the `TaskRunContextArgs` contract for those registry exports, and the task run result includes the tenant when one was passed.
8
+ - 88200a0: Server hardening: `ip`-scoped rate limits now fail fast at startup when `createRateLimitHooks(...)` has no explicit `ipSource` (pass `ipSource: "none"` to keep the shared `ip:unknown` bucket), backed by a new optional `validate` phase on server hooks; `server.runServiceContext(...)` runs service work inside a scoped ambient context frame so seeds and one-off scripts stay safe under top-level await on Bun 1.3.x; the in-memory rate limiter now prunes expired windows instead of growing unbounded across distinct keys.
9
+ - afbe1b3: The app-architecture skill now points at `server/seed.ts` as the usual app seed entrypoint, matching the CLI convention.
10
+ - f2461a9: Add lazy Next route server loaders and update generated route files and package docs to avoid booting providers during production build imports.
11
+
3
12
  ## 0.0.26
4
13
 
5
14
  ### Patch Changes
package/README.md CHANGED
@@ -389,6 +389,15 @@ the generic HMAC verifier. For billing flows backed by `ctx.ports.payments`,
389
389
  use `@beignet/core/payments` with `createPaymentWebhookRoute(...)` from
390
390
  `@beignet/next` instead of a generic webhook catalog.
391
391
 
392
+ Feature webhook definitions stay provider-free: `defineWebhook(...)` catalogs
393
+ are contract-reachable code, and contract-reachable code cannot import
394
+ `@beignet/provider-*` packages — `beignet lint` enforces this dependency
395
+ direction. Attach provider verifiers at the route boundary through the
396
+ `verify` option of `createWebhookRoute(...)`; the inline `verifier:` option on
397
+ `defineWebhook(...)` is reserved for the core verifiers
398
+ (`createHmacWebhookVerifier(...)`, `createMemoryWebhookVerifier(...)`) and for
399
+ tests.
400
+
392
401
  ## Provider metadata
393
402
 
394
403
  Reusable provider packages should declare static metadata in `package.json`
@@ -760,6 +769,32 @@ const server = await createNextServer({ ports, routes, context: appContext });
760
769
  const app = await createTestApp({ ports, routes, context: appContext });
761
770
  ```
762
771
 
772
+ The `service` factory powers two server entrypoints:
773
+
774
+ - `server.createServiceContext(...)` returns the built context and enters the
775
+ ambient correlation frame for the rest of the caller's async execution. Use
776
+ it from long-lived runtimes only: servers, workers, and `bun test`.
777
+ - `server.runServiceContext(...)` builds the same context and runs a callback
778
+ inside a scoped ambient frame, returning the callback's result. Use it from
779
+ plain scripts such as seeds and one-off maintenance work — the
780
+ `createServiceContext(...)` entrypoint relies on `AsyncLocalStorage.enterWith`,
781
+ and resuming that frame across top-level await crashes Bun 1.3.x in plain
782
+ scripts.
783
+
784
+ ```ts
785
+ // scripts/seed.ts (plain script, top-level await)
786
+ const server = await createServer({ ports, context: appContext });
787
+
788
+ await server.runServiceContext({ tenantId: "tenant_demo" }, async (ctx) => {
789
+ await seedDemoData(ctx);
790
+ });
791
+ ```
792
+
793
+ Both entrypoints require `context.service` in the blueprint, generate fresh
794
+ `requestId` and `trace` values per call, and expose the service `actor` and
795
+ `tenant` on the ambient request context so audit and instrumentation wrappers
796
+ observe them at record time.
797
+
763
798
  ### Testing providers
764
799
 
765
800
  Use `installProviderForTest(...)` to run provider setup against test ports
@@ -1038,10 +1073,17 @@ const server = await createServer<AppContext, AppPorts>({
1038
1073
 
1039
1074
  - `global` and `ip` scopes run in `onRequest` before parsing and context
1040
1075
  creation; `user` scope runs in `beforeHandle` once `ctx.actor` exists.
1041
- - `ip` buckets default to `ip:unknown`; Beignet does not trust forwarding
1042
- headers unless you set `ipSource`. Use `"x-forwarded-for-last"` only behind a
1043
- trusted proxy that appends the socket address, or pass a function for
1044
- platform headers such as `cf-connecting-ip`.
1076
+ - `ip` scopes require an explicit `ipSource`. The hook's `validate` phase
1077
+ fails `createServer(...)` startup when a registered contract declares an
1078
+ `ip`-scoped rate limit without one, and enforcement throws the same
1079
+ configuration error for contracts added later through `server.route(...)`.
1080
+ Use `"x-forwarded-for-last"` only behind a trusted proxy that appends the
1081
+ socket address, `"x-forwarded-for-first"` when a trusted edge normalizes
1082
+ the header, or pass a function for platform headers such as
1083
+ `cf-connecting-ip`.
1084
+ - Pass `ipSource: "none"` to explicitly opt out of client-IP resolution:
1085
+ Beignet then trusts no forwarding headers and all `ip`-scoped traffic
1086
+ shares one `ip:unknown` bucket.
1045
1087
  - Denials throw the framework `429 Too Many Requests` catalog error with
1046
1088
  `scope`, `retryAfterSeconds`, and `resetAt` details. The bucket key is
1047
1089
  never included in the client-visible response.
@@ -1309,7 +1351,9 @@ Readiness checks should be cheap, bounded, and non-mutating:
1309
1351
 
1310
1352
  ```ts
1311
1353
  import { createHealthHandler } from "@beignet/core/server";
1312
- import { server } from "@/server";
1354
+ import { getServer } from "@/server";
1355
+
1356
+ const server = await getServer();
1313
1357
 
1314
1358
  const readiness = createHealthHandler(
1315
1359
  server.ports,
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/ports/rate-limit.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;OAEG;IACH,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7D;AAiBD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,CAiCvD"}
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/ports/rate-limit.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;OAEG;IACH,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7D;AAiBD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,CA6CvD"}
@@ -18,11 +18,23 @@ function toRetryAfterSeconds(resetAt) {
18
18
  */
19
19
  export function createMemoryRateLimiter() {
20
20
  const windows = new Map();
21
+ const sweepIntervalMs = 60_000;
22
+ let nextSweepAt = Date.now() + sweepIntervalMs;
21
23
  return {
22
24
  async hit({ key, limit, windowSec }) {
23
25
  assertPositiveInteger("limit", limit);
24
26
  assertPositiveInteger("windowSec", windowSec);
25
27
  const now = Date.now();
28
+ // Lazy sweep: distinct keys would otherwise accumulate expired windows
29
+ // forever. Prune them at most once per sweep interval on the hit path.
30
+ if (now >= nextSweepAt) {
31
+ for (const [existingKey, existing] of windows) {
32
+ if (existing.resetAt <= now) {
33
+ windows.delete(existingKey);
34
+ }
35
+ }
36
+ nextSweepAt = now + sweepIntervalMs;
37
+ }
26
38
  const current = windows.get(key);
27
39
  const window = current && current.resetAt > now
28
40
  ? current
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/ports/rate-limit.ts"],"names":[],"mappings":"AA8DA,SAAS,qBAAqB,CAAC,IAAY,EAAE,KAAa;IACxD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,6BAA6B,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiC,CAAC;IAEzD,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;YACjC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACtC,qBAAqB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAE9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,MAAM,GACV,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,GAAG;gBAC9B,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC;oBACE,KAAK,EAAE,CAAC;oBACR,OAAO,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;iBAChC,CAAC;YAER,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAEzB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAEzC,OAAO;gBACL,OAAO;gBACP,SAAS;gBACT,OAAO;gBACP,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC;aACxE,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/ports/rate-limit.ts"],"names":[],"mappings":"AA8DA,SAAS,qBAAqB,CAAC,IAAY,EAAE,KAAa;IACxD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,6BAA6B,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiC,CAAC;IACzD,MAAM,eAAe,GAAG,MAAM,CAAC;IAC/B,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC;IAE/C,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;YACjC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACtC,qBAAqB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAE9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,uEAAuE;YACvE,uEAAuE;YACvE,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;gBACvB,KAAK,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;oBAC9C,IAAI,QAAQ,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC;wBAC5B,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBACD,WAAW,GAAG,GAAG,GAAG,eAAe,CAAC;YACtC,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,MAAM,GACV,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,GAAG;gBAC9B,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC;oBACE,KAAK,EAAE,CAAC;oBACR,OAAO,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;iBAChC,CAAC;YAER,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAEzB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAEzC,OAAO;gBACL,OAAO;gBACP,SAAS;gBACT,OAAO;gBACP,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC;aACxE,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Plain-script fixture for `server.runServiceContext(...)`.
3
+ *
4
+ * Reproduces the crash pattern exactly: a plain script under top-level await
5
+ * that awaits an async helper which builds service work through the server.
6
+ * `createServiceContext(...)` enters the ambient frame with
7
+ * `AsyncLocalStorage.enterWith`, and resuming that frame across top-level
8
+ * await segfaults Bun 1.3.x; `runServiceContext(...)` scopes the frame with
9
+ * `AsyncLocalStorage.run` so this script must exit 0 and print the marker.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=run-service-context-script.fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-service-context-script.fixture.d.ts","sourceRoot":"","sources":["../../../src/server/fixtures/run-service-context-script.fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Plain-script fixture for `server.runServiceContext(...)`.
3
+ *
4
+ * Reproduces the crash pattern exactly: a plain script under top-level await
5
+ * that awaits an async helper which builds service work through the server.
6
+ * `createServiceContext(...)` enters the ambient frame with
7
+ * `AsyncLocalStorage.enterWith`, and resuming that frame across top-level
8
+ * await segfaults Bun 1.3.x; `runServiceContext(...)` scopes the frame with
9
+ * `AsyncLocalStorage.run` so this script must exit 0 and print the marker.
10
+ */
11
+ import { getActiveRequestContext } from "../request-context.js";
12
+ import { createServer } from "../server.js";
13
+ import { defineServerContext } from "../server-context.js";
14
+ const appContext = defineServerContext()({
15
+ request: async ({ ports }) => ({
16
+ actor: { type: "service", id: "request" },
17
+ ports,
18
+ }),
19
+ service: ({ ports }) => ({
20
+ actor: { type: "service", id: "script-service" },
21
+ ports,
22
+ }),
23
+ });
24
+ async function runScriptWork() {
25
+ const server = await createServer({
26
+ ports: {},
27
+ context: appContext,
28
+ });
29
+ return server.runServiceContext(async (ctx) => {
30
+ const ambient = getActiveRequestContext();
31
+ return `${ctx.actor.id}:${ambient?.actor?.id ?? "no-ambient"}`;
32
+ });
33
+ }
34
+ const marker = await runScriptWork();
35
+ console.log(`run-service-context-script:${marker}`);
36
+ //# sourceMappingURL=run-service-context-script.fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-service-context-script.fixture.js","sourceRoot":"","sources":["../../../src/server/fixtures/run-service-context-script.fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAO3D,MAAM,UAAU,GAAG,mBAAmB,EAAwC,CAAC;IAC7E,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;QACzC,KAAK;KACN,CAAC;IACF,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE;QAChD,KAAK;KACN,CAAC;CACH,CAAC,CAAC;AAEH,KAAK,UAAU,aAAa;IAC1B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAuC;QACtE,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,UAAU;KACpB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;QAC1C,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,YAAY,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;AACrC,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC"}
@@ -21,7 +21,9 @@ type EarlyRateLimitScope = Exclude<RateLimitScope, "user">;
21
21
  /**
22
22
  * Strategy for resolving the client IP used by `ip`-scoped limits.
23
23
  *
24
- * - `"none"` (default): do not trust request headers for IP resolution.
24
+ * - `"none"`: do not trust request headers for IP resolution. Every request
25
+ * shares one `ip:unknown` bucket; this is the explicit opt-out for apps
26
+ * that declare `ip` scopes without a trusted client-IP source.
25
27
  * - `"x-forwarded-for-last"`: the last `x-forwarded-for` entry. Use this only
26
28
  * when the app is always behind a trusted reverse proxy that appends the
27
29
  * socket address.
@@ -58,8 +60,11 @@ export interface RateLimitOptions<Ctx> {
58
60
  /**
59
61
  * Resolve the client IP for `ip`-scoped limits.
60
62
  *
61
- * Defaults to `"none"`. Pass an explicit trusted proxy strategy or a
62
- * function for platform-specific headers.
63
+ * There is no default: when any contract declares an `ip`-scoped rate limit
64
+ * and neither `ipSource` nor a custom `earlyKey` is configured, the hook
65
+ * fails at startup. Pass an explicit trusted proxy strategy, a function for
66
+ * platform-specific headers, or `"none"` to explicitly accept one shared
67
+ * `ip:unknown` bucket for all clients.
63
68
  */
64
69
  ipSource?: RateLimitIpSource;
65
70
  }
@@ -73,6 +78,15 @@ export interface RateLimitOptions<Ctx> {
73
78
  * `resetAt` details. The bucket key is never sent to clients; denials emit a
74
79
  * `rateLimit.denied` instrumentation event that carries the key for operators.
75
80
  *
81
+ * `ip`-scoped limits require an explicit `ipSource` (or a custom `earlyKey`):
82
+ * the hook's `validate` phase fails `createServer(...)` startup when a
83
+ * registered contract declares an `ip` scope without one, instead of silently
84
+ * collapsing all clients into a shared `ip:unknown` bucket. Contracts added
85
+ * later through `server.route(...)` are not visible to `validate`, so
86
+ * enforcing an `ip`-scoped limit without an `ipSource` throws the same
87
+ * configuration error at request time as a backstop. Pass `ipSource: "none"`
88
+ * to explicitly opt in to the shared `ip:unknown` bucket.
89
+ *
76
90
  * @param options - Optional key builders and client-IP source.
77
91
  * @returns A server hook backed by `ctx.ports.rateLimit`.
78
92
  */
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/server/hooks/rate-limit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAKzE,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,KAAK,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AAE3D;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,sBAAsB,GACtB,uBAAuB,GACvB,CAAC,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,GAAG;IACnC;;;;OAIG;IACH,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;QACX,GAAG,EAAE,GAAG,CAAC;QACT,GAAG,EAAE,eAAe,CAAC;QACrB,KAAK,EAAE,cAAc,CAAC;KACvB,KAAK,MAAM,CAAC;IACb;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAChB,GAAG,EAAE,eAAe,CAAC;QACrB,KAAK,EAAE,mBAAmB,CAAC;KAC5B,KAAK,MAAM,CAAC;IACb;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAgID;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,SAAS,gBAAgB,EAC/D,OAAO,GAAE,gBAAgB,CAAC,GAAG,CAAM,GAClC,UAAU,CAAC,GAAG,EAAE,cAAc,CAAC,CAuDjC"}
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/server/hooks/rate-limit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAKzE,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,KAAK,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AAE3D;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,sBAAsB,GACtB,uBAAuB,GACvB,CAAC,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,GAAG;IACnC;;;;OAIG;IACH,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;QACX,GAAG,EAAE,GAAG,CAAC;QACT,GAAG,EAAE,eAAe,CAAC;QACrB,KAAK,EAAE,cAAc,CAAC;KACvB,KAAK,MAAM,CAAC;IACb;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAChB,GAAG,EAAE,eAAe,CAAC;QACrB,KAAK,EAAE,mBAAmB,CAAC;KAC5B,KAAK,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AA8ID;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,SAAS,gBAAgB,EAC/D,OAAO,GAAE,gBAAgB,CAAC,GAAG,CAAM,GAClC,UAAU,CAAC,GAAG,EAAE,cAAc,CAAC,CA+EjC"}
@@ -25,6 +25,16 @@ function resolveClientIp(req, ipSource) {
25
25
  ? entries[0]
26
26
  : entries[entries.length - 1];
27
27
  }
28
+ function formatContractNames(names) {
29
+ return names.map((name) => `"${name}"`).join(", ");
30
+ }
31
+ function ipSourceConfigurationError(contractNames) {
32
+ return new Error(`createRateLimitHooks(...) has no ipSource configured, but contract(s) ${contractNames} declare an "ip"-scoped rate limit. ` +
33
+ `Set ipSource to "x-forwarded-for-last" (app is always behind a trusted reverse proxy that appends the socket address), ` +
34
+ `"x-forwarded-for-first" (a trusted edge normalizes the header before it reaches the app), ` +
35
+ `a function for platform-specific headers such as cf-connecting-ip, ` +
36
+ `or "none" to explicitly accept one shared ip:unknown bucket for all clients.`);
37
+ }
28
38
  function emitUserKey(userId) {
29
39
  return `user:${userId}`;
30
40
  }
@@ -91,14 +101,40 @@ async function enforceRateLimit(ports, args) {
91
101
  * `resetAt` details. The bucket key is never sent to clients; denials emit a
92
102
  * `rateLimit.denied` instrumentation event that carries the key for operators.
93
103
  *
104
+ * `ip`-scoped limits require an explicit `ipSource` (or a custom `earlyKey`):
105
+ * the hook's `validate` phase fails `createServer(...)` startup when a
106
+ * registered contract declares an `ip` scope without one, instead of silently
107
+ * collapsing all clients into a shared `ip:unknown` bucket. Contracts added
108
+ * later through `server.route(...)` are not visible to `validate`, so
109
+ * enforcing an `ip`-scoped limit without an `ipSource` throws the same
110
+ * configuration error at request time as a backstop. Pass `ipSource: "none"`
111
+ * to explicitly opt in to the shared `ip:unknown` bucket.
112
+ *
94
113
  * @param options - Optional key builders and client-IP source.
95
114
  * @returns A server hook backed by `ctx.ports.rateLimit`.
96
115
  */
97
116
  export function createRateLimitHooks(options = {}) {
98
- const ipSource = options.ipSource ?? "none";
99
- const getClientIp = (req) => resolveClientIp(req, ipSource);
117
+ const { ipSource } = options;
118
+ const getClientIp = (req, contractName) => {
119
+ if (ipSource === undefined) {
120
+ throw ipSourceConfigurationError(formatContractNames([contractName]));
121
+ }
122
+ return resolveClientIp(req, ipSource);
123
+ };
100
124
  return {
101
125
  name: "rate-limit",
126
+ validate: ({ contracts }) => {
127
+ if (ipSource !== undefined || options.earlyKey) {
128
+ return;
129
+ }
130
+ const ipScoped = contracts
131
+ .filter((contract) => contract.metadata?.rateLimit?.scope === "ip")
132
+ .map((contract) => contract.name);
133
+ if (ipScoped.length === 0) {
134
+ return;
135
+ }
136
+ throw ipSourceConfigurationError(formatContractNames(ipScoped));
137
+ },
102
138
  onRequest: async ({ contract, ports, req }) => {
103
139
  const rlMeta = contract.metadata?.rateLimit;
104
140
  if (!rlMeta) {
@@ -109,7 +145,7 @@ export function createRateLimitHooks(options = {}) {
109
145
  return undefined;
110
146
  }
111
147
  const key = options.earlyKey?.({ req, scope }) ??
112
- defaultEarlyRateLimitKey({ req, scope }, getClientIp);
148
+ defaultEarlyRateLimitKey({ req, scope }, (r) => getClientIp(r, contract.name));
113
149
  await enforceRateLimit(ports, {
114
150
  key,
115
151
  limit: rlMeta.max,
@@ -128,7 +164,7 @@ export function createRateLimitHooks(options = {}) {
128
164
  return undefined;
129
165
  }
130
166
  const key = options.key?.({ ctx, req, scope }) ??
131
- defaultRateLimitKey({ ctx, req, scope }, getClientIp);
167
+ defaultRateLimitKey({ ctx, req, scope }, (r) => getClientIp(r, contract.name));
132
168
  await enforceRateLimit(ctx.ports, {
133
169
  key,
134
170
  limit: rlMeta.max,
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/server/hooks/rate-limit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/server/hooks/rate-limit.ts"],"names":[],"mappings":"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"}
@@ -321,6 +321,18 @@ export interface ServerHook<Ctx, Ports extends AnyPorts = AnyPorts> {
321
321
  * Optional name used in diagnostics and devtools.
322
322
  */
323
323
  name?: string;
324
+ /**
325
+ * Validates the hook configuration against the registered contracts.
326
+ *
327
+ * Invoked once at startup, right after `createServer(...)` collects the
328
+ * contracts from the `routes` option and before provider setup. Throw to
329
+ * fail startup instead of degrading silently at request time. Contracts
330
+ * registered later through `server.route(...)` are not seen here, so hooks
331
+ * that need full coverage should keep a runtime check as a backstop.
332
+ */
333
+ validate?: (args: {
334
+ contracts: readonly HttpContractConfig[];
335
+ }) => void;
324
336
  /**
325
337
  * Runs after route matching and before body/query/header parsing.
326
338
  */
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;IACd;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB;;OAEG;IACH,WAAW,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IACrC;;OAEG;IACH,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB;;OAEG;IACH,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B;;OAEG;IACH,KAAK,CAAC,IAAI,eAAe,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,QAAQ,CAAC;AAEvD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,GAAG,EAAE,eAAe,KACjB,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B;;GAEG;AACH,MAAM,MAAM,kBAAkB,CAAC,aAAa,EAAE,cAAc,IAAI,CAC9D,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW,CAAC,aAAa,EAAE,cAAc;IACxD;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,eAAe,CAAC;IACnD;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9E;;OAEG;IACH,aAAa,CACX,OAAO,EAAE,qBAAqB,GAC7B,kBAAkB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;CACtD;AAED,KAAK,qBAAqB,CACxB,CAAC,SAAS,cAAc,GAAG,IAAI,EAC/B,QAAQ,IACN,CAAC,SAAS,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,kBAAkB,IAAI,qBAAqB,CACzE,CAAC,CAAC,YAAY,CAAC,EACf,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,kBAAkB,IAAI,qBAAqB,CAC1E,CAAC,CAAC,OAAO,CAAC,EACV,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,kBAAkB,IAAI,qBAAqB,CACzE,CAAC,CAAC,MAAM,CAAC,EACT,OAAO,CACR,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,kBAAkB,IACnD,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,SAAS,SAAS,GACvE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,GAAG,EAAE,CAAC,SAAS,kBAAkB;IAC5D;;OAEG;IACH,GAAG,EAAE,eAAe,CAAC;IACrB;;OAEG;IACH,GAAG,EAAE,GAAG,CAAC;IACT;;OAEG;IACH,QAAQ,EAAE,CAAC,CAAC;IAEZ;;OAEG;IACH,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACnB;;OAEG;IACH,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACrB;;OAEG;IACH,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IACzB;;OAEG;IACH,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,kBAAkB,IAAI,CACvD,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,KACtB,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAE1C;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C;;;GAGG;AACH,MAAM,MAAM,aAAa,CACvB,GAAG,EACH,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,IAC/C,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAExB;;;;;;;;;;GAUG;AACH,MAAM,WAAW,SAAS,CACxB,GAAG,EACH,QAAQ,SAAS,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAElE;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;CAC3E;AAED,KAAK,gBAAgB,CAAC,IAAI,IACxB,IAAI,SAAS,SAAS,CAAC,MAAM,IAAI,EAAE,MAAM,QAAQ,CAAC,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE1E,KAAK,mBAAmB,CAAC,KAAK,IAAI,CAChC,KAAK,SAAS,OAAO,GACjB,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GACtB,KAAK,CACV,SAAS,CAAC,KAAK,EAAE,MAAM,YAAY,KAAK,IAAI,GACzC,YAAY,GACZ,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,IAC5D,KAAK,SAAS,SAAS,EAAE,GACrB,OAAO,GACP,mBAAmB,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,MAAM,aAAa,CACvB,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,IAC/C,CAAC,IAAI,EAAE;IACT,GAAG,EAAE,eAAe,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,CAAC,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,KAAK,YAAY,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,CAAC,GAAG,IAC9B,SAAS,GACT,YAAY,GACZ;IACE,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB,CAAC;AAEN;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAC1B,GAAG,EACH,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,IAC/C,CAAC,IAAI,EAAE;IACT,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,EAAE,GAAG,CAAC;IACT,QAAQ,EAAE,CAAC,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;CACpB,KAAK,YAAY,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,CACxB,GAAG,EACH,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,IAC/C,CAAC,IAAI,EAAE;IACT,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,CAAC,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACpB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,KAAK,YAAY,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,CACvB,GAAG,EACH,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,IAC/C,CAAC,IAAI,EAAE;IACT,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,CAAC,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACpB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;AAEzB;;GAEG;AACH,MAAM,MAAM,qBAAqB,CAC/B,GAAG,EACH,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,IAC/C,CAAC,IAAI,EAAE;IACT,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,CAAC,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;CACrB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;AAEzB;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,CACpC,GAAG,EACH,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,IAC/C,CAAC,IAAI,EAAE;IACT,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,CAAC,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;CACrB,KAAK,YAAY,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU,CAAC,GAAG,EAAE,KAAK,SAAS,QAAQ,GAAG,QAAQ;IAChE;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACjC;;OAEG;IACH,YAAY,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B;;OAEG;IACH,aAAa,CAAC,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3C;;OAEG;IACH,iBAAiB,CAAC,EAAE,0BAA0B,CAAC,GAAG,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,SAAS,kBAAkB,IAAI;IAC9D;;OAEG;IACH,QAAQ,EAAE,CAAC,CAAC;IACZ;;OAEG;IACH,OAAO,EAAE,CACP,GAAG,EAAE,eAAe,EACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC5B,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B;;OAEG;IACH,KAAK,EAAE,CACL,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,KACb;QAAE,OAAO,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAA;KAAE,CAAC;CAC7C,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,15 @@ export declare function enterActiveRequestContext(context: ActiveRequestContext)
31
31
  * Clear the ambient request context for the current async execution.
32
32
  */
33
33
  export declare function clearActiveRequestContext(): void;
34
+ /**
35
+ * Run a function inside a scoped ambient request context frame.
36
+ *
37
+ * Internal to the server runtime — not part of the public package surface.
38
+ * `server.runServiceContext(...)` uses this `AsyncLocalStorage.run` form
39
+ * instead of `enterWith` because resuming an `enterWith` frame across
40
+ * top-level await crashes Bun 1.3.x in plain scripts.
41
+ */
42
+ export declare function runWithActiveRequestContext<T>(context: ActiveRequestContext, fn: () => T): T;
34
43
  /**
35
44
  * Read the ambient request context, when one is active.
36
45
  */
@@ -1 +1 @@
1
- {"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAMD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAE7E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,oBAAoB,GAAG,SAAS,CAE1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,CAOxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAO1E;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE;IACjD,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,GAAG,IAAI,CAKP;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,SAAS;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,EACD,KAAK,EAAE,KAAK,GAAG,KAAK,CAUrB"}
1
+ {"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAMD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAE7E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,OAAO,EAAE,oBAAoB,EAC7B,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CAEH;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,oBAAoB,GAAG,SAAS,CAE1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,CAOxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAO1E;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE;IACjD,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,GAAG,IAAI,CAKP;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,SAAS;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,EACD,KAAK,EAAE,KAAK,GAAG,KAAK,CAUrB"}
@@ -12,6 +12,17 @@ export function enterActiveRequestContext(context) {
12
12
  export function clearActiveRequestContext() {
13
13
  activeRequestContext.enterWith(undefined);
14
14
  }
15
+ /**
16
+ * Run a function inside a scoped ambient request context frame.
17
+ *
18
+ * Internal to the server runtime — not part of the public package surface.
19
+ * `server.runServiceContext(...)` uses this `AsyncLocalStorage.run` form
20
+ * instead of `enterWith` because resuming an `enterWith` frame across
21
+ * top-level await crashes Bun 1.3.x in plain scripts.
22
+ */
23
+ export function runWithActiveRequestContext(context, fn) {
24
+ return activeRequestContext.run(context, fn);
25
+ }
15
26
  /**
16
27
  * Read the ambient request context, when one is active.
17
28
  */
@@ -1 +1 @@
1
- {"version":3,"file":"request-context.js","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AA4BrD,MAAM,oBAAoB,GAAG,IAAI,iBAAiB,EAE/C,CAAC;AAEJ;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAA6B;IACrE,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,oBAAoB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,oBAAoB,CAAC,QAAQ,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,KAAK,GAAI,GAA2B,CAAC,KAAK,CAAC;IACjD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,OAAO,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ;QAC3D,CAAC,CAAE,KAAuB;QAC1B,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,MAAM,GAAI,GAA4B,CAAC,MAAM,CAAC;IACpD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,OAAO,OAAQ,MAA2B,CAAC,EAAE,KAAK,QAAQ;QACxD,CAAC,CAAE,MAAyB;QAC5B,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAGxC;IACC,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,EAAE,CAAC;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI,QAAQ,CAAC,KAAK;QAAE,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IACnD,IAAI,QAAQ,CAAC,MAAM;QAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAMzC,KAAY;IACZ,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAC1C,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,OAAO;QACL,GAAG,KAAK;QACR,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS;QAC/C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO;QACzC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW;KACtD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"request-context.js","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AA4BrD,MAAM,oBAAoB,GAAG,IAAI,iBAAiB,EAE/C,CAAC;AAEJ;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAA6B;IACrE,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,oBAAoB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAA6B,EAC7B,EAAW;IAEX,OAAO,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,oBAAoB,CAAC,QAAQ,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,KAAK,GAAI,GAA2B,CAAC,KAAK,CAAC;IACjD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,OAAO,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ;QAC3D,CAAC,CAAE,KAAuB;QAC1B,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,MAAM,GAAI,GAA4B,CAAC,MAAM,CAAC;IACpD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,OAAO,OAAQ,MAA2B,CAAC,EAAE,KAAK,QAAQ;QACxD,CAAC,CAAE,MAAyB;QAC5B,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAGxC;IACC,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,EAAE,CAAC;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI,QAAQ,CAAC,KAAK;QAAE,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IACnD,IAAI,QAAQ,CAAC,MAAM;QAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAMzC,KAAY;IACZ,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAC1C,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,OAAO;QACL,GAAG,KAAK;QACR,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS;QAC/C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO;QACzC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW;KACtD,CAAC;AACJ,CAAC"}
@@ -235,8 +235,27 @@ export interface ServerInstance<Ctx, Ports extends AnyPorts = AnyPorts, ServiceI
235
235
  * tasks, and background work.
236
236
  *
237
237
  * Requires `context.service` to be declared in `createServer(...)`.
238
+ *
239
+ * Only call this from long-lived runtimes such as servers, workers, and
240
+ * `bun test`. It enters the ambient correlation context with
241
+ * `AsyncLocalStorage.enterWith`, and resuming that frame across top-level
242
+ * await crashes Bun 1.3.x in plain scripts. Seeds and one-off scripts must
243
+ * use `runServiceContext(...)` instead.
238
244
  */
239
245
  createServiceContext: (...args: ServiceContextInputArgs<ServiceInput>) => Promise<Ctx>;
246
+ /**
247
+ * Build a service context and run `fn` inside a scoped ambient correlation
248
+ * frame, returning its result.
249
+ *
250
+ * This is the script-safe counterpart to `createServiceContext(...)`: the
251
+ * ambient frame is entered with `AsyncLocalStorage.run`, so plain scripts
252
+ * such as seeds and one-off maintenance work stay safe under top-level
253
+ * await. Requires `context.service` to be declared in `createServer(...)`.
254
+ */
255
+ runServiceContext: <T>(...args: [
256
+ ...ServiceContextInputArgs<ServiceInput>,
257
+ fn: (ctx: Ctx) => T | Promise<T>
258
+ ]) => Promise<T>;
240
259
  /**
241
260
  * Contract configs registered through the `routes` option.
242
261
  */
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ import { resolveContract } from "./contract-like.js";
8
8
  import { getRequestIdFromContext } from "./hooks/utils.js";
9
9
  import { createServerInstrumentation } from "./instrumentation.js";
10
10
  import { loadProviderConfig, parseStandardSchema, SchemaValidationError, } from "./providers/index.js";
11
- import { enterActiveRequestContext, readContextActor, readContextTenant, setActiveRequestIdentity, } from "./request-context.js";
11
+ import { enterActiveRequestContext, readContextActor, readContextTenant, runWithActiveRequestContext, setActiveRequestIdentity, } from "./request-context.js";
12
12
  import { createUseCaseRouteHandler, isUseCaseRouteDef, } from "./use-case-route.js";
13
13
  const ROUTE_GROUP_KIND = "beignet.route-group";
14
14
  /**
@@ -1132,6 +1132,10 @@ export async function createServer(options) {
1132
1132
  ...(options.hooks ?? []),
1133
1133
  ];
1134
1134
  const contracts = options.routes ? contractsFromRoutes(options.routes) : [];
1135
+ // Fail startup on hook misconfiguration before provider setup runs.
1136
+ for (const hook of hooks) {
1137
+ hook.validate?.({ contracts });
1138
+ }
1135
1139
  const resolvedContext = resolveServerContext(options.context);
1136
1140
  const finalizeContext = createContextFinalizer(resolvedContext, () => finalPorts);
1137
1141
  const createRequestContext = async (req, contract) => {
@@ -1172,6 +1176,36 @@ export async function createServer(options) {
1172
1176
  ambient.tenant = readContextTenant(ctx);
1173
1177
  return ctx;
1174
1178
  };
1179
+ const runServiceContext = async (...args) => {
1180
+ const serviceFactory = resolvedContext.service;
1181
+ if (!serviceFactory) {
1182
+ throw new Error("Define context.service in createServer(...) to create service contexts.");
1183
+ }
1184
+ const fn = args[args.length - 1];
1185
+ const input = (args.length > 1 ? args[0] : undefined);
1186
+ const { requestId, trace } = instrumentation.createServiceCorrelation();
1187
+ const ambient = {
1188
+ requestId,
1189
+ traceId: trace.traceId,
1190
+ spanId: trace.spanId,
1191
+ parentSpanId: trace.parentSpanId,
1192
+ traceparent: trace.traceparent,
1193
+ };
1194
+ // AsyncLocalStorage.run scopes the ambient frame to this callback, so the
1195
+ // caller's continuation never resumes through an enterWith frame — the
1196
+ // pattern that crashes Bun 1.3.x in plain scripts under top-level await.
1197
+ return runWithActiveRequestContext(ambient, async () => {
1198
+ const ctx = finalizeContext(await serviceFactory({
1199
+ ports: finalPorts,
1200
+ input,
1201
+ requestId,
1202
+ trace,
1203
+ }));
1204
+ ambient.actor = readContextActor(ctx);
1205
+ ambient.tenant = readContextTenant(ctx);
1206
+ return await fn(ctx);
1207
+ });
1208
+ };
1175
1209
  const contextRuntime = {
1176
1210
  createRequestContext,
1177
1211
  finalizeContext,
@@ -1412,6 +1446,7 @@ export async function createServer(options) {
1412
1446
  },
1413
1447
  createRequestContext: (req) => createRequestContext(req),
1414
1448
  createServiceContext,
1449
+ runServiceContext,
1415
1450
  contracts,
1416
1451
  stop,
1417
1452
  ports: finalPorts,