@nifrajs/core 3.1.0 → 3.3.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 +21 -0
- package/dist/durable-adapters.d.ts.map +1 -1
- package/dist/durable-adapters.js +26 -3
- package/dist/durable-adapters.js.map +1 -1
- package/dist/durable-approval.d.ts +56 -0
- package/dist/durable-approval.d.ts.map +1 -0
- package/dist/durable-approval.js +233 -0
- package/dist/durable-approval.js.map +1 -0
- package/dist/durable-effect.d.ts +42 -0
- package/dist/durable-effect.d.ts.map +1 -0
- package/dist/durable-effect.js +234 -0
- package/dist/durable-effect.js.map +1 -0
- package/dist/durable-execution.d.ts +8 -346
- package/dist/durable-execution.d.ts.map +1 -1
- package/dist/durable-execution.js +7 -1150
- package/dist/durable-execution.js.map +1 -1
- package/dist/durable-saga.d.ts +94 -0
- package/dist/durable-saga.d.ts.map +1 -0
- package/dist/durable-saga.js +550 -0
- package/dist/durable-saga.js.map +1 -0
- package/dist/edge-kit.d.ts +2 -2
- package/dist/edge-kit.d.ts.map +1 -1
- package/dist/edge-kit.js +2 -2
- package/dist/edge-kit.js.map +1 -1
- package/dist/index.d.ts +23 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/durable-approval-protocol.d.ts +1 -1
- package/dist/internal/durable-approval-protocol.d.ts.map +1 -1
- package/dist/internal/durable-effect-protocol.d.ts +1 -1
- package/dist/internal/durable-effect-protocol.d.ts.map +1 -1
- package/dist/internal/durable-saga-protocol.d.ts +1 -1
- package/dist/internal/durable-saga-protocol.d.ts.map +1 -1
- package/dist/internal/durable-shared.d.ts +26 -0
- package/dist/internal/durable-shared.d.ts.map +1 -0
- package/dist/internal/durable-shared.js +131 -0
- package/dist/internal/durable-shared.js.map +1 -0
- package/dist/internal/durable-types.d.ts +159 -0
- package/dist/internal/durable-types.d.ts.map +1 -0
- package/dist/internal/durable-types.js +2 -0
- package/dist/internal/durable-types.js.map +1 -0
- package/dist/internal/route-compiler.d.ts +61 -0
- package/dist/internal/route-compiler.d.ts.map +1 -0
- package/dist/internal/route-compiler.js +121 -0
- package/dist/internal/route-compiler.js.map +1 -0
- package/dist/internal/route-execution.d.ts +6 -4
- package/dist/internal/route-execution.d.ts.map +1 -1
- package/dist/internal/route-execution.js +2 -17
- package/dist/internal/route-execution.js.map +1 -1
- package/dist/internal/route-lanes.d.ts +35 -0
- package/dist/internal/route-lanes.d.ts.map +1 -0
- package/dist/internal/route-lanes.js +150 -0
- package/dist/internal/route-lanes.js.map +1 -0
- package/dist/internal/route-program.d.ts +67 -0
- package/dist/internal/route-program.d.ts.map +1 -0
- package/dist/internal/route-program.js +199 -0
- package/dist/internal/route-program.js.map +1 -0
- package/dist/server/bare-error-lane.d.ts +1 -1
- package/dist/server/bare-error-lane.d.ts.map +1 -1
- package/dist/server/bare-error-lane.js +3 -3
- package/dist/server/bare-error-lane.js.map +1 -1
- package/dist/server/body-lane.d.ts +13 -0
- package/dist/server/body-lane.d.ts.map +1 -0
- package/dist/server/body-lane.js +134 -0
- package/dist/server/body-lane.js.map +1 -0
- package/dist/server/contract.d.ts +40 -14
- package/dist/server/contract.d.ts.map +1 -1
- package/dist/server/contract.js +7 -0
- package/dist/server/contract.js.map +1 -1
- package/dist/server/cookies.d.ts.map +1 -1
- package/dist/server/cookies.js +16 -2
- package/dist/server/cookies.js.map +1 -1
- package/dist/server/plugin.d.ts +2 -2
- package/dist/server/plugin.d.ts.map +1 -1
- package/dist/server/plugin.js +6 -1
- package/dist/server/plugin.js.map +1 -1
- package/dist/server/registry.d.ts +40 -12
- package/dist/server/registry.d.ts.map +1 -1
- package/dist/server/request-context.d.ts +4 -28
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js +10 -185
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/respond.d.ts.map +1 -1
- package/dist/server/respond.js +39 -2
- package/dist/server/respond.js.map +1 -1
- package/dist/server/runtime-core.d.ts +18 -2
- package/dist/server/runtime-core.d.ts.map +1 -1
- package/dist/server/runtime-core.js +0 -23
- package/dist/server/runtime-core.js.map +1 -1
- package/dist/server/server-types.d.ts +3 -0
- package/dist/server/server-types.d.ts.map +1 -1
- package/dist/server/server.d.ts +113 -84
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +506 -639
- package/dist/server/server.js.map +1 -1
- package/dist/server/validation.d.ts +5 -0
- package/dist/server/validation.d.ts.map +1 -0
- package/dist/server/validation.js +13 -0
- package/dist/server/validation.js.map +1 -0
- package/dist/server/ws-bun.d.ts +11 -3
- package/dist/server/ws-bun.d.ts.map +1 -1
- package/dist/server/ws-bun.js +42 -12
- package/dist/server/ws-bun.js.map +1 -1
- package/dist/server/ws-hook.d.ts +3 -2
- package/dist/server/ws-hook.d.ts.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/single-copy.d.ts.map +1 -1
- package/dist/single-copy.js +3 -1
- package/dist/single-copy.js.map +1 -1
- package/package.json +6 -3
- package/src/durable-adapters.ts +20 -0
- package/src/durable-approval.ts +281 -0
- package/src/durable-effect.ts +300 -0
- package/src/durable-execution.ts +8 -1627
- package/src/durable-saga.ts +744 -0
- package/src/edge-kit.ts +2 -2
- package/src/index.ts +129 -2
- package/src/internal/durable-approval-protocol.ts +1 -1
- package/src/internal/durable-effect-protocol.ts +1 -1
- package/src/internal/durable-saga-protocol.ts +1 -1
- package/src/internal/durable-shared.ts +157 -0
- package/src/internal/durable-types.ts +194 -0
- package/src/internal/route-compiler.ts +234 -0
- package/src/internal/route-execution.ts +34 -84
- package/src/internal/route-lanes.ts +221 -0
- package/src/internal/route-program.ts +404 -0
- package/src/server/bare-error-lane.ts +3 -2
- package/src/server/body-lane.ts +203 -0
- package/src/server/contract.ts +70 -20
- package/src/server/cookies.ts +16 -2
- package/src/server/plugin.ts +11 -5
- package/src/server/registry.ts +71 -16
- package/src/server/request-context.ts +7 -262
- package/src/server/respond.ts +45 -2
- package/src/server/runtime-core.ts +28 -2
- package/src/server/server-types.ts +3 -0
- package/src/server/server.ts +1152 -1260
- package/src/server/validation.ts +19 -0
- package/src/server/ws-bun.ts +44 -11
- package/src/server/ws-hook.ts +3 -2
- package/src/server.ts +7 -2
- package/src/single-copy.ts +3 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { RouteConfigError } from "../errors.js";
|
|
2
|
+
import { compileRoutePattern } from "../router/pattern.js";
|
|
3
|
+
import { assertByteLimit } from "../server/body.js";
|
|
4
|
+
import { CAPABILITY_GUARD, createCapabilityGuard, normalizeRouteCapabilities, } from "./capability-runtime.js";
|
|
5
|
+
import { assuranceDeclarationsOf, assuranceEvidenceFor, NIFRA_ASSURANCE_IDS, validEvidenceId, } from "./route-assurance.js";
|
|
6
|
+
import { selectRouteLanes } from "./route-lanes.js";
|
|
7
|
+
/** Resolve all registration-time policy and lane facts for one route. */
|
|
8
|
+
export function compileRouteOptions(context, method, path, schema, handler) {
|
|
9
|
+
const pattern = compileRoutePattern(path);
|
|
10
|
+
let bodyLimit = context.maxBodyBytes;
|
|
11
|
+
const invalidBodyLimit = (message) => {
|
|
12
|
+
throw new RouteConfigError("INVALID_BODY_LIMIT", `route ${method} ${path}: ${message}`);
|
|
13
|
+
};
|
|
14
|
+
if (schema?.bodyLimitReason !== undefined && schema.bodyLimit !== "unlimited") {
|
|
15
|
+
invalidBodyLimit('bodyLimitReason is only valid with bodyLimit: "unlimited"');
|
|
16
|
+
}
|
|
17
|
+
if (schema?.bodyLimit === "unlimited") {
|
|
18
|
+
if (typeof schema.bodyLimitReason !== "string" || schema.bodyLimitReason.trim().length === 0) {
|
|
19
|
+
invalidBodyLimit('bodyLimit: "unlimited" requires a non-empty bodyLimitReason');
|
|
20
|
+
}
|
|
21
|
+
if (schema.body !== undefined) {
|
|
22
|
+
invalidBodyLimit('bodyLimit: "unlimited" cannot be used with a body schema; use a finite cap');
|
|
23
|
+
}
|
|
24
|
+
if (schema.idempotency !== undefined) {
|
|
25
|
+
invalidBodyLimit('bodyLimit: "unlimited" cannot be used with idempotency');
|
|
26
|
+
}
|
|
27
|
+
bodyLimit = undefined;
|
|
28
|
+
}
|
|
29
|
+
else if (schema?.bodyLimit !== undefined) {
|
|
30
|
+
try {
|
|
31
|
+
assertByteLimit(schema.bodyLimit, "route bodyLimit");
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
invalidBodyLimit('bodyLimit must be a non-negative safe integer or "unlimited"');
|
|
35
|
+
}
|
|
36
|
+
bodyLimit = schema.bodyLimit;
|
|
37
|
+
}
|
|
38
|
+
const capabilities = normalizeRouteCapabilities(schema?.capabilities);
|
|
39
|
+
const handlerAssurance = assuranceDeclarationsOf(handler);
|
|
40
|
+
const invalidHandlerScope = handlerAssurance.find((declaration) => declaration.scope !== "plugin");
|
|
41
|
+
if (invalidHandlerScope !== undefined) {
|
|
42
|
+
throw new RouteConfigError("INVALID_ASSURANCE", `route handler assurance must use plugin scope (received ${invalidHandlerScope.scope})`);
|
|
43
|
+
}
|
|
44
|
+
const authenticated = assuranceEvidenceFor([...context.activeAssurance, ...handlerAssurance, ...context.globalAssurance], method, path).some((evidence) => evidence.id === NIFRA_ASSURANCE_IDS.AUTHENTICATED);
|
|
45
|
+
const routeDecorations = { ...context.decorations };
|
|
46
|
+
if (capabilities.length > 0) {
|
|
47
|
+
routeDecorations[CAPABILITY_GUARD] = createCapabilityGuard(capabilities, method, path, context.onCapabilityUse, context.idempotencyRuntime?.trackEffect, Object.freeze([...context.capabilityInterceptors]), Object.freeze([...context.capabilityObservers]));
|
|
48
|
+
}
|
|
49
|
+
const hasDecorations = Reflect.ownKeys(routeDecorations).length > 0;
|
|
50
|
+
if (schema?.idempotency !== undefined && context.idempotencyRuntime === undefined) {
|
|
51
|
+
throw new RouteConfigError("INVALID_IDEMPOTENCY", "route declares idempotency but the idempotency plugin is not installed; add .use(idempotency())");
|
|
52
|
+
}
|
|
53
|
+
const idempotent = context.idempotencyRuntime?.resolve(schema, authenticated, context.maxBodyBytes);
|
|
54
|
+
const ledgered = context.effectLedgerRuntime?.resolve(capabilities, method, path);
|
|
55
|
+
const contracted = context.responseContractRuntime !== undefined && schema?.response !== undefined
|
|
56
|
+
? { runtime: context.responseContractRuntime, schema: schema.response }
|
|
57
|
+
: undefined;
|
|
58
|
+
const lanes = selectRouteLanes({
|
|
59
|
+
schema,
|
|
60
|
+
hasIdempotency: idempotent !== undefined,
|
|
61
|
+
hasLedger: ledgered !== undefined,
|
|
62
|
+
hasResponseContract: contracted !== undefined,
|
|
63
|
+
hasDecorations,
|
|
64
|
+
derives: context.derives.length,
|
|
65
|
+
beforeHandle: context.beforeHandleHooks.length,
|
|
66
|
+
afterHandle: context.afterHandleHooks.length,
|
|
67
|
+
onError: context.onErrorHooks.length,
|
|
68
|
+
around: context.aroundHooks.length,
|
|
69
|
+
defaultOnValidationError: context.defaultOnValidationError !== undefined,
|
|
70
|
+
});
|
|
71
|
+
const routeAssurance = [...context.activeAssurance, ...handlerAssurance];
|
|
72
|
+
if (contracted?.runtime.mode === "enforce" && schema?.response !== undefined) {
|
|
73
|
+
routeAssurance.push(Object.freeze({
|
|
74
|
+
id: NIFRA_ASSURANCE_IDS.RESPONSE_CONTRACT,
|
|
75
|
+
source: "response-contract",
|
|
76
|
+
scope: "plugin",
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
for (const id of schema?.assurance ?? []) {
|
|
80
|
+
if (!validEvidenceId(id)) {
|
|
81
|
+
throw new Error(`route assurance: invalid evidence id ${JSON.stringify(id)} on ${method} ${path} (use lowercase dot/dash segments)`);
|
|
82
|
+
}
|
|
83
|
+
const declared = { id, source: "declared", scope: "plugin" };
|
|
84
|
+
Object.defineProperty(declared, "provenance", {
|
|
85
|
+
value: "declared",
|
|
86
|
+
enumerable: false,
|
|
87
|
+
configurable: false,
|
|
88
|
+
writable: false,
|
|
89
|
+
});
|
|
90
|
+
routeAssurance.push(Object.freeze(declared));
|
|
91
|
+
}
|
|
92
|
+
const unlimitedBody = schema?.bodyLimit === "unlimited";
|
|
93
|
+
if (!unlimitedBody && (schema?.body !== undefined || typeof schema?.bodyLimit === "number")) {
|
|
94
|
+
routeAssurance.push(Object.freeze({
|
|
95
|
+
id: NIFRA_ASSURANCE_IDS.BODY_BOUNDED,
|
|
96
|
+
source: "route-schema",
|
|
97
|
+
scope: "plugin",
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
if (schema?.idempotency !== undefined) {
|
|
101
|
+
routeAssurance.push(Object.freeze({
|
|
102
|
+
id: NIFRA_ASSURANCE_IDS.IDEMPOTENCY_KEY,
|
|
103
|
+
source: "route-schema",
|
|
104
|
+
scope: "plugin",
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
pattern,
|
|
109
|
+
bodyLimit,
|
|
110
|
+
capabilities,
|
|
111
|
+
handlerAssurance,
|
|
112
|
+
routeDecorations,
|
|
113
|
+
hasDecorations,
|
|
114
|
+
idempotent,
|
|
115
|
+
ledgered,
|
|
116
|
+
responseContract: contracted,
|
|
117
|
+
lanes,
|
|
118
|
+
routeAssurance: Object.freeze(routeAssurance),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=route-compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-compiler.js","sourceRoot":"","sources":["../../src/internal/route-compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ import type { Registry } from "../server/registry.js";
|
|
|
25
25
|
import type { 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
|
+
import type { RouteProgram } from "./route-program.js";
|
|
28
29
|
export type InternalHandler = (ctx: RawContext) => MaybePromise<HandlerResult>;
|
|
29
30
|
/** A `derive` computes per-request context extensions; stored path-erased. */
|
|
30
31
|
export type RawDerive = (ctx: RawContext) => MaybePromise<object>;
|
|
@@ -45,10 +46,9 @@ export declare function compileRouteExecutionPlan(options: {
|
|
|
45
46
|
readonly contextless: boolean;
|
|
46
47
|
readonly hasAround: boolean;
|
|
47
48
|
readonly hasLedger: boolean;
|
|
48
|
-
readonly lifecycleLane: LifecycleExecutionLane;
|
|
49
49
|
readonly fusedWeb: FusedWebRunner | undefined;
|
|
50
50
|
readonly fusedBody: FusedBodyRunner | undefined;
|
|
51
|
-
readonly fusedLane: "bare" | "body" | "query" | undefined;
|
|
51
|
+
readonly fusedLane: "bare" | "body" | "query" | "derive-before" | "derive-before-after" | "body-derive-before" | "body-derive-before-after" | undefined;
|
|
52
52
|
}): RouteExecutionPlan;
|
|
53
53
|
/** Registration-compiled route behavior. Every adapter invokes the same runner; the optional fused
|
|
54
54
|
* renderer is only a response-format specialization of that same selected route semantics. */
|
|
@@ -59,7 +59,7 @@ export interface RouteExecutionPlan {
|
|
|
59
59
|
/** Which builder produced {@link fusedWeb} - a merge rebinds the closure to the executing server
|
|
60
60
|
* and must rebuild it with the SAME semantics (a query-fused route rebuilt as bare would skip its
|
|
61
61
|
* validation). `undefined` iff `fusedWeb` is. */
|
|
62
|
-
readonly fusedLane: "bare" | "body" | "query" | undefined;
|
|
62
|
+
readonly fusedLane: "bare" | "body" | "query" | "derive-before" | "derive-before-after" | "body-derive-before" | "body-derive-before-after" | undefined;
|
|
63
63
|
}
|
|
64
64
|
export interface RouteEntry {
|
|
65
65
|
readonly handler: InternalHandler;
|
|
@@ -95,11 +95,13 @@ export interface RouteEntry {
|
|
|
95
95
|
readonly afterHandle: ReadonlyArray<RawAfterHandle>;
|
|
96
96
|
readonly onError: ReadonlyArray<RawErrorHandler>;
|
|
97
97
|
/** Registration-specialized hook shape for the common derive + before middleware route. */
|
|
98
|
-
readonly lifecycleHookLane: "derive-before" | undefined;
|
|
98
|
+
readonly lifecycleHookLane: "derive-before" | "derive-before-after" | undefined;
|
|
99
99
|
/** Wraps the matched route lifecycle. Empty for the common no-around path. */
|
|
100
100
|
readonly around: ReadonlyArray<RawAround>;
|
|
101
101
|
/** The single immutable execution decision consumed by portable, Node-direct, and Bun-native paths. */
|
|
102
102
|
readonly execution: RouteExecutionPlan;
|
|
103
|
+
/** One immutable general lifecycle program compiled at registration. */
|
|
104
|
+
readonly program: RouteProgram;
|
|
103
105
|
}
|
|
104
106
|
/** The fused Web lane: same inputs `routeAndRun` would hand the generic path, a `Response` out. */
|
|
105
107
|
export type FusedWebRunner = (source: RequestSource, params: Record<string, string>, search: string | undefined, signal: AbortSignal, budget: RequestBudget, platform: Platform | undefined, nativeContext: boolean) => MaybePromise<Response>;
|
|
@@ -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,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,KAAK,EAAuB,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAEzF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAA;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;
|
|
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,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,KAAK,EAAuB,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAEzF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAA;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAClG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,YAAY,CAAC,aAAa,CAAC,CAAA;AAE9E,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,YAAY,CAAC,MAAM,CAAC,CAAA;AACjE,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,YAAY,CAAC,OAAO,CAAC,CAAA;AACxE,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,KAAK,YAAY,CAAC,OAAO,CAAC,CAAA;AACxF,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,KAAK,YAAY,CAAC,OAAO,CAAC,CAAA;AACxF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,CAAA;AAE5F,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,QAAQ,EAAE,GAAG,EAC5D,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,EACvB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,aAAa,EAAE,OAAO,EACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,EAC7C,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,KAAK,CAAC,KACrD,YAAY,CAAC,CAAC,CAAC,CAAA;AAEpB,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,QAAQ,EAAE,GAAG,EAC1D,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,EACvB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,EAC7C,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,KAAK,CAAC,KACrD,YAAY,CAAC,CAAC,CAAC,CAAA;AA4DpB,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAA;AACxE,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,CAAA;AAE1F;;;gFAGgF;AAChF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,SAAS,CAAA;IAC/C,QAAQ,CAAC,SAAS,EACd,MAAM,GACN,MAAM,GACN,OAAO,GACP,eAAe,GACf,qBAAqB,GACrB,oBAAoB,GACpB,0BAA0B,GAC1B,SAAS,CAAA;CACd,GAAG,kBAAkB,CA8HrB;AAED;8FAC8F;AAC9F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,SAAS,CAAA;IAC/C;;qDAEiD;IACjD,QAAQ,CAAC,SAAS,EACd,MAAM,GACN,MAAM,GACN,OAAO,GACP,eAAe,GACf,qBAAqB,GACrB,oBAAoB,GACpB,0BAA0B,GAC1B,SAAS,CAAA;CACd;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;IACxC;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,yFAAyF;IACzF,QAAQ,CAAC,UAAU,EAAE,mBAAmB,GAAG,SAAS,CAAA;IACpD,gGAAgG;IAChG,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,GAAG,SAAS,CAAA;IACnD;;6CAEyC;IACzC,QAAQ,CAAC,gBAAgB,EACrB;QAAE,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,GAChF,SAAS,CAAA;IACb,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IAC1C,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAClD;8DAC0D;IAC1D,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,+DAA+D;IAC/D,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;IACrD,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;IACnD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;IAChD,2FAA2F;IAC3F,QAAQ,CAAC,iBAAiB,EAAE,eAAe,GAAG,qBAAqB,GAAG,SAAS,CAAA;IAC/E,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IACzC,uGAAuG;IACvG,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAA;IACtC,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAC/B;AAED,mGAAmG;AACnG,MAAM,MAAM,cAAc,GAAG,CAC3B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,aAAa,EAAE,OAAO,KACnB,YAAY,CAAC,QAAQ,CAAC,CAAA;AAE3B;wEACwE;AACxE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,EAC9B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,aAAa,EAAE,OAAO,EACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,KAAK,CAAC,EAC9D,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,KAAK,CAAC,KACrD,YAAY,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -5,7 +5,7 @@ import { RequestContext } from "../server/request-context.js";
|
|
|
5
5
|
* runners through the {@link RouteExecutionRuntime} mirror - a compile-time cast, not a dispatch
|
|
6
6
|
* object, so the emitted request path is a direct method call on the server. */
|
|
7
7
|
export function compileRouteExecutionPlan(options) {
|
|
8
|
-
const { lane, contextless, hasAround, hasLedger,
|
|
8
|
+
const { lane, contextless, hasAround, hasLedger, fusedWeb, fusedBody, fusedLane } = options;
|
|
9
9
|
if (contextless) {
|
|
10
10
|
const run = (runtime, entry, source, params, search, signal, budget, platform, _nativeContext, finalize, wrapResponse) => runtime.runContextlessBare(entry, source, params, search, signal, budget, platform, finalize, wrapResponse);
|
|
11
11
|
return Object.freeze({ run, fusedWeb, fusedBody, fusedLane });
|
|
@@ -22,22 +22,7 @@ export function compileRouteExecutionPlan(options) {
|
|
|
22
22
|
inner = (runtime, entry, _source, ctx, finalize, wrapResponse) => runtime.runQueryOnly(entry, ctx, finalize, wrapResponse);
|
|
23
23
|
break;
|
|
24
24
|
default:
|
|
25
|
-
|
|
26
|
-
case "hooks":
|
|
27
|
-
inner = (runtime, entry, _source, ctx, finalize, wrapResponse) => runtime.runLifecycleHooks(entry, ctx, finalize, wrapResponse);
|
|
28
|
-
break;
|
|
29
|
-
case "query":
|
|
30
|
-
inner = (runtime, entry, _source, ctx, finalize, wrapResponse) => runtime.runLifecycleQuery(entry, ctx, finalize, wrapResponse);
|
|
31
|
-
break;
|
|
32
|
-
case "body":
|
|
33
|
-
inner = (runtime, entry, source, ctx, finalize, wrapResponse) => runtime.runLifecycleBody(entry, source, ctx, finalize, wrapResponse);
|
|
34
|
-
break;
|
|
35
|
-
case "body-query":
|
|
36
|
-
inner = (runtime, entry, source, ctx, finalize, wrapResponse) => runtime.runLifecycleBodyQuery(entry, source, ctx, finalize, wrapResponse);
|
|
37
|
-
break;
|
|
38
|
-
default:
|
|
39
|
-
inner = (runtime, entry, source, ctx, finalize, wrapResponse) => runtime.runLifecycle(entry, source, ctx, finalize, wrapResponse);
|
|
40
|
-
}
|
|
25
|
+
inner = (runtime, entry, source, ctx, finalize, wrapResponse) => runtime.runProgram(entry, source, ctx, finalize, wrapResponse);
|
|
41
26
|
}
|
|
42
27
|
const execute = hasAround
|
|
43
28
|
? (runtime, entry, source, ctx, finalize, wrapResponse) => runtime.runWithAround(entry, ctx, () => inner(runtime, entry, source, ctx, finalize, wrapResponse), finalize, wrapResponse)
|
|
@@ -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":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registration-time route-lane selection.
|
|
3
|
+
*
|
|
4
|
+
* A route's lane is a property of its registered shape, not of an individual request. Keeping this
|
|
5
|
+
* decision in a small internal module gives the server kernel one vocabulary for bare/body/query/
|
|
6
|
+
* lifecycle execution while preserving the important invariant: this module is never called from the
|
|
7
|
+
* request path. The returned booleans are consumed by the existing compiled execution plan and fused
|
|
8
|
+
* builders; no adapter or extra dispatch hop is introduced at runtime.
|
|
9
|
+
*/
|
|
10
|
+
import type { RouteSchema } from "../server/context.js";
|
|
11
|
+
import type { LifecycleExecutionLane, RouteExecutionLane } from "./route-execution.js";
|
|
12
|
+
export interface RouteLaneSelection {
|
|
13
|
+
readonly bare: boolean;
|
|
14
|
+
readonly fusedQuery: boolean;
|
|
15
|
+
readonly bodyOnly: boolean;
|
|
16
|
+
readonly fusedBody: boolean;
|
|
17
|
+
readonly lane: RouteExecutionLane;
|
|
18
|
+
readonly lifecycleLane: LifecycleExecutionLane;
|
|
19
|
+
readonly lifecycleHookLane: "derive-before" | "derive-before-after" | undefined;
|
|
20
|
+
readonly fusedLane: "bare" | "body" | "query" | "derive-before" | "derive-before-after" | "body-derive-before" | "body-derive-before-after" | undefined;
|
|
21
|
+
}
|
|
22
|
+
export declare function selectRouteLanes(options: {
|
|
23
|
+
readonly schema: RouteSchema | undefined;
|
|
24
|
+
readonly hasIdempotency: boolean;
|
|
25
|
+
readonly hasLedger: boolean;
|
|
26
|
+
readonly hasResponseContract: boolean;
|
|
27
|
+
readonly hasDecorations: boolean;
|
|
28
|
+
readonly derives: number;
|
|
29
|
+
readonly beforeHandle: number;
|
|
30
|
+
readonly afterHandle: number;
|
|
31
|
+
readonly onError: number;
|
|
32
|
+
readonly around: number;
|
|
33
|
+
readonly defaultOnValidationError: boolean;
|
|
34
|
+
}): RouteLaneSelection;
|
|
35
|
+
//# sourceMappingURL=route-lanes.d.ts.map
|
|
@@ -0,0 +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,CAiLrB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
export function selectRouteLanes(options) {
|
|
2
|
+
const { schema, hasIdempotency, hasLedger, hasResponseContract, hasDecorations, derives, beforeHandle, afterHandle, onError, around, defaultOnValidationError, } = options;
|
|
3
|
+
const bare = schema?.params === undefined &&
|
|
4
|
+
schema?.headers === undefined &&
|
|
5
|
+
schema?.body === undefined &&
|
|
6
|
+
schema?.query === undefined &&
|
|
7
|
+
!hasIdempotency &&
|
|
8
|
+
!hasLedger &&
|
|
9
|
+
!hasResponseContract &&
|
|
10
|
+
derives === 0 &&
|
|
11
|
+
beforeHandle === 0 &&
|
|
12
|
+
afterHandle === 0 &&
|
|
13
|
+
onError === 0;
|
|
14
|
+
// A route whose ONLY lifecycle step is a query schema can fuse too: the parse + validate + handler +
|
|
15
|
+
// respond collapse into one closure with no lifecycle promise on the sync path. The guards mirror the
|
|
16
|
+
// query lane below PLUS everything the fused dispatch skips: around hooks, the idempotency/ledger
|
|
17
|
+
// wrappers, and validation-error recovery (schema or server default) - the fused invalid path is
|
|
18
|
+
// exactly `validationError(issues)`, so any recovery semantics keep the generic lane.
|
|
19
|
+
const fusedQuery = !bare &&
|
|
20
|
+
!hasResponseContract &&
|
|
21
|
+
schema?.query !== undefined &&
|
|
22
|
+
schema.body === undefined &&
|
|
23
|
+
schema.params === undefined &&
|
|
24
|
+
schema.headers === undefined &&
|
|
25
|
+
schema.onValidationError === undefined &&
|
|
26
|
+
!defaultOnValidationError &&
|
|
27
|
+
!hasIdempotency &&
|
|
28
|
+
!hasLedger &&
|
|
29
|
+
derives === 0 &&
|
|
30
|
+
beforeHandle === 0 &&
|
|
31
|
+
afterHandle === 0 &&
|
|
32
|
+
onError === 0 &&
|
|
33
|
+
around === 0;
|
|
34
|
+
const bodyOnly = !hasResponseContract &&
|
|
35
|
+
schema?.body !== undefined &&
|
|
36
|
+
schema.query === undefined &&
|
|
37
|
+
schema.params === undefined &&
|
|
38
|
+
schema.headers === undefined &&
|
|
39
|
+
derives === 0 &&
|
|
40
|
+
beforeHandle === 0 &&
|
|
41
|
+
afterHandle === 0 &&
|
|
42
|
+
onError === 0;
|
|
43
|
+
const fusedBody = !bare &&
|
|
44
|
+
bodyOnly &&
|
|
45
|
+
schema.onValidationError === undefined &&
|
|
46
|
+
!defaultOnValidationError &&
|
|
47
|
+
!hasIdempotency &&
|
|
48
|
+
!hasLedger &&
|
|
49
|
+
around === 0;
|
|
50
|
+
const lane = bare
|
|
51
|
+
? "bare"
|
|
52
|
+
: bodyOnly
|
|
53
|
+
? "body"
|
|
54
|
+
: !hasResponseContract &&
|
|
55
|
+
schema?.body === undefined &&
|
|
56
|
+
schema?.query !== undefined &&
|
|
57
|
+
schema.params === undefined &&
|
|
58
|
+
schema.headers === undefined &&
|
|
59
|
+
derives === 0 &&
|
|
60
|
+
beforeHandle === 0 &&
|
|
61
|
+
afterHandle === 0 &&
|
|
62
|
+
onError === 0
|
|
63
|
+
? "query"
|
|
64
|
+
: "lifecycle";
|
|
65
|
+
// Lifecycle routes with no params schema are the common middleware shape: derive/before plus an
|
|
66
|
+
// optional query or body schema. Select their complete validation stage at registration so the
|
|
67
|
+
// request path never re-checks params/body presence. Parameter-schema routes retain the generic
|
|
68
|
+
// lifecycle runner until their more involved recovery matrix is selected explicitly.
|
|
69
|
+
const lifecycleLane = lane !== "lifecycle" || schema?.params !== undefined || schema?.headers !== undefined
|
|
70
|
+
? undefined
|
|
71
|
+
: schema?.body !== undefined
|
|
72
|
+
? schema.query !== undefined
|
|
73
|
+
? "body-query"
|
|
74
|
+
: "body"
|
|
75
|
+
: schema?.query !== undefined
|
|
76
|
+
? "query"
|
|
77
|
+
: "hooks";
|
|
78
|
+
// The realistic middleware shape is commonly exactly one synchronous-or-async derive followed by
|
|
79
|
+
// one before hook. Keep the generic runner for every route that can observe decorations, after hooks,
|
|
80
|
+
// 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 headers schema routes
|
|
82
|
+
// back to the generic lane because the fused builder has no `params` / `headers` validation step
|
|
83
|
+
// baked in - adding them would be more code than it saves. A `body` schema is the same story
|
|
84
|
+
// because the fused derive-before / derive-before-after builders don't parse the body: routes with a
|
|
85
|
+
// body schema are routed to the `body-derive-before` / `body-derive-before-after` lane below.
|
|
86
|
+
const lifecycleHookLane = lane === "lifecycle" &&
|
|
87
|
+
!hasResponseContract &&
|
|
88
|
+
!hasDecorations &&
|
|
89
|
+
!hasIdempotency &&
|
|
90
|
+
!hasLedger &&
|
|
91
|
+
schema?.onValidationError === undefined &&
|
|
92
|
+
!defaultOnValidationError &&
|
|
93
|
+
schema?.params === undefined &&
|
|
94
|
+
schema?.headers === undefined &&
|
|
95
|
+
schema?.body === undefined &&
|
|
96
|
+
derives === 1 &&
|
|
97
|
+
beforeHandle === 1 &&
|
|
98
|
+
afterHandle <= 1 &&
|
|
99
|
+
onError === 0 &&
|
|
100
|
+
around === 0
|
|
101
|
+
? afterHandle === 0
|
|
102
|
+
? "derive-before"
|
|
103
|
+
: "derive-before-after"
|
|
104
|
+
: undefined;
|
|
105
|
+
// Body + lifecycle hooks in a closed shape: a body schema plus the same 1-derive + 1-before +
|
|
106
|
+
// 0-or-1-after + 0-onError shape, with no other body/query/path conflict. The fused closure runs
|
|
107
|
+
// parse → validate → derive → before → handler → after → respond in one function frame, the same
|
|
108
|
+
// win `fusedBody` already gives for the no-hooks body shape.
|
|
109
|
+
const fusedBodyLifecycle = lane === "lifecycle" &&
|
|
110
|
+
schema?.body !== undefined &&
|
|
111
|
+
schema?.query === undefined &&
|
|
112
|
+
schema?.params === undefined &&
|
|
113
|
+
schema?.headers === undefined &&
|
|
114
|
+
schema?.onValidationError === undefined &&
|
|
115
|
+
!defaultOnValidationError &&
|
|
116
|
+
!hasResponseContract &&
|
|
117
|
+
!hasDecorations &&
|
|
118
|
+
!hasIdempotency &&
|
|
119
|
+
!hasLedger &&
|
|
120
|
+
derives === 1 &&
|
|
121
|
+
beforeHandle === 1 &&
|
|
122
|
+
afterHandle <= 1 &&
|
|
123
|
+
onError === 0 &&
|
|
124
|
+
around === 0;
|
|
125
|
+
return {
|
|
126
|
+
bare,
|
|
127
|
+
fusedQuery,
|
|
128
|
+
bodyOnly,
|
|
129
|
+
fusedBody,
|
|
130
|
+
lane,
|
|
131
|
+
lifecycleLane,
|
|
132
|
+
lifecycleHookLane,
|
|
133
|
+
fusedLane: around === 0
|
|
134
|
+
? fusedQuery
|
|
135
|
+
? "query"
|
|
136
|
+
: fusedBody
|
|
137
|
+
? "body"
|
|
138
|
+
: bare
|
|
139
|
+
? "bare"
|
|
140
|
+
: lifecycleHookLane !== undefined
|
|
141
|
+
? lifecycleHookLane
|
|
142
|
+
: fusedBodyLifecycle
|
|
143
|
+
? afterHandle === 0
|
|
144
|
+
? "body-derive-before"
|
|
145
|
+
: "body-derive-before-after"
|
|
146
|
+
: undefined
|
|
147
|
+
: undefined,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=route-lanes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-lanes.js","sourceRoot":"","sources":["../../src/internal/route-lanes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registration-compiled general route program.
|
|
3
|
+
*
|
|
4
|
+
* This is deliberately a data-and-control-flow compiler, not source generation: user functions and
|
|
5
|
+
* schemas remain opaque references and no request value is ever converted into executable code. The
|
|
6
|
+
* program is frozen at registration so the request path walks one immutable stage sequence instead
|
|
7
|
+
* of rediscovering which lifecycle features are present.
|
|
8
|
+
*/
|
|
9
|
+
import type { StandardSchemaV1 } from "../schema/standard.js";
|
|
10
|
+
import type { Registry } from "../server/registry.js";
|
|
11
|
+
import { type ResponseResult } from "../server/runtime-core.js";
|
|
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";
|
|
15
|
+
export type RouteProgramStage = {
|
|
16
|
+
readonly kind: ProgramValidationKind;
|
|
17
|
+
readonly schema: StandardSchemaV1;
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: "derive";
|
|
20
|
+
readonly run: RawDerive;
|
|
21
|
+
} | {
|
|
22
|
+
readonly kind: "before";
|
|
23
|
+
readonly run: RawBeforeHandle;
|
|
24
|
+
} | {
|
|
25
|
+
readonly kind: "handler";
|
|
26
|
+
readonly run: InternalHandler;
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: "after";
|
|
29
|
+
readonly run: RawAfterHandle;
|
|
30
|
+
};
|
|
31
|
+
/** The complete registration-time lifecycle, in semantic execution order. */
|
|
32
|
+
export interface RouteProgram {
|
|
33
|
+
readonly stages: readonly RouteProgramStage[];
|
|
34
|
+
readonly validationStages: readonly Extract<RouteProgramStage, {
|
|
35
|
+
kind: ProgramValidationKind;
|
|
36
|
+
}>[];
|
|
37
|
+
readonly derives: readonly RawDerive[];
|
|
38
|
+
readonly beforeHandle: readonly RawBeforeHandle[];
|
|
39
|
+
readonly afterHandle: readonly RawAfterHandle[];
|
|
40
|
+
readonly onError: readonly RawErrorHandler[];
|
|
41
|
+
readonly handler: InternalHandler;
|
|
42
|
+
readonly decorations: Record<PropertyKey, unknown>;
|
|
43
|
+
readonly hasDecorations: boolean;
|
|
44
|
+
readonly bodySchema: StandardSchemaV1 | undefined;
|
|
45
|
+
readonly bodyLimit: RouteEntry["bodyLimit"];
|
|
46
|
+
readonly responseContract: RouteEntry["responseContract"];
|
|
47
|
+
}
|
|
48
|
+
export interface RouteProgramInput {
|
|
49
|
+
readonly schema: RouteEntry["schema"];
|
|
50
|
+
readonly handler: InternalHandler;
|
|
51
|
+
readonly derives: readonly RawDerive[];
|
|
52
|
+
readonly beforeHandle: readonly RawBeforeHandle[];
|
|
53
|
+
readonly afterHandle: readonly RawAfterHandle[];
|
|
54
|
+
readonly onError: readonly RawErrorHandler[];
|
|
55
|
+
readonly decorations: Record<PropertyKey, unknown>;
|
|
56
|
+
readonly hasDecorations: boolean;
|
|
57
|
+
readonly bodySchema: StandardSchemaV1 | undefined;
|
|
58
|
+
readonly bodyLimit: RouteEntry["bodyLimit"];
|
|
59
|
+
readonly responseContract: RouteEntry["responseContract"];
|
|
60
|
+
}
|
|
61
|
+
/** Build the immutable stage sequence once, while the server is still configurable. */
|
|
62
|
+
export declare function compileRouteProgram(input: RouteProgramInput): RouteProgram;
|
|
63
|
+
type ProgramResult<T> = MaybePromise<T>;
|
|
64
|
+
/** Execute the general program. The first synchronous stage sequence stays synchronous. */
|
|
65
|
+
export declare function executeRouteProgram<T, R extends Registry, Ctx>(runtime: Server<R, Ctx>, entry: RouteEntry, program: RouteProgram, source: RequestSource, ctx: RawContext, finalize: (result: unknown, set: CtxSet) => T, wrapResponse: (response: Response | ResponseResult) => T): ProgramResult<T>;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=route-program.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-program.d.ts","sourceRoot":"","sources":["../../src/internal/route-program.ts"],"names":[],"mappings":"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"}
|