@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
|
@@ -17,18 +17,20 @@
|
|
|
17
17
|
* The `Server` import is type-only and erased, so there is no runtime cycle back into the kernel.
|
|
18
18
|
*/
|
|
19
19
|
import type { RequestBudget } from "../budget.js";
|
|
20
|
-
import type {
|
|
20
|
+
import type { AuthenticationStage } from "../server/auth.js";
|
|
21
21
|
import type { Platform, RouteSchema } from "../server/context.js";
|
|
22
22
|
import type { ResolvedIdempotency } from "../server/idempotency-lane.js";
|
|
23
23
|
import type { ResolvedEffectLedger } from "../server/ledger-lane.js";
|
|
24
24
|
import type { Registry } from "../server/registry.js";
|
|
25
|
-
import type { ResponseContractRuntime } from "../server/response-contract-lane.js";
|
|
25
|
+
import type { ResponseContractDefinition, ResponseContractRuntime } from "../server/response-contract-lane.js";
|
|
26
26
|
import type { HandlerResult, ResponseResult } from "../server/runtime-core.js";
|
|
27
27
|
import type { CtxSet, MaybePromise, RawContext, RequestSource, Server } from "../server/server.js";
|
|
28
28
|
import type { RouteProgram } from "./route-program.js";
|
|
29
29
|
export type InternalHandler = (ctx: RawContext) => MaybePromise<HandlerResult>;
|
|
30
30
|
/** A `derive` computes per-request context extensions; stored path-erased. */
|
|
31
31
|
export type RawDerive = (ctx: RawContext) => MaybePromise<object>;
|
|
32
|
+
/** A route-scoped authentication provider, stored path-erased after registration. */
|
|
33
|
+
export type RawAuthStage = AuthenticationStage<unknown, unknown>;
|
|
32
34
|
export type RawBeforeHandle = (ctx: RawContext) => MaybePromise<unknown>;
|
|
33
35
|
export type RawAfterHandle = (result: unknown, ctx: RawContext) => MaybePromise<unknown>;
|
|
34
36
|
export type RawErrorHandler = (error: unknown, ctx: RawContext) => MaybePromise<unknown>;
|
|
@@ -81,10 +83,12 @@ export interface RouteEntry {
|
|
|
81
83
|
* still take the fused/native lanes). */
|
|
82
84
|
readonly responseContract: {
|
|
83
85
|
readonly runtime: ResponseContractRuntime;
|
|
84
|
-
readonly
|
|
86
|
+
readonly definition: ResponseContractDefinition;
|
|
85
87
|
} | undefined;
|
|
86
88
|
/** Per-request context extensions captured at registration (order-scoped). */
|
|
87
89
|
readonly derives: ReadonlyArray<RawDerive>;
|
|
90
|
+
/** Dedicated auth stages run before validation; ordinary derives keep their existing order. */
|
|
91
|
+
readonly authStages: ReadonlyArray<RawAuthStage>;
|
|
88
92
|
/** Static context extensions captured at registration. */
|
|
89
93
|
readonly decorations: Record<PropertyKey, unknown>;
|
|
90
94
|
/** Whether {@link decorations} has any keys - precomputed so the hot path skips a no-op
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-execution.d.ts","sourceRoot":"","sources":["../../src/internal/route-execution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"route-execution.d.ts","sourceRoot":"","sources":["../../src/internal/route-execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-execution.js","sourceRoot":"","sources":["../../src/internal/route-execution.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAMxD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"route-execution.js","sourceRoot":"","sources":["../../src/internal/route-execution.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAMxD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAwG7D;;;gFAGgF;AAChF,MAAM,UAAU,yBAAyB,CAAC,OAgBzC;IACC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;IAE3F,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,GAAG,GAAyB,CAChC,OAAO,EACP,KAAK,EACL,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,EACN,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,EAAE,CACD,OAA4C,CAAC,kBAAkB,CAC9D,KAAK,EACL,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,YAAY,CACb,CAAA;QACH,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAuB,CAAA;IACrF,CAAC;IAED,IAAI,KAAyB,CAAA;IAC7B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAC9D,OAA4C,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAA;YAC3F,MAAK;QACP,KAAK,MAAM;YACT,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAC7D,OAA4C,CAAC,WAAW,CACvD,KAAK,EACL,MAAM,EACN,GAAG,EACH,QAAQ,EACR,YAAY,CACb,CAAA;YACH,MAAK;QACP,KAAK,OAAO;YACV,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAC9D,OAA4C,CAAC,YAAY,CACxD,KAAK,EACL,GAAG,EACH,QAAQ,EACR,YAAY,CACb,CAAA;YACH,MAAK;QACP;YACE,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAC7D,OAA4C,CAAC,UAAU,CACtD,KAAK,EACL,MAAM,EACN,GAAG,EACH,QAAQ,EACR,YAAY,CACb,CAAA;IACP,CAAC;IAED,MAAM,OAAO,GAAuB,SAAS;QAC3C,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CACrD,OAA4C,CAAC,aAAa,CACzD,KAAK,EACL,GAAG,EACH,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,EAChE,QAAQ,EACR,YAAY,CACb;QACL,CAAC,CAAC,KAAK,CAAA;IAET,MAAM,GAAG,GAAyB,CAChC,OAAO,EACP,KAAK,EACL,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,EACN,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,EAAE;QACF,MAAM,MAAM,GAAG,OAA2C,CAAA;QAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,IAAI,oBAAoB,CAAA;QAC5D,MAAM,GAAG,GAAG,aAAa;YACvB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC;YAC9F,CAAC,CAAC,IAAI,cAAc,CAChB,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,MAAM,CAAC,cAAc,CACtB,CAAA;QACL,IAAI,MAAiC,CAAA;QACrC,2FAA2F;QAC3F,MAAM,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAA;QAChD,IAAI,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAgC,CAAA;YACvD,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YACvC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACnC,CAAC;QACD,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAA;QAC1E,IAAI,MAAM,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,MAAM,CAAA;YACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAgC,CAAA;YACvD,OAAO,GAAG,CAAC,OAAO,YAAY,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACzF,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,MAAM,CAAC,CACzD,CACF,CAAA;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC,CAAA;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAuB,CAAA;AACrF,CAAC"}
|
|
@@ -21,6 +21,7 @@ export interface RouteLaneSelection {
|
|
|
21
21
|
}
|
|
22
22
|
export declare function selectRouteLanes(options: {
|
|
23
23
|
readonly schema: RouteSchema | undefined;
|
|
24
|
+
readonly hasAuth?: boolean;
|
|
24
25
|
readonly hasIdempotency: boolean;
|
|
25
26
|
readonly hasLedger: boolean;
|
|
26
27
|
readonly hasResponseContract: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-lanes.d.ts","sourceRoot":"","sources":["../../src/internal/route-lanes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEtF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,aAAa,EAAE,sBAAsB,CAAA;IAC9C,QAAQ,CAAC,iBAAiB,EAAE,eAAe,GAAG,qBAAqB,GAAG,SAAS,CAAA;IAC/E,QAAQ,CAAC,SAAS,EACd,MAAM,GACN,MAAM,GACN,OAAO,GACP,eAAe,GACf,qBAAqB,GACrB,oBAAoB,GACpB,0BAA0B,GAC1B,SAAS,CAAA;CACd;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;IACxC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAA;CAC3C,GAAG,kBAAkB,
|
|
1
|
+
{"version":3,"file":"route-lanes.d.ts","sourceRoot":"","sources":["../../src/internal/route-lanes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEtF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,aAAa,EAAE,sBAAsB,CAAA;IAC9C,QAAQ,CAAC,iBAAiB,EAAE,eAAe,GAAG,qBAAqB,GAAG,SAAS,CAAA;IAC/E,QAAQ,CAAC,SAAS,EACd,MAAM,GACN,MAAM,GACN,OAAO,GACP,eAAe,GACf,qBAAqB,GACrB,oBAAoB,GACpB,0BAA0B,GAC1B,SAAS,CAAA;CACd;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAA;CAC3C,GAAG,kBAAkB,CAyLrB"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
export function selectRouteLanes(options) {
|
|
2
2
|
const { schema, hasIdempotency, hasLedger, hasResponseContract, hasDecorations, derives, beforeHandle, afterHandle, onError, around, defaultOnValidationError, } = options;
|
|
3
|
-
const
|
|
4
|
-
|
|
3
|
+
const authBeforeValidation = options.hasAuth === true || schema?.validationOrder === "auth-before-validation";
|
|
4
|
+
// No fused lane validates params, headers, or cookies: any of those schemas keeps the stage runner.
|
|
5
|
+
const plain = schema?.params === undefined && schema?.headers === undefined && schema?.cookies === undefined;
|
|
6
|
+
const bare = !authBeforeValidation &&
|
|
7
|
+
plain &&
|
|
5
8
|
schema?.body === undefined &&
|
|
6
9
|
schema?.query === undefined &&
|
|
7
10
|
!hasIdempotency &&
|
|
@@ -17,11 +20,11 @@ export function selectRouteLanes(options) {
|
|
|
17
20
|
// wrappers, and validation-error recovery (schema or server default) - the fused invalid path is
|
|
18
21
|
// exactly `validationError(issues)`, so any recovery semantics keep the generic lane.
|
|
19
22
|
const fusedQuery = !bare &&
|
|
23
|
+
!authBeforeValidation &&
|
|
20
24
|
!hasResponseContract &&
|
|
21
25
|
schema?.query !== undefined &&
|
|
22
26
|
schema.body === undefined &&
|
|
23
|
-
|
|
24
|
-
schema.headers === undefined &&
|
|
27
|
+
plain &&
|
|
25
28
|
schema.onValidationError === undefined &&
|
|
26
29
|
!defaultOnValidationError &&
|
|
27
30
|
!hasIdempotency &&
|
|
@@ -31,42 +34,44 @@ export function selectRouteLanes(options) {
|
|
|
31
34
|
afterHandle === 0 &&
|
|
32
35
|
onError === 0 &&
|
|
33
36
|
around === 0;
|
|
34
|
-
const bodyOnly = !
|
|
37
|
+
const bodyOnly = !authBeforeValidation &&
|
|
38
|
+
!hasResponseContract &&
|
|
35
39
|
schema?.body !== undefined &&
|
|
36
40
|
schema.query === undefined &&
|
|
37
|
-
|
|
38
|
-
schema.headers === undefined &&
|
|
41
|
+
plain &&
|
|
39
42
|
derives === 0 &&
|
|
40
43
|
beforeHandle === 0 &&
|
|
41
44
|
afterHandle === 0 &&
|
|
42
45
|
onError === 0;
|
|
43
46
|
const fusedBody = !bare &&
|
|
47
|
+
!authBeforeValidation &&
|
|
44
48
|
bodyOnly &&
|
|
45
49
|
schema.onValidationError === undefined &&
|
|
46
50
|
!defaultOnValidationError &&
|
|
47
51
|
!hasIdempotency &&
|
|
48
52
|
!hasLedger &&
|
|
49
53
|
around === 0;
|
|
50
|
-
const lane =
|
|
51
|
-
? "
|
|
52
|
-
:
|
|
53
|
-
? "
|
|
54
|
-
:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
54
|
+
const lane = authBeforeValidation
|
|
55
|
+
? "lifecycle"
|
|
56
|
+
: bare
|
|
57
|
+
? "bare"
|
|
58
|
+
: bodyOnly
|
|
59
|
+
? "body"
|
|
60
|
+
: !hasResponseContract &&
|
|
61
|
+
schema?.body === undefined &&
|
|
62
|
+
schema?.query !== undefined &&
|
|
63
|
+
plain &&
|
|
64
|
+
derives === 0 &&
|
|
65
|
+
beforeHandle === 0 &&
|
|
66
|
+
afterHandle === 0 &&
|
|
67
|
+
onError === 0
|
|
68
|
+
? "query"
|
|
69
|
+
: "lifecycle";
|
|
65
70
|
// Lifecycle routes with no params schema are the common middleware shape: derive/before plus an
|
|
66
71
|
// optional query or body schema. Select their complete validation stage at registration so the
|
|
67
72
|
// request path never re-checks params/body presence. Parameter-schema routes retain the generic
|
|
68
73
|
// lifecycle runner until their more involved recovery matrix is selected explicitly.
|
|
69
|
-
const lifecycleLane = lane !== "lifecycle" ||
|
|
74
|
+
const lifecycleLane = lane !== "lifecycle" || !plain
|
|
70
75
|
? undefined
|
|
71
76
|
: schema?.body !== undefined
|
|
72
77
|
? schema.query !== undefined
|
|
@@ -78,20 +83,20 @@ export function selectRouteLanes(options) {
|
|
|
78
83
|
// The realistic middleware shape is commonly exactly one synchronous-or-async derive followed by
|
|
79
84
|
// one before hook. Keep the generic runner for every route that can observe decorations, after hooks,
|
|
80
85
|
// error hooks, or response contracts; this lane only removes the two per-request hook-loop dispatches
|
|
81
|
-
// and preserves the same async continuations and error handling. A params or
|
|
82
|
-
// back to the generic lane because the fused builder has no
|
|
86
|
+
// and preserves the same async continuations and error handling. A params, headers, or cookies schema
|
|
87
|
+
// routes back to the generic lane because the fused builder has no validation step for them
|
|
83
88
|
// baked in - adding them would be more code than it saves. A `body` schema is the same story
|
|
84
89
|
// because the fused derive-before / derive-before-after builders don't parse the body: routes with a
|
|
85
90
|
// body schema are routed to the `body-derive-before` / `body-derive-before-after` lane below.
|
|
86
91
|
const lifecycleHookLane = lane === "lifecycle" &&
|
|
92
|
+
!authBeforeValidation &&
|
|
87
93
|
!hasResponseContract &&
|
|
88
94
|
!hasDecorations &&
|
|
89
95
|
!hasIdempotency &&
|
|
90
96
|
!hasLedger &&
|
|
91
97
|
schema?.onValidationError === undefined &&
|
|
92
98
|
!defaultOnValidationError &&
|
|
93
|
-
|
|
94
|
-
schema?.headers === undefined &&
|
|
99
|
+
plain &&
|
|
95
100
|
schema?.body === undefined &&
|
|
96
101
|
derives === 1 &&
|
|
97
102
|
beforeHandle === 1 &&
|
|
@@ -107,10 +112,10 @@ export function selectRouteLanes(options) {
|
|
|
107
112
|
// parse → validate → derive → before → handler → after → respond in one function frame, the same
|
|
108
113
|
// win `fusedBody` already gives for the no-hooks body shape.
|
|
109
114
|
const fusedBodyLifecycle = lane === "lifecycle" &&
|
|
115
|
+
!authBeforeValidation &&
|
|
110
116
|
schema?.body !== undefined &&
|
|
111
117
|
schema?.query === undefined &&
|
|
112
|
-
|
|
113
|
-
schema?.headers === undefined &&
|
|
118
|
+
plain &&
|
|
114
119
|
schema?.onValidationError === undefined &&
|
|
115
120
|
!defaultOnValidationError &&
|
|
116
121
|
!hasResponseContract &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-lanes.js","sourceRoot":"","sources":["../../src/internal/route-lanes.ts"],"names":[],"mappings":"AA+BA,MAAM,UAAU,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"route-lanes.js","sourceRoot":"","sources":["../../src/internal/route-lanes.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,8 @@ import type { StandardSchemaV1 } from "../schema/standard.js";
|
|
|
10
10
|
import type { Registry } from "../server/registry.js";
|
|
11
11
|
import { type ResponseResult } from "../server/runtime-core.js";
|
|
12
12
|
import type { CtxSet, MaybePromise, RawContext, RequestSource, Server } from "../server/server.js";
|
|
13
|
-
import type { InternalHandler, RawAfterHandle, RawBeforeHandle, RawDerive, RawErrorHandler, RouteEntry } from "./route-execution.js";
|
|
14
|
-
export type ProgramValidationKind = "headers" | "params" | "body" | "query";
|
|
13
|
+
import type { InternalHandler, RawAfterHandle, RawAuthStage, RawBeforeHandle, RawDerive, RawErrorHandler, RouteEntry } from "./route-execution.js";
|
|
14
|
+
export type ProgramValidationKind = "headers" | "cookies" | "params" | "body" | "query";
|
|
15
15
|
export type RouteProgramStage = {
|
|
16
16
|
readonly kind: ProgramValidationKind;
|
|
17
17
|
readonly schema: StandardSchemaV1;
|
|
@@ -31,6 +31,11 @@ export type RouteProgramStage = {
|
|
|
31
31
|
/** The complete registration-time lifecycle, in semantic execution order. */
|
|
32
32
|
export interface RouteProgram {
|
|
33
33
|
readonly stages: readonly RouteProgramStage[];
|
|
34
|
+
readonly validationOrder: "validate-before-auth" | "auth-before-validation";
|
|
35
|
+
readonly authBeforeValidation: boolean;
|
|
36
|
+
readonly authStages: readonly RawAuthStage[];
|
|
37
|
+
/** Protected route fast lane: auth plus validation/handler, with no general lifecycle hooks. */
|
|
38
|
+
readonly authFastLane: boolean;
|
|
34
39
|
readonly validationStages: readonly Extract<RouteProgramStage, {
|
|
35
40
|
kind: ProgramValidationKind;
|
|
36
41
|
}>[];
|
|
@@ -49,6 +54,7 @@ export interface RouteProgramInput {
|
|
|
49
54
|
readonly schema: RouteEntry["schema"];
|
|
50
55
|
readonly handler: InternalHandler;
|
|
51
56
|
readonly derives: readonly RawDerive[];
|
|
57
|
+
readonly authStages?: readonly RawAuthStage[];
|
|
52
58
|
readonly beforeHandle: readonly RawBeforeHandle[];
|
|
53
59
|
readonly afterHandle: readonly RawAfterHandle[];
|
|
54
60
|
readonly onError: readonly RawErrorHandler[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-program.d.ts","sourceRoot":"","sources":["../../src/internal/route-program.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"route-program.d.ts","sourceRoot":"","sources":["../../src/internal/route-program.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,31 +6,24 @@
|
|
|
6
6
|
* program is frozen at registration so the request path walks one immutable stage sequence instead
|
|
7
7
|
* of rediscovering which lifecycle features are present.
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import { pathnameOf } from "../server/http.js";
|
|
10
|
+
import { CONTEXT_SET, EMPTY_RESPONSE_CONTROLS, isResponseResult, status, } from "../server/runtime-core.js";
|
|
10
11
|
/** Build the immutable stage sequence once, while the server is still configurable. */
|
|
11
12
|
export function compileRouteProgram(input) {
|
|
12
13
|
const stages = [];
|
|
13
14
|
const validationStages = [];
|
|
14
15
|
const schema = input.schema;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const stage = { kind: "body", schema: schema.body };
|
|
27
|
-
stages.push(stage);
|
|
28
|
-
validationStages.push(stage);
|
|
29
|
-
}
|
|
30
|
-
if (schema?.query !== undefined) {
|
|
31
|
-
const stage = { kind: "query", schema: schema.query };
|
|
32
|
-
stages.push(stage);
|
|
33
|
-
validationStages.push(stage);
|
|
16
|
+
const authStages = input.authStages ?? [];
|
|
17
|
+
const authBeforeValidation = authStages.length > 0
|
|
18
|
+
? schema?.validationOrder !== "validate-before-auth"
|
|
19
|
+
: schema?.validationOrder === "auth-before-validation";
|
|
20
|
+
for (const kind of ["headers", "cookies", "params", "body", "query"]) {
|
|
21
|
+
const validator = schema?.[kind];
|
|
22
|
+
if (validator !== undefined) {
|
|
23
|
+
const stage = { kind, schema: validator };
|
|
24
|
+
stages.push(stage);
|
|
25
|
+
validationStages.push(stage);
|
|
26
|
+
}
|
|
34
27
|
}
|
|
35
28
|
for (const derive of input.derives)
|
|
36
29
|
stages.push({ kind: "derive", run: derive });
|
|
@@ -41,6 +34,13 @@ export function compileRouteProgram(input) {
|
|
|
41
34
|
stages.push({ kind: "after", run: after });
|
|
42
35
|
return Object.freeze({
|
|
43
36
|
stages: Object.freeze(stages),
|
|
37
|
+
validationOrder: authBeforeValidation ? "auth-before-validation" : "validate-before-auth",
|
|
38
|
+
authBeforeValidation,
|
|
39
|
+
authStages: Object.freeze([...authStages]),
|
|
40
|
+
authFastLane: authStages.length > 0 &&
|
|
41
|
+
input.derives.length === 0 &&
|
|
42
|
+
input.beforeHandle.length === 0 &&
|
|
43
|
+
input.afterHandle.length === 0,
|
|
44
44
|
validationStages: Object.freeze(validationStages),
|
|
45
45
|
derives: Object.freeze([...input.derives]),
|
|
46
46
|
beforeHandle: Object.freeze([...input.beforeHandle]),
|
|
@@ -60,10 +60,212 @@ function responseSet(ctx) {
|
|
|
60
60
|
function isEarly(value) {
|
|
61
61
|
return value instanceof Response || isResponseResult(value);
|
|
62
62
|
}
|
|
63
|
+
function authHeadersOf(source) {
|
|
64
|
+
return Object.freeze({
|
|
65
|
+
get: (name) => source.headers.get(name),
|
|
66
|
+
has: (name) => source.headers.has(name),
|
|
67
|
+
forEach: (callback) => {
|
|
68
|
+
source.headers.forEach(callback);
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function authenticationInputOf(source, ctx) {
|
|
73
|
+
return Object.freeze({
|
|
74
|
+
method: source.method,
|
|
75
|
+
pathname: pathnameOf(source.url),
|
|
76
|
+
headers: authHeadersOf(source),
|
|
77
|
+
params: Object.freeze({ ...ctx.params }),
|
|
78
|
+
env: ctx.env,
|
|
79
|
+
clientIp: ctx.clientIp,
|
|
80
|
+
signal: ctx.signal,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function defaultAuthenticationResponse(reason) {
|
|
84
|
+
if (reason === "forbidden")
|
|
85
|
+
return status(403, { ok: false, error: "forbidden" });
|
|
86
|
+
if (reason === "unavailable")
|
|
87
|
+
return status(503, { ok: false, error: "auth_unavailable" });
|
|
88
|
+
return status(401, { ok: false, error: "unauthorized" });
|
|
89
|
+
}
|
|
90
|
+
function validAuthenticationFailureReason(value) {
|
|
91
|
+
return (value === undefined ||
|
|
92
|
+
value === "unauthenticated" ||
|
|
93
|
+
value === "forbidden" ||
|
|
94
|
+
value === "unavailable");
|
|
95
|
+
}
|
|
96
|
+
function runAuthenticationStages(host, entry, program, source, ctx, finalize, wrapResponse, start = 0, validationComplete = false) {
|
|
97
|
+
if (start >= program.authStages.length) {
|
|
98
|
+
if (program.authFastLane) {
|
|
99
|
+
const validationIndex = validationComplete ? program.validationStages.length : 0;
|
|
100
|
+
return runFastAuthenticatedProgram(host, entry, program, source, ctx, finalize, wrapResponse, validationIndex);
|
|
101
|
+
}
|
|
102
|
+
return validationComplete
|
|
103
|
+
? runSync(host, entry, program, source, ctx, finalize, wrapResponse, program.validationStages.length, undefined)
|
|
104
|
+
: runValidatedProgram(host, entry, program, source, ctx, finalize, wrapResponse);
|
|
105
|
+
}
|
|
106
|
+
const input = authenticationInputOf(source, ctx);
|
|
107
|
+
const stage = program.authStages[start];
|
|
108
|
+
let outcome;
|
|
109
|
+
try {
|
|
110
|
+
outcome = stage.run(input);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return finalize(defaultAuthenticationResponse("unavailable"), responseSet(ctx));
|
|
114
|
+
}
|
|
115
|
+
if (outcome instanceof Promise) {
|
|
116
|
+
return outcome.then((settled) => finishAuthentication(host, entry, program, source, ctx, finalize, wrapResponse, settled, start + 1, validationComplete), () => finalize(defaultAuthenticationResponse("unavailable"), responseSet(ctx)));
|
|
117
|
+
}
|
|
118
|
+
return finishAuthentication(host, entry, program, source, ctx, finalize, wrapResponse, outcome, start + 1, validationComplete);
|
|
119
|
+
}
|
|
120
|
+
function finishAuthentication(host, entry, program, source, ctx, finalize, wrapResponse, result, next, validationComplete = false) {
|
|
121
|
+
if (result === null ||
|
|
122
|
+
typeof result !== "object" ||
|
|
123
|
+
(result.kind !== "authenticated" && result.kind !== "rejected")) {
|
|
124
|
+
return finalize(defaultAuthenticationResponse("unavailable"), responseSet(ctx));
|
|
125
|
+
}
|
|
126
|
+
if (result.kind === "rejected") {
|
|
127
|
+
if (!validAuthenticationFailureReason(result.reason)) {
|
|
128
|
+
return finalize(defaultAuthenticationResponse("unavailable"), responseSet(ctx));
|
|
129
|
+
}
|
|
130
|
+
if (result.response !== undefined &&
|
|
131
|
+
!(result.response instanceof Response) &&
|
|
132
|
+
!isResponseResult(result.response)) {
|
|
133
|
+
return finalize(defaultAuthenticationResponse("unavailable"), responseSet(ctx));
|
|
134
|
+
}
|
|
135
|
+
const response = result.response ?? defaultAuthenticationResponse(result.reason);
|
|
136
|
+
return finalize(response, responseSet(ctx));
|
|
137
|
+
}
|
|
138
|
+
if (result.principal === null || result.principal === undefined) {
|
|
139
|
+
return finalize(defaultAuthenticationResponse("unavailable"), responseSet(ctx));
|
|
140
|
+
}
|
|
141
|
+
Object.defineProperty(ctx, "principal", {
|
|
142
|
+
value: result.principal,
|
|
143
|
+
enumerable: true,
|
|
144
|
+
configurable: true,
|
|
145
|
+
writable: false,
|
|
146
|
+
});
|
|
147
|
+
return runAuthenticationStages(host, entry, program, source, ctx, finalize, wrapResponse, next, validationComplete);
|
|
148
|
+
}
|
|
149
|
+
/** Validate first only when a route explicitly opts out of the protected auth-first default. */
|
|
150
|
+
function runFastAuthenticatedProgram(host, entry, program, source, ctx, finalize, wrapResponse, validationIndex) {
|
|
151
|
+
for (let i = validationIndex; i < program.validationStages.length; i++) {
|
|
152
|
+
const stage = program.validationStages[i];
|
|
153
|
+
const outcome = stage.kind === "body"
|
|
154
|
+
? host.readProgramBody(entry, source, ctx)
|
|
155
|
+
: host.validateProgramStage(entry, stage, source, ctx);
|
|
156
|
+
if (outcome instanceof Promise) {
|
|
157
|
+
return continueFastAuthenticatedProgram(host, entry, program, source, ctx, finalize, wrapResponse, i + 1, outcome);
|
|
158
|
+
}
|
|
159
|
+
if (outcome !== undefined)
|
|
160
|
+
return wrapResponse(outcome);
|
|
161
|
+
}
|
|
162
|
+
return runFastAuthenticatedHandler(host, entry, program, ctx, finalize, wrapResponse);
|
|
163
|
+
}
|
|
164
|
+
async function continueFastAuthenticatedProgram(host, entry, program, source, ctx, finalize, wrapResponse, validationIndex, pending) {
|
|
165
|
+
try {
|
|
166
|
+
const settled = await pending;
|
|
167
|
+
if (settled !== undefined)
|
|
168
|
+
return wrapResponse(settled);
|
|
169
|
+
return await runFastAuthenticatedProgram(host, entry, program, source, ctx, finalize, wrapResponse, validationIndex);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
return await host.handleProgramError(entry, error, ctx, finalize, wrapResponse);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function runFastAuthenticatedHandler(host, entry, program, ctx, finalize, wrapResponse) {
|
|
176
|
+
let result;
|
|
177
|
+
try {
|
|
178
|
+
result = program.handler(ctx);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
return host.handleProgramError(entry, error, ctx, finalize, wrapResponse);
|
|
182
|
+
}
|
|
183
|
+
if (result instanceof Promise) {
|
|
184
|
+
return result.then((value) => host.finishProgramResult(entry, ctx, value, finalize, wrapResponse), (error) => host.handleProgramError(entry, error, ctx, finalize, wrapResponse));
|
|
185
|
+
}
|
|
186
|
+
return host.finishProgramResult(entry, ctx, result, finalize, wrapResponse);
|
|
187
|
+
}
|
|
188
|
+
function runValidationBeforeAuthentication(host, entry, program, source, ctx, finalize, wrapResponse, validationIndex = 0) {
|
|
189
|
+
for (let i = validationIndex; i < program.validationStages.length; i++) {
|
|
190
|
+
const stage = program.validationStages[i];
|
|
191
|
+
const outcome = stage.kind === "body"
|
|
192
|
+
? host.readProgramBody(entry, source, ctx)
|
|
193
|
+
: host.validateProgramStage(entry, stage, source, ctx);
|
|
194
|
+
if (outcome instanceof Promise) {
|
|
195
|
+
return continueValidationBeforeAuthentication(host, entry, program, source, ctx, finalize, wrapResponse, i + 1, outcome);
|
|
196
|
+
}
|
|
197
|
+
if (outcome !== undefined)
|
|
198
|
+
return wrapResponse(outcome);
|
|
199
|
+
}
|
|
200
|
+
return runAuthenticationStages(host, entry, program, source, ctx, finalize, wrapResponse, 0, true);
|
|
201
|
+
}
|
|
202
|
+
async function continueValidationBeforeAuthentication(host, entry, program, source, ctx, finalize, wrapResponse, validationIndex, pending) {
|
|
203
|
+
try {
|
|
204
|
+
const settled = await pending;
|
|
205
|
+
if (settled !== undefined)
|
|
206
|
+
return wrapResponse(settled);
|
|
207
|
+
return await runValidationBeforeAuthentication(host, entry, program, source, ctx, finalize, wrapResponse, validationIndex);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
return await host.handleProgramError(entry, error, ctx, finalize, wrapResponse);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function runValidatedProgram(host, entry, program, source, ctx, finalize, wrapResponse) {
|
|
214
|
+
if (program.hasDecorations)
|
|
215
|
+
Object.assign(ctx, program.decorations);
|
|
216
|
+
return runSync(host, entry, program, source, ctx, finalize, wrapResponse, 0, undefined);
|
|
217
|
+
}
|
|
218
|
+
/** Opt-in sensitive-route lane: run authentication/policy hooks before parsing untrusted input. */
|
|
219
|
+
async function runAuthBeforeValidation(host, entry, program, source, ctx, finalize, wrapResponse) {
|
|
220
|
+
try {
|
|
221
|
+
if (program.hasDecorations)
|
|
222
|
+
Object.assign(ctx, program.decorations);
|
|
223
|
+
for (const derive of program.derives) {
|
|
224
|
+
const result = derive(ctx);
|
|
225
|
+
const settled = result instanceof Promise ? await result : result;
|
|
226
|
+
if (isEarly(settled))
|
|
227
|
+
return finalize(settled, responseSet(ctx));
|
|
228
|
+
Object.assign(ctx, settled);
|
|
229
|
+
}
|
|
230
|
+
for (const before of program.beforeHandle) {
|
|
231
|
+
const result = before(ctx);
|
|
232
|
+
const settled = result instanceof Promise ? await result : result;
|
|
233
|
+
if (settled !== undefined)
|
|
234
|
+
return finalize(settled, responseSet(ctx));
|
|
235
|
+
}
|
|
236
|
+
for (const stage of program.validationStages) {
|
|
237
|
+
const result = stage.kind === "body"
|
|
238
|
+
? await host.readProgramBody(entry, source, ctx)
|
|
239
|
+
: host.validateProgramStage(entry, stage, source, ctx);
|
|
240
|
+
const settled = result instanceof Promise ? await result : result;
|
|
241
|
+
if (settled !== undefined)
|
|
242
|
+
return wrapResponse(settled);
|
|
243
|
+
}
|
|
244
|
+
let result = await program.handler(ctx);
|
|
245
|
+
for (const after of program.afterHandle) {
|
|
246
|
+
const transformed = after(result, ctx);
|
|
247
|
+
result = transformed instanceof Promise ? await transformed : transformed;
|
|
248
|
+
}
|
|
249
|
+
return await host.finishProgramResult(entry, ctx, result, finalize, wrapResponse);
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
return await host.handleProgramError(entry, error, ctx, finalize, wrapResponse);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
63
255
|
/** Execute the general program. The first synchronous stage sequence stays synchronous. */
|
|
64
256
|
export function executeRouteProgram(runtime, entry, program, source, ctx, finalize, wrapResponse) {
|
|
65
257
|
const host = runtime;
|
|
66
258
|
try {
|
|
259
|
+
if (program.authStages.length > 0) {
|
|
260
|
+
if (program.hasDecorations)
|
|
261
|
+
Object.assign(ctx, program.decorations);
|
|
262
|
+
return program.authBeforeValidation
|
|
263
|
+
? runAuthenticationStages(host, entry, program, source, ctx, finalize, wrapResponse)
|
|
264
|
+
: runValidationBeforeAuthentication(host, entry, program, source, ctx, finalize, wrapResponse);
|
|
265
|
+
}
|
|
266
|
+
if (program.validationOrder === "auth-before-validation") {
|
|
267
|
+
return runAuthBeforeValidation(host, entry, program, source, ctx, finalize, wrapResponse);
|
|
268
|
+
}
|
|
67
269
|
if (program.hasDecorations)
|
|
68
270
|
Object.assign(ctx, program.decorations);
|
|
69
271
|
return runSync(host, entry, program, source, ctx, finalize, wrapResponse, 0, undefined);
|