@nifrajs/core 3.5.0 → 4.0.2
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
package/dist/router/pattern.js
CHANGED
|
@@ -3,28 +3,116 @@ const PARAM_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
|
3
3
|
const RESERVED_PARAM_NAMES = new Set(["__proto__", "constructor", "prototype"]);
|
|
4
4
|
const COMPILED_ROUTE_PATTERN = Symbol("nifra.compiled-route-pattern");
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
* never asks for one, so building it during {@link compileRoutePattern} would charge every
|
|
8
|
-
* boot for the browser/mock adapters alone. Keyed by the frozen pattern, so the cache dies
|
|
6
|
+
* Matcher per compiled pattern, derived on first use. The core trie matches by descending segments
|
|
7
|
+
* and never asks for one, so building it during {@link compileRoutePattern} would charge every
|
|
8
|
+
* server's boot for the browser/mock adapters alone. Keyed by the frozen pattern, so the cache dies
|
|
9
|
+
* with it.
|
|
9
10
|
*/
|
|
10
|
-
const
|
|
11
|
-
function
|
|
12
|
-
let
|
|
13
|
-
if (
|
|
11
|
+
const MATCHER_CACHE = new WeakMap();
|
|
12
|
+
function matcherOf(compiled) {
|
|
13
|
+
let matcher = MATCHER_CACHE.get(compiled);
|
|
14
|
+
if (matcher === undefined) {
|
|
14
15
|
if (compiled[COMPILED_ROUTE_PATTERN] !== true) {
|
|
15
16
|
throw new TypeError("route pattern was not produced by compileRoutePattern()");
|
|
16
17
|
}
|
|
18
|
+
// A mixed segment is captured WHOLE here and taken apart by `matchMixedSegment` afterwards. Its
|
|
19
|
+
// parameters never become separate lazy groups in this regex: several of those in one segment
|
|
20
|
+
// make the engine retry every split of the text between them, and the text is the request's.
|
|
17
21
|
const parts = compiled.segments.map((segment) => segment.kind === "static"
|
|
18
22
|
? escapeRegex(segment.value)
|
|
19
|
-
: segment.kind === "
|
|
20
|
-
? "(
|
|
21
|
-
:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
: segment.kind === "wildcard"
|
|
24
|
+
? "(.+)"
|
|
25
|
+
: "([^/]+)");
|
|
26
|
+
matcher = {
|
|
27
|
+
regex: new RegExp(parts.length === 0 ? "^/$" : `^/${parts.join("/")}$`),
|
|
28
|
+
shapes: compiled.segments.map((segment) => segment.kind === "mixed" ? mixedSegmentShape(segment.parts) : undefined),
|
|
29
|
+
checked: compiled.segments.map((segment) => segment.kind === "mixed" ? constrainedParts(segment.parts) : undefined),
|
|
30
|
+
};
|
|
31
|
+
MATCHER_CACHE.set(compiled, matcher);
|
|
26
32
|
}
|
|
27
|
-
return
|
|
33
|
+
return matcher;
|
|
34
|
+
}
|
|
35
|
+
// No pattern text ever becomes a RegExp. This recognises the constraint grammar, anchored at a `{`:
|
|
36
|
+
// group 1 is a class, 2 its count (3 and 4 the bounds), 5 a list of values.
|
|
37
|
+
const CONSTRAINT = /^\{(?:(\[(?:[\w.~!$&'()+,;=@-]|\\[dw])+]|\\[dw])(\+|\{(\d+)(?:,(\d*))?})?|([\w.~-]+(?:\|[\w.~-]+)+))}/;
|
|
38
|
+
/**
|
|
39
|
+
* Parse the constraint `text` starts with, or `undefined` when it starts with none. `text` begins at
|
|
40
|
+
* the `{` that follows a parameter name; the constraint read is `source.length + 2` characters long.
|
|
41
|
+
*/
|
|
42
|
+
export function paramConstraint(text) {
|
|
43
|
+
const found = CONSTRAINT.exec(text);
|
|
44
|
+
if (found === null)
|
|
45
|
+
return undefined;
|
|
46
|
+
const oneOf = found[5]?.split("|");
|
|
47
|
+
const table = new Array(128).fill(0);
|
|
48
|
+
let min = 1;
|
|
49
|
+
let max = 1;
|
|
50
|
+
const set = (from, to) => table.fill(1, from, to + 1);
|
|
51
|
+
// A list has no class to read: `body` is empty for it, and so is the count.
|
|
52
|
+
const body = found[1] ?? "";
|
|
53
|
+
const members = body.length > 2 ? body.slice(1, -1) : body;
|
|
54
|
+
for (let i = 0; i < members.length; i++) {
|
|
55
|
+
const from = members.charCodeAt(i);
|
|
56
|
+
let to = from;
|
|
57
|
+
if (from === 92 /* \ */) {
|
|
58
|
+
if (members[++i] === "w") {
|
|
59
|
+
set(65, 90);
|
|
60
|
+
set(95, 95);
|
|
61
|
+
set(97, 122);
|
|
62
|
+
}
|
|
63
|
+
set(48, 57);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
// `x-y` is a range when something follows the hyphen; a hyphen at either end is itself.
|
|
67
|
+
if (members[i + 1] === "-" && i + 2 < members.length) {
|
|
68
|
+
i += 2;
|
|
69
|
+
to = members.charCodeAt(i);
|
|
70
|
+
// A range that takes in `%` would let a percent-escape through, and the handler would then
|
|
71
|
+
// see a value other than the one tested.
|
|
72
|
+
if (to === 92 || to < from || (from < 37 && to > 37))
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
set(from, to);
|
|
76
|
+
}
|
|
77
|
+
if (found[2] !== undefined) {
|
|
78
|
+
min = Number(found[3] ?? 1);
|
|
79
|
+
max = found[2] === "+" || found[4] === "" ? Infinity : Number(found[4] ?? found[3]);
|
|
80
|
+
if (min < 1 || max < min)
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
const mask = table.join("");
|
|
84
|
+
let index;
|
|
85
|
+
if (oneOf) {
|
|
86
|
+
index = Object.create(null);
|
|
87
|
+
for (const value of oneOf)
|
|
88
|
+
index[value] = 1;
|
|
89
|
+
}
|
|
90
|
+
return Object.freeze({
|
|
91
|
+
source: found[0].slice(1, -1),
|
|
92
|
+
oneOf: oneOf && Object.freeze(oneOf),
|
|
93
|
+
index: index && Object.freeze(index),
|
|
94
|
+
mask,
|
|
95
|
+
min,
|
|
96
|
+
max,
|
|
97
|
+
size: oneOf ? oneOf.length : mask.split("1").length - 1,
|
|
98
|
+
key: oneOf ? [...oneOf].sort().join("|") : `${mask},${min},${max}`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// Runs per request: lookups hit a string or a frozen object, as a frozen array reads several times slower.
|
|
102
|
+
function satisfies(constraint, value) {
|
|
103
|
+
if (!constraint)
|
|
104
|
+
return true;
|
|
105
|
+
if (constraint.index)
|
|
106
|
+
return constraint.index[value] === 1;
|
|
107
|
+
let i = value.length;
|
|
108
|
+
if (i < constraint.min || i > constraint.max)
|
|
109
|
+
return false;
|
|
110
|
+
const mask = constraint.mask;
|
|
111
|
+
// A code past 127 reads outside the mask, which is `NaN` and so not a `1`.
|
|
112
|
+
while (i-- > 0)
|
|
113
|
+
if (mask.charCodeAt(value.charCodeAt(i)) !== 49 /* 1 */)
|
|
114
|
+
return false;
|
|
115
|
+
return true;
|
|
28
116
|
}
|
|
29
117
|
function validParamName(name) {
|
|
30
118
|
return PARAM_NAME.test(name) && !RESERVED_PARAM_NAMES.has(name);
|
|
@@ -94,9 +182,11 @@ function splitMixed(value) {
|
|
|
94
182
|
parts.push({ t: "lit", v: literal });
|
|
95
183
|
literal = "";
|
|
96
184
|
}
|
|
97
|
-
|
|
185
|
+
// A constraint belongs to the parameter; braces that are not one stay literal text.
|
|
186
|
+
const constraint = paramConstraint(value.slice(paramEnd));
|
|
187
|
+
parts.push({ t: "param", name, c: constraint });
|
|
98
188
|
sawParam = true;
|
|
99
|
-
i
|
|
189
|
+
i = paramEnd - 1 + (constraint ? constraint.source.length + 2 : 0);
|
|
100
190
|
}
|
|
101
191
|
if (!sawParam)
|
|
102
192
|
return undefined;
|
|
@@ -104,7 +194,15 @@ function splitMixed(value) {
|
|
|
104
194
|
parts.push({ t: "lit", v: literal });
|
|
105
195
|
return parts;
|
|
106
196
|
}
|
|
107
|
-
/**
|
|
197
|
+
/**
|
|
198
|
+
* A canonical string for one mixed segment's shape: the anchored-regex source that describes what the
|
|
199
|
+
* segment accepts, with a capture per parameter. Two segments with the same source are the same shape.
|
|
200
|
+
*
|
|
201
|
+
* It is an identity and an ordering key. Matching goes through {@link matchMixedSegment}, which accepts
|
|
202
|
+
* exactly what this source describes without compiling it - for a segment with no constraint. A
|
|
203
|
+
* constrained parameter's capture is its constraint, and there the scanner accepts less than the
|
|
204
|
+
* source describes: it places the literals as if nothing were constrained and then tests each value.
|
|
205
|
+
*/
|
|
108
206
|
export function mixedSegmentSource(parts) {
|
|
109
207
|
let source = "";
|
|
110
208
|
for (const part of parts) {
|
|
@@ -112,10 +210,136 @@ export function mixedSegmentSource(parts) {
|
|
|
112
210
|
// `/abc.txt` would capture `abc.txt` and then fail to match `\.txt`. With `^…$` anchoring, the
|
|
113
211
|
// lazy form still yields `abc.txt` for `/abc.txt.txt` - the anchor forces the LAST `.txt` to be
|
|
114
212
|
// the literal. `+?` and not `*?`: an empty capture must not match (see the empty-segment rule).
|
|
115
|
-
source +=
|
|
213
|
+
source +=
|
|
214
|
+
part.t === "lit"
|
|
215
|
+
? escapeRegex(part.v)
|
|
216
|
+
: part.c === undefined
|
|
217
|
+
? "([^/]+?)"
|
|
218
|
+
: `(${part.c.oneOf?.map(escapeRegex).join("|") ?? part.c.source})`;
|
|
116
219
|
}
|
|
117
220
|
return source;
|
|
118
221
|
}
|
|
222
|
+
/** Lay a mixed segment's parts out as a {@link MixedSegmentShape}. Done once, at registration. */
|
|
223
|
+
export function mixedSegmentShape(parts) {
|
|
224
|
+
// Two literals are never adjacent, so a literal fills the open slot and a parameter opens the next.
|
|
225
|
+
const shape = [""];
|
|
226
|
+
for (const part of parts) {
|
|
227
|
+
if (part.t === "lit")
|
|
228
|
+
shape[shape.length - 1] = part.v;
|
|
229
|
+
else
|
|
230
|
+
shape.push("");
|
|
231
|
+
}
|
|
232
|
+
return shape;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The parts of a mixed segment when at least one of its parameters has a constraint, else
|
|
236
|
+
* `undefined`. It is the fourth argument to {@link matchMixedSegment}; done once, at registration.
|
|
237
|
+
*/
|
|
238
|
+
export function constrainedParts(parts) {
|
|
239
|
+
return parts.some((part) => part.t === "param" && part.c) ? parts : undefined;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Match ONE path segment against a mixed shape, in a single left-to-right pass.
|
|
243
|
+
*
|
|
244
|
+
* On a match the captures are appended to `out` in parameter order and the result is `true`. On a miss
|
|
245
|
+
* `out` is left exactly as it was and the result is `false`.
|
|
246
|
+
*
|
|
247
|
+
* The rule: the leading literal must start the segment and the trailing literal must end it; every
|
|
248
|
+
* parameter takes at least one character; and each literal between two parameters is taken at its
|
|
249
|
+
* FIRST occurrence that leaves the parameter before it non-empty. The last parameter takes what
|
|
250
|
+
* remains. Two parameters with nothing between them give the first one a single character.
|
|
251
|
+
*
|
|
252
|
+
* That is the match an anchored pattern with lazy captures selects, reached without trying the
|
|
253
|
+
* alternatives: taking a literal earlier only ever hands more text to the parameter after it, so if
|
|
254
|
+
* any placement matches, the earliest one does. The work is therefore bounded by the segment's length
|
|
255
|
+
* however many parameters the shape has - a segment is request-controlled and must not be able to buy
|
|
256
|
+
* more than one pass.
|
|
257
|
+
*
|
|
258
|
+
* Constraints are tested last, on the values that rule produced: pass `checked` (from
|
|
259
|
+
* {@link constrainedParts}) and a value that fails its parameter's constraint is a miss. A failed
|
|
260
|
+
* test never moves a literal to a later occurrence to try again, so the cost stays one pass to place
|
|
261
|
+
* the literals and one over the values.
|
|
262
|
+
*
|
|
263
|
+
* `segment` must not contain `/`.
|
|
264
|
+
*/
|
|
265
|
+
export function matchMixedSegment(shape, segment, out, checked) {
|
|
266
|
+
const last = shape.length - 1;
|
|
267
|
+
const head = shape[0];
|
|
268
|
+
const tail = shape[last];
|
|
269
|
+
let at = head.length;
|
|
270
|
+
const end = segment.length - tail.length;
|
|
271
|
+
// The first parameter needs a character between the two end literals. This also refuses end
|
|
272
|
+
// literals that would overlap in the text (`a.:x.b` against `a.b`).
|
|
273
|
+
if (at >= end)
|
|
274
|
+
return false;
|
|
275
|
+
if (at !== 0 && !segment.startsWith(head))
|
|
276
|
+
return false;
|
|
277
|
+
if (end !== segment.length && !segment.endsWith(tail))
|
|
278
|
+
return false;
|
|
279
|
+
const base = out.length;
|
|
280
|
+
for (let i = 1; i < last; i++) {
|
|
281
|
+
const separator = shape[i];
|
|
282
|
+
// An empty separator is found right here, which gives the parameter before it one character.
|
|
283
|
+
const found = segment.indexOf(separator, at + 1);
|
|
284
|
+
const next = found + separator.length;
|
|
285
|
+
// The parameter after this separator needs a character before the trailing literal. A first
|
|
286
|
+
// occurrence that leaves none means every later one does too.
|
|
287
|
+
if (found === -1 || next >= end) {
|
|
288
|
+
out.length = base;
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
out.push(segment.slice(at, found));
|
|
292
|
+
at = next;
|
|
293
|
+
}
|
|
294
|
+
out.push(segment.slice(at, end));
|
|
295
|
+
if (checked !== undefined) {
|
|
296
|
+
let value = base;
|
|
297
|
+
for (const part of checked) {
|
|
298
|
+
if (part.t === "param" && !satisfies(part.c, out[value++])) {
|
|
299
|
+
out.length = base;
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
/** Whether a segment is `:name?` or `:name{constraint}?` and nothing else. The caller has seen
|
|
307
|
+
* that the pattern ends in `?`; a segment before the last one is tested for it here. */
|
|
308
|
+
function isOptionalParam(segment) {
|
|
309
|
+
const parts = segment.endsWith("?") ? splitMixed(segment.slice(0, -1)) : undefined;
|
|
310
|
+
return parts?.length === 1 && parts[0].t === "param";
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* The concrete patterns an optional-parameter pattern stands for, shortest first.
|
|
314
|
+
*
|
|
315
|
+
* A path may END in a run of whole-segment optional parameters, `:name?` or, with a constraint,
|
|
316
|
+
* `:name{[0-9]+}?`. It is shorthand for one
|
|
317
|
+
* route per prefix of that run: `/users/:id?` is `/users` and `/users/:id`, and `/a/:b?/:c?` is `/a`,
|
|
318
|
+
* `/a/:b`, and `/a/:b/:c`. A later parameter is only present when every earlier one is, so a run of
|
|
319
|
+
* `n` parameters is `n + 1` patterns, never `2^n`.
|
|
320
|
+
*
|
|
321
|
+
* Every other pattern comes back unchanged as the only element. That includes a `?` anywhere but the
|
|
322
|
+
* trailing run (`/a/:b?/c`) or inside a mixed segment (`/files/:name.:ext?`): there it is literal
|
|
323
|
+
* text, as it always was.
|
|
324
|
+
*
|
|
325
|
+
* Expansion happens before compilation, so each result is an ordinary pattern for
|
|
326
|
+
* {@link compileRoutePattern} and a matcher never learns that a parameter was optional.
|
|
327
|
+
*/
|
|
328
|
+
export function expandOptionalParams(pattern) {
|
|
329
|
+
if (pattern.charCodeAt(pattern.length - 1) !== 63 /* ? */)
|
|
330
|
+
return [pattern];
|
|
331
|
+
const segments = pattern.split("/");
|
|
332
|
+
let first = segments.length;
|
|
333
|
+
while (first > 1 && isOptionalParam(segments[first - 1]))
|
|
334
|
+
first--;
|
|
335
|
+
let form = segments.slice(0, first).join("/");
|
|
336
|
+
const forms = [form || "/"];
|
|
337
|
+
for (let i = first; i < segments.length; i++) {
|
|
338
|
+
form += `/${segments[i].slice(0, -1)}`;
|
|
339
|
+
forms.push(form);
|
|
340
|
+
}
|
|
341
|
+
return forms;
|
|
342
|
+
}
|
|
119
343
|
/** Parse and validate Nifra's strict route grammar once. Trailing slashes remain significant. */
|
|
120
344
|
export function compileRoutePattern(pattern) {
|
|
121
345
|
if (pattern.length === 0 || pattern.charCodeAt(0) !== 47 /* / */) {
|
|
@@ -210,6 +434,7 @@ const SPECIFICITY = {
|
|
|
210
434
|
export function compareMixedPartsSpecificity(left, right) {
|
|
211
435
|
const literalWeight = (parts) => parts.reduce((sum, part) => (part.t === "lit" ? sum + part.v.length : sum), 0);
|
|
212
436
|
const order = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
437
|
+
const rank = (constraint) => constraint ? (constraint.oneOf ? 0 : 1) : 2;
|
|
213
438
|
const weightDifference = literalWeight(right) - literalWeight(left);
|
|
214
439
|
if (weightDifference !== 0)
|
|
215
440
|
return weightDifference;
|
|
@@ -224,8 +449,22 @@ export function compareMixedPartsSpecificity(left, right) {
|
|
|
224
449
|
if (a.t === "lit" && b.t === "lit" && a.v !== b.v) {
|
|
225
450
|
return a.v.length === b.v.length ? order(a.v, b.v) : b.v.length - a.v.length;
|
|
226
451
|
}
|
|
452
|
+
if (a.t === "param" && b.t === "param") {
|
|
453
|
+
// A constrained parameter before a free one, a list of values before a class. Two of a kind:
|
|
454
|
+
// the one that accepts less goes first, so a constraint contained in another is tried before
|
|
455
|
+
// it (`\d+` before `\w+`, whichever way each is spelled). The key settles the rest, and the
|
|
456
|
+
// result never depends on registration order.
|
|
457
|
+
const x = a.c;
|
|
458
|
+
const y = b.c;
|
|
459
|
+
const difference = rank(x) - rank(y) ||
|
|
460
|
+
(x && y && (x.size - y.size || x.max - x.min - (y.max - y.min) || order(x.key, y.key)));
|
|
461
|
+
if (difference)
|
|
462
|
+
return difference;
|
|
463
|
+
}
|
|
227
464
|
}
|
|
228
|
-
|
|
465
|
+
// Same kinds in the same order with the same literals and constraints: the two are one shape.
|
|
466
|
+
// Parameter names do not enter into what a segment matches, so they do not order it either.
|
|
467
|
+
return 0;
|
|
229
468
|
}
|
|
230
469
|
/** Core precedence: static > mixed > param > wildcard at the first differing segment, independent of
|
|
231
470
|
* registration order. */
|
|
@@ -277,12 +516,33 @@ export function decodeRouteParams(raw) {
|
|
|
277
516
|
}
|
|
278
517
|
/** Match one compiled pattern and return decoded captures. The caller decides cross-pattern order. */
|
|
279
518
|
export function matchRoutePattern(compiled, pathname) {
|
|
280
|
-
const
|
|
519
|
+
const matcher = matcherOf(compiled);
|
|
520
|
+
const match = matcher.regex.exec(pathname);
|
|
281
521
|
if (match === null)
|
|
282
522
|
return { matched: false, reason: "not-found" };
|
|
283
523
|
const params = {};
|
|
284
|
-
|
|
285
|
-
|
|
524
|
+
const names = compiled.paramNames;
|
|
525
|
+
// One capture group per dynamic segment, in order. A mixed segment's group is the whole segment,
|
|
526
|
+
// which the scanner splits into that segment's parameters.
|
|
527
|
+
let group = 1;
|
|
528
|
+
let name = 0;
|
|
529
|
+
let captures;
|
|
530
|
+
for (let i = 0; i < compiled.segments.length; i++) {
|
|
531
|
+
if (compiled.segments[i].kind === "static")
|
|
532
|
+
continue;
|
|
533
|
+
const value = match[group++] ?? "";
|
|
534
|
+
const shape = matcher.shapes[i];
|
|
535
|
+
if (shape === undefined) {
|
|
536
|
+
params[names[name++]] = value;
|
|
537
|
+
continue;
|
|
538
|
+
}
|
|
539
|
+
captures ??= [];
|
|
540
|
+
captures.length = 0;
|
|
541
|
+
if (!matchMixedSegment(shape, value, captures, matcher.checked[i])) {
|
|
542
|
+
return { matched: false, reason: "not-found" };
|
|
543
|
+
}
|
|
544
|
+
for (const capture of captures)
|
|
545
|
+
params[names[name++]] = capture;
|
|
286
546
|
}
|
|
287
547
|
const decoded = decodeRouteParams(params);
|
|
288
548
|
return decoded === null
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/router/pattern.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/router/pattern.ts"],"names":[],"mappings":"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"}
|
package/dist/router/router.d.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import { type CompiledRoutePattern } from "./pattern.js";
|
|
2
|
-
/** HTTP methods the
|
|
2
|
+
/** The standard HTTP methods: the ones with a builder on the server and a call on the typed client. */
|
|
3
3
|
export declare const METHODS: readonly ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"];
|
|
4
4
|
export type Method = (typeof METHODS)[number];
|
|
5
|
+
/**
|
|
6
|
+
* A method a route is registered under: a standard {@link Method}, or another token that
|
|
7
|
+
* {@link isRegistrableMethod} accepts (`PROPFIND`, `PURGE`, ...).
|
|
8
|
+
*/
|
|
9
|
+
export type RouteMethod = Method | (string & {});
|
|
10
|
+
/**
|
|
11
|
+
* Whether a route can be registered under `method` - one of {@link METHODS}, or another uppercase
|
|
12
|
+
* token such as `PROPFIND`. `TRACE`, `CONNECT` and `TRACK` never are.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isRegistrableMethod(method: string): boolean;
|
|
5
15
|
export declare const EMPTY_PARAMS: Record<string, string>;
|
|
6
16
|
/**
|
|
7
17
|
* Result of {@link Router.find}. The `found: false` cases deliberately separate
|
|
@@ -49,11 +59,15 @@ export declare class Router<T> {
|
|
|
49
59
|
* Register a payload for `method` + `path`. Throws {@link RouteConfigError}
|
|
50
60
|
* (boot-time, L2) on a duplicate route, a malformed pattern, or conflicting
|
|
51
61
|
* parameter names for the same path shape.
|
|
62
|
+
*
|
|
63
|
+
* One call is one route. A `?` in the pattern is literal text here: optional parameters
|
|
64
|
+
* (`/users/:id?`) are expanded by the caller, which adds each pattern `expandOptionalParams`
|
|
65
|
+
* (`@nifrajs/core/pattern`) gives for it.
|
|
52
66
|
*/
|
|
53
|
-
add(method:
|
|
67
|
+
add(method: string, pattern: string | CompiledRoutePattern, payload: T): void;
|
|
54
68
|
/**
|
|
55
|
-
* Resolve `method` + `path`. Tolerant of a missing leading slash
|
|
56
|
-
*
|
|
69
|
+
* Resolve `method` + `path`. Tolerant of a missing leading slash. The method is compared exactly:
|
|
70
|
+
* tokens are case-sensitive, so `get` does not reach a `GET` route. Never throws.
|
|
57
71
|
*/
|
|
58
72
|
find(method: string, path: string): RouterMatch<T>;
|
|
59
73
|
private findDynamic;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,oBAAoB,
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,oBAAoB,EAQ1B,MAAM,cAAc,CAAA;AAErB,uGAAuG;AACvG,eAAO,MAAM,OAAO,uEAAwE,CAAA;AAE5F,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7C;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAOhD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3D;AAGD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAqB,CAAA;AAGrE;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IACrB;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACtF;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAgPhG;;;;;;;;GAQG;AACH,qBAAa,MAAM,CAAC,CAAC;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;;IAQ7C;;;;;;;;OAQG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,oBAAoB,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAsF7E;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;IAelD,OAAO,CAAC,WAAW;IA8BnB,OAAO,CAAC,sBAAsB;CAwB/B"}
|
package/dist/router/router.js
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { RouteConfigError } from "../errors.js";
|
|
2
|
-
import { compareMixedPartsSpecificity, compileRoutePattern,
|
|
3
|
-
/** HTTP methods the
|
|
2
|
+
import { compareMixedPartsSpecificity, compileRoutePattern, constrainedParts, matchMixedSegment, mixedSegmentShape, } from "./pattern.js";
|
|
3
|
+
/** The standard HTTP methods: the ones with a builder on the server and a call on the typed client. */
|
|
4
4
|
export const METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"];
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
// A method token is 1-32 characters of `A-Z`, `0-9` and `-`, starting with a letter. TRACE, CONNECT
|
|
6
|
+
// and TRACK are left out: TRACE (and its alias TRACK) asks a server to echo the request back,
|
|
7
|
+
// headers included, and CONNECT asks for a tunnel. Neither is something a route handler answers.
|
|
8
|
+
const REGISTRABLE_METHOD = /^(?!(TRAC[EK]|CONNECT)$)[A-Z][A-Z\d-]{0,31}$/;
|
|
9
|
+
/**
|
|
10
|
+
* Whether a route can be registered under `method` - one of {@link METHODS}, or another uppercase
|
|
11
|
+
* token such as `PROPFIND`. `TRACE`, `CONNECT` and `TRACK` never are.
|
|
12
|
+
*/
|
|
13
|
+
export function isRegistrableMethod(method) {
|
|
14
|
+
return REGISTRABLE_METHOD.test(method);
|
|
8
15
|
}
|
|
9
16
|
const SLASH = 47;
|
|
10
17
|
export const EMPTY_PARAMS = Object.freeze({});
|
|
@@ -73,12 +80,11 @@ function matchNode(node, path, start, len, paramValues) {
|
|
|
73
80
|
const mixedChildren = node.mixedChildren;
|
|
74
81
|
if (mixedChildren !== undefined && seg.length > 0) {
|
|
75
82
|
for (const child of mixedChildren) {
|
|
76
|
-
|
|
77
|
-
|
|
83
|
+
// Pushes this segment's captures left-to-right, matching the order `paramNames` was built in,
|
|
84
|
+
// and pushes nothing on a miss - a value that fails its constraint is a miss. One pass over
|
|
85
|
+
// the segment whatever the shape: see the scanner.
|
|
86
|
+
if (!matchMixedSegment(child.shape, seg, paramValues, child.checked))
|
|
78
87
|
continue;
|
|
79
|
-
// Push left-to-right, matching the order `paramNames` was built in.
|
|
80
|
-
for (let i = 1; i <= child.arity; i++)
|
|
81
|
-
paramValues.push(matched[i]);
|
|
82
88
|
if (isLast) {
|
|
83
89
|
if (child.node.terminal !== undefined)
|
|
84
90
|
return child.node.terminal;
|
|
@@ -88,9 +94,9 @@ function matchNode(node, path, start, len, paramValues) {
|
|
|
88
94
|
if (found !== undefined)
|
|
89
95
|
return found;
|
|
90
96
|
}
|
|
91
|
-
// Backtrack: a mixed segment pushed
|
|
92
|
-
// every later param reads a value belonging to an abandoned branch.
|
|
93
|
-
for (let i =
|
|
97
|
+
// Backtrack: a mixed segment pushed a value per parameter, not a single one, so unwind exactly
|
|
98
|
+
// that many or every later param reads a value belonging to an abandoned branch.
|
|
99
|
+
for (let i = 1; i < child.shape.length; i++)
|
|
94
100
|
paramValues.pop();
|
|
95
101
|
}
|
|
96
102
|
}
|
|
@@ -132,39 +138,35 @@ function buildParams(names, values) {
|
|
|
132
138
|
}
|
|
133
139
|
function resolve(terminal, method, params) {
|
|
134
140
|
if (terminal.staticMatches !== undefined && params === EMPTY_PARAMS) {
|
|
135
|
-
// Real requests arrive pre-uppercased (HTTP methods are canonically uppercase; every runtime and
|
|
136
|
-
// client normalizes this) - try the cache under the raw method first so that overwhelmingly common
|
|
137
|
-
// case skips `toUpperCase()` entirely, matching the same already-uppercase fast path
|
|
138
|
-
// `resolveDirect` takes below. Falls back to the uppercase key (computed once) for a lowercase or
|
|
139
|
-
// mixed-case caller, so behavior is unchanged - only the common case gets cheaper.
|
|
140
141
|
const direct = terminal.staticMatches.get(method);
|
|
141
142
|
if (direct !== undefined)
|
|
142
143
|
return direct;
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return cached;
|
|
147
|
-
const cacheable = terminal.handlers.has(upper) || (upper === "HEAD" && terminal.handlers.has("GET"));
|
|
144
|
+
// Only a hit is cached, and only under a method the terminal serves, so the cache is bounded by
|
|
145
|
+
// the registered methods and an arbitrary request token never grows it.
|
|
146
|
+
const cacheable = terminal.handlers.has(method) || (method === "HEAD" && terminal.handlers.has("GET"));
|
|
148
147
|
if (!cacheable)
|
|
149
148
|
return resolveDirect(terminal, method, params);
|
|
150
149
|
const res = resolveDirect(terminal, method, params);
|
|
151
|
-
terminal.staticMatches.set(
|
|
150
|
+
terminal.staticMatches.set(method, res);
|
|
152
151
|
return res;
|
|
153
152
|
}
|
|
154
153
|
return resolveDirect(terminal, method, params);
|
|
155
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Method tokens are case-sensitive (RFC 9110 §9.1), and this compares them exactly. A request whose
|
|
157
|
+
* token differs from a registered method only in case is a different method and answers 405. Folding
|
|
158
|
+
* case here would run a handler under a method string that a case-sensitive method check elsewhere -
|
|
159
|
+
* a CSRF guard, a body limit, a user hook comparing `c.req.method` - does not recognise, so the two
|
|
160
|
+
* would disagree about whether the request mutates.
|
|
161
|
+
*/
|
|
156
162
|
function resolveDirect(terminal, method, params) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
const upper = method.toUpperCase();
|
|
161
|
-
if (upper !== method && terminal.handlers.has(upper)) {
|
|
162
|
-
return { found: true, payload: terminal.handlers.get(upper), params };
|
|
163
|
-
}
|
|
163
|
+
const payload = terminal.handlers.get(method);
|
|
164
|
+
if (payload !== undefined)
|
|
165
|
+
return { found: true, payload, params };
|
|
164
166
|
// RFC 9110 §9.3.2: HEAD is GET without the body. A route registered for GET answers HEAD with
|
|
165
167
|
// the GET handler; the serving runtime strips the body, so status + headers mirror GET exactly.
|
|
166
|
-
// An explicitly registered HEAD handler takes precedence via the
|
|
167
|
-
if (
|
|
168
|
+
// An explicitly registered HEAD handler takes precedence via the lookup above.
|
|
169
|
+
if (method === "HEAD") {
|
|
168
170
|
const get = terminal.handlers.get("GET");
|
|
169
171
|
if (get !== undefined)
|
|
170
172
|
return { found: true, payload: get, params };
|
|
@@ -208,13 +210,15 @@ export class Router {
|
|
|
208
210
|
* Register a payload for `method` + `path`. Throws {@link RouteConfigError}
|
|
209
211
|
* (boot-time, L2) on a duplicate route, a malformed pattern, or conflicting
|
|
210
212
|
* parameter names for the same path shape.
|
|
213
|
+
*
|
|
214
|
+
* One call is one route. A `?` in the pattern is literal text here: optional parameters
|
|
215
|
+
* (`/users/:id?`) are expanded by the caller, which adds each pattern `expandOptionalParams`
|
|
216
|
+
* (`@nifrajs/core/pattern`) gives for it.
|
|
211
217
|
*/
|
|
212
218
|
add(method, pattern, payload) {
|
|
213
219
|
DYNAMIC_MATCH_CACHES.delete(this);
|
|
214
220
|
const upper = method.toUpperCase();
|
|
215
|
-
|
|
216
|
-
// runtime for JS callers and dynamically-computed methods.
|
|
217
|
-
if (!isMethod(upper)) {
|
|
221
|
+
if (!isRegistrableMethod(upper)) {
|
|
218
222
|
throw new RouteConfigError("INVALID_METHOD", `unsupported HTTP method "${method}"`);
|
|
219
223
|
}
|
|
220
224
|
const compiled = typeof pattern === "string" ? compileRoutePattern(pattern) : pattern;
|
|
@@ -232,16 +236,19 @@ export class Router {
|
|
|
232
236
|
node = node.wildcardChild;
|
|
233
237
|
}
|
|
234
238
|
else if (segment.kind === "mixed") {
|
|
235
|
-
const
|
|
239
|
+
const parts = segment.parts;
|
|
240
|
+
const key = parts
|
|
241
|
+
.map((part) => (part.t === "lit" ? `L${part.v}` : `P${part.c?.key ?? ""}`))
|
|
242
|
+
.join("/");
|
|
236
243
|
node.mixedChildren ??= [];
|
|
237
|
-
let child = node.mixedChildren.find((entry) => entry.
|
|
244
|
+
let child = node.mixedChildren.find((entry) => entry.key === key);
|
|
238
245
|
if (child === undefined) {
|
|
239
246
|
child = {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
247
|
+
shape: mixedSegmentShape(parts),
|
|
248
|
+
parts,
|
|
249
|
+
checked: constrainedParts(parts),
|
|
243
250
|
node: createNode(),
|
|
244
|
-
|
|
251
|
+
key,
|
|
245
252
|
};
|
|
246
253
|
node.mixedChildren.push(child);
|
|
247
254
|
// Most literal text first. Registration order must not decide which of `/:id.txt` and
|
|
@@ -292,8 +299,8 @@ export class Router {
|
|
|
292
299
|
}
|
|
293
300
|
}
|
|
294
301
|
/**
|
|
295
|
-
* Resolve `method` + `path`. Tolerant of a missing leading slash
|
|
296
|
-
*
|
|
302
|
+
* Resolve `method` + `path`. Tolerant of a missing leading slash. The method is compared exactly:
|
|
303
|
+
* tokens are case-sensitive, so `get` does not reach a `GET` route. Never throws.
|
|
297
304
|
*/
|
|
298
305
|
find(method, path) {
|
|
299
306
|
const len = path.length;
|