@nifrajs/core 3.5.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/dist/assurance.d.ts +7 -0
- package/dist/assurance.d.ts.map +1 -1
- package/dist/assurance.js +39 -3
- package/dist/assurance.js.map +1 -1
- package/dist/capabilities.d.ts +20 -2
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +47 -15
- package/dist/capabilities.js.map +1 -1
- package/dist/diff.d.ts +2 -1
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +26 -2
- package/dist/diff.js.map +1 -1
- package/dist/durable-adapters.d.ts.map +1 -1
- package/dist/durable-adapters.js +16 -3
- package/dist/durable-adapters.js.map +1 -1
- package/dist/durable-effect.d.ts.map +1 -1
- package/dist/durable-effect.js +6 -3
- package/dist/durable-effect.js.map +1 -1
- package/dist/edge-kit.d.ts +2 -0
- package/dist/edge-kit.d.ts.map +1 -1
- package/dist/edge-kit.js +2 -0
- package/dist/edge-kit.js.map +1 -1
- package/dist/effect-lifecycle.d.ts.map +1 -1
- package/dist/effect-lifecycle.js +2 -1
- package/dist/effect-lifecycle.js.map +1 -1
- package/dist/effect-scope.d.ts.map +1 -1
- package/dist/effect-scope.js +1 -1
- package/dist/effect-scope.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/evidence.d.ts +24 -1
- package/dist/evidence.d.ts.map +1 -1
- package/dist/evidence.js +168 -13
- package/dist/evidence.js.map +1 -1
- package/dist/idempotency.d.ts +31 -0
- package/dist/idempotency.d.ts.map +1 -1
- package/dist/idempotency.js +40 -8
- package/dist/idempotency.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/code-unit-order.d.ts +7 -0
- package/dist/internal/code-unit-order.d.ts.map +1 -0
- package/dist/internal/code-unit-order.js +9 -0
- package/dist/internal/code-unit-order.js.map +1 -0
- package/dist/internal/durable-saga-protocol.d.ts.map +1 -1
- package/dist/internal/durable-saga-protocol.js +2 -0
- package/dist/internal/durable-saga-protocol.js.map +1 -1
- package/dist/internal/route-catalog.d.ts +6 -6
- package/dist/internal/route-catalog.d.ts.map +1 -1
- package/dist/internal/route-catalog.js +20 -18
- package/dist/internal/route-catalog.js.map +1 -1
- package/dist/internal/route-compiler.d.ts +7 -6
- package/dist/internal/route-compiler.d.ts.map +1 -1
- package/dist/internal/route-compiler.js +36 -4
- package/dist/internal/route-compiler.js.map +1 -1
- package/dist/internal/route-execution.d.ts +7 -3
- package/dist/internal/route-execution.d.ts.map +1 -1
- package/dist/internal/route-execution.js.map +1 -1
- package/dist/internal/route-lanes.d.ts +1 -0
- package/dist/internal/route-lanes.d.ts.map +1 -1
- package/dist/internal/route-lanes.js +34 -29
- package/dist/internal/route-lanes.js.map +1 -1
- package/dist/internal/route-program.d.ts +8 -2
- package/dist/internal/route-program.d.ts.map +1 -1
- package/dist/internal/route-program.js +222 -20
- package/dist/internal/route-program.js.map +1 -1
- package/dist/ledger.d.ts.map +1 -1
- package/dist/ledger.js +8 -5
- package/dist/ledger.js.map +1 -1
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +41 -37
- package/dist/manifest.js.map +1 -1
- package/dist/mount.d.ts +36 -0
- package/dist/mount.d.ts.map +1 -1
- package/dist/mount.js +32 -0
- package/dist/mount.js.map +1 -1
- package/dist/reflection.d.ts +26 -0
- package/dist/reflection.d.ts.map +1 -1
- package/dist/reflection.js +65 -1
- package/dist/reflection.js.map +1 -1
- package/dist/response-observer.d.ts +1 -1
- package/dist/response-observer.d.ts.map +1 -1
- package/dist/response-observer.js.map +1 -1
- package/dist/router/overlap.d.ts +23 -0
- package/dist/router/overlap.d.ts.map +1 -0
- package/dist/router/overlap.js +224 -0
- package/dist/router/overlap.js.map +1 -0
- package/dist/router/pattern.d.ts +117 -2
- package/dist/router/pattern.d.ts.map +1 -1
- package/dist/router/pattern.js +283 -23
- package/dist/router/pattern.js.map +1 -1
- package/dist/router/router.d.ts +18 -4
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +51 -44
- package/dist/router/router.js.map +1 -1
- package/dist/server/auth.d.ts +53 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/auth.js +9 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/bare-error-lane.d.ts +12 -7
- package/dist/server/bare-error-lane.d.ts.map +1 -1
- package/dist/server/bare-error-lane.js +13 -11
- package/dist/server/bare-error-lane.js.map +1 -1
- package/dist/server/body-lane.d.ts +20 -2
- package/dist/server/body-lane.d.ts.map +1 -1
- package/dist/server/body-lane.js +26 -7
- package/dist/server/body-lane.js.map +1 -1
- package/dist/server/body-parser.d.ts +68 -0
- package/dist/server/body-parser.d.ts.map +1 -0
- package/dist/server/body-parser.js +172 -0
- package/dist/server/body-parser.js.map +1 -0
- package/dist/server/body.d.ts.map +1 -1
- package/dist/server/body.js +62 -7
- package/dist/server/body.js.map +1 -1
- package/dist/server/client-ip.d.ts +8 -0
- package/dist/server/client-ip.d.ts.map +1 -1
- package/dist/server/client-ip.js +8 -0
- package/dist/server/client-ip.js.map +1 -1
- package/dist/server/context.d.ts +71 -6
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/contract.d.ts +15 -5
- package/dist/server/contract.d.ts.map +1 -1
- package/dist/server/contract.js +25 -4
- package/dist/server/contract.js.map +1 -1
- package/dist/server/core-copies.d.ts +2 -0
- package/dist/server/core-copies.d.ts.map +1 -0
- package/dist/server/core-copies.js +20 -0
- package/dist/server/core-copies.js.map +1 -0
- package/dist/server/edge.d.ts.map +1 -1
- package/dist/server/edge.js +2 -0
- package/dist/server/edge.js.map +1 -1
- package/dist/server/http.d.ts +11 -0
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +36 -0
- package/dist/server/http.js.map +1 -1
- package/dist/server/idempotency-lane.d.ts +6 -0
- package/dist/server/idempotency-lane.d.ts.map +1 -1
- package/dist/server/idempotency-lane.js +130 -73
- package/dist/server/idempotency-lane.js.map +1 -1
- package/dist/server/install.d.ts +4 -0
- package/dist/server/install.d.ts.map +1 -1
- package/dist/server/install.js +4 -0
- package/dist/server/install.js.map +1 -1
- package/dist/server/methods.d.ts +45 -0
- package/dist/server/methods.d.ts.map +1 -0
- package/dist/server/methods.js +37 -0
- package/dist/server/methods.js.map +1 -0
- package/dist/server/multipart.d.ts +63 -0
- package/dist/server/multipart.d.ts.map +1 -0
- package/dist/server/multipart.js +374 -0
- package/dist/server/multipart.js.map +1 -0
- package/dist/server/node-outcome-hook.d.ts +20 -0
- package/dist/server/node-outcome-hook.d.ts.map +1 -1
- package/dist/server/node-outcome-hook.js +15 -6
- package/dist/server/node-outcome-hook.js.map +1 -1
- package/dist/server/not-found-answer.d.ts +40 -0
- package/dist/server/not-found-answer.d.ts.map +1 -0
- package/dist/server/not-found-answer.js +56 -0
- package/dist/server/not-found-answer.js.map +1 -0
- package/dist/server/not-found.d.ts +23 -0
- package/dist/server/not-found.d.ts.map +1 -0
- package/dist/server/not-found.js +81 -0
- package/dist/server/not-found.js.map +1 -0
- package/dist/server/plugin.d.ts +26 -1
- package/dist/server/plugin.d.ts.map +1 -1
- package/dist/server/plugin.js.map +1 -1
- package/dist/server/proto-guard.d.ts +18 -5
- package/dist/server/proto-guard.d.ts.map +1 -1
- package/dist/server/proto-guard.js +114 -9
- package/dist/server/proto-guard.js.map +1 -1
- package/dist/server/query.d.ts +7 -0
- package/dist/server/query.d.ts.map +1 -1
- package/dist/server/query.js +47 -0
- package/dist/server/query.js.map +1 -1
- package/dist/server/registry.d.ts +13 -2
- package/dist/server/registry.d.ts.map +1 -1
- package/dist/server/request-context.d.ts +11 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js +33 -19
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/request-lineage.d.ts +8 -0
- package/dist/server/request-lineage.d.ts.map +1 -0
- package/dist/server/request-lineage.js +14 -0
- package/dist/server/request-lineage.js.map +1 -0
- package/dist/server/request-target.d.ts +31 -0
- package/dist/server/request-target.d.ts.map +1 -0
- package/dist/server/request-target.js +44 -0
- package/dist/server/request-target.js.map +1 -0
- package/dist/server/respond.d.ts +1 -1
- package/dist/server/respond.d.ts.map +1 -1
- package/dist/server/respond.js +16 -4
- package/dist/server/respond.js.map +1 -1
- package/dist/server/response-contract-lane.d.ts +19 -1
- package/dist/server/response-contract-lane.d.ts.map +1 -1
- package/dist/server/response-contract-lane.js +59 -14
- package/dist/server/response-contract-lane.js.map +1 -1
- package/dist/server/response-observer-runtime.d.ts +9 -5
- package/dist/server/response-observer-runtime.d.ts.map +1 -1
- package/dist/server/response-observer-runtime.js +10 -6
- package/dist/server/response-observer-runtime.js.map +1 -1
- package/dist/server/runtime-core.d.ts +2 -0
- package/dist/server/runtime-core.d.ts.map +1 -1
- package/dist/server/runtime-core.js.map +1 -1
- package/dist/server/server-types.d.ts +53 -3
- package/dist/server/server-types.d.ts.map +1 -1
- package/dist/server/server.d.ts +191 -19
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +1206 -218
- package/dist/server/server.js.map +1 -1
- package/dist/server/sse.d.ts.map +1 -1
- package/dist/server/sse.js +10 -7
- package/dist/server/sse.js.map +1 -1
- package/dist/server/static-headers.d.ts +3 -0
- package/dist/server/static-headers.d.ts.map +1 -1
- package/dist/server/static-headers.js +19 -1
- package/dist/server/static-headers.js.map +1 -1
- package/dist/server/transport-lane.d.ts +8 -0
- package/dist/server/transport-lane.d.ts.map +1 -1
- package/dist/server/transport-lane.js +9 -8
- package/dist/server/transport-lane.js.map +1 -1
- package/dist/server/validation.d.ts.map +1 -1
- package/dist/server/validation.js +5 -1
- package/dist/server/validation.js.map +1 -1
- package/dist/server/websocket.d.ts +10 -3
- package/dist/server/websocket.d.ts.map +1 -1
- package/dist/server/websocket.js +7 -4
- package/dist/server/websocket.js.map +1 -1
- package/dist/server/ws-bun.d.ts +2 -0
- package/dist/server/ws-bun.d.ts.map +1 -1
- package/dist/server/ws-bun.js +6 -3
- package/dist/server/ws-bun.js.map +1 -1
- package/dist/server/ws-hook.d.ts +2 -1
- package/dist/server/ws-hook.d.ts.map +1 -1
- package/dist/server.d.ts +7 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -1
- package/dist/server.js.map +1 -1
- package/dist/single-copy-register.js +5 -0
- package/dist/single-copy-register.js.map +1 -1
- package/dist/single-copy.d.ts +46 -3
- package/dist/single-copy.d.ts.map +1 -1
- package/dist/single-copy.js +125 -12
- package/dist/single-copy.js.map +1 -1
- package/dist/tool-contract.d.ts +23 -0
- package/dist/tool-contract.d.ts.map +1 -1
- package/dist/tool-contract.js +37 -3
- package/dist/tool-contract.js.map +1 -1
- package/dist/transport-codec.d.ts.map +1 -1
- package/dist/transport-codec.js +2 -1
- package/dist/transport-codec.js.map +1 -1
- package/package.json +27 -2
- package/src/assurance.ts +52 -2
- package/src/capabilities.ts +81 -22
- package/src/diff.ts +31 -6
- package/src/durable-adapters.ts +20 -3
- package/src/durable-effect.ts +10 -3
- package/src/edge-kit.ts +7 -0
- package/src/effect-lifecycle.ts +5 -1
- package/src/effect-scope.ts +2 -1
- package/src/errors.ts +3 -0
- package/src/evidence.ts +237 -12
- package/src/idempotency.ts +72 -8
- package/src/index.ts +40 -3
- package/src/internal/code-unit-order.ts +8 -0
- package/src/internal/durable-saga-protocol.ts +2 -0
- package/src/internal/route-catalog.ts +19 -18
- package/src/internal/route-compiler.ts +62 -13
- package/src/internal/route-execution.ts +13 -3
- package/src/internal/route-lanes.ts +37 -28
- package/src/internal/route-program.ts +434 -20
- package/src/ledger.ts +11 -5
- package/src/manifest.ts +41 -36
- package/src/mount.ts +62 -0
- package/src/reflection.ts +84 -1
- package/src/response-observer.ts +1 -0
- package/src/router/overlap.ts +258 -0
- package/src/router/pattern.ts +349 -25
- package/src/router/router.ts +76 -51
- package/src/server/auth.ts +75 -0
- package/src/server/bare-error-lane.ts +12 -11
- package/src/server/body-lane.ts +46 -6
- package/src/server/body-parser.ts +241 -0
- package/src/server/body.ts +82 -9
- package/src/server/client-ip.ts +9 -0
- package/src/server/context.ts +219 -12
- package/src/server/contract.ts +54 -9
- package/src/server/core-copies.ts +21 -0
- package/src/server/edge.ts +2 -0
- package/src/server/http.ts +34 -0
- package/src/server/idempotency-lane.ts +147 -72
- package/src/server/install.ts +6 -0
- package/src/server/methods.ts +143 -0
- package/src/server/multipart.ts +424 -0
- package/src/server/node-outcome-hook.ts +40 -7
- package/src/server/not-found-answer.ts +109 -0
- package/src/server/not-found.ts +121 -0
- package/src/server/plugin.ts +45 -1
- package/src/server/proto-guard.ts +128 -9
- package/src/server/query.ts +49 -0
- package/src/server/registry.ts +17 -2
- package/src/server/request-context.ts +44 -16
- package/src/server/request-lineage.ts +15 -0
- package/src/server/request-target.ts +46 -0
- package/src/server/respond.ts +14 -3
- package/src/server/response-contract-lane.ts +97 -16
- package/src/server/response-observer-runtime.ts +37 -8
- package/src/server/runtime-core.ts +2 -0
- package/src/server/server-types.ts +59 -2
- package/src/server/server.ts +1613 -269
- package/src/server/sse.ts +10 -8
- package/src/server/static-headers.ts +22 -1
- package/src/server/transport-lane.ts +17 -9
- package/src/server/validation.ts +7 -1
- package/src/server/websocket.ts +23 -9
- package/src/server/ws-bun.ts +8 -3
- package/src/server/ws-hook.ts +2 -1
- package/src/server.ts +38 -2
- package/src/single-copy-register.ts +5 -0
- package/src/single-copy.ts +160 -12
- package/src/tool-contract.ts +66 -3
- package/src/transport-codec.ts +2 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Two physical copies of `@nifrajs/core` in one process (a linked sibling checkout, a nested install)
|
|
3
|
+
* split every piece of module-scoped identity: a route from one copy's `server()` merged into the
|
|
4
|
+
* other answers 500 from an internal TypeError as soon as it sets a cookie. The install is the
|
|
5
|
+
* defect, so it is named the moment the second copy loads, not at the first failing request.
|
|
6
|
+
* `nifra check` is the gate that fails the build on it; this is the runtime notice.
|
|
7
|
+
*
|
|
8
|
+
* Each copy records its module URL in a process-wide list. The query is dropped, so a dev server that
|
|
9
|
+
* re-evaluates this same file (HMR, `--hot`) is one copy, not two.
|
|
10
|
+
*/
|
|
11
|
+
const registry = globalThis;
|
|
12
|
+
const COPIES = Symbol.for("nifra.core.copies");
|
|
13
|
+
registry[COPIES] ??= [];
|
|
14
|
+
const copies = registry[COPIES];
|
|
15
|
+
const here = String(import.meta.url).split("?")[0];
|
|
16
|
+
if (!copies.includes(here) && copies.push(here) > 1) {
|
|
17
|
+
console.warn(`[nifra] @nifrajs/core is loaded ${copies.length} times; \`nifra check\` names each importer:\n ${copies.join("\n ")}`);
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=core-copies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-copies.js","sourceRoot":"","sources":["../../src/server/core-copies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,QAAQ,GAAG,UAA6D,CAAA;AAC9E,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAC9C,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;AACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAW,CAAA;AAE5D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACpD,OAAO,CAAC,IAAI,CACV,mCAAmC,MAAM,CAAC,MAAM,mDAAmD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACzH,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../../src/server/edge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAqB,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAEhF;6FAC6F;AAC7F,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;CAC3C;AAED,uGAAuG;AACvG,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,0DAA0D;IAC1D,OAAO,IAAI,IAAI,CAAA;CAChB;AAED;6FAC6F;AAC7F,MAAM,MAAM,gBAAgB,CAAC,GAAG,GAAG,OAAO,IAAI,CAC5C,UAAU,EAAE,mBAAmB,EAC/B,OAAO,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;CAAE,KACvE,YAAY,CAAC,IAAI,CAAC,CAAA;AAQvB;6EAC6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IACjC,GAAG,CAAC,EAAE,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAA;CACjE;AAKD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAG,OAAO,EAC1C,GAAG,EAAE;IACH,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IACzE,uBAAuB,CAAC,CACtB,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GACvB,YAAY,CAAC,uBAAuB,CAAC,CAAA;CACzC,EACD,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACjC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,0BAA0B,CAAA;CACxD,GACA;IACD,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAChF,SAAS,CAAC,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;CACjG,
|
|
1
|
+
{"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../../src/server/edge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAqB,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAEhF;6FAC6F;AAC7F,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;CAC3C;AAED,uGAAuG;AACvG,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,0DAA0D;IAC1D,OAAO,IAAI,IAAI,CAAA;CAChB;AAED;6FAC6F;AAC7F,MAAM,MAAM,gBAAgB,CAAC,GAAG,GAAG,OAAO,IAAI,CAC5C,UAAU,EAAE,mBAAmB,EAC/B,OAAO,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;CAAE,KACvE,YAAY,CAAC,IAAI,CAAC,CAAA;AAQvB;6EAC6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IACjC,GAAG,CAAC,EAAE,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAA;CACjE;AAKD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAG,OAAO,EAC1C,GAAG,EAAE;IACH,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IACzE,uBAAuB,CAAC,CACtB,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GACvB,YAAY,CAAC,uBAAuB,CAAC,CAAA;CACzC,EACD,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACjC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,0BAA0B,CAAA;CACxD,GACA;IACD,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAChF,SAAS,CAAC,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;CACjG,CA8DA"}
|
package/dist/server/edge.js
CHANGED
|
@@ -62,6 +62,8 @@ export function toFetchHandler(app, options) {
|
|
|
62
62
|
outcome.attach(server, outcome.handler, outcome.data, {
|
|
63
63
|
openNow: true,
|
|
64
64
|
pubsub: outcome.pubsub,
|
|
65
|
+
// `wsMaxPayloadBytes`, as the Bun, Node, Deno and hub lanes enforce it.
|
|
66
|
+
maxPayloadBytes: outcome.maxPayloadBytes,
|
|
65
67
|
});
|
|
66
68
|
// `webSocket` is a Workers-only `ResponseInit` field (absent from the standard type), and a
|
|
67
69
|
// 101 status is only valid on the Workers runtime - both gated by the `Pair` feature check.
|
package/dist/server/edge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge.js","sourceRoot":"","sources":["../../src/server/edge.ts"],"names":[],"mappings":"AAwDA,+GAA+G;AAC/G,MAAM,eAAe,GAAG,cAAc,CAAA;AAEtC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc,CAC5B,GAMC,EACD,OAUC;IAKD,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,CAAA;IACpC,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,CAAA;IAC1C,MAAM,SAAS,GAAG,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IACxD,OAAO;QACL,KAAK,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3B,4FAA4F;YAC5F,2FAA2F;YAC3F,8FAA8F;YAC9F,8FAA8F;YAC9F,4FAA4F;YAC5F,wFAAwF;YACxF,6FAA6F;YAC7F,sFAAsF;YACtF,CAAC;YAAC,OAA8C,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBACvF,IAAI,CAAA;YACN,MAAM,QAAQ,GAAkB,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAA;YACvF,yFAAyF;YACzF,+FAA+F;YAC/F,6FAA6F;YAC7F,IACE,YAAY,KAAK,SAAS;gBAC1B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,WAAW,EAC7D,CAAC;gBACD,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;gBAC5B,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC9D,CAAC;YACD,6FAA6F;YAC7F,gGAAgG;YAChG,6FAA6F;YAC7F,MAAM,IAAI,GAAI,UAAoD,CAAC,aAAa,CAAA;YAChF,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBAClD,MAAM,MAAM,GAAG,CAAC,OAAgC,EAA0B,EAAE;oBAC1E,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;wBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;oBAChE,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;wBAAE,OAAO,OAAO,CAAC,QAAQ,CAAA;oBACtD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAA;oBACvB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;oBACtB,MAAM,CAAC,MAAM,EAAE,CAAA;oBACf,0FAA0F;oBAC1F,iGAAiG;oBACjG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;wBACpD,OAAO,EAAE,IAAI;wBACb,MAAM,EAAE,OAAO,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"edge.js","sourceRoot":"","sources":["../../src/server/edge.ts"],"names":[],"mappings":"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"}
|
package/dist/server/http.d.ts
CHANGED
|
@@ -22,6 +22,17 @@ import { type ResponseResult } from "./runtime-core.js";
|
|
|
22
22
|
* current origin, because the whole point is that the value never got to name a host.
|
|
23
23
|
*/
|
|
24
24
|
export declare function isSameOriginPath(value: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Whether `method` is a token a route can be registered under: uppercase ASCII letters, digits and
|
|
27
|
+
* hyphens, a letter first, 1 to 32 characters. That covers every method in the IANA registry.
|
|
28
|
+
*
|
|
29
|
+
* Every registered method has this shape and the router compares tokens exactly, so a request whose
|
|
30
|
+
* token does not have it can never reach a handler. The server uses this to keep such a request away
|
|
31
|
+
* from everything that runs around routing as well - `onRequest` hooks and mounted handlers - because
|
|
32
|
+
* those see the raw token, and code that tests `req.method === "POST"` would otherwise read a
|
|
33
|
+
* differently-cased token as a method it does not guard.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isRoutableMethod(method: string): boolean;
|
|
25
36
|
/** A uniform JSON error envelope: `{ ok: false, error }` at the given status. */
|
|
26
37
|
export declare function jsonError(status: number, error: string, headers?: Record<string, string>): Response;
|
|
27
38
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,mBAAmB,CAAA;AAE/E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CASvD;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,QAAQ,CAKV;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,cAAc,CAEhB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAMD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAwBhD;AAKD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAc9C"}
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,mBAAmB,CAAA;AAE/E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CASvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAsBxD;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,QAAQ,CAKV;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,cAAc,CAEhB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAMD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAwBhD;AAKD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAc9C"}
|
package/dist/server/http.js
CHANGED
|
@@ -33,6 +33,42 @@ export function isSameOriginPath(value) {
|
|
|
33
33
|
}
|
|
34
34
|
return true;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Whether `method` is a token a route can be registered under: uppercase ASCII letters, digits and
|
|
38
|
+
* hyphens, a letter first, 1 to 32 characters. That covers every method in the IANA registry.
|
|
39
|
+
*
|
|
40
|
+
* Every registered method has this shape and the router compares tokens exactly, so a request whose
|
|
41
|
+
* token does not have it can never reach a handler. The server uses this to keep such a request away
|
|
42
|
+
* from everything that runs around routing as well - `onRequest` hooks and mounted handlers - because
|
|
43
|
+
* those see the raw token, and code that tests `req.method === "POST"` would otherwise read a
|
|
44
|
+
* differently-cased token as a method it does not guard.
|
|
45
|
+
*/
|
|
46
|
+
export function isRoutableMethod(method) {
|
|
47
|
+
// The common verbs first: a string switch settles them without walking the token, which keeps the
|
|
48
|
+
// check close to free on the lanes that run it per request.
|
|
49
|
+
switch (method) {
|
|
50
|
+
case "GET":
|
|
51
|
+
case "POST":
|
|
52
|
+
case "PUT":
|
|
53
|
+
case "PATCH":
|
|
54
|
+
case "DELETE":
|
|
55
|
+
case "HEAD":
|
|
56
|
+
case "OPTIONS":
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
const length = method.length;
|
|
60
|
+
if (length === 0 || length > 32)
|
|
61
|
+
return false;
|
|
62
|
+
for (let i = 0; i < length; i++) {
|
|
63
|
+
const code = method.charCodeAt(i);
|
|
64
|
+
if (code >= 65 && code <= 90)
|
|
65
|
+
continue;
|
|
66
|
+
if (i > 0 && (code === 45 || (code >= 48 && code <= 57)))
|
|
67
|
+
continue;
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
36
72
|
/** A uniform JSON error envelope: `{ ok: false, error }` at the given status. */
|
|
37
73
|
export function jsonError(status, error, headers) {
|
|
38
74
|
return Response.json({ ok: false, error }, headers !== undefined ? { status, headers } : { status });
|
package/dist/server/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ import type { IdentityPlugin } from "./server.js";
|
|
|
5
5
|
export interface ResolvedIdempotency {
|
|
6
6
|
readonly store: IdempotencyStore;
|
|
7
7
|
readonly ttlMs: number;
|
|
8
|
+
/** The lease renewed while a handler runs; unset when the store cannot renew. */
|
|
9
|
+
readonly pendingTtlMs: number | undefined;
|
|
8
10
|
readonly headerName: string;
|
|
9
11
|
readonly namespace: NonNullable<RouteSchema["idempotency"]>["namespace"];
|
|
10
12
|
readonly maxResponseBytes: number;
|
|
@@ -22,6 +24,10 @@ export interface IdempotencyRuntime {
|
|
|
22
24
|
readonly trackEffect: (context: object, committed: boolean) => void;
|
|
23
25
|
/** Resolve a route's declared idempotency into a pinned store + defaults, or `undefined` when off. */
|
|
24
26
|
resolve(schema: RouteSchema | undefined, authenticated: boolean, maxBodyBytes: number): ResolvedIdempotency | undefined;
|
|
27
|
+
/** Wrap an idempotent route's handler so the lane can tell a request rejected before it ran. */
|
|
28
|
+
wrapHandler<C extends {
|
|
29
|
+
readonly req: Request;
|
|
30
|
+
}>(handler: (context: C) => unknown): (context: C) => unknown;
|
|
25
31
|
/** The dedupe lane: read the key, fingerprint the request, consult the store, run/replay/reject. */
|
|
26
32
|
run<T>(config: ResolvedIdempotency, req: Request, platform: Platform | undefined, entry: unknown, params: Record<string, string>, search: string | undefined, wrapResponse: (response: Response) => T, host: IdempotencyHost): Promise<T>;
|
|
27
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency-lane.d.ts","sourceRoot":"","sources":["../../src/server/idempotency-lane.ts"],"names":[],"mappings":"AAUA,OAAO,
|
|
1
|
+
{"version":3,"file":"idempotency-lane.d.ts","sourceRoot":"","sources":["../../src/server/idempotency-lane.ts"],"names":[],"mappings":"AAUA,OAAO,EAOL,KAAK,gBAAgB,EAMtB,MAAM,mBAAmB,CAAA;AAQ1B,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAGzD,OAAO,KAAK,EAAa,cAAc,EAAE,MAAM,aAAa,CAAA;AAU5D,kGAAkG;AAClG,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,iFAAiF;IACjF,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;IACxE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CACN,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,OAAO,CAAC,QAAQ,CAAC,CAAA;CACrB;AAED,qGAAqG;AACrG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;IACnE,sGAAsG;IACtG,OAAO,CACL,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,aAAa,EAAE,OAAO,EACtB,YAAY,EAAE,MAAM,GACnB,mBAAmB,GAAG,SAAS,CAAA;IAClC,gGAAgG;IAChG,WAAW,CAAC,CAAC,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;KAAE,EAC7C,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,GAC/B,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAA;IAC1B,oGAAoG;IACpG,GAAG,CAAC,CAAC,EACH,MAAM,EAAE,mBAAmB,EAC3B,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,CAAC,EACvC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,CAAC,CAAC,CAAA;CACd;AAOD;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAA;CAC9C;AAED,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,cAAc,CAO9E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,kBAAkB,CA6Q/F"}
|
|
@@ -8,11 +8,17 @@
|
|
|
8
8
|
* server-specific is supplied through {@link IdempotencyHost} so this module depends on no server internals.
|
|
9
9
|
*/
|
|
10
10
|
import { RouteConfigError } from "../errors.js";
|
|
11
|
-
import { canonicalizeIdempotencyBody, computeIdempotencyFingerprint, DEFAULT_IDEMPOTENCY_HEADER, DEFAULT_IDEMPOTENCY_TTL_MS, IdempotencyResponseTooLargeError, MemoryIdempotencyStore, responseFromStored, serializeResponse, validIdempotencyKey, validIdempotencyNamespace, } from "../idempotency.js";
|
|
11
|
+
import { canonicalizeIdempotencyBody, computeIdempotencyFingerprint, DEFAULT_IDEMPOTENCY_HEADER, DEFAULT_IDEMPOTENCY_PENDING_TTL_MS, DEFAULT_IDEMPOTENCY_TTL_MS, IdempotencyResponseTooLargeError, MemoryIdempotencyStore, responseFromStored, serializeResponse, validIdempotencyKey, validIdempotencyNamespace, } from "../idempotency.js";
|
|
12
12
|
import { beginRequestEffectTracking, markEffect, requestEffectEvidence, requestIsSafeToRetry, } from "../internal/effect-execution.js";
|
|
13
13
|
import { readBoundedBytes } from "./body.js";
|
|
14
14
|
import { jsonError, urlPartsOf } from "./http.js";
|
|
15
15
|
import { INSTALL_IDEMPOTENCY } from "./install.js";
|
|
16
|
+
/** Requests whose route handler was entered. One rejected before it - by auth, validation, a guard -
|
|
17
|
+
* began no execution, so its key is released rather than stored. */
|
|
18
|
+
const HANDLER_ENTERED = new WeakSet();
|
|
19
|
+
/** Statuses that say the request was not carried out (RFC 9110). A handler answering with one, with no
|
|
20
|
+
* owned effect begun, releases its key, so a refused caller cannot hold a store entry for the TTL. */
|
|
21
|
+
const REFUSALS = new Set([401, 403, 408, 409, 425, 429]);
|
|
16
22
|
export function idempotency(options) {
|
|
17
23
|
const runtime = createIdempotencyRuntime(options);
|
|
18
24
|
const apply = (app) => {
|
|
@@ -40,6 +46,12 @@ export function createIdempotencyRuntime(options) {
|
|
|
40
46
|
trackEffect(context, committed) {
|
|
41
47
|
markEffect(context, committed);
|
|
42
48
|
},
|
|
49
|
+
wrapHandler(handler) {
|
|
50
|
+
return (context) => {
|
|
51
|
+
HANDLER_ENTERED.add(context.req);
|
|
52
|
+
return handler(context);
|
|
53
|
+
};
|
|
54
|
+
},
|
|
43
55
|
resolve(schema, authenticated, maxBodyBytes) {
|
|
44
56
|
const config = schema?.idempotency;
|
|
45
57
|
if (config === undefined)
|
|
@@ -55,6 +67,11 @@ export function createIdempotencyRuntime(options) {
|
|
|
55
67
|
if (!Number.isSafeInteger(ttlMs) || ttlMs <= 0) {
|
|
56
68
|
throw new RouteConfigError("INVALID_IDEMPOTENCY", "idempotency ttlMs must be a finite positive number");
|
|
57
69
|
}
|
|
70
|
+
const pendingTtlMs = config.pendingTtlMs;
|
|
71
|
+
if (pendingTtlMs !== undefined &&
|
|
72
|
+
(store.renew === undefined || !Number.isSafeInteger(pendingTtlMs) || pendingTtlMs <= 0)) {
|
|
73
|
+
throw new RouteConfigError("INVALID_IDEMPOTENCY", "idempotency pendingTtlMs must be a positive integer, on a store that implements renew()");
|
|
74
|
+
}
|
|
58
75
|
const headerName = (config.headerName ?? DEFAULT_IDEMPOTENCY_HEADER).toLowerCase();
|
|
59
76
|
try {
|
|
60
77
|
new Headers().set(headerName, "probe");
|
|
@@ -79,6 +96,9 @@ export function createIdempotencyRuntime(options) {
|
|
|
79
96
|
return Object.freeze({
|
|
80
97
|
store,
|
|
81
98
|
ttlMs,
|
|
99
|
+
pendingTtlMs: store.renew === undefined
|
|
100
|
+
? undefined
|
|
101
|
+
: (pendingTtlMs ?? DEFAULT_IDEMPOTENCY_PENDING_TTL_MS),
|
|
82
102
|
headerName,
|
|
83
103
|
namespace,
|
|
84
104
|
maxResponseBytes,
|
|
@@ -102,7 +122,14 @@ export function createIdempotencyRuntime(options) {
|
|
|
102
122
|
const url = urlPartsOf(req.url);
|
|
103
123
|
const canonicalBody = canonicalizeIdempotencyBody(read.bytes, req.headers.get("content-type"));
|
|
104
124
|
const fingerprint = await computeIdempotencyFingerprint(req.method, `${url.pathname}${url.search}`, canonicalBody, req.headers.get("content-type") ?? "");
|
|
105
|
-
const
|
|
125
|
+
const pendingTtlMs = config.pendingTtlMs;
|
|
126
|
+
const begin = await config.store.begin({
|
|
127
|
+
namespace,
|
|
128
|
+
key,
|
|
129
|
+
fingerprint,
|
|
130
|
+
ttlMs: config.ttlMs,
|
|
131
|
+
pendingTtlMs,
|
|
132
|
+
});
|
|
106
133
|
if (begin.state === "replay") {
|
|
107
134
|
return wrapResponse(responseFromStored(begin.response, { maxBytes: config.maxResponseBytes }));
|
|
108
135
|
}
|
|
@@ -115,90 +142,120 @@ export function createIdempotencyRuntime(options) {
|
|
|
115
142
|
return wrapResponse(jsonError(503, "idempotency_store_capacity", { "Retry-After": "1" }));
|
|
116
143
|
}
|
|
117
144
|
const reservation = begin.reservation;
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
145
|
+
let heartbeat;
|
|
146
|
+
if (pendingTtlMs !== undefined) {
|
|
147
|
+
// Renew the lease while the handler runs: only a process that died stops renewing, so its
|
|
148
|
+
// key frees after the lease rather than the replay TTL.
|
|
149
|
+
heartbeat = setInterval(() => {
|
|
150
|
+
// A failed renewal only lets the lease lapse, which completion then reports.
|
|
151
|
+
Promise.resolve()
|
|
152
|
+
.then(() => config.store.renew?.({ namespace, key, reservation, ttlMs: pendingTtlMs }))
|
|
153
|
+
.catch(() => undefined);
|
|
154
|
+
}, pendingTtlMs / 3);
|
|
155
|
+
heartbeat.unref?.();
|
|
156
|
+
}
|
|
130
157
|
try {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
158
|
+
// Fresh key: re-expose the buffered body as a Request so the normal lanes can read + validate it,
|
|
159
|
+
// then run those lanes to a concrete Response.
|
|
160
|
+
const bufferedInit = {
|
|
161
|
+
method: req.method,
|
|
162
|
+
headers: req.headers,
|
|
163
|
+
signal: req.signal,
|
|
164
|
+
};
|
|
165
|
+
if (read.bytes.byteLength > 0)
|
|
166
|
+
bufferedInit.body = read.bytes;
|
|
167
|
+
const buffered = new Request(req.url, bufferedInit);
|
|
168
|
+
beginRequestEffectTracking(buffered);
|
|
169
|
+
// The handler threw, or its response body failed while being captured: no response to store.
|
|
170
|
+
const settleThrown = async (err) => {
|
|
171
|
+
if (!requestEffectEvidence(buffered).began) {
|
|
172
|
+
// The request-local boundary proves no owned effect started, so this is the one safe case
|
|
173
|
+
// where releasing the key cannot duplicate an effect.
|
|
174
|
+
await config.store.abandon({ namespace, key, reservation });
|
|
175
|
+
throw err;
|
|
176
|
+
}
|
|
177
|
+
// A committed or ambiguous effect must never be repeated. Persist a payload-free terminal
|
|
178
|
+
// response even though the normal handler lifecycle escaped without producing one.
|
|
179
|
+
const terminal = new Response(null, { status: 500 });
|
|
180
|
+
const completed = await config.store.complete({
|
|
181
|
+
namespace,
|
|
182
|
+
key,
|
|
183
|
+
reservation,
|
|
184
|
+
response: await serializeResponse(terminal, { maxBytes: config.maxResponseBytes }),
|
|
185
|
+
});
|
|
186
|
+
if (!completed) {
|
|
187
|
+
return wrapResponse(jsonError(503, "idempotency_reservation_lost", { "Retry-After": "1" }));
|
|
188
|
+
}
|
|
189
|
+
return wrapResponse(terminal);
|
|
190
|
+
};
|
|
191
|
+
let response;
|
|
192
|
+
try {
|
|
193
|
+
response = await host.runLanes(buffered, platform, entry, params, search);
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
return await settleThrown(err);
|
|
197
|
+
}
|
|
198
|
+
if (!HANDLER_ENTERED.has(buffered) && !requestEffectEvidence(buffered).began) {
|
|
199
|
+
// Rejected before the handler ran: no execution began, so there is nothing a retry could
|
|
200
|
+
// duplicate and no result is saved - storing every rejection would let callers who never
|
|
201
|
+
// pass auth fill the store and lock everyone else out.
|
|
202
|
+
const abandoned = await config.store.abandon({ namespace, key, reservation });
|
|
203
|
+
if (!abandoned) {
|
|
204
|
+
return wrapResponse(jsonError(503, "idempotency_reservation_lost", { "Retry-After": "1" }));
|
|
205
|
+
}
|
|
206
|
+
return wrapResponse(response);
|
|
207
|
+
}
|
|
208
|
+
if ((REFUSALS.has(response.status) ||
|
|
209
|
+
(response.status >= 500 && requestIsSafeToRetry(buffered))) &&
|
|
210
|
+
!requestEffectEvidence(buffered).began) {
|
|
211
|
+
const abandoned = await config.store.abandon({ namespace, key, reservation });
|
|
212
|
+
if (!abandoned) {
|
|
213
|
+
return wrapResponse(jsonError(503, "idempotency_reservation_lost", { "Retry-After": "1" }));
|
|
214
|
+
}
|
|
215
|
+
return wrapResponse(response);
|
|
216
|
+
}
|
|
217
|
+
// Once the handler ran, every other concrete response is terminal for this key. A non-2xx may
|
|
218
|
+
// follow an already-committed external effect; abandoning it would let a retry duplicate it.
|
|
219
|
+
let storedResponse;
|
|
220
|
+
try {
|
|
221
|
+
storedResponse = await serializeResponse(response, { maxBytes: config.maxResponseBytes });
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
if (!(error instanceof IdempotencyResponseTooLargeError))
|
|
225
|
+
return await settleThrown(error);
|
|
226
|
+
// The effect may already have happened, so never abandon and permit a duplicate execution.
|
|
227
|
+
// Commit a small terminal response under the winning key and return that same response now.
|
|
228
|
+
response = jsonError(507, "idempotency_response_too_large");
|
|
229
|
+
try {
|
|
230
|
+
storedResponse = await serializeResponse(response, {
|
|
231
|
+
maxBytes: config.maxResponseBytes,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
catch (terminalError) {
|
|
235
|
+
if (!(terminalError instanceof IdempotencyResponseTooLargeError))
|
|
236
|
+
throw terminalError;
|
|
237
|
+
// Even an intentionally tiny bound must remain truthful. An empty 507 preserves terminal
|
|
238
|
+
// status + replay safety without silently storing more bytes than the route permits.
|
|
239
|
+
response = new Response(null, { status: 507 });
|
|
240
|
+
storedResponse = await serializeResponse(response, {
|
|
241
|
+
maxBytes: config.maxResponseBytes,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
140
244
|
}
|
|
141
|
-
// A committed or ambiguous effect must never be repeated. Persist a payload-free terminal
|
|
142
|
-
// response even though the normal handler lifecycle escaped without producing one.
|
|
143
|
-
response = new Response(null, { status: 500 });
|
|
144
245
|
const completed = await config.store.complete({
|
|
145
246
|
namespace,
|
|
146
247
|
key,
|
|
147
248
|
reservation,
|
|
148
|
-
response:
|
|
249
|
+
response: storedResponse,
|
|
149
250
|
});
|
|
150
251
|
if (!completed) {
|
|
151
252
|
return wrapResponse(jsonError(503, "idempotency_reservation_lost", { "Retry-After": "1" }));
|
|
152
253
|
}
|
|
153
254
|
return wrapResponse(response);
|
|
154
255
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
!requestEffectEvidence(buffered).began) {
|
|
158
|
-
const abandoned = await config.store.abandon({ namespace, key, reservation });
|
|
159
|
-
if (!abandoned) {
|
|
160
|
-
return wrapResponse(jsonError(503, "idempotency_reservation_lost", { "Retry-After": "1" }));
|
|
161
|
-
}
|
|
162
|
-
return wrapResponse(response);
|
|
163
|
-
}
|
|
164
|
-
// Once the handler ran, every concrete response is terminal for this key. A non-2xx may follow
|
|
165
|
-
// an already-committed external effect; abandoning it would let a retry duplicate that effect.
|
|
166
|
-
let storedResponse;
|
|
167
|
-
try {
|
|
168
|
-
storedResponse = await serializeResponse(response, { maxBytes: config.maxResponseBytes });
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
if (!(error instanceof IdempotencyResponseTooLargeError))
|
|
172
|
-
throw error;
|
|
173
|
-
// The effect may already have happened, so never abandon and permit a duplicate execution.
|
|
174
|
-
// Commit a small terminal response under the winning key and return that same response now.
|
|
175
|
-
response = jsonError(507, "idempotency_response_too_large");
|
|
176
|
-
try {
|
|
177
|
-
storedResponse = await serializeResponse(response, {
|
|
178
|
-
maxBytes: config.maxResponseBytes,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
catch (terminalError) {
|
|
182
|
-
if (!(terminalError instanceof IdempotencyResponseTooLargeError))
|
|
183
|
-
throw terminalError;
|
|
184
|
-
// Even an intentionally tiny bound must remain truthful. An empty 507 preserves terminal
|
|
185
|
-
// status + replay safety without silently storing more bytes than the route permits.
|
|
186
|
-
response = new Response(null, { status: 507 });
|
|
187
|
-
storedResponse = await serializeResponse(response, {
|
|
188
|
-
maxBytes: config.maxResponseBytes,
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
const completed = await config.store.complete({
|
|
193
|
-
namespace,
|
|
194
|
-
key,
|
|
195
|
-
reservation,
|
|
196
|
-
response: storedResponse,
|
|
197
|
-
});
|
|
198
|
-
if (!completed) {
|
|
199
|
-
return wrapResponse(jsonError(503, "idempotency_reservation_lost", { "Retry-After": "1" }));
|
|
256
|
+
finally {
|
|
257
|
+
clearInterval(heartbeat);
|
|
200
258
|
}
|
|
201
|
-
return wrapResponse(response);
|
|
202
259
|
},
|
|
203
260
|
};
|
|
204
261
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency-lane.js","sourceRoot":"","sources":["../../src/server/idempotency-lane.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,0BAA0B,EAC1B,0BAA0B,EAC1B,gCAAgC,EAEhC,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,0BAA0B,EAC1B,UAAU,EACV,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAE5C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"idempotency-lane.js","sourceRoot":"","sources":["../../src/server/idempotency-lane.ts"],"names":[],"mappings":"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"}
|
package/dist/server/install.d.ts
CHANGED
|
@@ -8,8 +8,12 @@ export declare const INSTALL_MCP: unique symbol;
|
|
|
8
8
|
export declare const INSTALL_SSE: unique symbol;
|
|
9
9
|
/** @internal Install the Node-direct renderer on a server (called by the `nodeDirect()` plugin). */
|
|
10
10
|
export declare const INSTALL_NODE_DIRECT: unique symbol;
|
|
11
|
+
/** @internal Install the not-found lane on a server (called by the `notFound()` plugin). */
|
|
12
|
+
export declare const INSTALL_NOT_FOUND: unique symbol;
|
|
11
13
|
/** @internal Install the WebSocket runtime on a server (called by the `websocket()` plugin). */
|
|
12
14
|
export declare const INSTALL_WS: unique symbol;
|
|
15
|
+
/** @internal Read the installed WebSocket runtime when a server is composed into another server. */
|
|
16
|
+
export declare const GET_WS_RUNTIME: unique symbol;
|
|
13
17
|
/** @internal Install the response-contract runtime on a server (called by the `responseContract()` plugin). */
|
|
14
18
|
export declare const INSTALL_RESPONSE_CONTRACT: unique symbol;
|
|
15
19
|
/** @internal Install the response-observer adapters on a server. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/server/install.ts"],"names":[],"mappings":"AAUA,oGAAoG;AACpG,eAAO,MAAM,mBAAmB,EAAE,OAAO,MAAwD,CAAA;AAEjG,uGAAuG;AACvG,eAAO,MAAM,qBAAqB,EAAE,OAAO,MAE1C,CAAA;AAED,oFAAoF;AACpF,eAAO,MAAM,WAAW,EAAE,OAAO,MAAgD,CAAA;AAEjF,8FAA8F;AAC9F,eAAO,MAAM,WAAW,EAAE,OAAO,MAAgD,CAAA;AAEjF,oGAAoG;AACpG,eAAO,MAAM,mBAAmB,EAAE,OAAO,MAAwD,CAAA;AAEjG,gGAAgG;AAChG,eAAO,MAAM,UAAU,EAAE,OAAO,MAA+C,CAAA;AAE/E,+GAA+G;AAC/G,eAAO,MAAM,yBAAyB,EAAE,OAAO,MAE9C,CAAA;AAED,oEAAoE;AACpE,eAAO,MAAM,yBAAyB,EAAE,OAAO,MAE9C,CAAA;AAED,wGAAwG;AACxG,eAAO,MAAM,kBAAkB,EAAE,OAAO,MAEvC,CAAA;AAED,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,EAAE,OAAO,MAAsD,CAAA"}
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/server/install.ts"],"names":[],"mappings":"AAUA,oGAAoG;AACpG,eAAO,MAAM,mBAAmB,EAAE,OAAO,MAAwD,CAAA;AAEjG,uGAAuG;AACvG,eAAO,MAAM,qBAAqB,EAAE,OAAO,MAE1C,CAAA;AAED,oFAAoF;AACpF,eAAO,MAAM,WAAW,EAAE,OAAO,MAAgD,CAAA;AAEjF,8FAA8F;AAC9F,eAAO,MAAM,WAAW,EAAE,OAAO,MAAgD,CAAA;AAEjF,oGAAoG;AACpG,eAAO,MAAM,mBAAmB,EAAE,OAAO,MAAwD,CAAA;AAEjG,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,EAAE,OAAO,MAAsD,CAAA;AAE7F,gGAAgG;AAChG,eAAO,MAAM,UAAU,EAAE,OAAO,MAA+C,CAAA;AAE/E,oGAAoG;AACpG,eAAO,MAAM,cAAc,EAAE,OAAO,MAAmD,CAAA;AAEvF,+GAA+G;AAC/G,eAAO,MAAM,yBAAyB,EAAE,OAAO,MAE9C,CAAA;AAED,oEAAoE;AACpE,eAAO,MAAM,yBAAyB,EAAE,OAAO,MAE9C,CAAA;AAED,wGAAwG;AACxG,eAAO,MAAM,kBAAkB,EAAE,OAAO,MAEvC,CAAA;AAED,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,EAAE,OAAO,MAAsD,CAAA"}
|
package/dist/server/install.js
CHANGED
|
@@ -17,8 +17,12 @@ export const INSTALL_MCP = Symbol.for("@nifrajs/core/install-mcp");
|
|
|
17
17
|
export const INSTALL_SSE = Symbol.for("@nifrajs/core/install-sse");
|
|
18
18
|
/** @internal Install the Node-direct renderer on a server (called by the `nodeDirect()` plugin). */
|
|
19
19
|
export const INSTALL_NODE_DIRECT = Symbol.for("@nifrajs/core/install-node-direct");
|
|
20
|
+
/** @internal Install the not-found lane on a server (called by the `notFound()` plugin). */
|
|
21
|
+
export const INSTALL_NOT_FOUND = Symbol.for("@nifrajs/core/install-not-found");
|
|
20
22
|
/** @internal Install the WebSocket runtime on a server (called by the `websocket()` plugin). */
|
|
21
23
|
export const INSTALL_WS = Symbol.for("@nifrajs/core/install-ws");
|
|
24
|
+
/** @internal Read the installed WebSocket runtime when a server is composed into another server. */
|
|
25
|
+
export const GET_WS_RUNTIME = Symbol.for("@nifrajs/core/get-ws-runtime");
|
|
22
26
|
/** @internal Install the response-contract runtime on a server (called by the `responseContract()` plugin). */
|
|
23
27
|
export const INSTALL_RESPONSE_CONTRACT = Symbol.for("@nifrajs/core/install-response-contract");
|
|
24
28
|
/** @internal Install the response-observer adapters on a server. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/server/install.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAE7D,oGAAoG;AACpG,MAAM,CAAC,MAAM,mBAAmB,GAAkB,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;AAEjG,uGAAuG;AACvG,MAAM,CAAC,MAAM,qBAAqB,GAAkB,MAAM,CAAC,GAAG,CAC5D,qCAAqC,CACtC,CAAA;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;AAEjF,8FAA8F;AAC9F,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;AAEjF,oGAAoG;AACpG,MAAM,CAAC,MAAM,mBAAmB,GAAkB,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;AAEjG,gGAAgG;AAChG,MAAM,CAAC,MAAM,UAAU,GAAkB,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;AAE/E,+GAA+G;AAC/G,MAAM,CAAC,MAAM,yBAAyB,GAAkB,MAAM,CAAC,GAAG,CAChE,yCAAyC,CAC1C,CAAA;AAED,oEAAoE;AACpE,MAAM,CAAC,MAAM,yBAAyB,GAAkB,MAAM,CAAC,GAAG,CAChE,yCAAyC,CAC1C,CAAA;AAED,wGAAwG;AACxG,MAAM,CAAC,MAAM,kBAAkB,GAAkB,MAAM,CAAC,GAAG,CACzD,uBAAuB,CAAC,gBAAgB,CACzC,CAAA;AAED,oGAAoG;AACpG,MAAM,CAAC,MAAM,iBAAiB,GAAkB,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/server/install.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAE7D,oGAAoG;AACpG,MAAM,CAAC,MAAM,mBAAmB,GAAkB,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;AAEjG,uGAAuG;AACvG,MAAM,CAAC,MAAM,qBAAqB,GAAkB,MAAM,CAAC,GAAG,CAC5D,qCAAqC,CACtC,CAAA;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;AAEjF,8FAA8F;AAC9F,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;AAEjF,oGAAoG;AACpG,MAAM,CAAC,MAAM,mBAAmB,GAAkB,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;AAEjG,4FAA4F;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAAkB,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;AAE7F,gGAAgG;AAChG,MAAM,CAAC,MAAM,UAAU,GAAkB,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;AAE/E,oGAAoG;AACpG,MAAM,CAAC,MAAM,cAAc,GAAkB,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;AAEvF,+GAA+G;AAC/G,MAAM,CAAC,MAAM,yBAAyB,GAAkB,MAAM,CAAC,GAAG,CAChE,yCAAyC,CAC1C,CAAA;AAED,oEAAoE;AACpE,MAAM,CAAC,MAAM,yBAAyB,GAAkB,MAAM,CAAC,GAAG,CAChE,yCAAyC,CAC1C,CAAA;AAED,wGAAwG;AACxG,MAAM,CAAC,MAAM,kBAAkB,GAAkB,MAAM,CAAC,GAAG,CACzD,uBAAuB,CAAC,gBAAgB,CACzC,CAAA;AAED,oGAAoG;AACpG,MAAM,CAAC,MAAM,iBAAiB,GAAkB,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type Method } from "../router/router.js";
|
|
2
|
+
import type { RouteSchema } from "./context.js";
|
|
3
|
+
import type { MethodRoutesPlugin } from "./plugin.js";
|
|
4
|
+
import type { OutputOf } from "./registry.js";
|
|
5
|
+
import type { Handler } from "./server.js";
|
|
6
|
+
export type { MethodRoutesPlugin } from "./plugin.js";
|
|
7
|
+
/**
|
|
8
|
+
* Register one handler under every standard method: `app.use(all(path, handler))`.
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { all } from "@nifrajs/core/methods"
|
|
12
|
+
*
|
|
13
|
+
* const app = server().use(all("/echo", (c) => ({ method: c.req.method })))
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* It is the same as calling `get`, `post`, `put`, `patch`, `delete`, `head` and `options` with the
|
|
17
|
+
* one handler, as a single registration: a method already registered on the path makes the call
|
|
18
|
+
* throw and adds nothing. A schema applies to every method, so with a `body` schema a request that
|
|
19
|
+
* carries no body is refused under any of them, `GET` included.
|
|
20
|
+
*/
|
|
21
|
+
export declare function all<Path extends string, S extends RouteSchema, H extends Handler<Path, S, Ctx>, Ctx = NonNullable<unknown>>(path: Path, schema: S, handler: H): MethodRoutesPlugin<Method, Path, S, OutputOf<H>, Ctx>;
|
|
22
|
+
export declare function all<Path extends string, H extends Handler<Path, RouteSchema, Ctx>, Ctx = NonNullable<unknown>>(path: Path, handler: H): MethodRoutesPlugin<Method, Path, Record<never, never>, OutputOf<H>, Ctx>;
|
|
23
|
+
/**
|
|
24
|
+
* Register one handler under the method, or the methods, you name:
|
|
25
|
+
* `app.use(method("PROPFIND", path, handler))`.
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { method } from "@nifrajs/core/methods"
|
|
29
|
+
*
|
|
30
|
+
* const app = server()
|
|
31
|
+
* .use(method("PROPFIND", "/dav/*path", (c) => listing(c.params.path)))
|
|
32
|
+
* .use(method(["GET", "POST"], "/search", (c) => search(c.req)))
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* A name is case-insensitive and is registered uppercase. It must be a token of letters, digits and
|
|
36
|
+
* hyphens that starts with a letter, at most 32 characters, and not `TRACE`, `CONNECT` or `TRACK`;
|
|
37
|
+
* anything else throws when `method()` is called. A list is one registration: every method is added,
|
|
38
|
+
* or none is.
|
|
39
|
+
*
|
|
40
|
+
* Only the standard methods among the names join the app's typed registry, so the typed client has
|
|
41
|
+
* a call for those and none for a custom token.
|
|
42
|
+
*/
|
|
43
|
+
export declare function method<const M extends string, Path extends string, S extends RouteSchema, H extends Handler<Path, S, Ctx>, Ctx = NonNullable<unknown>>(name: M | readonly M[], path: Path, schema: S, handler: H): MethodRoutesPlugin<M, Path, S, OutputOf<H>, Ctx>;
|
|
44
|
+
export declare function method<const M extends string, Path extends string, H extends Handler<Path, RouteSchema, Ctx>, Ctx = NonNullable<unknown>>(name: M | readonly M[], path: Path, handler: H): MethodRoutesPlugin<M, Path, Record<never, never>, OutputOf<H>, Ctx>;
|
|
45
|
+
//# sourceMappingURL=methods.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../../src/server/methods.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgC,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAkCrD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,GAAG,CACjB,IAAI,SAAS,MAAM,EACnB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAC/B,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,EAC1B,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAC3F,wBAAgB,GAAG,CACjB,IAAI,SAAS,MAAM,EACnB,CAAC,SAAS,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,EACzC,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,EAC1B,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AASnG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,MAAM,CACpB,KAAK,CAAC,CAAC,SAAS,MAAM,EACtB,IAAI,SAAS,MAAM,EACnB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAC/B,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,EAE1B,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,EACtB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,CAAC,GACT,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AACnD,wBAAgB,MAAM,CACpB,KAAK,CAAC,CAAC,SAAS,MAAM,EACtB,IAAI,SAAS,MAAM,EACnB,CAAC,SAAS,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,EACzC,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,EAE1B,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,EACtB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,CAAC,GACT,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA"}
|