@nifrajs/core 5.0.0 → 5.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/CHANGELOG.md +2384 -0
- package/dist/assurance.d.ts +15 -1
- package/dist/assurance.d.ts.map +1 -1
- package/dist/assurance.js +97 -71
- package/dist/assurance.js.map +1 -1
- package/dist/capabilities.d.ts +2 -0
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +1 -1
- package/dist/capabilities.js.map +1 -1
- package/dist/edge-kit.d.ts +1 -1
- package/dist/edge-kit.d.ts.map +1 -1
- package/dist/edge-kit.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/hook-origins.d.ts +17 -1
- package/dist/internal/hook-origins.d.ts.map +1 -1
- package/dist/internal/hook-origins.js +20 -0
- package/dist/internal/hook-origins.js.map +1 -1
- package/dist/internal/route-compiler.d.ts +9 -0
- package/dist/internal/route-compiler.d.ts.map +1 -1
- package/dist/internal/route-compiler.js +95 -13
- package/dist/internal/route-compiler.js.map +1 -1
- package/dist/internal/route-program.d.ts +2 -0
- package/dist/internal/route-program.d.ts.map +1 -1
- package/dist/internal/route-program.js +22 -17
- package/dist/internal/route-program.js.map +1 -1
- package/dist/internal/same-origin.d.ts +11 -1
- package/dist/internal/same-origin.d.ts.map +1 -1
- package/dist/internal/same-origin.js +8 -0
- package/dist/internal/same-origin.js.map +1 -1
- package/dist/reflection.d.ts +23 -2
- package/dist/reflection.d.ts.map +1 -1
- package/dist/reflection.js +57 -1
- package/dist/reflection.js.map +1 -1
- package/dist/server/body-lane.d.ts +8 -2
- package/dist/server/body-lane.d.ts.map +1 -1
- package/dist/server/body-lane.js +27 -2
- package/dist/server/body-lane.js.map +1 -1
- package/dist/server/client-ip.js +6 -5
- package/dist/server/client-ip.js.map +1 -1
- package/dist/server/context.d.ts +7 -4
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/cookies.d.ts.map +1 -1
- package/dist/server/cookies.js +13 -1
- package/dist/server/cookies.js.map +1 -1
- package/dist/server/core-copies.d.ts +7 -1
- package/dist/server/core-copies.d.ts.map +1 -1
- package/dist/server/core-copies.js +37 -1
- package/dist/server/core-copies.js.map +1 -1
- package/dist/server/edge.d.ts.map +1 -1
- package/dist/server/edge.js +2 -1
- package/dist/server/edge.js.map +1 -1
- package/dist/server/headers.d.ts +9 -0
- package/dist/server/headers.d.ts.map +1 -1
- package/dist/server/headers.js +26 -0
- package/dist/server/headers.js.map +1 -1
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +5 -1
- package/dist/server/http.js.map +1 -1
- package/dist/server/response-contract-lane.d.ts +57 -7
- package/dist/server/response-contract-lane.d.ts.map +1 -1
- package/dist/server/response-contract-lane.js +394 -23
- package/dist/server/response-contract-lane.js.map +1 -1
- package/dist/server/server-types.d.ts +23 -9
- package/dist/server/server-types.d.ts.map +1 -1
- package/dist/server/server.d.ts +40 -5
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +188 -43
- package/dist/server/server.js.map +1 -1
- package/dist/server/websocket.d.ts +11 -0
- package/dist/server/websocket.d.ts.map +1 -1
- package/dist/server/websocket.js +26 -12
- package/dist/server/websocket.js.map +1 -1
- package/dist/server/ws-bun.d.ts +7 -1
- package/dist/server/ws-bun.d.ts.map +1 -1
- package/dist/server/ws-bun.js +42 -2
- package/dist/server/ws-bun.js.map +1 -1
- package/dist/server/ws-hook.d.ts +9 -3
- package/dist/server/ws-hook.d.ts.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/single-copy.d.ts.map +1 -1
- package/dist/single-copy.js +81 -10
- package/dist/single-copy.js.map +1 -1
- package/dist/wire.d.ts +5 -0
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +5 -0
- package/dist/wire.js.map +1 -1
- package/dist/ws.d.ts.map +1 -1
- package/dist/ws.js +2 -1
- package/dist/ws.js.map +1 -1
- package/package.json +3 -2
- package/src/assurance.ts +120 -81
- package/src/capabilities.ts +3 -1
- package/src/edge-kit.ts +1 -1
- package/src/index.ts +2 -2
- package/src/internal/hook-origins.ts +35 -0
- package/src/internal/route-compiler.ts +107 -16
- package/src/internal/route-program.ts +39 -20
- package/src/internal/same-origin.ts +14 -1
- package/src/reflection.ts +61 -1
- package/src/server/body-lane.ts +36 -1
- package/src/server/client-ip.ts +5 -5
- package/src/server/context.ts +7 -4
- package/src/server/cookies.ts +12 -1
- package/src/server/core-copies.ts +40 -0
- package/src/server/edge.ts +2 -1
- package/src/server/headers.ts +39 -0
- package/src/server/http.ts +7 -1
- package/src/server/response-contract-lane.ts +491 -24
- package/src/server/server-types.ts +23 -9
- package/src/server/server.ts +249 -35
- package/src/server/websocket.ts +39 -13
- package/src/server/ws-bun.ts +48 -1
- package/src/server/ws-hook.ts +9 -2
- package/src/server.ts +1 -1
- package/src/single-copy.ts +90 -9
- package/src/wire.ts +14 -0
- package/src/ws.ts +2 -0
|
@@ -28,7 +28,9 @@
|
|
|
28
28
|
*
|
|
29
29
|
* That is not an inconsistency to paper over: a strict schema has already declared that extra fields
|
|
30
30
|
* are an error, and a stripping one has declared they are ignorable. Enforcement honours what the
|
|
31
|
-
* author wrote rather than overriding it
|
|
31
|
+
* author wrote rather than overriding it - unless the app asks for `extra: "strip"`. A schema that
|
|
32
|
+
* carries its JSON Schema as `jsonSchema` (every `t` schema does) CAN list its declared keys, so for
|
|
33
|
+
* those the payload is projected onto the declared shape before it is validated.
|
|
32
34
|
*
|
|
33
35
|
* ## What enforcement costs
|
|
34
36
|
*
|
|
@@ -45,6 +47,284 @@ import { formatStandardIssues, } from "../schema/standard.js";
|
|
|
45
47
|
import { INSTALL_RESPONSE_CONTRACT } from "./install.js";
|
|
46
48
|
import { isResponseResult, status } from "./runtime-core.js";
|
|
47
49
|
const isPlainObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
50
|
+
const projectors = new WeakMap();
|
|
51
|
+
/** The projector for a schema's JSON Schema, compiled once per schema. */
|
|
52
|
+
function projectorOf(schema) {
|
|
53
|
+
const node = Reflect.get(schema, "jsonSchema");
|
|
54
|
+
if (typeof node !== "object" || node === null)
|
|
55
|
+
return undefined;
|
|
56
|
+
let found = projectors.get(node);
|
|
57
|
+
if (found === undefined) {
|
|
58
|
+
found = compileProjector(node) ?? null;
|
|
59
|
+
projectors.set(node, found);
|
|
60
|
+
}
|
|
61
|
+
return found ?? undefined;
|
|
62
|
+
}
|
|
63
|
+
const objectField = (node, key) => {
|
|
64
|
+
const value = Reflect.get(node, key);
|
|
65
|
+
return typeof value === "object" && value !== null ? value : undefined;
|
|
66
|
+
};
|
|
67
|
+
function compileProjector(node) {
|
|
68
|
+
if (typeof node !== "object" || node === null)
|
|
69
|
+
return undefined;
|
|
70
|
+
const schema = node;
|
|
71
|
+
const type = Reflect.get(schema, "type");
|
|
72
|
+
const branches = Reflect.get(schema, "anyOf") ?? Reflect.get(schema, "oneOf");
|
|
73
|
+
if (Array.isArray(branches))
|
|
74
|
+
return compileUnion(branches);
|
|
75
|
+
if (type === "array") {
|
|
76
|
+
const items = Reflect.get(schema, "items");
|
|
77
|
+
const item = Array.isArray(items) ? undefined : compileProjector(items);
|
|
78
|
+
return item === undefined
|
|
79
|
+
? undefined
|
|
80
|
+
: (value) => (Array.isArray(value) ? value.map(item) : value);
|
|
81
|
+
}
|
|
82
|
+
if (type !== "object")
|
|
83
|
+
return undefined;
|
|
84
|
+
const properties = objectField(schema, "properties") ?? {};
|
|
85
|
+
const keys = Object.keys(properties);
|
|
86
|
+
const nested = new Map();
|
|
87
|
+
for (const key of keys) {
|
|
88
|
+
const projector = compileProjector(Reflect.get(properties, key));
|
|
89
|
+
if (projector !== undefined)
|
|
90
|
+
nested.set(key, projector);
|
|
91
|
+
}
|
|
92
|
+
const patterns = [];
|
|
93
|
+
for (const [source, child] of Object.entries(objectField(schema, "patternProperties") ?? {})) {
|
|
94
|
+
let pattern;
|
|
95
|
+
try {
|
|
96
|
+
pattern = new RegExp(source, "u");
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return undefined; // a pattern this engine can't read: the validator judges the value whole
|
|
100
|
+
}
|
|
101
|
+
patterns.push([pattern, compileProjector(child)]);
|
|
102
|
+
}
|
|
103
|
+
const closed = Reflect.get(schema, "additionalProperties") === false;
|
|
104
|
+
if (!closed && nested.size === 0 && patterns.every(([, projector]) => projector === undefined))
|
|
105
|
+
return undefined;
|
|
106
|
+
const declared = new Set(keys);
|
|
107
|
+
return (value) => {
|
|
108
|
+
if (!isPlainObject(value))
|
|
109
|
+
return value;
|
|
110
|
+
const out = closed ? {} : { ...value };
|
|
111
|
+
for (const key of closed ? keys : nested.keys()) {
|
|
112
|
+
if (!hasField(value, key))
|
|
113
|
+
continue;
|
|
114
|
+
const projector = nested.get(key);
|
|
115
|
+
define(out, key, projector === undefined ? value[key] : projector(value[key]));
|
|
116
|
+
}
|
|
117
|
+
if (patterns.length > 0)
|
|
118
|
+
projectPatternKeys(value, out, declared, patterns, closed);
|
|
119
|
+
return out;
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/** A getter on a row class's prototype is a declared field; `Object.prototype`'s members are not. */
|
|
123
|
+
const hasField = (value, key) => Object.hasOwn(value, key) || (key in value && !(key in Object.prototype));
|
|
124
|
+
/**
|
|
125
|
+
* A union projects a value onto the one branch able to accept it, and leaves anything less certain to
|
|
126
|
+
* the validator. JSON Schema's `object` never matches an array nor `array` an object, so the two are
|
|
127
|
+
* routed apart; two object branches are told apart only by a discriminator (see
|
|
128
|
+
* {@link compileDiscriminated}). A branch that could hold anything (`{}`, `$ref`, `allOf`) stops it.
|
|
129
|
+
*/
|
|
130
|
+
function compileUnion(branches) {
|
|
131
|
+
const objects = [];
|
|
132
|
+
const arrays = [];
|
|
133
|
+
if (!sortBranches(branches, objects, arrays))
|
|
134
|
+
return undefined;
|
|
135
|
+
const forArray = arrays.length === 1 ? compileProjector(arrays[0]) : undefined;
|
|
136
|
+
const forObject = objects.length === 1
|
|
137
|
+
? compileProjector(objects[0])
|
|
138
|
+
: objects.length > 1
|
|
139
|
+
? compileDiscriminated(objects)
|
|
140
|
+
: undefined;
|
|
141
|
+
if (forArray === undefined && forObject === undefined)
|
|
142
|
+
return undefined;
|
|
143
|
+
return (value) => {
|
|
144
|
+
if (Array.isArray(value))
|
|
145
|
+
return forArray === undefined ? value : forArray(value);
|
|
146
|
+
return forObject !== undefined && isPlainObject(value) ? forObject(value) : value;
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** Sort a union's branches, nested unions flattened; `false` when one could hold anything. */
|
|
150
|
+
function sortBranches(branches, objects, arrays) {
|
|
151
|
+
for (const branch of branches) {
|
|
152
|
+
if (branch === false)
|
|
153
|
+
continue;
|
|
154
|
+
if (typeof branch !== "object" || branch === null)
|
|
155
|
+
return false;
|
|
156
|
+
const nested = Reflect.get(branch, "anyOf") ?? Reflect.get(branch, "oneOf");
|
|
157
|
+
if (Array.isArray(nested)) {
|
|
158
|
+
if (!sortBranches(nested, objects, arrays))
|
|
159
|
+
return false;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const type = Reflect.get(branch, "type");
|
|
163
|
+
if (type === "object")
|
|
164
|
+
objects.push(branch);
|
|
165
|
+
else if (type === "array")
|
|
166
|
+
arrays.push(branch);
|
|
167
|
+
else if (typeof type === "string")
|
|
168
|
+
continue;
|
|
169
|
+
else if (type !== undefined || literalsOf(branch) === undefined)
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Object branches that all require one key, each holding literals no other branch holds: at most one
|
|
176
|
+
* branch can accept a value, so projecting onto the branch its tag names cannot strip a field another
|
|
177
|
+
* branch needed. The first such key in the first branch's declared order is used. A value whose tag
|
|
178
|
+
* names no branch is left to the validator, which rejects it.
|
|
179
|
+
*/
|
|
180
|
+
function compileDiscriminated(branches) {
|
|
181
|
+
const projectors = branches.map((branch) => compileProjector(branch));
|
|
182
|
+
const first = branches[0];
|
|
183
|
+
if (first === undefined || projectors.every((projector) => projector === undefined))
|
|
184
|
+
return undefined;
|
|
185
|
+
for (const key of Object.keys(objectField(first, "properties") ?? {})) {
|
|
186
|
+
const byTag = new Map();
|
|
187
|
+
const disjoint = branches.every((branch, index) => {
|
|
188
|
+
const tags = requiredLiterals(branch, key);
|
|
189
|
+
if (tags === undefined)
|
|
190
|
+
return false;
|
|
191
|
+
for (const tag of tags) {
|
|
192
|
+
if (byTag.has(tag))
|
|
193
|
+
return false;
|
|
194
|
+
byTag.set(tag, projectors[index]);
|
|
195
|
+
}
|
|
196
|
+
return true;
|
|
197
|
+
});
|
|
198
|
+
if (!disjoint)
|
|
199
|
+
continue;
|
|
200
|
+
return (value) => {
|
|
201
|
+
if (!isPlainObject(value) || !hasField(value, key))
|
|
202
|
+
return value;
|
|
203
|
+
const projector = byTag.get(value[key]);
|
|
204
|
+
return projector === undefined ? value : projector(value);
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
/** The distinct literals `key` may hold in an object branch that requires it. */
|
|
210
|
+
function requiredLiterals(branch, key) {
|
|
211
|
+
const required = Reflect.get(branch, "required");
|
|
212
|
+
const properties = objectField(branch, "properties");
|
|
213
|
+
if (!Array.isArray(required) || !required.includes(key))
|
|
214
|
+
return undefined;
|
|
215
|
+
if (properties === undefined || !Object.hasOwn(properties, key))
|
|
216
|
+
return undefined;
|
|
217
|
+
const literals = literalsOf(Reflect.get(properties, key));
|
|
218
|
+
return literals === undefined ? undefined : new Set(literals);
|
|
219
|
+
}
|
|
220
|
+
const isLiteral = (value) => value === null || ["string", "number", "boolean"].includes(typeof value);
|
|
221
|
+
/** The finite set of primitives a schema admits (`const`, `enum`, `null`, a union of those), else `undefined`. */
|
|
222
|
+
function literalsOf(node) {
|
|
223
|
+
if (typeof node !== "object" || node === null)
|
|
224
|
+
return undefined;
|
|
225
|
+
if (Object.hasOwn(node, "const")) {
|
|
226
|
+
const value = Reflect.get(node, "const");
|
|
227
|
+
return isLiteral(value) ? [value] : undefined;
|
|
228
|
+
}
|
|
229
|
+
const listed = Reflect.get(node, "enum");
|
|
230
|
+
if (Array.isArray(listed))
|
|
231
|
+
return listed.length > 0 && listed.every(isLiteral) ? listed : undefined;
|
|
232
|
+
const branches = Reflect.get(node, "anyOf") ?? Reflect.get(node, "oneOf");
|
|
233
|
+
if (Array.isArray(branches)) {
|
|
234
|
+
const all = [];
|
|
235
|
+
for (const branch of branches) {
|
|
236
|
+
const literals = literalsOf(branch);
|
|
237
|
+
if (literals === undefined)
|
|
238
|
+
return undefined;
|
|
239
|
+
all.push(...literals);
|
|
240
|
+
}
|
|
241
|
+
return all.length > 0 ? all : undefined;
|
|
242
|
+
}
|
|
243
|
+
return Reflect.get(node, "type") === "null" ? [null] : undefined;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Carry the undeclared keys a `patternProperties` entry admits: a closed record's keys are all
|
|
247
|
+
* pattern keys, so dropping them empties a valid value. A key two patterns match is copied verbatim,
|
|
248
|
+
* since projecting it onto one could strip what the other requires.
|
|
249
|
+
*/
|
|
250
|
+
function projectPatternKeys(value, out, declared, patterns, closed) {
|
|
251
|
+
for (const key of Object.keys(value)) {
|
|
252
|
+
if (declared.has(key))
|
|
253
|
+
continue;
|
|
254
|
+
let projector;
|
|
255
|
+
let matches = 0;
|
|
256
|
+
for (const [pattern, child] of patterns)
|
|
257
|
+
if (pattern.test(key)) {
|
|
258
|
+
projector = child;
|
|
259
|
+
matches++;
|
|
260
|
+
}
|
|
261
|
+
if (matches === 0)
|
|
262
|
+
continue;
|
|
263
|
+
if (matches === 1 && projector !== undefined)
|
|
264
|
+
define(out, key, projector(value[key]));
|
|
265
|
+
else if (closed)
|
|
266
|
+
define(out, key, value[key]);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/** `__proto__` is a declared name like any other here; plain assignment would set the prototype. */
|
|
270
|
+
function define(out, key, value) {
|
|
271
|
+
if (key === "__proto__")
|
|
272
|
+
Object.defineProperty(out, key, { value, enumerable: true, writable: true, configurable: true });
|
|
273
|
+
else
|
|
274
|
+
out[key] = value;
|
|
275
|
+
}
|
|
276
|
+
const MAX_STRIPPED_NAMES = 20;
|
|
277
|
+
const MAX_NAME_LENGTH = 64;
|
|
278
|
+
const MAX_REPORTED_SETS = 32;
|
|
279
|
+
/** Paths in what the handler returned that are absent from what was sent, array items as `name[]`.
|
|
280
|
+
* Stops one past {@link MAX_STRIPPED_NAMES}, so the log can say there were more. */
|
|
281
|
+
function collectStripped(sent, kept, path, out) {
|
|
282
|
+
if (Array.isArray(sent)) {
|
|
283
|
+
if (!Array.isArray(kept))
|
|
284
|
+
return;
|
|
285
|
+
const items = `${path}[]`;
|
|
286
|
+
for (let i = 0; i < sent.length && i < kept.length; i++) {
|
|
287
|
+
collectStripped(sent[i], kept[i], items, out);
|
|
288
|
+
if (out.size > MAX_STRIPPED_NAMES)
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
if (!isPlainObject(sent) || !isPlainObject(kept))
|
|
294
|
+
return;
|
|
295
|
+
for (const key of Object.keys(sent)) {
|
|
296
|
+
const short = key.length > MAX_NAME_LENGTH ? `${key.slice(0, MAX_NAME_LENGTH)}...` : key;
|
|
297
|
+
const name = path === "" ? short : `${path}.${short}`;
|
|
298
|
+
if (!Object.hasOwn(kept, key))
|
|
299
|
+
out.add(name);
|
|
300
|
+
else
|
|
301
|
+
collectStripped(sent[key], kept[key], name, out);
|
|
302
|
+
if (out.size > MAX_STRIPPED_NAMES)
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/** The log line for a route's stripped names the first time it sends that set, else `undefined`. */
|
|
307
|
+
function firstReport(reported, definition, fields) {
|
|
308
|
+
if (fields.length === 0)
|
|
309
|
+
return undefined;
|
|
310
|
+
let seen = reported.get(definition);
|
|
311
|
+
if (seen === undefined) {
|
|
312
|
+
seen = new Set();
|
|
313
|
+
reported.set(definition, seen);
|
|
314
|
+
}
|
|
315
|
+
const key = fields.join("\n");
|
|
316
|
+
if (seen.size >= MAX_REPORTED_SETS || seen.has(key))
|
|
317
|
+
return undefined;
|
|
318
|
+
seen.add(key);
|
|
319
|
+
const last = seen.size === MAX_REPORTED_SETS ? " Further sets of fields on this route are not logged." : "";
|
|
320
|
+
return `${strippedMessage(fields)}${last}`;
|
|
321
|
+
}
|
|
322
|
+
function strippedMessage(fields) {
|
|
323
|
+
const listed = fields.length > MAX_STRIPPED_NAMES
|
|
324
|
+
? `${fields.slice(0, MAX_STRIPPED_NAMES).join(", ")}, and more`
|
|
325
|
+
: fields.join(", ");
|
|
326
|
+
return `response carried fields its contract does not declare: ${listed}. They were not sent.`;
|
|
327
|
+
}
|
|
48
328
|
/** Top-level keys present in the handler's result but absent from the validated value. */
|
|
49
329
|
function droppedKeys(result, value) {
|
|
50
330
|
if (!isPlainObject(result) || !isPlainObject(value))
|
|
@@ -57,8 +337,8 @@ function droppedKeys(result, value) {
|
|
|
57
337
|
* Returns synchronously when the schema does (the common case), so an app that opts in does not pay a
|
|
58
338
|
* microtask per response for a check that had no work to do.
|
|
59
339
|
*/
|
|
60
|
-
export function checkResponseContract(schema, result, mode) {
|
|
61
|
-
return checkRouteResponseContract({ response: schema }, result, mode);
|
|
340
|
+
export function checkResponseContract(schema, result, mode, options) {
|
|
341
|
+
return checkRouteResponseContract({ response: schema }, result, mode, undefined, options);
|
|
62
342
|
}
|
|
63
343
|
/** The schema a reply with this status is held to: `response` for 2xx, else `errors[status]`. */
|
|
64
344
|
const schemaFor = (definition, code) => code >= 200 && code < 300 ? definition.response : definition.errors?.[code];
|
|
@@ -79,19 +359,24 @@ function reserialize(reply, value) {
|
|
|
79
359
|
* `Response` remains an explicit transport escape hatch because inspecting it would consume
|
|
80
360
|
* streams or alter redirects; assurance/static checks must govern that path separately.
|
|
81
361
|
*/
|
|
82
|
-
export function checkRouteResponseContract(definition, result, mode, jsonReply) {
|
|
362
|
+
export function checkRouteResponseContract(definition, result, mode, jsonReply, options) {
|
|
363
|
+
return checkContract(definition, result, mode, jsonReply, options?.extra === "strip" ? STRIP : KEEP);
|
|
364
|
+
}
|
|
365
|
+
const STRIP = { strip: true, report: undefined };
|
|
366
|
+
const KEEP = { strip: false, report: undefined };
|
|
367
|
+
function checkContract(definition, result, mode, jsonReply, policy) {
|
|
83
368
|
const plain = isResponseResult(result) ? result.plain : undefined;
|
|
84
369
|
if (plain !== undefined) {
|
|
85
370
|
const schema = schemaFor(definition, plain.status);
|
|
86
371
|
if (schema === undefined)
|
|
87
372
|
return { kind: "ok", value: result };
|
|
88
|
-
return validateContract(schema, plain.body, result, mode, (value) => status(plain.status, value, plain.headers === undefined ? undefined : { headers: plain.headers }));
|
|
373
|
+
return validateContract(schema, plain.body, result, mode, policy, (value) => status(plain.status, value, plain.headers === undefined ? undefined : { headers: plain.headers }));
|
|
89
374
|
}
|
|
90
375
|
if (jsonReply !== undefined && result instanceof Response) {
|
|
91
376
|
const schema = schemaFor(definition, result.status);
|
|
92
377
|
if (schema === undefined)
|
|
93
378
|
return { kind: "ok", value: result };
|
|
94
|
-
return validateContract(schema, jsonReply.body, result, mode, (value) => reserialize(result, value));
|
|
379
|
+
return validateContract(schema, jsonReply.body, result, mode, policy, (value) => reserialize(result, value));
|
|
95
380
|
}
|
|
96
381
|
// A handler may return a raw Response as deliberate control flow (a redirect, a stream). There is no
|
|
97
382
|
// JSON payload to hold to the contract, and re-serializing one would corrupt it. A `status(...)` is
|
|
@@ -102,17 +387,18 @@ export function checkRouteResponseContract(definition, result, mode, jsonReply)
|
|
|
102
387
|
const schema = definition.response;
|
|
103
388
|
if (schema === undefined)
|
|
104
389
|
return { kind: "ok", value: result };
|
|
105
|
-
return validateContract(schema, result, result, mode, (value) => value);
|
|
390
|
+
return validateContract(schema, result, result, mode, policy, (value) => value);
|
|
106
391
|
}
|
|
107
392
|
/** Validate `payload`; `served` is what goes out unchanged when nothing is enforced - the whole
|
|
108
393
|
* `status(...)` result or reply, never just its body. */
|
|
109
|
-
function validateContract(schema, payload, served, mode, replace) {
|
|
110
|
-
const
|
|
394
|
+
function validateContract(schema, payload, served, mode, policy, replace) {
|
|
395
|
+
const project = policy.strip ? projectorOf(schema) : undefined;
|
|
396
|
+
const settled = schema["~standard"].validate(project === undefined ? payload : project(payload));
|
|
111
397
|
return settled instanceof Promise
|
|
112
|
-
? settled.then((r) => interpret(r, payload, served, mode, replace))
|
|
113
|
-
: interpret(settled, payload, served, mode, replace);
|
|
398
|
+
? settled.then((r) => interpret(r, payload, served, mode, replace, policy.report))
|
|
399
|
+
: interpret(settled, payload, served, mode, replace, policy.report);
|
|
114
400
|
}
|
|
115
|
-
function interpret(settled, payload, served, mode, replace) {
|
|
401
|
+
function interpret(settled, payload, served, mode, replace, report) {
|
|
116
402
|
if (settled.issues !== undefined) {
|
|
117
403
|
const message = `response does not satisfy its declared contract: ${formatStandardIssues(settled.issues)}`;
|
|
118
404
|
// `warn` never changes what is served - it reports and gets out of the way, so switching it on can
|
|
@@ -121,24 +407,34 @@ function interpret(settled, payload, served, mode, replace) {
|
|
|
121
407
|
? { kind: "warn", value: served, message }
|
|
122
408
|
: { kind: "violation", message };
|
|
123
409
|
}
|
|
410
|
+
if (mode === "enforce") {
|
|
411
|
+
const value = replace(settled.value);
|
|
412
|
+
if (report === undefined)
|
|
413
|
+
return { kind: "ok", value };
|
|
414
|
+
const stripped = new Set();
|
|
415
|
+
collectStripped(payload, settled.value, "", stripped);
|
|
416
|
+
const message = report([...stripped].sort());
|
|
417
|
+
return message === undefined ? { kind: "ok", value } : { kind: "warn", value, message };
|
|
418
|
+
}
|
|
124
419
|
const dropped = droppedKeys(payload, settled.value);
|
|
125
|
-
if (mode === "enforce")
|
|
126
|
-
return { kind: "ok", value: replace(settled.value) };
|
|
127
420
|
return dropped.length === 0
|
|
128
421
|
? { kind: "ok", value: served }
|
|
129
422
|
: {
|
|
130
423
|
kind: "warn",
|
|
131
424
|
value: served,
|
|
132
|
-
message: `response carries fields its contract does not declare: ${dropped.join(", ")}. They are being sent; \`responseContract
|
|
425
|
+
message: `response carries fields its contract does not declare: ${dropped.join(", ")}. They are being sent; \`responseContract("enforce")\` would strip them.`,
|
|
426
|
+
fields: dropped,
|
|
133
427
|
};
|
|
134
428
|
}
|
|
135
429
|
/**
|
|
136
430
|
* Hold every route's declared `response` schema to what the handler actually returned.
|
|
137
431
|
*
|
|
138
|
-
* app.use(responseContract("enforce"))
|
|
432
|
+
* app.use(responseContract("enforce")) // a closed t.object -> 500 on extras
|
|
433
|
+
* app.use(responseContract("enforce", { extra: "strip" })) // extras dropped, declared fields sent
|
|
139
434
|
*
|
|
140
435
|
* Install it before the routes it should cover - like `idempotency()`, the decision is made per route
|
|
141
|
-
* at registration, so routes registered earlier are not retroactively covered.
|
|
436
|
+
* at registration, so routes registered earlier are not retroactively covered. It covers routes on
|
|
437
|
+
* the server it is installed on, its `group()`s, and servers `merge()`d into it afterwards.
|
|
142
438
|
*
|
|
143
439
|
* The check itself is cheap - with a compiled validator it measures in the ~100ns-per-response
|
|
144
440
|
* range, within benchmark noise of an uncontracted route on any route that carries middleware or a
|
|
@@ -147,16 +443,91 @@ function interpret(settled, payload, served, mode, replace) {
|
|
|
147
443
|
* taking anyway. Opt-in because not installing the plugin keeps the lane out of the bundle, not
|
|
148
444
|
* because enforcement is expensive.
|
|
149
445
|
*/
|
|
150
|
-
export function responseContract(mode = "warn") {
|
|
446
|
+
export function responseContract(mode = "warn", options = {}) {
|
|
447
|
+
if (options.extra !== undefined && options.extra !== "reject" && options.extra !== "strip") {
|
|
448
|
+
throw new TypeError(`responseContract(): extra must be "reject" or "strip", got ${JSON.stringify(options.extra)}`);
|
|
449
|
+
}
|
|
450
|
+
if (options.logStripped !== undefined && typeof options.logStripped !== "boolean") {
|
|
451
|
+
throw new TypeError(`responseContract(): logStripped must be a boolean, got ${JSON.stringify(options.logStripped)}`);
|
|
452
|
+
}
|
|
453
|
+
const onReport = options.onReport;
|
|
454
|
+
const strip = options.extra === "strip";
|
|
455
|
+
const quiet = strip ? STRIP : KEEP;
|
|
456
|
+
const reported = options.logStripped === true && mode === "enforce"
|
|
457
|
+
? new WeakMap()
|
|
458
|
+
: undefined;
|
|
459
|
+
const hosts = [];
|
|
460
|
+
// A definition is compiled per route into the catalog of a server this plugin was applied to (a
|
|
461
|
+
// `group()`'s and a `merge()`d server's routes are adopted into it), so the route is found there
|
|
462
|
+
// and naming it costs the kernel nothing.
|
|
463
|
+
const routes = new WeakMap();
|
|
464
|
+
let failed = false;
|
|
465
|
+
// A hook that throws or rejects (or is not a function) is logged once and never reaches a response.
|
|
466
|
+
const fail = (error) => {
|
|
467
|
+
if (!failed)
|
|
468
|
+
hosts[0]?.logger.error("response contract onReport threw", { detail: String(error) });
|
|
469
|
+
failed = true;
|
|
470
|
+
};
|
|
151
471
|
const runtime = {
|
|
152
472
|
mode,
|
|
153
|
-
check: (definition, result, context) =>
|
|
154
|
-
|
|
155
|
-
|
|
473
|
+
check: (definition, result, context) => {
|
|
474
|
+
const jsonReply = result instanceof Response && result === context?.jsonReply
|
|
475
|
+
? { body: context.jsonBody }
|
|
476
|
+
: undefined;
|
|
477
|
+
const logged = reported === undefined
|
|
478
|
+
? undefined
|
|
479
|
+
: (fields) => firstReport(reported, definition, fields);
|
|
480
|
+
if (onReport === undefined)
|
|
481
|
+
return checkContract(definition, result, mode, jsonReply, logged === undefined ? quiet : { strip, report: logged });
|
|
482
|
+
const send = (kind, message, fields) => {
|
|
483
|
+
if (!routes.has(definition))
|
|
484
|
+
for (const host of hosts)
|
|
485
|
+
for (const route of host.catalog.entries()) {
|
|
486
|
+
const owned = route.entry.responseContract?.definition;
|
|
487
|
+
if (owned !== undefined)
|
|
488
|
+
routes.set(owned, route);
|
|
489
|
+
}
|
|
490
|
+
const route = routes.get(definition);
|
|
491
|
+
try {
|
|
492
|
+
const returned = onReport({
|
|
493
|
+
kind,
|
|
494
|
+
method: route?.method ?? "",
|
|
495
|
+
route: route?.path ?? "",
|
|
496
|
+
fields,
|
|
497
|
+
message,
|
|
498
|
+
});
|
|
499
|
+
if (returned instanceof Promise)
|
|
500
|
+
returned.catch(fail);
|
|
501
|
+
}
|
|
502
|
+
catch (error) {
|
|
503
|
+
fail(error);
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
const outcome = checkContract(definition, result, mode, jsonReply, {
|
|
507
|
+
strip,
|
|
508
|
+
report: (fields) => {
|
|
509
|
+
if (fields.length > 0)
|
|
510
|
+
send("stripped", strippedMessage(fields), fields);
|
|
511
|
+
return logged?.(fields);
|
|
512
|
+
},
|
|
513
|
+
});
|
|
514
|
+
const observe = (settled) => {
|
|
515
|
+
// An enforce-mode warn is the stripped-field log line, already reported as `stripped`.
|
|
516
|
+
if (settled.kind === "violation")
|
|
517
|
+
send("violation", settled.message);
|
|
518
|
+
else if (settled.kind === "warn" && mode === "warn")
|
|
519
|
+
send("warn", settled.message, settled.fields);
|
|
520
|
+
return settled;
|
|
521
|
+
};
|
|
522
|
+
return outcome instanceof Promise ? outcome.then(observe) : observe(outcome);
|
|
523
|
+
},
|
|
156
524
|
};
|
|
157
525
|
const apply = (app) => {
|
|
158
|
-
|
|
159
|
-
app
|
|
526
|
+
// A server also holds the route catalog and the logger ContractHost reads.
|
|
527
|
+
const host = app;
|
|
528
|
+
host[INSTALL_RESPONSE_CONTRACT](runtime);
|
|
529
|
+
if (!hosts.includes(host))
|
|
530
|
+
hosts.push(host);
|
|
160
531
|
return app;
|
|
161
532
|
};
|
|
162
533
|
return Object.assign(apply, { pluginName: "nifra:response-contract" });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-contract-lane.js","sourceRoot":"","sources":["../../src/server/response-contract-lane.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"response-contract-lane.js","sourceRoot":"","sources":["../../src/server/response-contract-lane.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,10 +54,18 @@ export interface ServerOptions {
|
|
|
54
54
|
* `__proto__` key, or a `constructor` carrying a `prototype`, is the payload shape that turns a
|
|
55
55
|
* later innocent merge/assign into prototype pollution. `"reject"` (default) answers the same
|
|
56
56
|
* flat 400 as malformed JSON; `"strip"` removes the offending keys and continues; `"ignore"`
|
|
57
|
-
* parses as-is (only for routes that never merge body input into other objects).
|
|
58
|
-
*
|
|
57
|
+
* parses as-is (only for routes that never merge body input into other objects). Every guarded
|
|
58
|
+
* payload pays one iterative pass over its parsed object nodes; `"ignore"` skips it.
|
|
59
59
|
*/
|
|
60
60
|
readonly protoPoisoning?: "reject" | "strip" | "ignore";
|
|
61
|
+
/**
|
|
62
|
+
* Other sites whose HTML forms may post to a body-schema route: exact origins, or a function that
|
|
63
|
+
* receives the `Origin`. A urlencoded, multipart or `text/plain` body is one a form on any site can
|
|
64
|
+
* send with the visitor's cookies and no preflight, so one whose `Origin` names another site is
|
|
65
|
+
* refused with `403` before it is read. Same-origin posts and requests without an `Origin`, such
|
|
66
|
+
* as server-to-server calls, pass. JSON is not affected: a browser preflights it, so CORS decides.
|
|
67
|
+
*/
|
|
68
|
+
readonly formOrigins?: ReadonlyArray<string> | ((origin: string) => boolean);
|
|
61
69
|
/**
|
|
62
70
|
* Declare that every `Request` reaching `app.fetch` was framed by a runtime HTTP parser, so its
|
|
63
71
|
* `Content-Length` is an exact transport boundary rather than a hint. Set this ONLY when the
|
|
@@ -76,9 +84,12 @@ export interface ServerOptions {
|
|
|
76
84
|
* untrusted input.
|
|
77
85
|
*/
|
|
78
86
|
readonly trustBodyFraming?: boolean;
|
|
79
|
-
/**
|
|
80
|
-
*
|
|
81
|
-
* Default: `maxBodyBytes` (1 MB).
|
|
87
|
+
/**
|
|
88
|
+
* Max inbound WebSocket message size (bytes). A larger message never reaches the handler and the
|
|
89
|
+
* socket closes with `1009`. Default: `maxBodyBytes` (1 MB). Bun and Node stop buffering at the cap,
|
|
90
|
+
* so a huge frame is never held in memory; on Bun a mounted app's smaller cap, and on Deno and
|
|
91
|
+
* Workers every cap, is checked after the runtime has buffered the whole message.
|
|
92
|
+
*/
|
|
82
93
|
readonly wsMaxPayloadBytes?: number;
|
|
83
94
|
/** Per-request timeout (ms): a slower request gets a 503 and `ctx.signal` aborts. 0 disables (default). */
|
|
84
95
|
readonly requestTimeoutMs?: number;
|
|
@@ -150,10 +161,13 @@ export interface ServerOptions {
|
|
|
150
161
|
*/
|
|
151
162
|
readonly onValidationError?: RouteSchema["onValidationError"];
|
|
152
163
|
/**
|
|
153
|
-
* What to do when an order-scoped hook (`derive`/`beforeHandle`/`around
|
|
154
|
-
* `afterHandle`/`onError`/`decorate`) covers no route because it was added after
|
|
155
|
-
* registered. `register()` snapshots the current chain into each route as it is
|
|
156
|
-
* appended after every route reaches nothing and is silently dead. `
|
|
164
|
+
* What to do when an order-scoped hook (`derive`/`authenticate`/`beforeHandle`/`around`/
|
|
165
|
+
* `aroundCapability`/`afterHandle`/`onError`/`decorate`) covers no route because it was added after
|
|
166
|
+
* the last route was registered. `register()` snapshots the current chain into each route as it is
|
|
167
|
+
* declared, so a hook appended after every route reaches nothing and is silently dead. A `merge()`d
|
|
168
|
+
* route keeps the chain of the server that declared it, so a hook followed only by merges is dead
|
|
169
|
+
* too. The same report covers `responseContract()` and `effectLedger()` installed after routes they
|
|
170
|
+
* would have covered (a declared response, declared capabilities). `"warn"` (default) logs once at
|
|
157
171
|
* seal (first `listen()`/`fetch`/`resolveNode`); `"error"` throws a `FrameworkError`
|
|
158
172
|
* (`UNUSED_SCOPED_HOOKS`); `"off"` skips the bookkeeping entirely, including the one-frame stack
|
|
159
173
|
* capture. App-global hooks (`onRequest`/`onResponse`/...) are unaffected in every mode.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-types.d.ts","sourceRoot":"","sources":["../../src/server/server-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAE7D;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE,GAC5C;IAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAA;AAE7D;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;CACpE;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAA;IACvD;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;IACnC
|
|
1
|
+
{"version":3,"file":"server-types.d.ts","sourceRoot":"","sources":["../../src/server/server-types.ts"],"names":[],"mappings":"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"}
|