@nifrajs/middleware 2.9.1 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/conditional.d.ts +9 -0
- package/dist/conditional.d.ts.map +1 -0
- package/dist/conditional.js +62 -0
- package/dist/conditional.js.map +1 -0
- package/dist/content-negotiation.d.ts +15 -0
- package/dist/content-negotiation.d.ts.map +1 -0
- package/dist/content-negotiation.js +130 -0
- package/dist/content-negotiation.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/multipart.d.ts +20 -0
- package/dist/multipart.d.ts.map +1 -0
- package/dist/multipart.js +132 -0
- package/dist/multipart.js.map +1 -0
- package/dist/problem-details.d.ts +17 -0
- package/dist/problem-details.d.ts.map +1 -0
- package/dist/problem-details.js +161 -0
- package/dist/problem-details.js.map +1 -0
- package/dist/range.d.ts +19 -0
- package/dist/range.d.ts.map +1 -0
- package/dist/range.js +144 -0
- package/dist/range.js.map +1 -0
- package/package.json +3 -3
- package/src/conditional.ts +70 -0
- package/src/content-negotiation.ts +139 -0
- package/src/index.ts +24 -0
- package/src/multipart.ts +166 -0
- package/src/problem-details.ts +208 -0
- package/src/range.ts +176 -0
package/README.md
CHANGED
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
bodyLimit,
|
|
15
15
|
cors,
|
|
16
16
|
MemoryStore,
|
|
17
|
+
problemDetails,
|
|
17
18
|
rateLimit,
|
|
18
19
|
securityHeaders,
|
|
19
20
|
timing,
|
|
@@ -21,6 +22,7 @@ import {
|
|
|
21
22
|
|
|
22
23
|
const app = server()
|
|
23
24
|
.use(securityHeaders())
|
|
25
|
+
.use(problemDetails())
|
|
24
26
|
.use(cors({ origin: ["https://app.example.com"], credentials: true }))
|
|
25
27
|
.use(bodyLimit({ maxBytes: 1_000_000 }))
|
|
26
28
|
.use(rateLimit({
|
|
@@ -60,6 +62,14 @@ const app = server()
|
|
|
60
62
|
store, `Vary`-aware keys, `Age`, byte caps, and `Cache-Control` / `Set-Cookie` safety defaults.
|
|
61
63
|
`MemoryResponseCache` is dev/single-instance only unless explicitly allowed in production.
|
|
62
64
|
- **`timing()`** - `Server-Timing` plus typed `c.timing.metric/mark/measure` controls.
|
|
65
|
+
- **`problemDetails()`** - opt-in RFC 9457 `application/problem+json` responses for framework
|
|
66
|
+
errors. The default `{ ok: false, error }` envelope remains unchanged unless installed; validation
|
|
67
|
+
issues are preserved, and `includeInstance` includes only the request pathname.
|
|
68
|
+
- **`rangeResponse()` / `parseByteRange()`** - bounded byte-range responses with 206/416,
|
|
69
|
+
`If-Range`, multipart ranges, and conditional validators.
|
|
70
|
+
- **`conditionalResponse()`** - reusable ETag/Last-Modified handling that emits a bodyless 304.
|
|
71
|
+
- **`negotiateContentType()`** - RFC-style `Accept` matching with q-values, wildcards, and q=0.
|
|
72
|
+
- **`multipartResponse()`** - cancellable streaming multipart output without buffering all parts.
|
|
63
73
|
- **`prettyJson()`** - capped, JSON-only pretty printing for debugging and developer-facing APIs.
|
|
64
74
|
- **`methodOverride()`** - header/query method tunneling for clients that can only send `POST`.
|
|
65
75
|
Header override is on by default; query override is opt-in.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ConditionalResponseOptions {
|
|
2
|
+
/** Entity tag to attach and compare using HTTP weak comparison for GET/HEAD. */
|
|
3
|
+
readonly etag?: string;
|
|
4
|
+
/** Last-modified validator to attach and compare at one-second HTTP date precision. */
|
|
5
|
+
readonly lastModified?: Date;
|
|
6
|
+
}
|
|
7
|
+
/** Apply validators to a response and produce a standards-compliant 304 when it is fresh. */
|
|
8
|
+
export declare function conditionalResponse(request: Request, response: Response, options?: ConditionalResponseOptions): Response;
|
|
9
|
+
//# sourceMappingURL=conditional.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditional.d.ts","sourceRoot":"","sources":["../src/conditional.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,0BAA0B;IACzC,gFAAgF;IAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,uFAAuF;IACvF,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAA;CAC7B;AAwCD,6FAA6F;AAC7F,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,0BAA+B,GACvC,QAAQ,CAiBV"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { withHeaders } from "./_utils.js";
|
|
2
|
+
function lastModifiedHeader(date) {
|
|
3
|
+
if (date === undefined)
|
|
4
|
+
return undefined;
|
|
5
|
+
if (!Number.isFinite(date.getTime())) {
|
|
6
|
+
throw new RangeError("conditionalResponse: lastModified must be a valid Date");
|
|
7
|
+
}
|
|
8
|
+
return date.toUTCString();
|
|
9
|
+
}
|
|
10
|
+
function weakTag(value) {
|
|
11
|
+
return value.startsWith("W/") ? value.slice(2) : value;
|
|
12
|
+
}
|
|
13
|
+
function matchesIfNoneMatch(value, etag) {
|
|
14
|
+
const comparable = weakTag(etag);
|
|
15
|
+
return value.split(",").some((candidate) => {
|
|
16
|
+
const item = candidate.trim();
|
|
17
|
+
return item === "*" || weakTag(item) === comparable;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function isFresh(request, options) {
|
|
21
|
+
if (request.method !== "GET" && request.method !== "HEAD")
|
|
22
|
+
return false;
|
|
23
|
+
const ifNoneMatch = request.headers.get("if-none-match");
|
|
24
|
+
if (ifNoneMatch !== null && options.etag !== undefined) {
|
|
25
|
+
return matchesIfNoneMatch(ifNoneMatch, options.etag);
|
|
26
|
+
}
|
|
27
|
+
if (ifNoneMatch !== null)
|
|
28
|
+
return false;
|
|
29
|
+
const modified = options.lastModified?.getTime();
|
|
30
|
+
const since = request.headers.get("if-modified-since");
|
|
31
|
+
return (modified !== undefined &&
|
|
32
|
+
since !== null &&
|
|
33
|
+
Number.isFinite(modified) &&
|
|
34
|
+
Number.isFinite(Date.parse(since)) &&
|
|
35
|
+
Math.floor(Date.parse(since) / 1000) >= Math.floor(modified / 1000));
|
|
36
|
+
}
|
|
37
|
+
/** Apply validators to a response and produce a standards-compliant 304 when it is fresh. */
|
|
38
|
+
export function conditionalResponse(request, response, options = {}) {
|
|
39
|
+
const modified = lastModifiedHeader(options.lastModified);
|
|
40
|
+
if (response.status < 200 || response.status >= 300)
|
|
41
|
+
return response;
|
|
42
|
+
if (!isFresh(request, options)) {
|
|
43
|
+
if (options.etag === undefined && modified === undefined)
|
|
44
|
+
return response;
|
|
45
|
+
return withHeaders(response, (headers) => {
|
|
46
|
+
if (options.etag !== undefined)
|
|
47
|
+
headers.set("etag", options.etag);
|
|
48
|
+
if (modified !== undefined)
|
|
49
|
+
headers.set("last-modified", modified);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const headers = new Headers(response.headers);
|
|
53
|
+
if (options.etag !== undefined)
|
|
54
|
+
headers.set("etag", options.etag);
|
|
55
|
+
if (modified !== undefined)
|
|
56
|
+
headers.set("last-modified", modified);
|
|
57
|
+
headers.delete("content-length");
|
|
58
|
+
headers.delete("content-type");
|
|
59
|
+
void response.body?.cancel().catch(() => { });
|
|
60
|
+
return new Response(null, { status: 304, headers });
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=conditional.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditional.js","sourceRoot":"","sources":["../src/conditional.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ContentPreference {
|
|
2
|
+
readonly type: string;
|
|
3
|
+
readonly subtype: string;
|
|
4
|
+
readonly q: number;
|
|
5
|
+
readonly specificity: 0 | 1 | 2;
|
|
6
|
+
}
|
|
7
|
+
/** Parse an `Accept` header, preserving quality and wildcard specificity. */
|
|
8
|
+
export declare function parseAcceptHeader(value: string | null): readonly ContentPreference[];
|
|
9
|
+
/**
|
|
10
|
+
* Select the best offered media type for an `Accept` header. The returned string is the original
|
|
11
|
+
* offered value, so parameters such as `profile` are preserved. An absent/empty header accepts the
|
|
12
|
+
* first offer; an explicit `q=0` or no matching offer returns `undefined`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function negotiateContentType(accept: string | null | Headers | Request, offered: readonly string[]): string | undefined;
|
|
15
|
+
//# sourceMappingURL=content-negotiation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-negotiation.d.ts","sourceRoot":"","sources":["../src/content-negotiation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;CAChC;AA2DD,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,iBAAiB,EAAE,CAQpF;AAyBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,OAAO,EACzC,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,MAAM,GAAG,SAAS,CAgCpB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
const MAX_ACCEPT_HEADER_LENGTH = 16 * 1024;
|
|
2
|
+
const MAX_MEDIA_RANGES = 128;
|
|
3
|
+
function splitHeader(value) {
|
|
4
|
+
if (value.length > MAX_ACCEPT_HEADER_LENGTH)
|
|
5
|
+
return undefined;
|
|
6
|
+
const parts = [];
|
|
7
|
+
let start = 0;
|
|
8
|
+
let quoted = false;
|
|
9
|
+
for (let index = 0; index < value.length; index++) {
|
|
10
|
+
const character = value[index];
|
|
11
|
+
if (character === '"' && value[index - 1] !== "\\")
|
|
12
|
+
quoted = !quoted;
|
|
13
|
+
if (character === "," && !quoted) {
|
|
14
|
+
parts.push(value.slice(start, index));
|
|
15
|
+
if (parts.length >= MAX_MEDIA_RANGES)
|
|
16
|
+
return undefined;
|
|
17
|
+
start = index + 1;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
parts.push(value.slice(start));
|
|
21
|
+
return parts;
|
|
22
|
+
}
|
|
23
|
+
function parseMediaType(value, qDefault = 1) {
|
|
24
|
+
const segments = value.split(";");
|
|
25
|
+
const media = segments.shift()?.trim().toLowerCase() ?? "";
|
|
26
|
+
const slash = media.indexOf("/");
|
|
27
|
+
if (slash <= 0 || slash === media.length - 1)
|
|
28
|
+
return undefined;
|
|
29
|
+
const type = media.slice(0, slash);
|
|
30
|
+
const subtype = media.slice(slash + 1);
|
|
31
|
+
if (!/^[\w!#$&^_.+-]+$/.test(type) || !/^[\w!#$&^_.+*-]+$/.test(subtype))
|
|
32
|
+
return undefined;
|
|
33
|
+
let q = qDefault;
|
|
34
|
+
const parameters = new Map();
|
|
35
|
+
let afterQuality = false;
|
|
36
|
+
for (const segment of segments) {
|
|
37
|
+
const separator = segment.indexOf("=");
|
|
38
|
+
if (separator < 1)
|
|
39
|
+
continue;
|
|
40
|
+
const key = segment.slice(0, separator).trim().toLowerCase();
|
|
41
|
+
const raw = segment.slice(separator + 1).trim();
|
|
42
|
+
const parameter = raw.startsWith('"') && raw.endsWith('"') ? raw.slice(1, -1) : raw;
|
|
43
|
+
if (key === "q") {
|
|
44
|
+
if (afterQuality)
|
|
45
|
+
continue;
|
|
46
|
+
const parsed = Number(parameter);
|
|
47
|
+
if (!Number.isFinite(parsed) || parsed < 0 || parsed > 1)
|
|
48
|
+
return undefined;
|
|
49
|
+
q = parsed;
|
|
50
|
+
afterQuality = true;
|
|
51
|
+
}
|
|
52
|
+
else if (!afterQuality) {
|
|
53
|
+
parameters.set(key, parameter.toLowerCase());
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const specificity = type === "*" ? 0 : subtype === "*" ? 1 : 2;
|
|
57
|
+
return { type, subtype, q, specificity, parameters };
|
|
58
|
+
}
|
|
59
|
+
/** Parse an `Accept` header, preserving quality and wildcard specificity. */
|
|
60
|
+
export function parseAcceptHeader(value) {
|
|
61
|
+
if (value === null || value.trim() === "")
|
|
62
|
+
return [];
|
|
63
|
+
const preferences = [];
|
|
64
|
+
for (const item of splitHeader(value) ?? []) {
|
|
65
|
+
const parsed = parseMediaType(item);
|
|
66
|
+
if (parsed !== undefined)
|
|
67
|
+
preferences.push(parsed);
|
|
68
|
+
}
|
|
69
|
+
return preferences;
|
|
70
|
+
}
|
|
71
|
+
function parsedAcceptHeader(value) {
|
|
72
|
+
const preferences = [];
|
|
73
|
+
for (const item of splitHeader(value) ?? []) {
|
|
74
|
+
const parsed = parseMediaType(item);
|
|
75
|
+
if (parsed !== undefined)
|
|
76
|
+
preferences.push(parsed);
|
|
77
|
+
}
|
|
78
|
+
return preferences;
|
|
79
|
+
}
|
|
80
|
+
function offeredMatches(offer, preference) {
|
|
81
|
+
if (preference.type !== "*" && preference.type !== offer.type)
|
|
82
|
+
return false;
|
|
83
|
+
if (preference.subtype !== "*" && preference.subtype !== offer.subtype)
|
|
84
|
+
return false;
|
|
85
|
+
for (const [key, value] of preference.parameters) {
|
|
86
|
+
if (offer.parameters.get(key) !== value)
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
function acceptHeaderOf(value) {
|
|
92
|
+
if (typeof value === "string" || value === null)
|
|
93
|
+
return value;
|
|
94
|
+
return value instanceof Request ? value.headers.get("accept") : value.get("accept");
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Select the best offered media type for an `Accept` header. The returned string is the original
|
|
98
|
+
* offered value, so parameters such as `profile` are preserved. An absent/empty header accepts the
|
|
99
|
+
* first offer; an explicit `q=0` or no matching offer returns `undefined`.
|
|
100
|
+
*/
|
|
101
|
+
export function negotiateContentType(accept, offered) {
|
|
102
|
+
if (offered.length === 0)
|
|
103
|
+
return undefined;
|
|
104
|
+
const header = acceptHeaderOf(accept);
|
|
105
|
+
if (header === null || header.trim() === "")
|
|
106
|
+
return offered[0];
|
|
107
|
+
const preferences = parsedAcceptHeader(header);
|
|
108
|
+
let selected;
|
|
109
|
+
offered.forEach((value, index) => {
|
|
110
|
+
const parsed = parseMediaType(value, 0);
|
|
111
|
+
if (parsed === undefined)
|
|
112
|
+
return;
|
|
113
|
+
let best;
|
|
114
|
+
for (const preference of preferences) {
|
|
115
|
+
if (!offeredMatches(parsed, preference))
|
|
116
|
+
continue;
|
|
117
|
+
if (best === undefined || preference.specificity > best.specificity)
|
|
118
|
+
best = preference;
|
|
119
|
+
}
|
|
120
|
+
if (best === undefined || best.q === 0)
|
|
121
|
+
return;
|
|
122
|
+
if (selected === undefined ||
|
|
123
|
+
best.q > selected.q ||
|
|
124
|
+
(best.q === selected.q && best.specificity > selected.specificity)) {
|
|
125
|
+
selected = { value, q: best.q, specificity: best.specificity, index };
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
return selected?.value;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=content-negotiation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-negotiation.js","sourceRoot":"","sources":["../src/content-negotiation.ts"],"names":[],"mappings":"AAWA,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,CAAA;AAC1C,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAE5B,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,CAAC,MAAM,GAAG,wBAAwB;QAAE,OAAO,SAAS,CAAA;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,SAAS,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,MAAM,GAAG,CAAC,MAAM,CAAA;QACpE,IAAI,SAAS,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;YACrC,IAAI,KAAK,CAAC,MAAM,IAAI,gBAAgB;gBAAE,OAAO,SAAS,CAAA;YACtD,KAAK,GAAG,KAAK,GAAG,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9B,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,QAAQ,GAAG,CAAC;IACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAA;IAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAChC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IACtC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAA;IAE1F,IAAI,CAAC,GAAG,QAAQ,CAAA;IAChB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC5C,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,SAAS,GAAG,CAAC;YAAE,SAAQ;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC/C,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACnF,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,IAAI,YAAY;gBAAE,SAAQ;YAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;YAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAA;YAC1E,CAAC,GAAG,MAAM,CAAA;YACV,YAAY,GAAG,IAAI,CAAA;QACrB,CAAC;aAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACzB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAc,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACzE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAA;AACtD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,KAAoB;IACpD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,CAAA;IACpD,MAAM,WAAW,GAAwB,EAAE,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,MAAM,KAAK,SAAS;YAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,MAAM,WAAW,GAAsB,EAAE,CAAA;IACzC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,MAAM,KAAK,SAAS;YAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,SAAS,cAAc,CAAC,KAAsB,EAAE,UAA2B;IACzE,IAAI,UAAU,CAAC,IAAI,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IAC3E,IAAI,UAAU,CAAC,OAAO,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAA;IACpF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QACjD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;YAAE,OAAO,KAAK,CAAA;IACvD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,cAAc,CAAC,KAAwC;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC7D,OAAO,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AACrF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAyC,EACzC,OAA0B;IAE1B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC1C,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;IACrC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;IAC9D,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAC9C,IAAI,QAOS,CAAA;IAEb,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QACvC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAM;QAChC,IAAI,IAAiC,CAAA;QACrC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC;gBAAE,SAAQ;YACjD,IAAI,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;gBAAE,IAAI,GAAG,UAAU,CAAA;QACxF,CAAC;QACD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC;YAAE,OAAM;QAC9C,IACE,QAAQ,KAAK,SAAS;YACtB,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;YACnB,CAAC,IAAI,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,EAClE,CAAC;YACD,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAA;QACvE,CAAC;IACH,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,EAAE,KAAK,CAAA;AACxB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export { type CachedResponse, type CacheOptions, cache, MemoryResponseCache, typ
|
|
|
12
12
|
export { type CacheControlOptions, cacheControl } from "./cache-control.js";
|
|
13
13
|
export { type Composable, combine, namedCombine } from "./combine.js";
|
|
14
14
|
export { type CompressionOptions, compression } from "./compression.js";
|
|
15
|
+
export { type ConditionalResponseOptions, conditionalResponse, } from "./conditional.js";
|
|
16
|
+
export { type ContentPreference, negotiateContentType, parseAcceptHeader, } from "./content-negotiation.js";
|
|
15
17
|
export { type CorsOptions, cors } from "./cors.js";
|
|
16
18
|
export { type CsrfOptions, createCsrfToken, csrf, verifyCsrfToken, } from "./csrf.js";
|
|
17
19
|
export { type DurableCommandOptions, durableCommand } from "./durable-command.js";
|
|
@@ -23,9 +25,12 @@ export { type JwkKey, type JwksOptions, type JwtAlgorithm, type JwtClaims, type
|
|
|
23
25
|
export { type LanguageMatch, type LanguageOptions, language, pickLanguage, } from "./language.js";
|
|
24
26
|
export { type LoggerOptions, logger, type RequestLogFields } from "./logger.js";
|
|
25
27
|
export { type MethodOverrideOptions, methodOverride } from "./method-override.js";
|
|
28
|
+
export { type MultipartBody, type MultipartHeadersInit, type MultipartPart, type MultipartResponseOptions, multipartResponse, } from "./multipart.js";
|
|
26
29
|
export { buildOpenApiDocument, type OpenApiInfo, type OpenApiOptions, type OpenApiServer, type OpenApiTag, type OpenApiUiOptions, openapi, type RouteLike, type SecurityRequirement, } from "./openapi.js";
|
|
27
30
|
export { type PoweredByOptions, poweredBy } from "./powered-by.js";
|
|
28
31
|
export { type PrettyJsonOptions, prettyJson } from "./pretty-json.js";
|
|
32
|
+
export { type ProblemDetailsOptions, problemDetails } from "./problem-details.js";
|
|
33
|
+
export { type ByteRange, type ByteRangeResult, parseByteRange, type RangeResponseOptions, rangeResponse, } from "./range.js";
|
|
29
34
|
export { MemoryStore, type MemoryStoreOptions, type RateLimitOptions, type RateLimitResult, type RateLimitStore, rateLimit, } from "./rate-limit.js";
|
|
30
35
|
export { type RequestIdOptions, requestId } from "./request-id.js";
|
|
31
36
|
export { type SecurityHeadersOptions, securityHeaders } from "./security-headers.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,SAAS,GACV,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,KAAK,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EACvB,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,KAAK,mBAAmB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,KAAK,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EACL,KAAK,0BAA0B,EAC/B,mBAAmB,GACpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,KAAK,iBAAiB,EACtB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,KAAK,WAAW,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EACL,KAAK,WAAW,EAChB,eAAe,EACf,IAAI,EACJ,eAAe,GAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,KAAK,qBAAqB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAAE,KAAK,WAAW,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,WAAW,EACX,sBAAsB,EACtB,KAAK,6BAA6B,GACnC,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,oBAAoB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9F,OAAO,EACL,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,GAAG,EACH,IAAI,EACJ,GAAG,EACH,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,SAAS,GACV,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,QAAQ,EACR,YAAY,GACb,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC/E,OAAO,EAAE,KAAK,qBAAqB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,iBAAiB,GAClB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,OAAO,EACP,KAAK,SAAS,EACd,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,KAAK,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,KAAK,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,KAAK,qBAAqB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EACL,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,cAAc,EACd,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,SAAS,GACV,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,KAAK,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,KAAK,sBAAsB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpF,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAChG,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,MAAM,EACN,KAAK,aAAa,EAClB,MAAM,GACP,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,iBAAiB,GAClB,MAAM,qBAAqB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -12,6 +12,8 @@ export { cache, MemoryResponseCache, responseCache, } from "./cache.js";
|
|
|
12
12
|
export { cacheControl } from "./cache-control.js";
|
|
13
13
|
export { combine, namedCombine } from "./combine.js";
|
|
14
14
|
export { compression } from "./compression.js";
|
|
15
|
+
export { conditionalResponse, } from "./conditional.js";
|
|
16
|
+
export { negotiateContentType, parseAcceptHeader, } from "./content-negotiation.js";
|
|
15
17
|
export { cors } from "./cors.js";
|
|
16
18
|
export { createCsrfToken, csrf, verifyCsrfToken, } from "./csrf.js";
|
|
17
19
|
export { durableCommand } from "./durable-command.js";
|
|
@@ -23,9 +25,12 @@ export { jwk, jwks, jwt, tryVerifyJwt, verifyJwt, } from "./jwt.js";
|
|
|
23
25
|
export { language, pickLanguage, } from "./language.js";
|
|
24
26
|
export { logger } from "./logger.js";
|
|
25
27
|
export { methodOverride } from "./method-override.js";
|
|
28
|
+
export { multipartResponse, } from "./multipart.js";
|
|
26
29
|
export { buildOpenApiDocument, openapi, } from "./openapi.js";
|
|
27
30
|
export { poweredBy } from "./powered-by.js";
|
|
28
31
|
export { prettyJson } from "./pretty-json.js";
|
|
32
|
+
export { problemDetails } from "./problem-details.js";
|
|
33
|
+
export { parseByteRange, rangeResponse, } from "./range.js";
|
|
29
34
|
export { MemoryStore, rateLimit, } from "./rate-limit.js";
|
|
30
35
|
export { requestId } from "./request-id.js";
|
|
31
36
|
export { securityHeaders } from "./security-headers.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAML,yBAAyB,EACzB,yBAAyB,GAI1B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAIL,SAAS,GACV,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAyB,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAGL,KAAK,EACL,mBAAmB,EAGnB,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAA4B,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAmB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAA2B,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAoB,IAAI,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAEL,eAAe,EACf,IAAI,EACJ,eAAe,GAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EAA8B,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAAoB,IAAI,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAA2B,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAKL,WAAW,EACX,sBAAsB,GAEvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAA6C,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9F,OAAO,EAUL,GAAG,EACH,IAAI,EACJ,GAAG,EACH,YAAY,EAIZ,SAAS,GACV,MAAM,UAAU,CAAA;AACjB,OAAO,EAGL,QAAQ,EACR,YAAY,GACb,MAAM,eAAe,CAAA;AACtB,OAAO,EAAsB,MAAM,EAAyB,MAAM,aAAa,CAAA;AAC/E,OAAO,EAA8B,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EACL,oBAAoB,EAMpB,OAAO,GAGR,MAAM,cAAc,CAAA;AACrB,OAAO,EAAyB,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAA0B,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EACL,WAAW,EAKX,SAAS,GACV,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAyB,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAA+B,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpF,OAAO,EAA8D,MAAM,EAAE,MAAM,aAAa,CAAA;AAChG,OAAO,EAIL,MAAM,EAEN,MAAM,GACP,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,mBAAmB,EAEnB,iBAAiB,GAClB,MAAM,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAML,yBAAyB,EACzB,yBAAyB,GAI1B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAIL,SAAS,GACV,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAyB,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAGL,KAAK,EACL,mBAAmB,EAGnB,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAA4B,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAmB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAA2B,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAEL,mBAAmB,GACpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAEL,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAoB,IAAI,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAEL,eAAe,EACf,IAAI,EACJ,eAAe,GAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EAA8B,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAAoB,IAAI,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAA2B,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAKL,WAAW,EACX,sBAAsB,GAEvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAA6C,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9F,OAAO,EAUL,GAAG,EACH,IAAI,EACJ,GAAG,EACH,YAAY,EAIZ,SAAS,GACV,MAAM,UAAU,CAAA;AACjB,OAAO,EAGL,QAAQ,EACR,YAAY,GACb,MAAM,eAAe,CAAA;AACtB,OAAO,EAAsB,MAAM,EAAyB,MAAM,aAAa,CAAA;AAC/E,OAAO,EAA8B,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAKL,iBAAiB,GAClB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,oBAAoB,EAMpB,OAAO,GAGR,MAAM,cAAc,CAAA;AACrB,OAAO,EAAyB,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAA0B,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAA8B,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAGL,cAAc,EAEd,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,WAAW,EAKX,SAAS,GACV,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAyB,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAA+B,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpF,OAAO,EAA8D,MAAM,EAAE,MAAM,aAAa,CAAA;AAChG,OAAO,EAIL,MAAM,EAEN,MAAM,GACP,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,mBAAmB,EAEnB,iBAAiB,GAClB,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type MultipartBody = string | Uint8Array | ArrayBuffer | ArrayBufferView | Blob | ReadableStream<Uint8Array>;
|
|
2
|
+
export type MultipartHeadersInit = Headers | Readonly<Record<string, string>> | ReadonlyArray<readonly [string, string]>;
|
|
3
|
+
export interface MultipartPart {
|
|
4
|
+
readonly headers?: MultipartHeadersInit;
|
|
5
|
+
readonly body: MultipartBody;
|
|
6
|
+
}
|
|
7
|
+
export interface MultipartResponseOptions {
|
|
8
|
+
/** Boundary token. If omitted, a cryptographically random boundary is generated. */
|
|
9
|
+
readonly boundary?: string;
|
|
10
|
+
/** Multipart subtype. Defaults to `mixed`; use `form-data` when parts carry form names. */
|
|
11
|
+
readonly subtype?: "mixed" | "form-data";
|
|
12
|
+
/** HTTP response status. Defaults to 200. */
|
|
13
|
+
readonly status?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Stream a multipart response without buffering the parts. The part headers and bodies are emitted
|
|
17
|
+
* as supplied; this helper deliberately does not persist, inspect, or serialize payloads.
|
|
18
|
+
*/
|
|
19
|
+
export declare function multipartResponse(parts: Iterable<MultipartPart> | AsyncIterable<MultipartPart>, options?: MultipartResponseOptions): Response;
|
|
20
|
+
//# sourceMappingURL=multipart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multipart.d.ts","sourceRoot":"","sources":["../src/multipart.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,UAAU,GACV,WAAW,GACX,eAAe,GACf,IAAI,GACJ,cAAc,CAAC,UAAU,CAAC,CAAA;AAE9B,MAAM,MAAM,oBAAoB,GAC5B,OAAO,GACP,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAChC,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAE5C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAuGD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC,aAAa,CAAC,EAC7D,OAAO,GAAE,wBAA6B,GACrC,QAAQ,CA8BV"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
const TEXT = new TextEncoder();
|
|
2
|
+
const BOUNDARY = /^[A-Za-z0-9'()+_,./:=? -]{1,70}$/;
|
|
3
|
+
function validateBoundary(value) {
|
|
4
|
+
if (!BOUNDARY.test(value) || value.endsWith(" ")) {
|
|
5
|
+
throw new TypeError("multipartResponse: boundary must be a valid RFC token");
|
|
6
|
+
}
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
function headersOf(init) {
|
|
10
|
+
const headers = new Headers();
|
|
11
|
+
if (init instanceof Headers) {
|
|
12
|
+
for (const [name, value] of init)
|
|
13
|
+
headers.set(name, value);
|
|
14
|
+
}
|
|
15
|
+
else if (Array.isArray(init)) {
|
|
16
|
+
for (const [name, value] of init)
|
|
17
|
+
headers.append(name, value);
|
|
18
|
+
}
|
|
19
|
+
else if (init !== undefined) {
|
|
20
|
+
for (const [name, value] of Object.entries(init))
|
|
21
|
+
headers.append(name, value);
|
|
22
|
+
}
|
|
23
|
+
for (const [name, value] of headers) {
|
|
24
|
+
if (hasHeaderControlCharacter(name) || hasHeaderControlCharacter(value)) {
|
|
25
|
+
throw new TypeError("multipartResponse: part headers cannot contain control characters");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return headers;
|
|
29
|
+
}
|
|
30
|
+
function hasHeaderControlCharacter(value) {
|
|
31
|
+
for (let index = 0; index < value.length; index++) {
|
|
32
|
+
const code = value.charCodeAt(index);
|
|
33
|
+
// HTAB is the only C0 control permitted in an HTTP field value. Reject the rest, including
|
|
34
|
+
// DEL, so a caller cannot smuggle non-printing bytes into a multipart header line.
|
|
35
|
+
if ((code <= 31 && code !== 9) || code === 127)
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
async function* bodyChunks(body, activeReader) {
|
|
41
|
+
if (typeof body === "string") {
|
|
42
|
+
yield TEXT.encode(body);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (body instanceof Uint8Array) {
|
|
46
|
+
yield body;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (body instanceof ArrayBuffer) {
|
|
50
|
+
yield new Uint8Array(body);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (ArrayBuffer.isView(body)) {
|
|
54
|
+
yield new Uint8Array(body.buffer, body.byteOffset, body.byteLength);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const stream = body instanceof Blob ? body.stream() : body;
|
|
58
|
+
const reader = stream.getReader();
|
|
59
|
+
activeReader.current = reader;
|
|
60
|
+
let completed = false;
|
|
61
|
+
try {
|
|
62
|
+
while (true) {
|
|
63
|
+
const result = await reader.read();
|
|
64
|
+
if (result.done) {
|
|
65
|
+
completed = true;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
yield result.value;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
if (activeReader.current === reader)
|
|
73
|
+
activeReader.current = undefined;
|
|
74
|
+
if (!completed)
|
|
75
|
+
await reader.cancel().catch(() => { });
|
|
76
|
+
reader.releaseLock();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function* encodeParts(parts, boundary, activeReader) {
|
|
80
|
+
for await (const part of parts) {
|
|
81
|
+
if (part === null || typeof part !== "object") {
|
|
82
|
+
throw new TypeError("multipartResponse: every part must be an object");
|
|
83
|
+
}
|
|
84
|
+
yield TEXT.encode(`--${boundary}\r\n`);
|
|
85
|
+
for (const [name, value] of headersOf(part.headers)) {
|
|
86
|
+
yield TEXT.encode(`${name}: ${value}\r\n`);
|
|
87
|
+
}
|
|
88
|
+
yield TEXT.encode("\r\n");
|
|
89
|
+
yield* bodyChunks(part.body, activeReader);
|
|
90
|
+
yield TEXT.encode("\r\n");
|
|
91
|
+
}
|
|
92
|
+
yield TEXT.encode(`--${boundary}--\r\n`);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Stream a multipart response without buffering the parts. The part headers and bodies are emitted
|
|
96
|
+
* as supplied; this helper deliberately does not persist, inspect, or serialize payloads.
|
|
97
|
+
*/
|
|
98
|
+
export function multipartResponse(parts, options = {}) {
|
|
99
|
+
const boundary = validateBoundary(options.boundary ?? `nifra-${crypto.randomUUID().replaceAll("-", "")}`);
|
|
100
|
+
const subtype = options.subtype ?? "mixed";
|
|
101
|
+
const activeReader = { current: undefined };
|
|
102
|
+
const iterator = encodeParts(parts, boundary, activeReader)[Symbol.asyncIterator]();
|
|
103
|
+
const stream = new ReadableStream({
|
|
104
|
+
async pull(controller) {
|
|
105
|
+
try {
|
|
106
|
+
const result = await iterator.next();
|
|
107
|
+
if (result.done)
|
|
108
|
+
controller.close();
|
|
109
|
+
else
|
|
110
|
+
controller.enqueue(result.value);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
const reader = activeReader.current;
|
|
114
|
+
if (reader !== undefined)
|
|
115
|
+
await reader.cancel(error).catch(() => { });
|
|
116
|
+
await iterator.return?.(error);
|
|
117
|
+
controller.error(error);
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
async cancel(reason) {
|
|
121
|
+
const reader = activeReader.current;
|
|
122
|
+
if (reader !== undefined)
|
|
123
|
+
await reader.cancel(reason).catch(() => { });
|
|
124
|
+
await iterator.return?.(reason);
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
return new Response(stream, {
|
|
128
|
+
status: options.status ?? 200,
|
|
129
|
+
headers: { "content-type": `multipart/${subtype}; boundary=${boundary}` },
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=multipart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multipart.js","sourceRoot":"","sources":["../src/multipart.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ProblemDetailsOptions {
|
|
2
|
+
/** Include only the request pathname as `instance`. Query strings are never included. Default false. */
|
|
3
|
+
readonly includeInstance?: boolean;
|
|
4
|
+
/** Prefix for code-specific problem types. Default `about:blank`. */
|
|
5
|
+
readonly typeBase?: string;
|
|
6
|
+
/** Maximum JSON error body inspected. Default 64 KiB. */
|
|
7
|
+
readonly maxBytes?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Opt-in RFC 9457 formatting for Nifra's structured error envelope.
|
|
11
|
+
*
|
|
12
|
+
* The default `{ ok: false, error }` response remains unchanged. This plugin only converts that
|
|
13
|
+
* framework envelope, so custom JSON errors and already-formatted problem documents pass through.
|
|
14
|
+
* Raw JSON error Responses are supported through a capped clone; encoded responses are never drained.
|
|
15
|
+
*/
|
|
16
|
+
export declare function problemDetails(options?: ProblemDetailsOptions): import("@nifrajs/core/server").NifraPlugin<import("@nifrajs/core/server").AnyServer, import("@nifrajs/core/server").AnyServer>;
|
|
17
|
+
//# sourceMappingURL=problem-details.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"problem-details.d.ts","sourceRoot":"","sources":["../src/problem-details.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,qBAAqB;IACpC,wGAAwG;IACxG,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAA;IAClC,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AA+FD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,kIAqEjE"}
|