@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.
- package/CHANGELOG.md +9 -0
- package/README.md +49 -5
- package/dist/ports/rate-limit.d.ts.map +1 -1
- package/dist/ports/rate-limit.js +12 -0
- package/dist/ports/rate-limit.js.map +1 -1
- package/dist/server/fixtures/run-service-context-script.fixture.d.ts +12 -0
- package/dist/server/fixtures/run-service-context-script.fixture.d.ts.map +1 -0
- package/dist/server/fixtures/run-service-context-script.fixture.js +36 -0
- package/dist/server/fixtures/run-service-context-script.fixture.js.map +1 -0
- package/dist/server/hooks/rate-limit.d.ts +17 -3
- package/dist/server/hooks/rate-limit.d.ts.map +1 -1
- package/dist/server/hooks/rate-limit.js +40 -4
- package/dist/server/hooks/rate-limit.js.map +1 -1
- package/dist/server/http.d.ts +12 -0
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/request-context.d.ts +9 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js +11 -0
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/server.d.ts +19 -0
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +36 -1
- package/dist/server/server.js.map +1 -1
- package/dist/tasks/index.d.ts +22 -0
- package/dist/tasks/index.d.ts.map +1 -1
- package/dist/tasks/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/app-architecture/SKILL.md +1 -1
- package/src/ports/rate-limit.ts +12 -0
- package/src/server/fixtures/run-service-context-script.fixture.ts +45 -0
- package/src/server/hooks/rate-limit.ts +59 -7
- package/src/server/http.ts +10 -0
- package/src/server/request-context.ts +15 -0
- package/src/server/server.ts +68 -0
- 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`
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
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 {
|
|
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,
|
|
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"}
|
package/dist/ports/rate-limit.js
CHANGED
|
@@ -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;
|
|
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"
|
|
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
|
-
*
|
|
62
|
-
*
|
|
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
|
|
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
|
|
99
|
-
const getClientIp = (req) =>
|
|
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":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EACL,6BAA6B,GAE9B,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/server/hooks/rate-limit.ts"],"names":[],"mappings":"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"}
|
package/dist/server/http.d.ts
CHANGED
|
@@ -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":"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"}
|
|
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"}
|
package/dist/server/server.d.ts
CHANGED
|
@@ -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":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAIL,KAAK,kBAAkB,EAIxB,MAAM,uBAAuB,CAAC;AAiB/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAQlD,OAAO,KAAK,EACV,kBAAkB,EAElB,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAEV,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGxE,OAAO,KAAK,EACV,iBAAiB,EACjB,OAAO,EAEP,eAAe,EACf,YAAY,EAGZ,SAAS,EACT,qBAAqB,EACrB,UAAU,EACV,0BAA0B,EAC3B,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server/server.js
CHANGED
|
@@ -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,
|