@beignet/core 0.0.29 → 0.0.31
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 +13 -0
- package/README.md +49 -2
- package/dist/errors/catalog.d.ts +8 -0
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/catalog.js +8 -0
- package/dist/errors/catalog.js.map +1 -1
- package/dist/memo/index.d.ts +107 -0
- package/dist/memo/index.d.ts.map +1 -0
- package/dist/memo/index.js +205 -0
- package/dist/memo/index.js.map +1 -0
- package/dist/server/hooks/rate-limit.d.ts +3 -1
- package/dist/server/hooks/rate-limit.d.ts.map +1 -1
- package/dist/server/hooks/rate-limit.js +6 -2
- package/dist/server/hooks/rate-limit.js.map +1 -1
- package/dist/server/server.d.ts +1 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +46 -3
- package/dist/server/server.js.map +1 -1
- package/package.json +6 -1
- package/src/errors/catalog.ts +11 -1
- package/src/memo/index.ts +310 -0
- package/src/server/hooks/rate-limit.ts +6 -1
- package/src/server/server.ts +76 -18
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @beignet/core
|
|
2
2
|
|
|
3
|
+
## 0.0.31
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- d77e367: New `@beignet/core/memo` subpath: `createMemo(fn)` deduplicates a lookup for the lifetime of one request — the first call runs, later calls with the same arguments (from context, policies, use cases) share the same value and in-flight promise. The server scopes every HTTP request and `runServiceContext(...)` execution automatically; the cache dies with the request, so there is no TTL, no invalidation policy, and no cross-request staleness. Mutations pair with `memoized.invalidate(...)`, `runMemoScope(fn)` scopes scripts and tests, and devtools records `memo.hit`/`memo.miss` events with fill durations. The generated CLAUDE/AGENTS capability index now points at it.
|
|
8
|
+
|
|
9
|
+
## 0.0.30
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 38d1770: Every published package now rebuilds in `prepack`, so publishing can never ship a stale `dist/` again (the 0.0.28 packaging incident). No runtime behavior changes.
|
|
14
|
+
- b601494: Rate-limit denials now set a standard `Retry-After` header on 429 responses whenever the limiter reports a reset time, so generic HTTP clients can back off without parsing the error body. Powering this, `AppError` (and `createAppError` helpers) accept an optional `headers` option that the server merges onto the HTTP response when the error crosses the boundary.
|
|
15
|
+
|
|
3
16
|
## 0.0.29
|
|
4
17
|
|
|
5
18
|
## 0.0.28
|
package/README.md
CHANGED
|
@@ -61,6 +61,7 @@ name the framework area they depend on.
|
|
|
61
61
|
| `@beignet/core/jobs` | Job definitions, retry policies, and inline job dispatch |
|
|
62
62
|
| `@beignet/core/locks` | Lease-backed LocksPort, memory adapter, memory provider, and helpers |
|
|
63
63
|
| `@beignet/core/mail` | Mail port, memory mailer, and memory mailer provider |
|
|
64
|
+
| `@beignet/core/memo` | Request-scoped memoization for port lookups |
|
|
64
65
|
| `@beignet/core/notifications` | Notification definitions, dispatchers, inline notifications provider, mail channels, and test adapters |
|
|
65
66
|
| `@beignet/core/openapi` | OpenAPI generation |
|
|
66
67
|
| `@beignet/core/outbox` | Durable event and job outbox |
|
|
@@ -1067,6 +1068,51 @@ return ctx.ports.posts.findMany({
|
|
|
1067
1068
|
Beignet's convention is `items` for list contents and `page` for pagination
|
|
1068
1069
|
metadata. Keep filters and sort options app-owned plain objects.
|
|
1069
1070
|
|
|
1071
|
+
### Request-scoped memoization
|
|
1072
|
+
|
|
1073
|
+
Use `createMemo(...)` from `@beignet/core/memo` to run a lookup once per
|
|
1074
|
+
request no matter how many policies, use cases, and handlers ask for it. The
|
|
1075
|
+
server enters a memo scope around every HTTP request and every
|
|
1076
|
+
`server.runServiceContext(...)` execution; the scope's cache dies with it, so
|
|
1077
|
+
there is no TTL, no invalidation policy, and no cross-request staleness.
|
|
1078
|
+
|
|
1079
|
+
```ts
|
|
1080
|
+
import { createMemo } from "@beignet/core/memo";
|
|
1081
|
+
|
|
1082
|
+
const repository = createDrizzleIssuesRepository(db);
|
|
1083
|
+
|
|
1084
|
+
export const issues = {
|
|
1085
|
+
...repository,
|
|
1086
|
+
findById: createMemo(repository.findById, { name: "issues.findById" }),
|
|
1087
|
+
update: async (id: string, patch: IssuePatch) => {
|
|
1088
|
+
const updated = await repository.update(id, patch);
|
|
1089
|
+
// A write makes the memoized read stale within this same request.
|
|
1090
|
+
issues.findById.invalidate(id);
|
|
1091
|
+
return updated;
|
|
1092
|
+
},
|
|
1093
|
+
};
|
|
1094
|
+
```
|
|
1095
|
+
|
|
1096
|
+
- Wrap reads in infra, next to the adapter — use cases and policies never
|
|
1097
|
+
know caching exists. Memoize reads, not mutations, and pair mutations with
|
|
1098
|
+
`invalidate(...)` as above.
|
|
1099
|
+
- Concurrent calls share one in-flight promise; rejected promises are
|
|
1100
|
+
evicted so the next call retries instead of memoizing the failure.
|
|
1101
|
+
- Default cache keys use a structural, type-tagged encoding of the arguments
|
|
1102
|
+
(`"1"` and `1` never collide, object key order is irrelevant). Arguments
|
|
1103
|
+
that cannot be encoded deterministically throw a `MemoKeyError` naming the
|
|
1104
|
+
memo; pass `key: (...args) => string` for those.
|
|
1105
|
+
- Outside a scope — plain scripts, `createServiceContext(...)` callers —
|
|
1106
|
+
memoized functions call straight through uncached. `runMemoScope(fn)`
|
|
1107
|
+
creates a scope explicitly in scripts and unit tests.
|
|
1108
|
+
- With devtools installed, each call records a `memo.hit` or `memo.miss`
|
|
1109
|
+
event (with fill duration) under the request, so duplicate lookups are
|
|
1110
|
+
visible in the waterfall.
|
|
1111
|
+
|
|
1112
|
+
For caching that must survive across requests, use the explicit tier —
|
|
1113
|
+
`ports.cache.remember` with keys that change when the data changes — and see
|
|
1114
|
+
the request lifecycle docs for context latency budgets.
|
|
1115
|
+
|
|
1070
1116
|
### Rate limiting
|
|
1071
1117
|
|
|
1072
1118
|
Use `createRateLimitHooks(...)` from `@beignet/core/server` to enforce
|
|
@@ -1097,8 +1143,9 @@ const server = await createServer<AppContext, AppPorts>({
|
|
|
1097
1143
|
Beignet then trusts no forwarding headers and all `ip`-scoped traffic
|
|
1098
1144
|
shares one `ip:unknown` bucket.
|
|
1099
1145
|
- Denials throw the framework `429 Too Many Requests` catalog error with
|
|
1100
|
-
`scope`, `retryAfterSeconds`, and `resetAt` details
|
|
1101
|
-
|
|
1146
|
+
`scope`, `retryAfterSeconds`, and `resetAt` details, and the response
|
|
1147
|
+
carries a standard `Retry-After` header when the limiter reports a reset
|
|
1148
|
+
time. The bucket key is never included in the client-visible response.
|
|
1102
1149
|
- Each denial emits a `rateLimit.denied` instrumentation event carrying the
|
|
1103
1150
|
key, scope, limit, and window when the app ports include an
|
|
1104
1151
|
`instrumentation` or `devtools` sink, so operators keep bucket visibility.
|
package/dist/errors/catalog.d.ts
CHANGED
|
@@ -59,8 +59,15 @@ export declare class AppError<TDef extends ErrorDef = ErrorDef> extends Error {
|
|
|
59
59
|
* logs, or error reporting instead.
|
|
60
60
|
*/
|
|
61
61
|
readonly details?: InferErrorDetails<TDef>;
|
|
62
|
+
/**
|
|
63
|
+
* Optional HTTP response headers set when this error crosses the HTTP
|
|
64
|
+
* boundary, such as `Retry-After` on a 429. Headers are public response
|
|
65
|
+
* data; only include values that are safe to expose.
|
|
66
|
+
*/
|
|
67
|
+
readonly headers?: Record<string, string>;
|
|
62
68
|
constructor(def: TDef, details?: InferErrorDetails<TDef>, overrideMessage?: string, options?: {
|
|
63
69
|
cause?: unknown;
|
|
70
|
+
headers?: Record<string, string>;
|
|
64
71
|
});
|
|
65
72
|
/**
|
|
66
73
|
* Stable public error code.
|
|
@@ -85,6 +92,7 @@ export type AppErrorCreator<TCatalog extends ErrorCatalog> = {
|
|
|
85
92
|
<Key extends keyof TCatalog>(key: Key, options?: {
|
|
86
93
|
cause?: unknown;
|
|
87
94
|
details?: InferErrorDetails<TCatalog[Key]>;
|
|
95
|
+
headers?: Record<string, string>;
|
|
88
96
|
message?: string;
|
|
89
97
|
}): AppError<TCatalog[Key]>;
|
|
90
98
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/errors/catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,KAAK,kBAAkB,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7D,QAAA,MAAM,eAAe,eAAiC,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,QAAQ,CACvB,QAAQ,SAAS,kBAAkB,GAAG,SAAS,GAC3C,kBAAkB,GAClB,SAAS;IAEb,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,IAAI,SAAS,QAAQ,IAAI,IAAI,SAAS;IAClE,OAAO,EAAE,kBAAkB,CAAC;CAC7B,GACG,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAC5C,OAAO,CAAC;AAEZ;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,CAAC,SAAS,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAErE;AAED;;;;;GAKG;AACH,qBAAa,QAAQ,CAAC,IAAI,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,KAAK;IACnE,QAAQ,CAAC,CAAC,eAAe,CAAC,QAAQ;IAClC,yCAAyC;IACzC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/errors/catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,KAAK,kBAAkB,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7D,QAAA,MAAM,eAAe,eAAiC,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,QAAQ,CACvB,QAAQ,SAAS,kBAAkB,GAAG,SAAS,GAC3C,kBAAkB,GAClB,SAAS;IAEb,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,IAAI,SAAS,QAAQ,IAAI,IAAI,SAAS;IAClE,OAAO,EAAE,kBAAkB,CAAC;CAC7B,GACG,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAC5C,OAAO,CAAC;AAEZ;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,CAAC,SAAS,YAAY,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAErE;AAED;;;;;GAKG;AACH,qBAAa,QAAQ,CAAC,IAAI,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,KAAK;IACnE,QAAQ,CAAC,CAAC,eAAe,CAAC,QAAQ;IAClC,yCAAyC;IACzC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAGxC,GAAG,EAAE,IAAI,EACT,OAAO,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,EACjC,eAAe,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IASjE;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,QAAQ,SAAS,YAAY,IAAI;IAC3D;;OAEG;IACH,OAAO,EAAE,QAAQ,CAAC;IAClB;;OAEG;IACH,CAAC,GAAG,SAAS,MAAM,QAAQ,EACzB,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,OAAO,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GACA,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,CAAC,CAAC,SAAS,YAAY,EACzD,OAAO,EAAE,CAAC,GACT,eAAe,CAAC,CAAC,CAAC,CA2BpB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAiBlE"}
|
package/dist/errors/catalog.js
CHANGED
|
@@ -26,11 +26,18 @@ export class AppError extends Error {
|
|
|
26
26
|
* logs, or error reporting instead.
|
|
27
27
|
*/
|
|
28
28
|
details;
|
|
29
|
+
/**
|
|
30
|
+
* Optional HTTP response headers set when this error crosses the HTTP
|
|
31
|
+
* boundary, such as `Retry-After` on a 429. Headers are public response
|
|
32
|
+
* data; only include values that are safe to expose.
|
|
33
|
+
*/
|
|
34
|
+
headers;
|
|
29
35
|
constructor(def, details, overrideMessage, options) {
|
|
30
36
|
super(overrideMessage ?? def.message, { cause: options?.cause });
|
|
31
37
|
this.name = "AppError";
|
|
32
38
|
this.def = def;
|
|
33
39
|
this.details = details;
|
|
40
|
+
this.headers = options?.headers;
|
|
34
41
|
}
|
|
35
42
|
/**
|
|
36
43
|
* Stable public error code.
|
|
@@ -59,6 +66,7 @@ export function createAppError(catalog) {
|
|
|
59
66
|
}
|
|
60
67
|
return new AppError(def, options?.details, options?.message, {
|
|
61
68
|
cause: options?.cause,
|
|
69
|
+
headers: options?.headers,
|
|
62
70
|
});
|
|
63
71
|
});
|
|
64
72
|
appError.catalog = catalog;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/errors/catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AA4CvD;;GAEG;AACH,MAAM,UAAU,YAAY,CAA+B,IAAO;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,QAA2C,SAAQ,KAAK;IAC1D,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAClC,yCAAyC;IAChC,GAAG,CAAO;IACnB;;;;;;OAMG;IACM,OAAO,CAA2B;
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/errors/catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AA4CvD;;GAEG;AACH,MAAM,UAAU,YAAY,CAA+B,IAAO;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,QAA2C,SAAQ,KAAK;IAC1D,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAClC,yCAAyC;IAChC,GAAG,CAAO;IACnB;;;;;;OAMG;IACM,OAAO,CAA2B;IAC3C;;;;OAIG;IACM,OAAO,CAA0B;IAE1C,YACE,GAAS,EACT,OAAiC,EACjC,eAAwB,EACxB,OAA+D;QAE/D,KAAK,CAAC,eAAe,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IACzB,CAAC;CACF;AAwBD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAU;IAEV,MAAM,QAAQ,GAAG,CAAC,CAChB,GAAQ,EACR,OAKC,EACiB,EAAE;QACpB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAc,CAA8B,CAAC;QACjE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,QAAQ,CACjB,GAAG,EACH,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB;YACE,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,OAAO,EAAE,OAAO,EAAE,OAAO;SAC1B,CACF,CAAC;IACJ,CAAC,CAAuB,CAAC;IAEzB,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,IAAI,GAAG,YAAY,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAE1D,MAAM,KAAK,GAAG,GAAmC,CAAC;IAClD,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAE5C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAE1D,MAAM,QAAQ,GAAG,GAA8B,CAAC;IAChD,OAAO,CACL,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ;QACjC,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ;QACnC,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CACrC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @beignet/core/memo
|
|
3
|
+
*
|
|
4
|
+
* Request-scoped memoization for port lookups and other async functions.
|
|
5
|
+
*
|
|
6
|
+
* `createMemo(fn)` deduplicates calls with the same arguments for the
|
|
7
|
+
* lifetime of one request: the server enters a memo scope around every HTTP
|
|
8
|
+
* request and `runServiceContext(...)` execution, and the scope's cache dies
|
|
9
|
+
* with it. There is no TTL and no cross-request state, so memoized reads can
|
|
10
|
+
* never serve data staler than the request that fetched them.
|
|
11
|
+
*
|
|
12
|
+
* Outside any scope — plain scripts, `createServiceContext(...)` callers —
|
|
13
|
+
* memoized functions call straight through without caching.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Error thrown when a default cache key cannot be derived from arguments.
|
|
17
|
+
*/
|
|
18
|
+
export declare class MemoKeyError extends Error {
|
|
19
|
+
constructor(message: string);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Instrumentation event emitted by memoized functions inside a scope that
|
|
23
|
+
* carries a recorder.
|
|
24
|
+
*/
|
|
25
|
+
export interface MemoInstrumentationEvent {
|
|
26
|
+
/** Whether the call was served from the scope cache or filled it. */
|
|
27
|
+
kind: "hit" | "miss";
|
|
28
|
+
/** Memo name from `createMemo` options, defaulting to the function name. */
|
|
29
|
+
memo: string;
|
|
30
|
+
/** Encoded argument key for the call. */
|
|
31
|
+
key: string;
|
|
32
|
+
/** Fill duration for misses, rounded to two decimals. */
|
|
33
|
+
durationMs?: number;
|
|
34
|
+
/** Set when a miss's underlying call rejected (the entry is evicted). */
|
|
35
|
+
failed?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Run a function inside a memo scope with an explicit recorder.
|
|
39
|
+
*
|
|
40
|
+
* Internal to the server runtime — apps should use `runMemoScope(...)`.
|
|
41
|
+
* Always uses `AsyncLocalStorage.run` (never `enterWith`), so callers'
|
|
42
|
+
* continuations never resume through a dangling frame.
|
|
43
|
+
*/
|
|
44
|
+
export declare function runWithMemoScope<T>(options: {
|
|
45
|
+
record?: (event: MemoInstrumentationEvent) => void;
|
|
46
|
+
}, fn: () => T): T;
|
|
47
|
+
/**
|
|
48
|
+
* Run a function inside a fresh memo scope.
|
|
49
|
+
*
|
|
50
|
+
* Use this in scripts and unit tests to give memoized functions a cache
|
|
51
|
+
* lifetime. Nested scopes start empty; an active recorder is inherited so
|
|
52
|
+
* instrumentation keeps flowing.
|
|
53
|
+
*/
|
|
54
|
+
export declare function runMemoScope<T>(fn: () => T): T;
|
|
55
|
+
/**
|
|
56
|
+
* Memoized function returned by `createMemo(...)`.
|
|
57
|
+
*/
|
|
58
|
+
export type Memoized<F extends (...args: never[]) => unknown> = F & {
|
|
59
|
+
/**
|
|
60
|
+
* Drop the current scope's entry for these arguments, so the next call
|
|
61
|
+
* re-executes. Call this from mutation methods that make a memoized read
|
|
62
|
+
* stale within the same request.
|
|
63
|
+
*
|
|
64
|
+
* @returns Whether an entry existed.
|
|
65
|
+
*/
|
|
66
|
+
invalidate(...args: Parameters<F>): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Drop all of this function's entries in the current scope.
|
|
69
|
+
*/
|
|
70
|
+
clear(): void;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Options for `createMemo(...)`.
|
|
74
|
+
*/
|
|
75
|
+
export interface CreateMemoOptions<F extends (...args: never[]) => unknown> {
|
|
76
|
+
/**
|
|
77
|
+
* Name used in instrumentation events and key errors. Defaults to the
|
|
78
|
+
* wrapped function's name.
|
|
79
|
+
*/
|
|
80
|
+
name?: string;
|
|
81
|
+
/**
|
|
82
|
+
* Build the cache key from the call arguments. Defaults to a structural,
|
|
83
|
+
* type-tagged encoding of the arguments that throws `MemoKeyError` for
|
|
84
|
+
* values it cannot encode deterministically (functions, symbols, class
|
|
85
|
+
* instances, circular references).
|
|
86
|
+
*/
|
|
87
|
+
key?: (...args: Parameters<F>) => string;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Wrap an async lookup so calls with the same arguments run once per request.
|
|
91
|
+
*
|
|
92
|
+
* Within a memo scope the first call executes and every later call with the
|
|
93
|
+
* same key returns the same value — including the same in-flight promise, so
|
|
94
|
+
* concurrent calls share one execution. Rejected promises are evicted, so a
|
|
95
|
+
* failed lookup is retried by the next call rather than memoized. Outside a
|
|
96
|
+
* scope the function calls through uncached.
|
|
97
|
+
*
|
|
98
|
+
* Memoize reads, not mutations. When a mutation in the same infra module
|
|
99
|
+
* makes a memoized read stale, call `memoized.invalidate(...)` with the
|
|
100
|
+
* read's arguments.
|
|
101
|
+
*
|
|
102
|
+
* @param fn - Function to memoize. `this` is not forwarded.
|
|
103
|
+
* @param options - Optional name and key builder.
|
|
104
|
+
* @returns The function with `invalidate(...)` and `clear()` attached.
|
|
105
|
+
*/
|
|
106
|
+
export declare function createMemo<F extends (...args: never[]) => unknown>(fn: F, options?: CreateMemoOptions<F>): Memoized<F>;
|
|
107
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,qEAAqE;IACrE,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AASD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAA;CAAE,EAC/D,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CAEH;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE9C;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,IAAI,CAAC,GAAG;IAClE;;;;;;OAMG;IACH,UAAU,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IAC5C;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO;IACxE;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;CAC1C;AAsGD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,OAAO,GAAE,iBAAiB,CAAC,CAAC,CAAM,GACjC,QAAQ,CAAC,CAAC,CAAC,CA6Eb"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @beignet/core/memo
|
|
3
|
+
*
|
|
4
|
+
* Request-scoped memoization for port lookups and other async functions.
|
|
5
|
+
*
|
|
6
|
+
* `createMemo(fn)` deduplicates calls with the same arguments for the
|
|
7
|
+
* lifetime of one request: the server enters a memo scope around every HTTP
|
|
8
|
+
* request and `runServiceContext(...)` execution, and the scope's cache dies
|
|
9
|
+
* with it. There is no TTL and no cross-request state, so memoized reads can
|
|
10
|
+
* never serve data staler than the request that fetched them.
|
|
11
|
+
*
|
|
12
|
+
* Outside any scope — plain scripts, `createServiceContext(...)` callers —
|
|
13
|
+
* memoized functions call straight through without caching.
|
|
14
|
+
*/
|
|
15
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
16
|
+
/**
|
|
17
|
+
* Error thrown when a default cache key cannot be derived from arguments.
|
|
18
|
+
*/
|
|
19
|
+
export class MemoKeyError extends Error {
|
|
20
|
+
constructor(message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = "MemoKeyError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const memoScope = new AsyncLocalStorage();
|
|
26
|
+
/**
|
|
27
|
+
* Run a function inside a memo scope with an explicit recorder.
|
|
28
|
+
*
|
|
29
|
+
* Internal to the server runtime — apps should use `runMemoScope(...)`.
|
|
30
|
+
* Always uses `AsyncLocalStorage.run` (never `enterWith`), so callers'
|
|
31
|
+
* continuations never resume through a dangling frame.
|
|
32
|
+
*/
|
|
33
|
+
export function runWithMemoScope(options, fn) {
|
|
34
|
+
return memoScope.run({ entries: new Map(), record: options.record }, fn);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Run a function inside a fresh memo scope.
|
|
38
|
+
*
|
|
39
|
+
* Use this in scripts and unit tests to give memoized functions a cache
|
|
40
|
+
* lifetime. Nested scopes start empty; an active recorder is inherited so
|
|
41
|
+
* instrumentation keeps flowing.
|
|
42
|
+
*/
|
|
43
|
+
export function runMemoScope(fn) {
|
|
44
|
+
return runWithMemoScope({ record: memoScope.getStore()?.record }, fn);
|
|
45
|
+
}
|
|
46
|
+
function describeArgType(value) {
|
|
47
|
+
if (value === null)
|
|
48
|
+
return "null";
|
|
49
|
+
if (typeof value !== "object")
|
|
50
|
+
return typeof value;
|
|
51
|
+
const ctor = value.constructor?.name;
|
|
52
|
+
return ctor && ctor !== "Object" ? `class instance (${ctor})` : "object";
|
|
53
|
+
}
|
|
54
|
+
function encodeMemoValue(value, memoName, position, seen) {
|
|
55
|
+
if (value === null)
|
|
56
|
+
return ["null"];
|
|
57
|
+
switch (typeof value) {
|
|
58
|
+
case "string":
|
|
59
|
+
return ["string", value];
|
|
60
|
+
case "number":
|
|
61
|
+
return ["number", Object.is(value, -0) ? "-0" : String(value)];
|
|
62
|
+
case "boolean":
|
|
63
|
+
return ["boolean", value ? "true" : "false"];
|
|
64
|
+
case "undefined":
|
|
65
|
+
return ["undefined"];
|
|
66
|
+
case "bigint":
|
|
67
|
+
return ["bigint", value.toString()];
|
|
68
|
+
case "object":
|
|
69
|
+
break;
|
|
70
|
+
default:
|
|
71
|
+
throw new MemoKeyError(`[Beignet memo] Cannot build a default cache key for "${memoName}": argument ${position} is a ${typeof value}. Pass options.key to compute keys for these arguments.`);
|
|
72
|
+
}
|
|
73
|
+
if (value instanceof Date) {
|
|
74
|
+
return ["date", value.toISOString()];
|
|
75
|
+
}
|
|
76
|
+
if (seen.has(value)) {
|
|
77
|
+
throw new MemoKeyError(`[Beignet memo] Cannot build a default cache key for "${memoName}": argument ${position} contains a circular reference. Pass options.key to compute keys for these arguments.`);
|
|
78
|
+
}
|
|
79
|
+
if (Array.isArray(value)) {
|
|
80
|
+
seen.add(value);
|
|
81
|
+
const encoded = [
|
|
82
|
+
"array",
|
|
83
|
+
value.map((item) => encodeMemoValue(item, memoName, position, seen)),
|
|
84
|
+
];
|
|
85
|
+
seen.delete(value);
|
|
86
|
+
return encoded;
|
|
87
|
+
}
|
|
88
|
+
const proto = Object.getPrototypeOf(value);
|
|
89
|
+
if (proto !== null && proto !== Object.prototype) {
|
|
90
|
+
throw new MemoKeyError(`[Beignet memo] Cannot build a default cache key for "${memoName}": argument ${position} is a ${describeArgType(value)}. Pass options.key to compute keys for these arguments.`);
|
|
91
|
+
}
|
|
92
|
+
seen.add(value);
|
|
93
|
+
const record = value;
|
|
94
|
+
const encoded = [
|
|
95
|
+
"object",
|
|
96
|
+
Object.keys(record)
|
|
97
|
+
.sort()
|
|
98
|
+
.map((key) => [
|
|
99
|
+
key,
|
|
100
|
+
encodeMemoValue(record[key], memoName, position, seen),
|
|
101
|
+
]),
|
|
102
|
+
];
|
|
103
|
+
seen.delete(value);
|
|
104
|
+
return encoded;
|
|
105
|
+
}
|
|
106
|
+
function defaultArgsKey(memoName, args) {
|
|
107
|
+
return JSON.stringify(args.map((arg, index) => encodeMemoValue(arg, memoName, index, new WeakSet())));
|
|
108
|
+
}
|
|
109
|
+
function isPromiseLike(value) {
|
|
110
|
+
return (value !== null &&
|
|
111
|
+
(typeof value === "object" || typeof value === "function") &&
|
|
112
|
+
typeof value.then === "function");
|
|
113
|
+
}
|
|
114
|
+
function roundDuration(startedAt) {
|
|
115
|
+
return Math.round((performance.now() - startedAt) * 100) / 100;
|
|
116
|
+
}
|
|
117
|
+
let nextMemoInstance = 0;
|
|
118
|
+
/**
|
|
119
|
+
* Wrap an async lookup so calls with the same arguments run once per request.
|
|
120
|
+
*
|
|
121
|
+
* Within a memo scope the first call executes and every later call with the
|
|
122
|
+
* same key returns the same value — including the same in-flight promise, so
|
|
123
|
+
* concurrent calls share one execution. Rejected promises are evicted, so a
|
|
124
|
+
* failed lookup is retried by the next call rather than memoized. Outside a
|
|
125
|
+
* scope the function calls through uncached.
|
|
126
|
+
*
|
|
127
|
+
* Memoize reads, not mutations. When a mutation in the same infra module
|
|
128
|
+
* makes a memoized read stale, call `memoized.invalidate(...)` with the
|
|
129
|
+
* read's arguments.
|
|
130
|
+
*
|
|
131
|
+
* @param fn - Function to memoize. `this` is not forwarded.
|
|
132
|
+
* @param options - Optional name and key builder.
|
|
133
|
+
* @returns The function with `invalidate(...)` and `clear()` attached.
|
|
134
|
+
*/
|
|
135
|
+
export function createMemo(fn, options = {}) {
|
|
136
|
+
const name = options.name ?? (fn.name || "anonymous");
|
|
137
|
+
// The map key is namespaced by instance, not name, so two memos that share
|
|
138
|
+
// a name can never read each other's entries. The unit separator keeps
|
|
139
|
+
// prefixes unambiguous: instance 1 never prefix-matches instance 11.
|
|
140
|
+
nextMemoInstance += 1;
|
|
141
|
+
const instancePrefix = `${nextMemoInstance}\u001f`;
|
|
142
|
+
const keyOf = (args) => options.key ? options.key(...args) : defaultArgsKey(name, args);
|
|
143
|
+
const memoized = ((...args) => {
|
|
144
|
+
const store = memoScope.getStore();
|
|
145
|
+
if (!store)
|
|
146
|
+
return fn(...args);
|
|
147
|
+
const argsKey = keyOf(args);
|
|
148
|
+
const mapKey = instancePrefix + argsKey;
|
|
149
|
+
if (store.entries.has(mapKey)) {
|
|
150
|
+
store.record?.({ kind: "hit", memo: name, key: argsKey });
|
|
151
|
+
return store.entries.get(mapKey);
|
|
152
|
+
}
|
|
153
|
+
const startedAt = performance.now();
|
|
154
|
+
const value = fn(...args);
|
|
155
|
+
store.entries.set(mapKey, value);
|
|
156
|
+
if (isPromiseLike(value)) {
|
|
157
|
+
Promise.resolve(value).then(() => {
|
|
158
|
+
store.record?.({
|
|
159
|
+
kind: "miss",
|
|
160
|
+
memo: name,
|
|
161
|
+
key: argsKey,
|
|
162
|
+
durationMs: roundDuration(startedAt),
|
|
163
|
+
});
|
|
164
|
+
}, () => {
|
|
165
|
+
if (store.entries.get(mapKey) === value) {
|
|
166
|
+
store.entries.delete(mapKey);
|
|
167
|
+
}
|
|
168
|
+
store.record?.({
|
|
169
|
+
kind: "miss",
|
|
170
|
+
memo: name,
|
|
171
|
+
key: argsKey,
|
|
172
|
+
durationMs: roundDuration(startedAt),
|
|
173
|
+
failed: true,
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
store.record?.({
|
|
179
|
+
kind: "miss",
|
|
180
|
+
memo: name,
|
|
181
|
+
key: argsKey,
|
|
182
|
+
durationMs: roundDuration(startedAt),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
return value;
|
|
186
|
+
});
|
|
187
|
+
memoized.invalidate = (...args) => {
|
|
188
|
+
const store = memoScope.getStore();
|
|
189
|
+
if (!store)
|
|
190
|
+
return false;
|
|
191
|
+
return store.entries.delete(instancePrefix + keyOf(args));
|
|
192
|
+
};
|
|
193
|
+
memoized.clear = () => {
|
|
194
|
+
const store = memoScope.getStore();
|
|
195
|
+
if (!store)
|
|
196
|
+
return;
|
|
197
|
+
for (const key of [...store.entries.keys()]) {
|
|
198
|
+
if (key.startsWith(instancePrefix)) {
|
|
199
|
+
store.entries.delete(key);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
return memoized;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memo/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -75,7 +75,9 @@ export interface RateLimitOptions<Ctx> {
|
|
|
75
75
|
* in `onRequest` before context creation; user-scoped limits run in
|
|
76
76
|
* `beforeHandle` after route hooks have resolved identity and `ctx.actor` is
|
|
77
77
|
* available. Exceeded limits throw the framework `TooManyRequests` app error
|
|
78
|
-
* with `scope`, `retryAfterSeconds`, and `resetAt` details
|
|
78
|
+
* with `scope`, `retryAfterSeconds`, and `resetAt` details, and the 429
|
|
79
|
+
* response carries a `Retry-After` header when the limiter reports a reset
|
|
80
|
+
* time. The bucket key is
|
|
79
81
|
* never sent to clients; denials emit a `rateLimit.denied` instrumentation
|
|
80
82
|
* event that carries the key for operators.
|
|
81
83
|
*
|
|
@@ -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;;;;;;;;;;;;;;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;
|
|
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;AAiJD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,SAAS,gBAAgB,EAC/D,OAAO,GAAE,gBAAgB,CAAC,GAAG,CAAM,GAClC,UAAU,CAAC,GAAG,EAAE,cAAc,CAAC,CA+EjC"}
|
|
@@ -89,7 +89,9 @@ async function enforceRateLimit(ports, args) {
|
|
|
89
89
|
scope: args.scope,
|
|
90
90
|
retryAfterSeconds: result.retryAfterSeconds,
|
|
91
91
|
resetAt: result.resetAt?.toISOString() ?? null,
|
|
92
|
-
}, "Rate limit exceeded"
|
|
92
|
+
}, "Rate limit exceeded", result.retryAfterSeconds !== null
|
|
93
|
+
? { headers: { "Retry-After": String(result.retryAfterSeconds) } }
|
|
94
|
+
: undefined);
|
|
93
95
|
}
|
|
94
96
|
/**
|
|
95
97
|
* Create metadata-driven rate-limit hooks.
|
|
@@ -98,7 +100,9 @@ async function enforceRateLimit(ports, args) {
|
|
|
98
100
|
* in `onRequest` before context creation; user-scoped limits run in
|
|
99
101
|
* `beforeHandle` after route hooks have resolved identity and `ctx.actor` is
|
|
100
102
|
* available. Exceeded limits throw the framework `TooManyRequests` app error
|
|
101
|
-
* with `scope`, `retryAfterSeconds`, and `resetAt` details
|
|
103
|
+
* with `scope`, `retryAfterSeconds`, and `resetAt` details, and the 429
|
|
104
|
+
* response carries a `Retry-After` header when the limiter reports a reset
|
|
105
|
+
* time. The bucket key is
|
|
102
106
|
* never sent to clients; denials emit a `rateLimit.denied` instrumentation
|
|
103
107
|
* event that carries the key for operators.
|
|
104
108
|
*
|
|
@@ -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":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EACL,6BAA6B,GAE9B,MAAM,0BAA0B,CAAC;AA4ElC,SAAS,iBAAiB,CAAC,GAAoB;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;IACxD,OAAO,MAAM;SACV,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,eAAe,CACtB,GAAoB,EACpB,QAA2B;IAE3B,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;IACpC,CAAC;IAED,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,QAAQ,KAAK,uBAAuB;QACzC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACZ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAwB;IACnD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,0BAA0B,CAAC,aAAqB;IACvD,OAAO,IAAI,KAAK,CACd,yEAAyE,aAAa,sCAAsC;QAC1H,yHAAyH;QACzH,4FAA4F;QAC5F,qEAAqE;QACrE,8EAA8E,CACjF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,QAAQ,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,EAAU;IAC3B,OAAO,MAAM,EAAE,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAIC,EACD,WAAyD;IAEzD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEjC,IAAI,KAAK,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACnE,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;QACzC,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,wBAAwB,CAC/B,IAGC,EACD,WAAyD;IAEzD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;QAC9C,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,KAAqB,EACrB,IAKC;IAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;QACvC,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,4EAA4E;IAC5E,8DAA8D;IAC9D,MAAM,eAAe,GAAG,6BAA6B,CACnD,KAAsC,EACtC;QACE,YAAY,EAAE,YAAY;QAC1B,OAAO,EAAE,WAAW;KACrB,CACF,CAAC;IACF,eAAe,CAAC,MAAM,CAAC;QACrB,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,yBAAyB,IAAI,CAAC,GAAG,EAAE;QAC5C,OAAO,EAAE;YACP,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B;KACF,CAAC,CAAC;IAEH,MAAM,IAAI,QAAQ,CAChB,UAAU,CAAC,eAAe,EAC1B;QACE,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI;KAC/C,EACD,qBAAqB,EACrB,MAAM,CAAC,iBAAiB,KAAK,IAAI;QAC/B,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE;QAClE,CAAC,CAAC,SAAS,CACd,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAiC,EAAE;IAEnC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,WAAW,GAAG,CAClB,GAAoB,EACpB,YAAoB,EACA,EAAE;QACtB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,0BAA0B,CAAC,mBAAmB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;YAC1B,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC/C,OAAO;YACT,CAAC;YACD,MAAM,QAAQ,GAAG,SAAS;iBACvB,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC;iBAClE,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,MAAM,0BAA0B,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,KAAK,GAAmB,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC;YACvD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;gBAClC,wBAAwB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAC7C,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAC9B,CAAC;YAEJ,MAAM,gBAAgB,CAAC,KAAK,EAAE;gBAC5B,GAAG;gBACH,KAAK,EAAE,MAAM,CAAC,GAAG;gBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,KAAK;aACN,CAAC,CAAC;YAEH,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,YAAY,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE;YAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,KAAK,GAAmB,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC;YACvD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;gBAClC,mBAAmB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAC7C,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAC9B,CAAC;YAEJ,MAAM,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE;gBAChC,GAAG;gBACH,KAAK,EAAE,MAAM,CAAC,GAAG;gBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,KAAK;aACN,CAAC,CAAC;YAEH,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/server/server.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
2
|
import { type HttpContractConfig } from "../contracts/index.js";
|
|
3
3
|
import type { AnyPorts } from "../ports/index.js";
|
|
4
|
-
import type
|
|
4
|
+
import { type InferProviderPorts, type ServiceProvider } from "../providers/index.js";
|
|
5
5
|
import type { ServerContextConfig, ServiceContextInputArgs } from "./context.js";
|
|
6
6
|
import type { ContractLike, ResolveContract } from "./contract-like.js";
|
|
7
7
|
import type { AddedCtxFromHooks, Handler, HttpRequestLike, HttpResponse, RouteHook, ServerCaughtErrorHook, ServerHook, ServerUnhandledErrorMapper } from "./http.js";
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
|