@nifrajs/core 2.1.0 → 2.2.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/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/router/pattern.d.ts +26 -1
- package/dist/router/pattern.d.ts.map +1 -1
- package/dist/router/pattern.js +164 -8
- package/dist/router/pattern.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +49 -1
- package/dist/router/router.js.map +1 -1
- package/dist/transport-codec.d.ts +1 -1
- package/dist/transport-codec.d.ts.map +1 -1
- package/dist/transport-codec.js +31 -7
- package/dist/transport-codec.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -1
- package/src/router/pattern.ts +179 -8
- package/src/router/router.ts +75 -1
- package/src/transport-codec.ts +41 -7
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and
|
|
10
10
|
* `check:publish` asserts it equals `@nifrajs/core`'s package version.
|
|
11
11
|
*/
|
|
12
|
-
export declare const VERSION: "2.
|
|
12
|
+
export declare const VERSION: "2.2.0";
|
|
13
13
|
export type Version = typeof VERSION;
|
|
14
14
|
export * from "./server.js";
|
|
15
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,6 @@
|
|
|
9
9
|
* read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and
|
|
10
10
|
* `check:publish` asserts it equals `@nifrajs/core`'s package version.
|
|
11
11
|
*/
|
|
12
|
-
export const VERSION = "2.
|
|
12
|
+
export const VERSION = "2.2.0";
|
|
13
13
|
export * from "./server.js";
|
|
14
14
|
//# sourceMappingURL=index.js.map
|
package/dist/router/pattern.d.ts
CHANGED
|
@@ -8,6 +8,19 @@ export type RoutePatternSegment = {
|
|
|
8
8
|
} | {
|
|
9
9
|
readonly kind: "wildcard";
|
|
10
10
|
readonly name: string;
|
|
11
|
+
}
|
|
12
|
+
/** A segment that is part literal, part parameter: `:key.txt`, `feed.:format`, `v:major.:minor`. */
|
|
13
|
+
| {
|
|
14
|
+
readonly kind: "mixed";
|
|
15
|
+
readonly parts: readonly MixedPart[];
|
|
16
|
+
};
|
|
17
|
+
/** One piece of a {@link RoutePatternSegment} of kind `mixed`, in left-to-right order. */
|
|
18
|
+
export type MixedPart = {
|
|
19
|
+
readonly t: "lit";
|
|
20
|
+
readonly v: string;
|
|
21
|
+
} | {
|
|
22
|
+
readonly t: "param";
|
|
23
|
+
readonly name: string;
|
|
11
24
|
};
|
|
12
25
|
/**
|
|
13
26
|
* Compiled route grammar shared by runtime routers, browser navigation, mocks, and adapters.
|
|
@@ -29,9 +42,21 @@ export type RoutePatternMatch = {
|
|
|
29
42
|
readonly matched: false;
|
|
30
43
|
readonly reason: "not-found" | "malformed";
|
|
31
44
|
};
|
|
45
|
+
/** The regex source matching one segment's worth of a mixed pattern, with a capture per parameter. */
|
|
46
|
+
export declare function mixedSegmentSource(parts: readonly MixedPart[]): string;
|
|
32
47
|
/** Parse and validate Nifra's strict route grammar once. Trailing slashes remain significant. */
|
|
33
48
|
export declare function compileRoutePattern(pattern: string): CompiledRoutePattern;
|
|
34
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* Total ordering for mixed segment shapes, shared by the trie and regex-based routers.
|
|
51
|
+
*
|
|
52
|
+
* Code-unit comparison, never `localeCompare`: this exists so the server and the browser agree on which
|
|
53
|
+
* of two equally-weighted patterns wins, and `localeCompare` answers by the RUNTIME's locale - a server
|
|
54
|
+
* and a visitor in different locales would order the same pair differently, which is the divergence
|
|
55
|
+
* being prevented.
|
|
56
|
+
*/
|
|
57
|
+
export declare function compareMixedPartsSpecificity(left: readonly MixedPart[], right: readonly MixedPart[]): number;
|
|
58
|
+
/** Core precedence: static > mixed > param > wildcard at the first differing segment, independent of
|
|
59
|
+
* registration order. */
|
|
35
60
|
export declare function compareRoutePatternSpecificity(left: CompiledRoutePattern, right: CompiledRoutePattern): number;
|
|
36
61
|
/** Decode router captures under one rule. Plain values take the zero-allocation path; malformed
|
|
37
62
|
* escapes return `null`, allowing HTTP to emit 400 while client navigation declines the match. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/router/pattern.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,sBAAsB,EAAE,OAAO,MAA+C,CAAA;AAEpF,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/router/pattern.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,sBAAsB,EAAE,OAAO,MAA+C,CAAA;AAEpF,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACtD,oGAAoG;GAClG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,CAAA;AAEpE,0FAA0F;AAC1F,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAElD;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAA;IACjD,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CACvC;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAAA;CAAE,CAAA;AA4G3E,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAUtE;AAED,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CA4FzE;AAWD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,SAAS,SAAS,EAAE,EAC1B,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,MAAM,CAoBR;AAED;yBACyB;AACzB,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,oBAAoB,GAC1B,MAAM,CAeR;AAED;kGACkG;AAClG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAa5F;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAWnB"}
|
package/dist/router/pattern.js
CHANGED
|
@@ -18,7 +18,9 @@ function regexOf(compiled) {
|
|
|
18
18
|
? escapeRegex(segment.value)
|
|
19
19
|
: segment.kind === "param"
|
|
20
20
|
? "([^/]+)"
|
|
21
|
-
: "
|
|
21
|
+
: segment.kind === "mixed"
|
|
22
|
+
? mixedSegmentSource(segment.parts)
|
|
23
|
+
: "(.+)");
|
|
22
24
|
regex = new RegExp(parts.length === 0 ? "^/$" : `^/${parts.join("/")}$`);
|
|
23
25
|
REGEX_CACHE.set(compiled, regex);
|
|
24
26
|
}
|
|
@@ -27,9 +29,93 @@ function regexOf(compiled) {
|
|
|
27
29
|
function validParamName(name) {
|
|
28
30
|
return PARAM_NAME.test(name) && !RESERVED_PARAM_NAMES.has(name);
|
|
29
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Explain WHY a parameter name was rejected, in the terms the author was thinking in.
|
|
34
|
+
*
|
|
35
|
+
* The grammar is per-segment: a segment is wholly static or wholly a parameter, so everything after
|
|
36
|
+
* the colon is the name. `/v/:id.json` therefore asks for a parameter literally named `id.json`,
|
|
37
|
+
* which is not what anyone means by it — but the bare "invalid parameter" that produces reads as a
|
|
38
|
+
* typo rather than as a rule, leaving the author to guess whether the dot, the length, or the casing
|
|
39
|
+
* was the problem. Naming the actual limitation and showing the two ways out is the difference
|
|
40
|
+
* between a five-second fix and a trip to the source.
|
|
41
|
+
*/
|
|
42
|
+
function paramNameHint(name) {
|
|
43
|
+
if (RESERVED_PARAM_NAMES.has(name))
|
|
44
|
+
return ` — "${name}" is reserved (prototype key)`;
|
|
45
|
+
if (name.length === 0)
|
|
46
|
+
return ` — ":" needs a name after it`;
|
|
47
|
+
// No "a segment is wholly static or wholly a parameter" case here any more: mixed segments made
|
|
48
|
+
// that message obsolete. `:id.json` was the shape it explained, and `:id.json` now compiles.
|
|
49
|
+
return ` — a name must match ${PARAM_NAME.source}`;
|
|
50
|
+
}
|
|
30
51
|
function escapeRegex(value) {
|
|
31
52
|
return value.replace(/[.*+?^()|[\]\\{}$]/g, "\\$&");
|
|
32
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Split a segment containing `:` into literal and parameter parts.
|
|
56
|
+
*
|
|
57
|
+
* The param name is the LONGEST run matching {@link PARAM_NAME}'s body after each `:`; everything
|
|
58
|
+
* else in the segment is literal. So `:key.txt` is `[param key][lit ".txt"]`. Choosing a greedy scan
|
|
59
|
+
* on the existing sigil rather than a new `{key}.txt` syntax is a safety argument, not a taste one:
|
|
60
|
+
* every segment this newly accepts currently THROWS `INVALID_PARAM_NAME`, so no pattern that compiles
|
|
61
|
+
* today can change meaning.
|
|
62
|
+
*
|
|
63
|
+
* Returns `undefined` when the segment holds no parameter at all, so a literal colon
|
|
64
|
+
* (`/v1/things:batchGet` - legal in a URL path) stays a plain static segment.
|
|
65
|
+
*/
|
|
66
|
+
function splitMixed(value) {
|
|
67
|
+
const parts = [];
|
|
68
|
+
let literal = "";
|
|
69
|
+
let sawParam = false;
|
|
70
|
+
for (let i = 0; i < value.length; i++) {
|
|
71
|
+
if (value[i] !== ":") {
|
|
72
|
+
literal += value[i];
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const rest = value.slice(i + 1);
|
|
76
|
+
const name = /^[A-Za-z_][A-Za-z0-9_]*/.exec(rest)?.[0];
|
|
77
|
+
// A `:` not followed by a valid name start is literal text, not a malformed parameter.
|
|
78
|
+
if (name === undefined) {
|
|
79
|
+
literal += ":";
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const paramEnd = i + 1 + name.length;
|
|
83
|
+
const previous = i > 0 ? value[i - 1] : undefined;
|
|
84
|
+
const precededByBoundary = previous === undefined || !/[A-Za-z0-9_]/.test(previous);
|
|
85
|
+
// Preserve established RPC-style literals such as `things:batchGet`. A colon embedded after an
|
|
86
|
+
// identifier and running to the end is literal; mixed params remain unambiguous at segment start,
|
|
87
|
+
// after punctuation (`post-:id`), or when followed by a literal suffix (`v:major.json`).
|
|
88
|
+
if (!precededByBoundary && paramEnd === value.length) {
|
|
89
|
+
literal += `:${name}`;
|
|
90
|
+
i += name.length;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (literal !== "") {
|
|
94
|
+
parts.push({ t: "lit", v: literal });
|
|
95
|
+
literal = "";
|
|
96
|
+
}
|
|
97
|
+
parts.push({ t: "param", name });
|
|
98
|
+
sawParam = true;
|
|
99
|
+
i += name.length;
|
|
100
|
+
}
|
|
101
|
+
if (!sawParam)
|
|
102
|
+
return undefined;
|
|
103
|
+
if (literal !== "")
|
|
104
|
+
parts.push({ t: "lit", v: literal });
|
|
105
|
+
return parts;
|
|
106
|
+
}
|
|
107
|
+
/** The regex source matching one segment's worth of a mixed pattern, with a capture per parameter. */
|
|
108
|
+
export function mixedSegmentSource(parts) {
|
|
109
|
+
let source = "";
|
|
110
|
+
for (const part of parts) {
|
|
111
|
+
// LAZY (`+?`), not greedy. A greedy capture swallows the trailing literal, so `/:key.txt` against
|
|
112
|
+
// `/abc.txt` would capture `abc.txt` and then fail to match `\.txt`. With `^…$` anchoring, the
|
|
113
|
+
// lazy form still yields `abc.txt` for `/abc.txt.txt` - the anchor forces the LAST `.txt` to be
|
|
114
|
+
// the literal. `+?` and not `*?`: an empty capture must not match (see the empty-segment rule).
|
|
115
|
+
source += part.t === "lit" ? escapeRegex(part.v) : "([^/]+?)";
|
|
116
|
+
}
|
|
117
|
+
return source;
|
|
118
|
+
}
|
|
33
119
|
/** Parse and validate Nifra's strict route grammar once. Trailing slashes remain significant. */
|
|
34
120
|
export function compileRoutePattern(pattern) {
|
|
35
121
|
if (pattern.length === 0 || pattern.charCodeAt(0) !== 47 /* / */) {
|
|
@@ -40,11 +126,18 @@ export function compileRoutePattern(pattern) {
|
|
|
40
126
|
const paramNames = [];
|
|
41
127
|
for (let i = 0; i < raw.length; i++) {
|
|
42
128
|
const value = raw[i];
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
129
|
+
// A leading `:` whose name run spans the WHOLE segment is a plain parameter - the untouched fast
|
|
130
|
+
// path. When it does not (`:key.txt`), the segment is mixed and is handled below; but a leading
|
|
131
|
+
// `:` that yields no usable name at all (`:9lives`, `:`) was clearly meant as a parameter, so it
|
|
132
|
+
// still fails here rather than being silently reinterpreted as literal text.
|
|
133
|
+
if (value.charCodeAt(0) === 58 /* : */ && !validParamName(value.slice(1))) {
|
|
134
|
+
if (splitMixed(value) === undefined) {
|
|
135
|
+
const name = value.slice(1);
|
|
136
|
+
throw new RouteConfigError("INVALID_PARAM_NAME", `invalid parameter ":${name}" in "${pattern}"${paramNameHint(name)}`);
|
|
47
137
|
}
|
|
138
|
+
}
|
|
139
|
+
else if (value.charCodeAt(0) === 58 /* : */) {
|
|
140
|
+
const name = value.slice(1);
|
|
48
141
|
if (paramNames.includes(name)) {
|
|
49
142
|
throw new RouteConfigError("DUPLICATE_PARAM", `duplicate parameter ":${name}" in "${pattern}"`);
|
|
50
143
|
}
|
|
@@ -67,6 +160,27 @@ export function compileRoutePattern(pattern) {
|
|
|
67
160
|
segments.push(Object.freeze({ kind: "wildcard", name }));
|
|
68
161
|
continue;
|
|
69
162
|
}
|
|
163
|
+
// A segment holding a `:` anywhere other than the front is part literal, part parameter. Checked
|
|
164
|
+
// last so the wholly-static and wholly-param fast paths above are untouched.
|
|
165
|
+
const mixed = value.includes(":") ? splitMixed(value) : undefined;
|
|
166
|
+
if (mixed !== undefined) {
|
|
167
|
+
for (const part of mixed) {
|
|
168
|
+
if (part.t !== "param")
|
|
169
|
+
continue;
|
|
170
|
+
if (!validParamName(part.name)) {
|
|
171
|
+
throw new RouteConfigError("INVALID_PARAM_NAME", `invalid parameter ":${part.name}" in "${pattern}"${paramNameHint(part.name)}`);
|
|
172
|
+
}
|
|
173
|
+
// Duplicates must be rejected WITHIN a segment (`/:a.:a`) as well as across segments,
|
|
174
|
+
// or two captures would race for one params key.
|
|
175
|
+
if (paramNames.includes(part.name)) {
|
|
176
|
+
throw new RouteConfigError("DUPLICATE_PARAM", `duplicate parameter ":${part.name}" in "${pattern}"`);
|
|
177
|
+
}
|
|
178
|
+
// Pushed left-to-right so `paramNames` stays aligned with regex capture order.
|
|
179
|
+
paramNames.push(part.name);
|
|
180
|
+
}
|
|
181
|
+
segments.push(Object.freeze({ kind: "mixed", parts: Object.freeze(mixed) }));
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
70
184
|
segments.push(Object.freeze({ kind: "static", value }));
|
|
71
185
|
}
|
|
72
186
|
const compiled = Object.freeze({
|
|
@@ -77,7 +191,44 @@ export function compileRoutePattern(pattern) {
|
|
|
77
191
|
});
|
|
78
192
|
return compiled;
|
|
79
193
|
}
|
|
80
|
-
/**
|
|
194
|
+
/** Weight for {@link compareRoutePatternSpecificity}. A mixed segment constrains more than a bare
|
|
195
|
+
* param (it pins literal text) and less than a fully static one, so it sits between them. */
|
|
196
|
+
const SPECIFICITY = {
|
|
197
|
+
static: 4,
|
|
198
|
+
mixed: 3,
|
|
199
|
+
param: 2,
|
|
200
|
+
wildcard: 1,
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Total ordering for mixed segment shapes, shared by the trie and regex-based routers.
|
|
204
|
+
*
|
|
205
|
+
* Code-unit comparison, never `localeCompare`: this exists so the server and the browser agree on which
|
|
206
|
+
* of two equally-weighted patterns wins, and `localeCompare` answers by the RUNTIME's locale - a server
|
|
207
|
+
* and a visitor in different locales would order the same pair differently, which is the divergence
|
|
208
|
+
* being prevented.
|
|
209
|
+
*/
|
|
210
|
+
export function compareMixedPartsSpecificity(left, right) {
|
|
211
|
+
const literalWeight = (parts) => parts.reduce((sum, part) => (part.t === "lit" ? sum + part.v.length : sum), 0);
|
|
212
|
+
const order = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
213
|
+
const weightDifference = literalWeight(right) - literalWeight(left);
|
|
214
|
+
if (weightDifference !== 0)
|
|
215
|
+
return weightDifference;
|
|
216
|
+
const length = Math.max(left.length, right.length);
|
|
217
|
+
for (let i = 0; i < length; i++) {
|
|
218
|
+
const a = left[i];
|
|
219
|
+
const b = right[i];
|
|
220
|
+
if (a === undefined || b === undefined)
|
|
221
|
+
return b === undefined ? -1 : 1;
|
|
222
|
+
if (a.t !== b.t)
|
|
223
|
+
return a.t === "lit" ? -1 : 1;
|
|
224
|
+
if (a.t === "lit" && b.t === "lit" && a.v !== b.v) {
|
|
225
|
+
return a.v.length === b.v.length ? order(a.v, b.v) : b.v.length - a.v.length;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return order(mixedSegmentSource(left), mixedSegmentSource(right));
|
|
229
|
+
}
|
|
230
|
+
/** Core precedence: static > mixed > param > wildcard at the first differing segment, independent of
|
|
231
|
+
* registration order. */
|
|
81
232
|
export function compareRoutePatternSpecificity(left, right) {
|
|
82
233
|
const length = Math.max(left.segments.length, right.segments.length);
|
|
83
234
|
for (let i = 0; i < length; i++) {
|
|
@@ -85,10 +236,15 @@ export function compareRoutePatternSpecificity(left, right) {
|
|
|
85
236
|
const b = right.segments[i];
|
|
86
237
|
if (a === undefined || b === undefined)
|
|
87
238
|
return b === undefined ? -1 : 1;
|
|
88
|
-
const aWeight = a.kind
|
|
89
|
-
const bWeight = b.kind
|
|
239
|
+
const aWeight = SPECIFICITY[a.kind];
|
|
240
|
+
const bWeight = SPECIFICITY[b.kind];
|
|
90
241
|
if (aWeight !== bWeight)
|
|
91
242
|
return bWeight - aWeight;
|
|
243
|
+
if (a.kind === "mixed" && b.kind === "mixed") {
|
|
244
|
+
const mixed = compareMixedPartsSpecificity(a.parts, b.parts);
|
|
245
|
+
if (mixed !== 0)
|
|
246
|
+
return mixed;
|
|
247
|
+
}
|
|
92
248
|
}
|
|
93
249
|
return 0;
|
|
94
250
|
}
|
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,oBAAoB,EAK1B,MAAM,cAAc,CAAA;AAErB,uCAAuC;AACvC,eAAO,MAAM,OAAO,uEAAwE,CAAA;AAE5F,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AAS7C,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;AA0NhG;;;;;;;;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;;;;OAIG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,oBAAoB,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAqF7E;;;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,5 +1,5 @@
|
|
|
1
1
|
import { RouteConfigError } from "../errors.js";
|
|
2
|
-
import { compileRoutePattern } from "./pattern.js";
|
|
2
|
+
import { compareMixedPartsSpecificity, compileRoutePattern, mixedSegmentSource, } from "./pattern.js";
|
|
3
3
|
/** HTTP methods the router accepts. */
|
|
4
4
|
export const METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"];
|
|
5
5
|
const METHOD_SET = new Set(METHODS);
|
|
@@ -26,6 +26,7 @@ function createNode() {
|
|
|
26
26
|
return {
|
|
27
27
|
staticChildren: new Map(),
|
|
28
28
|
paramChild: undefined,
|
|
29
|
+
mixedChildren: undefined,
|
|
29
30
|
wildcardChild: undefined,
|
|
30
31
|
terminal: undefined,
|
|
31
32
|
};
|
|
@@ -66,6 +67,33 @@ function matchNode(node, path, start, len, paramValues) {
|
|
|
66
67
|
return found;
|
|
67
68
|
}
|
|
68
69
|
}
|
|
70
|
+
// Mixed sits between static and param: it pins literal text, so it is more specific than a bare
|
|
71
|
+
// `:param`, and less than an exact segment. Guarded on `undefined` so a mixed-free route table
|
|
72
|
+
// never enters this branch.
|
|
73
|
+
const mixedChildren = node.mixedChildren;
|
|
74
|
+
if (mixedChildren !== undefined && seg.length > 0) {
|
|
75
|
+
for (const child of mixedChildren) {
|
|
76
|
+
const matched = child.regex.exec(seg);
|
|
77
|
+
if (matched === null)
|
|
78
|
+
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
|
+
if (isLast) {
|
|
83
|
+
if (child.node.terminal !== undefined)
|
|
84
|
+
return child.node.terminal;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const found = matchNode(child.node, path, end + 1, len, paramValues);
|
|
88
|
+
if (found !== undefined)
|
|
89
|
+
return found;
|
|
90
|
+
}
|
|
91
|
+
// Backtrack: a mixed segment pushed `arity` values, not one, so unwind exactly that many or
|
|
92
|
+
// every later param reads a value belonging to an abandoned branch.
|
|
93
|
+
for (let i = 0; i < child.arity; i++)
|
|
94
|
+
paramValues.pop();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
69
97
|
const paramChild = node.paramChild;
|
|
70
98
|
// An empty segment (`/users//posts`) never matches a `:param` — matching would hand the handler
|
|
71
99
|
// `id: ""` and downstream code a `WHERE id = ''` class of bug. Peers (Hono, Elysia, Next) 404
|
|
@@ -183,6 +211,26 @@ export class Router {
|
|
|
183
211
|
node.wildcardChild ??= createNode();
|
|
184
212
|
node = node.wildcardChild;
|
|
185
213
|
}
|
|
214
|
+
else if (segment.kind === "mixed") {
|
|
215
|
+
const source = mixedSegmentSource(segment.parts);
|
|
216
|
+
node.mixedChildren ??= [];
|
|
217
|
+
let child = node.mixedChildren.find((entry) => entry.source === source);
|
|
218
|
+
if (child === undefined) {
|
|
219
|
+
child = {
|
|
220
|
+
regex: new RegExp(`^${source}$`),
|
|
221
|
+
arity: segment.parts.reduce((n, part) => (part.t === "param" ? n + 1 : n), 0),
|
|
222
|
+
parts: segment.parts,
|
|
223
|
+
node: createNode(),
|
|
224
|
+
source,
|
|
225
|
+
};
|
|
226
|
+
node.mixedChildren.push(child);
|
|
227
|
+
// Most literal text first. Registration order must not decide which of `/:id.txt` and
|
|
228
|
+
// `/:id.json` wins, and re-sorting on insert (a boot-time cost) keeps the match path a
|
|
229
|
+
// straight scan.
|
|
230
|
+
node.mixedChildren.sort((a, b) => compareMixedPartsSpecificity(a.parts, b.parts));
|
|
231
|
+
}
|
|
232
|
+
node = child.node;
|
|
233
|
+
}
|
|
186
234
|
else {
|
|
187
235
|
let child = node.staticChildren.get(segment.value);
|
|
188
236
|
if (child === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ export interface TransportCodec {
|
|
|
13
13
|
decode(text: string): unknown;
|
|
14
14
|
}
|
|
15
15
|
export declare class TransportCodecError extends TypeError {
|
|
16
|
-
constructor(message: string);
|
|
16
|
+
constructor(message: string, options?: ErrorOptions);
|
|
17
17
|
}
|
|
18
18
|
export declare const plainJsonCodec: TransportCodec;
|
|
19
19
|
export interface TransportCodecRegistry {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport-codec.d.ts","sourceRoot":"","sources":["../src/transport-codec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;IAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAC9B;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBACpC,OAAO,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"transport-codec.d.ts","sourceRoot":"","sources":["../src/transport-codec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;IAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAC9B;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAsCD,eAAO,MAAM,cAAc,EAAE,cAY3B,CAAA;AAEF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAAA;IAC1D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAAA;IAChD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAAA;CACxD;AAUD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,QAAQ,GAAE,cAA+B,GACxC,sBAAsB,CA0ExB;AAED,eAAO,MAAM,sBAAsB,EAAE,sBAEnC,CAAA;AAEF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,cAA+B,EACtC,IAAI,GAAE,YAAiB,GACtB,QAAQ,CAKV;AA8CD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,GAAE,sBAA+C,EACzD,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,OAAO,CAAC,CAQlB;AAQD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,cAA+B,GACrC,MAAM,CAER;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,sBAA+C,EACzD,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAsBT"}
|
package/dist/transport-codec.js
CHANGED
|
@@ -5,11 +5,31 @@
|
|
|
5
5
|
const DEFAULT_MAX_BYTES = 16 * 1024 * 1024;
|
|
6
6
|
const TOKEN = /^[a-z][a-z0-9_.-]{0,63}$/;
|
|
7
7
|
export class TransportCodecError extends TypeError {
|
|
8
|
-
constructor(message) {
|
|
9
|
-
super(message);
|
|
8
|
+
constructor(message, options) {
|
|
9
|
+
super(message, options);
|
|
10
10
|
this.name = "TransportCodecError";
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Run a decode step and normalize whatever it throws into {@link TransportCodecError}.
|
|
15
|
+
*
|
|
16
|
+
* Decoding is the one place this module touches attacker-controlled bytes, and the primitives it
|
|
17
|
+
* delegates to raise their own native types — `JSON.parse` throws `SyntaxError`, a BYO codec throws
|
|
18
|
+
* whatever it likes. Every other failure here is a `TransportCodecError`, so letting those escape
|
|
19
|
+
* would mean a malformed payload — the single most likely hostile input — is the one case that slips
|
|
20
|
+
* past a caller catching the documented error type. The original is kept as `cause`, so the parse
|
|
21
|
+
* failure stays diagnosable; a codec already speaking the contract is re-thrown untouched.
|
|
22
|
+
*/
|
|
23
|
+
function decodeOrThrow(decode, message) {
|
|
24
|
+
try {
|
|
25
|
+
return decode();
|
|
26
|
+
}
|
|
27
|
+
catch (cause) {
|
|
28
|
+
if (cause instanceof TransportCodecError)
|
|
29
|
+
throw cause;
|
|
30
|
+
throw new TransportCodecError(message, { cause });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
13
33
|
function maxBytesOf(options) {
|
|
14
34
|
const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
15
35
|
if (!Number.isSafeInteger(maxBytes) || maxBytes < 0)
|
|
@@ -164,19 +184,21 @@ async function readBoundedText(response, options) {
|
|
|
164
184
|
bytes.set(chunk, offset);
|
|
165
185
|
offset += chunk.byteLength;
|
|
166
186
|
}
|
|
167
|
-
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
187
|
+
return decodeOrThrow(() => new TextDecoder("utf-8", { fatal: true }).decode(bytes), "transport payload is not valid UTF-8");
|
|
168
188
|
}
|
|
169
189
|
export async function decodeTransportResponse(response, registry = defaultTransportCodecs, options = {}) {
|
|
170
190
|
const codec = registry.forContentType(response.headers.get("content-type"));
|
|
171
191
|
const text = await readBoundedText(response, options);
|
|
172
|
-
|
|
192
|
+
if (text === "")
|
|
193
|
+
return undefined;
|
|
194
|
+
return decodeOrThrow(() => codec.decode(text), `malformed transport body for codec ${codec.id}@${codec.version}`);
|
|
173
195
|
}
|
|
174
196
|
export function encodeTransportFrame(value, codec = plainJsonCodec) {
|
|
175
197
|
return JSON.stringify({ codec: codec.id, version: codec.version, payload: codec.encode(value) });
|
|
176
198
|
}
|
|
177
199
|
export function decodeTransportFrame(frame, registry = defaultTransportCodecs, options = {}) {
|
|
178
200
|
assertBounded(frame, options);
|
|
179
|
-
const envelope = JSON.parse(frame);
|
|
201
|
+
const envelope = decodeOrThrow(() => JSON.parse(frame), "malformed transport frame");
|
|
180
202
|
if (envelope === null ||
|
|
181
203
|
typeof envelope !== "object" ||
|
|
182
204
|
typeof envelope.codec !== "string" ||
|
|
@@ -184,7 +206,9 @@ export function decodeTransportFrame(frame, registry = defaultTransportCodecs, o
|
|
|
184
206
|
typeof envelope.payload !== "string") {
|
|
185
207
|
throw new TransportCodecError("malformed transport frame");
|
|
186
208
|
}
|
|
187
|
-
|
|
188
|
-
|
|
209
|
+
const payload = envelope.payload;
|
|
210
|
+
assertBounded(payload, options);
|
|
211
|
+
const codec = registry.byIdentity(envelope.codec, envelope.version);
|
|
212
|
+
return decodeOrThrow(() => codec.decode(payload), `malformed transport frame payload for codec ${codec.id}@${codec.version}`);
|
|
189
213
|
}
|
|
190
214
|
//# sourceMappingURL=transport-codec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport-codec.js","sourceRoot":"","sources":["../src/transport-codec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA;AAC1C,MAAM,KAAK,GAAG,0BAA0B,CAAA;AAcxC,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IAChD,YAAY,OAAe;
|
|
1
|
+
{"version":3,"file":"transport-codec.js","sourceRoot":"","sources":["../src/transport-codec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and
|
|
11
11
|
* `check:publish` asserts it equals `@nifrajs/core`'s package version.
|
|
12
12
|
*/
|
|
13
|
-
export const VERSION = "2.
|
|
13
|
+
export const VERSION = "2.2.0" as const
|
|
14
14
|
|
|
15
15
|
export type Version = typeof VERSION
|
|
16
16
|
|
package/src/router/pattern.ts
CHANGED
|
@@ -8,6 +8,13 @@ export type RoutePatternSegment =
|
|
|
8
8
|
| { readonly kind: "static"; readonly value: string }
|
|
9
9
|
| { readonly kind: "param"; readonly name: string }
|
|
10
10
|
| { readonly kind: "wildcard"; readonly name: string }
|
|
11
|
+
/** A segment that is part literal, part parameter: `:key.txt`, `feed.:format`, `v:major.:minor`. */
|
|
12
|
+
| { readonly kind: "mixed"; readonly parts: readonly MixedPart[] }
|
|
13
|
+
|
|
14
|
+
/** One piece of a {@link RoutePatternSegment} of kind `mixed`, in left-to-right order. */
|
|
15
|
+
export type MixedPart =
|
|
16
|
+
| { readonly t: "lit"; readonly v: string }
|
|
17
|
+
| { readonly t: "param"; readonly name: string }
|
|
11
18
|
|
|
12
19
|
/**
|
|
13
20
|
* Compiled route grammar shared by runtime routers, browser navigation, mocks, and adapters.
|
|
@@ -45,7 +52,9 @@ function regexOf(compiled: CompiledRoutePattern): RegExp {
|
|
|
45
52
|
? escapeRegex(segment.value)
|
|
46
53
|
: segment.kind === "param"
|
|
47
54
|
? "([^/]+)"
|
|
48
|
-
: "
|
|
55
|
+
: segment.kind === "mixed"
|
|
56
|
+
? mixedSegmentSource(segment.parts)
|
|
57
|
+
: "(.+)",
|
|
49
58
|
)
|
|
50
59
|
regex = new RegExp(parts.length === 0 ? "^/$" : `^/${parts.join("/")}$`)
|
|
51
60
|
REGEX_CACHE.set(compiled, regex)
|
|
@@ -57,10 +66,93 @@ function validParamName(name: string): boolean {
|
|
|
57
66
|
return PARAM_NAME.test(name) && !RESERVED_PARAM_NAMES.has(name)
|
|
58
67
|
}
|
|
59
68
|
|
|
69
|
+
/**
|
|
70
|
+
* Explain WHY a parameter name was rejected, in the terms the author was thinking in.
|
|
71
|
+
*
|
|
72
|
+
* The grammar is per-segment: a segment is wholly static or wholly a parameter, so everything after
|
|
73
|
+
* the colon is the name. `/v/:id.json` therefore asks for a parameter literally named `id.json`,
|
|
74
|
+
* which is not what anyone means by it — but the bare "invalid parameter" that produces reads as a
|
|
75
|
+
* typo rather than as a rule, leaving the author to guess whether the dot, the length, or the casing
|
|
76
|
+
* was the problem. Naming the actual limitation and showing the two ways out is the difference
|
|
77
|
+
* between a five-second fix and a trip to the source.
|
|
78
|
+
*/
|
|
79
|
+
function paramNameHint(name: string): string {
|
|
80
|
+
if (RESERVED_PARAM_NAMES.has(name)) return ` — "${name}" is reserved (prototype key)`
|
|
81
|
+
if (name.length === 0) return ` — ":" needs a name after it`
|
|
82
|
+
// No "a segment is wholly static or wholly a parameter" case here any more: mixed segments made
|
|
83
|
+
// that message obsolete. `:id.json` was the shape it explained, and `:id.json` now compiles.
|
|
84
|
+
return ` — a name must match ${PARAM_NAME.source}`
|
|
85
|
+
}
|
|
86
|
+
|
|
60
87
|
function escapeRegex(value: string): string {
|
|
61
88
|
return value.replace(/[.*+?^()|[\]\\{}$]/g, "\\$&")
|
|
62
89
|
}
|
|
63
90
|
|
|
91
|
+
/**
|
|
92
|
+
* Split a segment containing `:` into literal and parameter parts.
|
|
93
|
+
*
|
|
94
|
+
* The param name is the LONGEST run matching {@link PARAM_NAME}'s body after each `:`; everything
|
|
95
|
+
* else in the segment is literal. So `:key.txt` is `[param key][lit ".txt"]`. Choosing a greedy scan
|
|
96
|
+
* on the existing sigil rather than a new `{key}.txt` syntax is a safety argument, not a taste one:
|
|
97
|
+
* every segment this newly accepts currently THROWS `INVALID_PARAM_NAME`, so no pattern that compiles
|
|
98
|
+
* today can change meaning.
|
|
99
|
+
*
|
|
100
|
+
* Returns `undefined` when the segment holds no parameter at all, so a literal colon
|
|
101
|
+
* (`/v1/things:batchGet` - legal in a URL path) stays a plain static segment.
|
|
102
|
+
*/
|
|
103
|
+
function splitMixed(value: string): MixedPart[] | undefined {
|
|
104
|
+
const parts: MixedPart[] = []
|
|
105
|
+
let literal = ""
|
|
106
|
+
let sawParam = false
|
|
107
|
+
for (let i = 0; i < value.length; i++) {
|
|
108
|
+
if (value[i] !== ":") {
|
|
109
|
+
literal += value[i]
|
|
110
|
+
continue
|
|
111
|
+
}
|
|
112
|
+
const rest = value.slice(i + 1)
|
|
113
|
+
const name = /^[A-Za-z_][A-Za-z0-9_]*/.exec(rest)?.[0]
|
|
114
|
+
// A `:` not followed by a valid name start is literal text, not a malformed parameter.
|
|
115
|
+
if (name === undefined) {
|
|
116
|
+
literal += ":"
|
|
117
|
+
continue
|
|
118
|
+
}
|
|
119
|
+
const paramEnd = i + 1 + name.length
|
|
120
|
+
const previous = i > 0 ? value[i - 1] : undefined
|
|
121
|
+
const precededByBoundary = previous === undefined || !/[A-Za-z0-9_]/.test(previous)
|
|
122
|
+
// Preserve established RPC-style literals such as `things:batchGet`. A colon embedded after an
|
|
123
|
+
// identifier and running to the end is literal; mixed params remain unambiguous at segment start,
|
|
124
|
+
// after punctuation (`post-:id`), or when followed by a literal suffix (`v:major.json`).
|
|
125
|
+
if (!precededByBoundary && paramEnd === value.length) {
|
|
126
|
+
literal += `:${name}`
|
|
127
|
+
i += name.length
|
|
128
|
+
continue
|
|
129
|
+
}
|
|
130
|
+
if (literal !== "") {
|
|
131
|
+
parts.push({ t: "lit", v: literal })
|
|
132
|
+
literal = ""
|
|
133
|
+
}
|
|
134
|
+
parts.push({ t: "param", name })
|
|
135
|
+
sawParam = true
|
|
136
|
+
i += name.length
|
|
137
|
+
}
|
|
138
|
+
if (!sawParam) return undefined
|
|
139
|
+
if (literal !== "") parts.push({ t: "lit", v: literal })
|
|
140
|
+
return parts
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** The regex source matching one segment's worth of a mixed pattern, with a capture per parameter. */
|
|
144
|
+
export function mixedSegmentSource(parts: readonly MixedPart[]): string {
|
|
145
|
+
let source = ""
|
|
146
|
+
for (const part of parts) {
|
|
147
|
+
// LAZY (`+?`), not greedy. A greedy capture swallows the trailing literal, so `/:key.txt` against
|
|
148
|
+
// `/abc.txt` would capture `abc.txt` and then fail to match `\.txt`. With `^…$` anchoring, the
|
|
149
|
+
// lazy form still yields `abc.txt` for `/abc.txt.txt` - the anchor forces the LAST `.txt` to be
|
|
150
|
+
// the literal. `+?` and not `*?`: an empty capture must not match (see the empty-segment rule).
|
|
151
|
+
source += part.t === "lit" ? escapeRegex(part.v) : "([^/]+?)"
|
|
152
|
+
}
|
|
153
|
+
return source
|
|
154
|
+
}
|
|
155
|
+
|
|
64
156
|
/** Parse and validate Nifra's strict route grammar once. Trailing slashes remain significant. */
|
|
65
157
|
export function compileRoutePattern(pattern: string): CompiledRoutePattern {
|
|
66
158
|
if (pattern.length === 0 || pattern.charCodeAt(0) !== 47 /* / */) {
|
|
@@ -71,14 +163,20 @@ export function compileRoutePattern(pattern: string): CompiledRoutePattern {
|
|
|
71
163
|
const paramNames: string[] = []
|
|
72
164
|
for (let i = 0; i < raw.length; i++) {
|
|
73
165
|
const value = raw[i]!
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
166
|
+
// A leading `:` whose name run spans the WHOLE segment is a plain parameter - the untouched fast
|
|
167
|
+
// path. When it does not (`:key.txt`), the segment is mixed and is handled below; but a leading
|
|
168
|
+
// `:` that yields no usable name at all (`:9lives`, `:`) was clearly meant as a parameter, so it
|
|
169
|
+
// still fails here rather than being silently reinterpreted as literal text.
|
|
170
|
+
if (value.charCodeAt(0) === 58 /* : */ && !validParamName(value.slice(1))) {
|
|
171
|
+
if (splitMixed(value) === undefined) {
|
|
172
|
+
const name = value.slice(1)
|
|
77
173
|
throw new RouteConfigError(
|
|
78
174
|
"INVALID_PARAM_NAME",
|
|
79
|
-
`invalid parameter ":${name}" in "${pattern}"`,
|
|
175
|
+
`invalid parameter ":${name}" in "${pattern}"${paramNameHint(name)}`,
|
|
80
176
|
)
|
|
81
177
|
}
|
|
178
|
+
} else if (value.charCodeAt(0) === 58 /* : */) {
|
|
179
|
+
const name = value.slice(1)
|
|
82
180
|
if (paramNames.includes(name)) {
|
|
83
181
|
throw new RouteConfigError(
|
|
84
182
|
"DUPLICATE_PARAM",
|
|
@@ -113,6 +211,32 @@ export function compileRoutePattern(pattern: string): CompiledRoutePattern {
|
|
|
113
211
|
segments.push(Object.freeze({ kind: "wildcard", name }))
|
|
114
212
|
continue
|
|
115
213
|
}
|
|
214
|
+
// A segment holding a `:` anywhere other than the front is part literal, part parameter. Checked
|
|
215
|
+
// last so the wholly-static and wholly-param fast paths above are untouched.
|
|
216
|
+
const mixed = value.includes(":") ? splitMixed(value) : undefined
|
|
217
|
+
if (mixed !== undefined) {
|
|
218
|
+
for (const part of mixed) {
|
|
219
|
+
if (part.t !== "param") continue
|
|
220
|
+
if (!validParamName(part.name)) {
|
|
221
|
+
throw new RouteConfigError(
|
|
222
|
+
"INVALID_PARAM_NAME",
|
|
223
|
+
`invalid parameter ":${part.name}" in "${pattern}"${paramNameHint(part.name)}`,
|
|
224
|
+
)
|
|
225
|
+
}
|
|
226
|
+
// Duplicates must be rejected WITHIN a segment (`/:a.:a`) as well as across segments,
|
|
227
|
+
// or two captures would race for one params key.
|
|
228
|
+
if (paramNames.includes(part.name)) {
|
|
229
|
+
throw new RouteConfigError(
|
|
230
|
+
"DUPLICATE_PARAM",
|
|
231
|
+
`duplicate parameter ":${part.name}" in "${pattern}"`,
|
|
232
|
+
)
|
|
233
|
+
}
|
|
234
|
+
// Pushed left-to-right so `paramNames` stays aligned with regex capture order.
|
|
235
|
+
paramNames.push(part.name)
|
|
236
|
+
}
|
|
237
|
+
segments.push(Object.freeze({ kind: "mixed", parts: Object.freeze(mixed) }))
|
|
238
|
+
continue
|
|
239
|
+
}
|
|
116
240
|
segments.push(Object.freeze({ kind: "static", value }))
|
|
117
241
|
}
|
|
118
242
|
const compiled = Object.freeze({
|
|
@@ -124,7 +248,50 @@ export function compileRoutePattern(pattern: string): CompiledRoutePattern {
|
|
|
124
248
|
return compiled
|
|
125
249
|
}
|
|
126
250
|
|
|
127
|
-
/**
|
|
251
|
+
/** Weight for {@link compareRoutePatternSpecificity}. A mixed segment constrains more than a bare
|
|
252
|
+
* param (it pins literal text) and less than a fully static one, so it sits between them. */
|
|
253
|
+
const SPECIFICITY: Readonly<Record<RoutePatternSegment["kind"], number>> = {
|
|
254
|
+
static: 4,
|
|
255
|
+
mixed: 3,
|
|
256
|
+
param: 2,
|
|
257
|
+
wildcard: 1,
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Total ordering for mixed segment shapes, shared by the trie and regex-based routers.
|
|
262
|
+
*
|
|
263
|
+
* Code-unit comparison, never `localeCompare`: this exists so the server and the browser agree on which
|
|
264
|
+
* of two equally-weighted patterns wins, and `localeCompare` answers by the RUNTIME's locale - a server
|
|
265
|
+
* and a visitor in different locales would order the same pair differently, which is the divergence
|
|
266
|
+
* being prevented.
|
|
267
|
+
*/
|
|
268
|
+
export function compareMixedPartsSpecificity(
|
|
269
|
+
left: readonly MixedPart[],
|
|
270
|
+
right: readonly MixedPart[],
|
|
271
|
+
): number {
|
|
272
|
+
const literalWeight = (parts: readonly MixedPart[]): number =>
|
|
273
|
+
parts.reduce((sum, part) => (part.t === "lit" ? sum + part.v.length : sum), 0)
|
|
274
|
+
const order = (a: string, b: string): number => (a < b ? -1 : a > b ? 1 : 0)
|
|
275
|
+
|
|
276
|
+
const weightDifference = literalWeight(right) - literalWeight(left)
|
|
277
|
+
if (weightDifference !== 0) return weightDifference
|
|
278
|
+
|
|
279
|
+
const length = Math.max(left.length, right.length)
|
|
280
|
+
for (let i = 0; i < length; i++) {
|
|
281
|
+
const a = left[i]
|
|
282
|
+
const b = right[i]
|
|
283
|
+
if (a === undefined || b === undefined) return b === undefined ? -1 : 1
|
|
284
|
+
if (a.t !== b.t) return a.t === "lit" ? -1 : 1
|
|
285
|
+
if (a.t === "lit" && b.t === "lit" && a.v !== b.v) {
|
|
286
|
+
return a.v.length === b.v.length ? order(a.v, b.v) : b.v.length - a.v.length
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return order(mixedSegmentSource(left), mixedSegmentSource(right))
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** Core precedence: static > mixed > param > wildcard at the first differing segment, independent of
|
|
294
|
+
* registration order. */
|
|
128
295
|
export function compareRoutePatternSpecificity(
|
|
129
296
|
left: CompiledRoutePattern,
|
|
130
297
|
right: CompiledRoutePattern,
|
|
@@ -134,9 +301,13 @@ export function compareRoutePatternSpecificity(
|
|
|
134
301
|
const a = left.segments[i]
|
|
135
302
|
const b = right.segments[i]
|
|
136
303
|
if (a === undefined || b === undefined) return b === undefined ? -1 : 1
|
|
137
|
-
const aWeight = a.kind
|
|
138
|
-
const bWeight = b.kind
|
|
304
|
+
const aWeight = SPECIFICITY[a.kind]
|
|
305
|
+
const bWeight = SPECIFICITY[b.kind]
|
|
139
306
|
if (aWeight !== bWeight) return bWeight - aWeight
|
|
307
|
+
if (a.kind === "mixed" && b.kind === "mixed") {
|
|
308
|
+
const mixed = compareMixedPartsSpecificity(a.parts, b.parts)
|
|
309
|
+
if (mixed !== 0) return mixed
|
|
310
|
+
}
|
|
140
311
|
}
|
|
141
312
|
return 0
|
|
142
313
|
}
|
package/src/router/router.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { RouteConfigError } from "../errors.ts"
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
type CompiledRoutePattern,
|
|
4
|
+
compareMixedPartsSpecificity,
|
|
5
|
+
compileRoutePattern,
|
|
6
|
+
type MixedPart,
|
|
7
|
+
mixedSegmentSource,
|
|
8
|
+
} from "./pattern.ts"
|
|
3
9
|
|
|
4
10
|
/** HTTP methods the router accepts. */
|
|
5
11
|
export const METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"] as const
|
|
@@ -68,16 +74,43 @@ interface RouteNode<T> {
|
|
|
68
74
|
readonly staticChildren: Map<string, RouteNode<T>>
|
|
69
75
|
/** Single `:param` child, if any. */
|
|
70
76
|
paramChild: RouteNode<T> | undefined
|
|
77
|
+
/**
|
|
78
|
+
* Part-literal-part-param children (`:key.txt`), ordered by specificity.
|
|
79
|
+
*
|
|
80
|
+
* Unlike `paramChild` there can legitimately be SEVERAL at one level - `/:id.txt` and `/:id.json`
|
|
81
|
+
* are different shapes, not a conflict - so this is a list rather than a slot, and it must be tried
|
|
82
|
+
* in specificity order rather than registration order.
|
|
83
|
+
*
|
|
84
|
+
* Left `undefined` unless a mixed route is registered, so an app that never uses one pays nothing:
|
|
85
|
+
* no allocation, and one `undefined` check on the match path.
|
|
86
|
+
*/
|
|
87
|
+
mixedChildren: MixedChild<T>[] | undefined
|
|
71
88
|
/** Catch-all `*` child, if any — always terminal. */
|
|
72
89
|
wildcardChild: RouteNode<T> | undefined
|
|
73
90
|
/** Set once this node terminates one or more routes. */
|
|
74
91
|
terminal: Terminal<T> | undefined
|
|
75
92
|
}
|
|
76
93
|
|
|
94
|
+
interface MixedChild<T> {
|
|
95
|
+
/** Anchored matcher for ONE segment, with a capture group per parameter. */
|
|
96
|
+
readonly regex: RegExp
|
|
97
|
+
/**
|
|
98
|
+
* How many values this segment pushes. A mixed segment pushes N, not one, so a failed branch must
|
|
99
|
+
* pop exactly N to keep `paramValues` aligned with `paramNames`.
|
|
100
|
+
*/
|
|
101
|
+
readonly arity: number
|
|
102
|
+
/** Parsed shape used by the same total specificity comparator as the browser router. */
|
|
103
|
+
readonly parts: readonly MixedPart[]
|
|
104
|
+
readonly node: RouteNode<T>
|
|
105
|
+
/** The pattern source, so re-registering the same shape reuses its node. */
|
|
106
|
+
readonly source: string
|
|
107
|
+
}
|
|
108
|
+
|
|
77
109
|
function createNode<T>(): RouteNode<T> {
|
|
78
110
|
return {
|
|
79
111
|
staticChildren: new Map(),
|
|
80
112
|
paramChild: undefined,
|
|
113
|
+
mixedChildren: undefined,
|
|
81
114
|
wildcardChild: undefined,
|
|
82
115
|
terminal: undefined,
|
|
83
116
|
}
|
|
@@ -123,6 +156,28 @@ function matchNode<T>(
|
|
|
123
156
|
}
|
|
124
157
|
}
|
|
125
158
|
|
|
159
|
+
// Mixed sits between static and param: it pins literal text, so it is more specific than a bare
|
|
160
|
+
// `:param`, and less than an exact segment. Guarded on `undefined` so a mixed-free route table
|
|
161
|
+
// never enters this branch.
|
|
162
|
+
const mixedChildren = node.mixedChildren
|
|
163
|
+
if (mixedChildren !== undefined && seg.length > 0) {
|
|
164
|
+
for (const child of mixedChildren) {
|
|
165
|
+
const matched = child.regex.exec(seg)
|
|
166
|
+
if (matched === null) continue
|
|
167
|
+
// Push left-to-right, matching the order `paramNames` was built in.
|
|
168
|
+
for (let i = 1; i <= child.arity; i++) paramValues.push(matched[i] as string)
|
|
169
|
+
if (isLast) {
|
|
170
|
+
if (child.node.terminal !== undefined) return child.node.terminal
|
|
171
|
+
} else {
|
|
172
|
+
const found = matchNode(child.node, path, end + 1, len, paramValues)
|
|
173
|
+
if (found !== undefined) return found
|
|
174
|
+
}
|
|
175
|
+
// Backtrack: a mixed segment pushed `arity` values, not one, so unwind exactly that many or
|
|
176
|
+
// every later param reads a value belonging to an abandoned branch.
|
|
177
|
+
for (let i = 0; i < child.arity; i++) paramValues.pop()
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
126
181
|
const paramChild = node.paramChild
|
|
127
182
|
// An empty segment (`/users//posts`) never matches a `:param` — matching would hand the handler
|
|
128
183
|
// `id: ""` and downstream code a `WHERE id = ''` class of bug. Peers (Hono, Elysia, Next) 404
|
|
@@ -250,6 +305,25 @@ export class Router<T> {
|
|
|
250
305
|
} else if (segment.kind === "wildcard") {
|
|
251
306
|
node.wildcardChild ??= createNode<T>()
|
|
252
307
|
node = node.wildcardChild
|
|
308
|
+
} else if (segment.kind === "mixed") {
|
|
309
|
+
const source = mixedSegmentSource(segment.parts)
|
|
310
|
+
node.mixedChildren ??= []
|
|
311
|
+
let child = node.mixedChildren.find((entry) => entry.source === source)
|
|
312
|
+
if (child === undefined) {
|
|
313
|
+
child = {
|
|
314
|
+
regex: new RegExp(`^${source}$`),
|
|
315
|
+
arity: segment.parts.reduce((n, part) => (part.t === "param" ? n + 1 : n), 0),
|
|
316
|
+
parts: segment.parts,
|
|
317
|
+
node: createNode<T>(),
|
|
318
|
+
source,
|
|
319
|
+
}
|
|
320
|
+
node.mixedChildren.push(child)
|
|
321
|
+
// Most literal text first. Registration order must not decide which of `/:id.txt` and
|
|
322
|
+
// `/:id.json` wins, and re-sorting on insert (a boot-time cost) keeps the match path a
|
|
323
|
+
// straight scan.
|
|
324
|
+
node.mixedChildren.sort((a, b) => compareMixedPartsSpecificity(a.parts, b.parts))
|
|
325
|
+
}
|
|
326
|
+
node = child.node
|
|
253
327
|
} else {
|
|
254
328
|
let child = node.staticChildren.get(segment.value)
|
|
255
329
|
if (child === undefined) {
|
package/src/transport-codec.ts
CHANGED
|
@@ -19,12 +19,31 @@ export interface TransportCodec {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export class TransportCodecError extends TypeError {
|
|
22
|
-
constructor(message: string) {
|
|
23
|
-
super(message)
|
|
22
|
+
constructor(message: string, options?: ErrorOptions) {
|
|
23
|
+
super(message, options)
|
|
24
24
|
this.name = "TransportCodecError"
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
/**
|
|
29
|
+
* Run a decode step and normalize whatever it throws into {@link TransportCodecError}.
|
|
30
|
+
*
|
|
31
|
+
* Decoding is the one place this module touches attacker-controlled bytes, and the primitives it
|
|
32
|
+
* delegates to raise their own native types — `JSON.parse` throws `SyntaxError`, a BYO codec throws
|
|
33
|
+
* whatever it likes. Every other failure here is a `TransportCodecError`, so letting those escape
|
|
34
|
+
* would mean a malformed payload — the single most likely hostile input — is the one case that slips
|
|
35
|
+
* past a caller catching the documented error type. The original is kept as `cause`, so the parse
|
|
36
|
+
* failure stays diagnosable; a codec already speaking the contract is re-thrown untouched.
|
|
37
|
+
*/
|
|
38
|
+
function decodeOrThrow<T>(decode: () => T, message: string): T {
|
|
39
|
+
try {
|
|
40
|
+
return decode()
|
|
41
|
+
} catch (cause) {
|
|
42
|
+
if (cause instanceof TransportCodecError) throw cause
|
|
43
|
+
throw new TransportCodecError(message, { cause })
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
28
47
|
function maxBytesOf(options: TransportDecodeOptions): number {
|
|
29
48
|
const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES
|
|
30
49
|
if (!Number.isSafeInteger(maxBytes) || maxBytes < 0)
|
|
@@ -203,7 +222,10 @@ async function readBoundedText(
|
|
|
203
222
|
bytes.set(chunk, offset)
|
|
204
223
|
offset += chunk.byteLength
|
|
205
224
|
}
|
|
206
|
-
return
|
|
225
|
+
return decodeOrThrow(
|
|
226
|
+
() => new TextDecoder("utf-8", { fatal: true }).decode(bytes),
|
|
227
|
+
"transport payload is not valid UTF-8",
|
|
228
|
+
)
|
|
207
229
|
}
|
|
208
230
|
|
|
209
231
|
export async function decodeTransportResponse(
|
|
@@ -213,7 +235,11 @@ export async function decodeTransportResponse(
|
|
|
213
235
|
): Promise<unknown> {
|
|
214
236
|
const codec = registry.forContentType(response.headers.get("content-type"))
|
|
215
237
|
const text = await readBoundedText(response, options)
|
|
216
|
-
|
|
238
|
+
if (text === "") return undefined
|
|
239
|
+
return decodeOrThrow(
|
|
240
|
+
() => codec.decode(text),
|
|
241
|
+
`malformed transport body for codec ${codec.id}@${codec.version}`,
|
|
242
|
+
)
|
|
217
243
|
}
|
|
218
244
|
|
|
219
245
|
interface TransportFrame {
|
|
@@ -235,7 +261,10 @@ export function decodeTransportFrame(
|
|
|
235
261
|
options: TransportDecodeOptions = {},
|
|
236
262
|
): unknown {
|
|
237
263
|
assertBounded(frame, options)
|
|
238
|
-
const envelope =
|
|
264
|
+
const envelope = decodeOrThrow(
|
|
265
|
+
() => JSON.parse(frame),
|
|
266
|
+
"malformed transport frame",
|
|
267
|
+
) as Partial<TransportFrame>
|
|
239
268
|
if (
|
|
240
269
|
envelope === null ||
|
|
241
270
|
typeof envelope !== "object" ||
|
|
@@ -245,6 +274,11 @@ export function decodeTransportFrame(
|
|
|
245
274
|
) {
|
|
246
275
|
throw new TransportCodecError("malformed transport frame")
|
|
247
276
|
}
|
|
248
|
-
|
|
249
|
-
|
|
277
|
+
const payload = envelope.payload
|
|
278
|
+
assertBounded(payload, options)
|
|
279
|
+
const codec = registry.byIdentity(envelope.codec, envelope.version as number)
|
|
280
|
+
return decodeOrThrow(
|
|
281
|
+
() => codec.decode(payload),
|
|
282
|
+
`malformed transport frame payload for codec ${codec.id}@${codec.version}`,
|
|
283
|
+
)
|
|
250
284
|
}
|