@daloyjs/core 0.30.0 → 0.34.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 +14 -1
- package/bin/daloy.mjs +0 -0
- package/dist/adapters/bun.d.ts.map +1 -1
- package/dist/adapters/bun.js +5 -1
- package/dist/adapters/bun.js.map +1 -1
- package/dist/adapters/node.d.ts.map +1 -1
- package/dist/adapters/node.js +7 -2
- package/dist/adapters/node.js.map +1 -1
- package/dist/app.d.ts +47 -36
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +229 -59
- package/dist/app.js.map +1 -1
- package/dist/banner.d.ts +2 -0
- package/dist/banner.d.ts.map +1 -1
- package/dist/banner.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +29 -31
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +10 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/compression.d.ts +2 -2
- package/dist/compression.js +2 -2
- package/dist/config.d.ts +2 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/conn-info.d.ts +5 -5
- package/dist/conn-info.js +4 -4
- package/dist/contract.d.ts +19 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +10 -0
- package/dist/contract.js.map +1 -1
- package/dist/cookie.d.ts +15 -1
- package/dist/cookie.d.ts.map +1 -1
- package/dist/cookie.js +24 -4
- package/dist/cookie.js.map +1 -1
- package/dist/dependency.d.ts +1 -1
- package/dist/dependency.js +1 -1
- package/dist/discriminator.d.ts +9 -0
- package/dist/discriminator.d.ts.map +1 -1
- package/dist/discriminator.js.map +1 -1
- package/dist/docs.d.ts +49 -2
- package/dist/docs.d.ts.map +1 -1
- package/dist/docs.js +26 -2
- package/dist/docs.js.map +1 -1
- package/dist/errors.d.ts +89 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +148 -7
- package/dist/errors.js.map +1 -1
- package/dist/etag.d.ts +1 -1
- package/dist/etag.js +1 -1
- package/dist/fetch-guard.d.ts +163 -0
- package/dist/fetch-guard.d.ts.map +1 -0
- package/dist/fetch-guard.js +265 -0
- package/dist/fetch-guard.js.map +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/ip-restriction.d.ts +17 -0
- package/dist/ip-restriction.d.ts.map +1 -1
- package/dist/ip-restriction.js +6 -3
- package/dist/ip-restriction.js.map +1 -1
- package/dist/jwk.d.ts +1 -1
- package/dist/jwk.d.ts.map +1 -1
- package/dist/jwk.js +3 -3
- package/dist/jwt.d.ts +3 -3
- package/dist/jwt.d.ts.map +1 -1
- package/dist/jwt.js +19 -7
- package/dist/jwt.js.map +1 -1
- package/dist/load-shedding.d.ts +1 -1
- package/dist/load-shedding.js +1 -1
- package/dist/logger.d.ts +14 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +66 -4
- package/dist/logger.js.map +1 -1
- package/dist/middleware.d.ts +40 -15
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +18 -14
- package/dist/middleware.js.map +1 -1
- package/dist/multipart.d.ts +22 -0
- package/dist/multipart.d.ts.map +1 -1
- package/dist/multipart.js +69 -0
- package/dist/multipart.js.map +1 -1
- package/dist/openapi.d.ts +13 -0
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +5 -0
- package/dist/openapi.js.map +1 -1
- package/dist/router.d.ts +9 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +6 -0
- package/dist/router.js.map +1 -1
- package/dist/sbom.cdx.json +60 -0
- package/dist/sbom.spdx.json +42 -0
- package/dist/security-schemes.d.ts +29 -0
- package/dist/security-schemes.d.ts.map +1 -1
- package/dist/security-schemes.js +11 -0
- package/dist/security-schemes.js.map +1 -1
- package/dist/security.d.ts +53 -2
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +67 -2
- package/dist/security.js.map +1 -1
- package/dist/session.d.ts +4 -2
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +2 -2
- package/dist/session.js.map +1 -1
- package/dist/streaming.d.ts +8 -0
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js.map +1 -1
- package/dist/subdomains.d.ts +1 -1
- package/dist/subdomains.js +1 -1
- package/dist/time-claims.d.ts +1 -2
- package/dist/time-claims.d.ts.map +1 -1
- package/dist/time-claims.js +1 -2
- package/dist/time-claims.js.map +1 -1
- package/dist/tracing.d.ts +10 -0
- package/dist/tracing.d.ts.map +1 -1
- package/dist/tracing.js +5 -0
- package/dist/tracing.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/websocket.d.ts +87 -0
- package/dist/websocket.d.ts.map +1 -1
- package/dist/websocket.js +81 -0
- package/dist/websocket.js.map +1 -1
- package/package.json +31 -10
package/dist/docs.d.ts
CHANGED
|
@@ -1,16 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Built-in API documentation handlers.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* `specUrl` from a CDN. No build step,
|
|
4
|
+
* Scalar and Swagger UI helpers serve a single HTML page that loads the spec
|
|
5
|
+
* at `specUrl` and fetches UI assets from a CDN by default. No build step,
|
|
6
|
+
* no extra deps.
|
|
6
7
|
*
|
|
7
8
|
* (You can self-host the assets if your CSP forbids CDNs.)
|
|
8
9
|
*/
|
|
10
|
+
/** JSON primitive accepted by {@link ScalarReferenceConfiguration}. */
|
|
9
11
|
export type ScalarJsonPrimitive = string | number | boolean | null;
|
|
12
|
+
/** Recursive JSON value accepted by Scalar configuration fields. */
|
|
10
13
|
export type ScalarJsonValue = ScalarJsonPrimitive | ScalarJsonValue[] | {
|
|
11
14
|
[key: string]: ScalarJsonValue | undefined;
|
|
12
15
|
};
|
|
16
|
+
/** Built-in Scalar API Reference color theme names. */
|
|
13
17
|
export type ScalarTheme = "alternate" | "default" | "moon" | "purple" | "solarized" | "bluePlanet" | "saturn" | "kepler" | "mars" | "deepSpace" | "laserwave" | "none";
|
|
18
|
+
/**
|
|
19
|
+
* Subset of Scalar API Reference configuration safe to serialize from the
|
|
20
|
+
* server (function callbacks and inline `spec` are intentionally excluded).
|
|
21
|
+
*
|
|
22
|
+
* Forwarded verbatim as the `data-configuration` attribute on the Scalar
|
|
23
|
+
* script tag.
|
|
24
|
+
*/
|
|
14
25
|
export interface ScalarReferenceConfiguration {
|
|
15
26
|
[key: string]: ScalarJsonValue | undefined;
|
|
16
27
|
theme?: ScalarTheme;
|
|
@@ -81,29 +92,65 @@ export interface ScalarReferenceConfiguration {
|
|
|
81
92
|
spec?: never;
|
|
82
93
|
url?: never;
|
|
83
94
|
}
|
|
95
|
+
/** Shared options for {@link scalarHtml} and {@link swaggerUiHtml}. */
|
|
84
96
|
export interface DocsOptions {
|
|
97
|
+
/** Absolute or relative URL of the OpenAPI document to render. */
|
|
85
98
|
specUrl: string;
|
|
99
|
+
/** `<title>` of the generated HTML page. */
|
|
86
100
|
title?: string;
|
|
101
|
+
/** Override CDN URLs for the docs UI assets (useful for self-hosting). */
|
|
87
102
|
assets?: {
|
|
88
103
|
scalarScriptUrl?: string;
|
|
89
104
|
swaggerUiCssUrl?: string;
|
|
90
105
|
swaggerUiBundleUrl?: string;
|
|
91
106
|
};
|
|
107
|
+
/** CSP `nonce` to apply to inline/script tags; must match the response CSP. */
|
|
92
108
|
scriptNonce?: string;
|
|
93
109
|
}
|
|
110
|
+
/** Options for {@link scalarHtml}; adds Scalar-specific UI configuration. */
|
|
94
111
|
export interface ScalarHtmlOptions extends DocsOptions {
|
|
112
|
+
/** Forwarded to the Scalar `<script id="api-reference">` tag. */
|
|
95
113
|
configuration?: ScalarReferenceConfiguration;
|
|
96
114
|
}
|
|
115
|
+
/** Options for {@link docsContentSecurityPolicy}. */
|
|
97
116
|
export interface DocsContentSecurityPolicyOptions {
|
|
117
|
+
/** Extra origins to allow for `script-src` / `style-src` (defaults to jsDelivr). */
|
|
98
118
|
assetOrigins?: string[];
|
|
119
|
+
/** When set, allows nonce-protected inline scripts instead of `'unsafe-inline'`. */
|
|
99
120
|
scriptNonce?: string;
|
|
121
|
+
/** When `false`, omits `'unsafe-inline'` from `style-src`. Defaults to `true`. */
|
|
100
122
|
allowInlineStyles?: boolean;
|
|
101
123
|
}
|
|
124
|
+
/** Options for {@link htmlResponse}. */
|
|
102
125
|
export interface HtmlResponseOptions extends DocsContentSecurityPolicyOptions {
|
|
126
|
+
/** Override the computed `content-security-policy` header verbatim. */
|
|
103
127
|
contentSecurityPolicy?: string;
|
|
104
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Render a Scalar API Reference HTML page that loads `opts.specUrl`.
|
|
131
|
+
*
|
|
132
|
+
* The output is a single HTML document with configurable external assets;
|
|
133
|
+
* pair it with {@link htmlResponse} (or your own `Response`) and serve from
|
|
134
|
+
* any route.
|
|
135
|
+
*/
|
|
105
136
|
export declare function scalarHtml(opts: ScalarHtmlOptions): string;
|
|
137
|
+
/**
|
|
138
|
+
* Render a Swagger UI HTML page that loads `opts.specUrl`. Same usage as
|
|
139
|
+
* {@link scalarHtml} but emits the classic Swagger UI bundle.
|
|
140
|
+
*/
|
|
106
141
|
export declare function swaggerUiHtml(opts: DocsOptions): string;
|
|
142
|
+
/**
|
|
143
|
+
* Build a Content-Security-Policy string compatible with the docs HTML
|
|
144
|
+
* produced by {@link scalarHtml} / {@link swaggerUiHtml}.
|
|
145
|
+
*
|
|
146
|
+
* Allows `'self'` plus the listed `assetOrigins` (default: jsDelivr) and
|
|
147
|
+
* either `'unsafe-inline'` or the provided `scriptNonce` for scripts.
|
|
148
|
+
*/
|
|
107
149
|
export declare function docsContentSecurityPolicy(opts?: DocsContentSecurityPolicyOptions): string;
|
|
150
|
+
/**
|
|
151
|
+
* Wrap a docs HTML string in a `Response` with safe defaults:
|
|
152
|
+
* `text/html` content type, `nosniff`, `no-referrer`, and a CSP from
|
|
153
|
+
* {@link docsContentSecurityPolicy} (or a caller-supplied override).
|
|
154
|
+
*/
|
|
108
155
|
export declare function htmlResponse(html: string, opts?: HtmlResponseOptions): Response;
|
|
109
156
|
//# sourceMappingURL=docs.d.ts.map
|
package/dist/docs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"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"}
|
package/dist/docs.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Built-in API documentation handlers.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* `specUrl` from a CDN. No build step,
|
|
4
|
+
* Scalar and Swagger UI helpers serve a single HTML page that loads the spec
|
|
5
|
+
* at `specUrl` and fetches UI assets from a CDN by default. No build step,
|
|
6
|
+
* no extra deps.
|
|
6
7
|
*
|
|
7
8
|
* (You can self-host the assets if your CSP forbids CDNs.)
|
|
8
9
|
*/
|
|
@@ -10,6 +11,13 @@ const JSDELIVR_ORIGIN = "https://cdn.jsdelivr.net";
|
|
|
10
11
|
function nonceAttr(nonce) {
|
|
11
12
|
return nonce ? ` nonce="${escapeHtml(nonce)}"` : "";
|
|
12
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Render a Scalar API Reference HTML page that loads `opts.specUrl`.
|
|
16
|
+
*
|
|
17
|
+
* The output is a single HTML document with configurable external assets;
|
|
18
|
+
* pair it with {@link htmlResponse} (or your own `Response`) and serve from
|
|
19
|
+
* any route.
|
|
20
|
+
*/
|
|
13
21
|
export function scalarHtml(opts) {
|
|
14
22
|
const title = escapeHtml(opts.title ?? "API Reference");
|
|
15
23
|
const url = escapeHtml(opts.specUrl);
|
|
@@ -27,6 +35,10 @@ export function scalarHtml(opts) {
|
|
|
27
35
|
<script src="${scriptUrl}"${nonce}></script>
|
|
28
36
|
</body></html>`;
|
|
29
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Render a Swagger UI HTML page that loads `opts.specUrl`. Same usage as
|
|
40
|
+
* {@link scalarHtml} but emits the classic Swagger UI bundle.
|
|
41
|
+
*/
|
|
30
42
|
export function swaggerUiHtml(opts) {
|
|
31
43
|
const title = escapeHtml(opts.title ?? "API Docs");
|
|
32
44
|
const url = escapeHtml(opts.specUrl);
|
|
@@ -47,6 +59,13 @@ export function swaggerUiHtml(opts) {
|
|
|
47
59
|
<script${nonce}>window.onload=()=>SwaggerUIBundle({url:"${url}",dom_id:"#swagger"});</script>
|
|
48
60
|
</body></html>`;
|
|
49
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Build a Content-Security-Policy string compatible with the docs HTML
|
|
64
|
+
* produced by {@link scalarHtml} / {@link swaggerUiHtml}.
|
|
65
|
+
*
|
|
66
|
+
* Allows `'self'` plus the listed `assetOrigins` (default: jsDelivr) and
|
|
67
|
+
* either `'unsafe-inline'` or the provided `scriptNonce` for scripts.
|
|
68
|
+
*/
|
|
50
69
|
export function docsContentSecurityPolicy(opts = {}) {
|
|
51
70
|
const assetOrigins = opts.assetOrigins ?? [JSDELIVR_ORIGIN];
|
|
52
71
|
const scriptSrc = ["'self'", ...assetOrigins];
|
|
@@ -65,6 +84,11 @@ export function docsContentSecurityPolicy(opts = {}) {
|
|
|
65
84
|
"connect-src 'self'",
|
|
66
85
|
].join("; ");
|
|
67
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Wrap a docs HTML string in a `Response` with safe defaults:
|
|
89
|
+
* `text/html` content type, `nosniff`, `no-referrer`, and a CSP from
|
|
90
|
+
* {@link docsContentSecurityPolicy} (or a caller-supplied override).
|
|
91
|
+
*/
|
|
68
92
|
export function htmlResponse(html, opts = {}) {
|
|
69
93
|
return new Response(html, {
|
|
70
94
|
headers: {
|
package/dist/docs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -49,7 +49,96 @@ export interface ProblemRenderOptions {
|
|
|
49
49
|
production?: boolean;
|
|
50
50
|
/** Request id stamped into `instance` as `urn:request:<id>` for log correlation. */
|
|
51
51
|
requestId?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Extra response headers (typically `ctx.set.headers`) to merge
|
|
54
|
+
* onto the rendered problem response so per-request state (CSRF rotation,
|
|
55
|
+
* session renewal, request-id, secure-headers) is not lost when a handler
|
|
56
|
+
* throws an {@link HttpError}. Existing headers baked into the error
|
|
57
|
+
* (e.g. `cache-control: no-store` on `UnauthorizedError`) win over the
|
|
58
|
+
* supplied set — they were declared by the error class for a reason and
|
|
59
|
+
* are not overridable by ad-hoc Context state.
|
|
60
|
+
*
|
|
61
|
+
* @since 0.32.0
|
|
62
|
+
*/
|
|
63
|
+
contextHeaders?: Headers | HeadersInit;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Headers that are safe to attach to a custom error response
|
|
67
|
+
* (typically a `WWW-Authenticate` challenge built by an auth helper). Any
|
|
68
|
+
* header outside this allowlist on a custom response would leak state from
|
|
69
|
+
* the request scope into a generic error response and is refused at
|
|
70
|
+
* construction time by {@link httpError}.
|
|
71
|
+
*
|
|
72
|
+
* @since 0.32.0
|
|
73
|
+
*/
|
|
74
|
+
export declare const SAFE_CUSTOM_ERROR_RESPONSE_HEADERS: ReadonlySet<string>;
|
|
75
|
+
/**
|
|
76
|
+
* Thrown when {@link httpError} is asked to attach a custom
|
|
77
|
+
* `Response` whose headers would leak request-scoped state (cookies,
|
|
78
|
+
* caching directives other than `no-store` / `no-cache`, server-timing,
|
|
79
|
+
* `X-*-Token` debug headers) into the error response.
|
|
80
|
+
*
|
|
81
|
+
* @since 0.32.0
|
|
82
|
+
*/
|
|
83
|
+
export declare class MessageLeakError extends Error {
|
|
84
|
+
readonly offendingHeaders: ReadonlyArray<{
|
|
85
|
+
name: string;
|
|
86
|
+
reason: string;
|
|
87
|
+
}>;
|
|
88
|
+
constructor(offendingHeaders: ReadonlyArray<{
|
|
89
|
+
name: string;
|
|
90
|
+
reason: string;
|
|
91
|
+
}>);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* @internal — header-safety check applied by {@link httpError} when a custom
|
|
95
|
+
* `res` is supplied. Exported for audits and tests.
|
|
96
|
+
*/
|
|
97
|
+
export declare function checkCustomErrorResponseHeaders(headers: Headers): Array<{
|
|
98
|
+
name: string;
|
|
99
|
+
reason: string;
|
|
100
|
+
}>;
|
|
101
|
+
/**
|
|
102
|
+
* Factory for constructing an {@link HttpError} with an optional
|
|
103
|
+
* custom `res` (typically a `WWW-Authenticate` challenge). Refuses-at-
|
|
104
|
+
* construction in production under `secureDefaults` when the custom
|
|
105
|
+
* response carries headers that would leak request-scoped state — see
|
|
106
|
+
* {@link SAFE_CUSTOM_ERROR_RESPONSE_HEADERS} and {@link MessageLeakError}.
|
|
107
|
+
*
|
|
108
|
+
* @since 0.32.0
|
|
109
|
+
*/
|
|
110
|
+
export interface HttpErrorOptions {
|
|
111
|
+
status: number;
|
|
112
|
+
problem: Partial<ProblemDetails> & {
|
|
113
|
+
title: string;
|
|
114
|
+
};
|
|
115
|
+
/** Plain headers merged onto the rendered response. */
|
|
116
|
+
headers?: Record<string, string>;
|
|
117
|
+
/**
|
|
118
|
+
* Custom `Response` providing additional headers (typically a
|
|
119
|
+
* `WWW-Authenticate` challenge). Body is ignored; only headers are
|
|
120
|
+
* extracted. Headers are validated against the safe allowlist.
|
|
121
|
+
*/
|
|
122
|
+
res?: Response;
|
|
123
|
+
/**
|
|
124
|
+
* Override the production check. Defaults to
|
|
125
|
+
* `process.env.NODE_ENV === "production"`.
|
|
126
|
+
*/
|
|
127
|
+
production?: boolean;
|
|
128
|
+
/**
|
|
129
|
+
* Override the secureDefaults check. Defaults to `true`. The refuse-at-
|
|
130
|
+
* construction behavior only activates when `production && secureDefaults`
|
|
131
|
+
* are both true.
|
|
132
|
+
*/
|
|
133
|
+
secureDefaults?: boolean;
|
|
52
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Build an {@link HttpError} with optional safe-header extraction from a
|
|
137
|
+
* custom `Response`. See {@link HttpErrorOptions}.
|
|
138
|
+
*
|
|
139
|
+
* @since 0.32.0
|
|
140
|
+
*/
|
|
141
|
+
export declare function httpError(opts: HttpErrorOptions): HttpError;
|
|
53
142
|
/**
|
|
54
143
|
* Base class for every DaloyJS HTTP error.
|
|
55
144
|
*
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,oDAAoD;IACpD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,8FAA8F;IAC9F,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
CHANGED
|
@@ -8,6 +8,132 @@
|
|
|
8
8
|
* Production-mode rendering scrubs `detail` for 5xx responses so internal
|
|
9
9
|
* messages never leak to clients (security: information disclosure).
|
|
10
10
|
*/
|
|
11
|
+
/**
|
|
12
|
+
* Headers that are safe to attach to a custom error response
|
|
13
|
+
* (typically a `WWW-Authenticate` challenge built by an auth helper). Any
|
|
14
|
+
* header outside this allowlist on a custom response would leak state from
|
|
15
|
+
* the request scope into a generic error response and is refused at
|
|
16
|
+
* construction time by {@link httpError}.
|
|
17
|
+
*
|
|
18
|
+
* @since 0.32.0
|
|
19
|
+
*/
|
|
20
|
+
export const SAFE_CUSTOM_ERROR_RESPONSE_HEADERS = new Set([
|
|
21
|
+
"www-authenticate",
|
|
22
|
+
"proxy-authenticate",
|
|
23
|
+
"retry-after",
|
|
24
|
+
"content-type",
|
|
25
|
+
"content-language",
|
|
26
|
+
"content-length",
|
|
27
|
+
// `cache-control` is allowed only when its value is `no-store` or
|
|
28
|
+
// `no-cache`; that constraint is enforced in the check itself.
|
|
29
|
+
"cache-control",
|
|
30
|
+
]);
|
|
31
|
+
/**
|
|
32
|
+
* Thrown when {@link httpError} is asked to attach a custom
|
|
33
|
+
* `Response` whose headers would leak request-scoped state (cookies,
|
|
34
|
+
* caching directives other than `no-store` / `no-cache`, server-timing,
|
|
35
|
+
* `X-*-Token` debug headers) into the error response.
|
|
36
|
+
*
|
|
37
|
+
* @since 0.32.0
|
|
38
|
+
*/
|
|
39
|
+
export class MessageLeakError extends Error {
|
|
40
|
+
offendingHeaders;
|
|
41
|
+
constructor(offendingHeaders) {
|
|
42
|
+
const summary = offendingHeaders
|
|
43
|
+
.map((h) => `${h.name} (${h.reason})`)
|
|
44
|
+
.join(", ");
|
|
45
|
+
super(`httpError({ res }): custom error response carries disallowed header(s): ${summary}. ` +
|
|
46
|
+
"Only WWW-Authenticate, Proxy-Authenticate, Retry-After, Content-Type, " +
|
|
47
|
+
"Content-Language, Content-Length, and Cache-Control (no-store|no-cache) " +
|
|
48
|
+
"are permitted on a custom error response.");
|
|
49
|
+
this.name = "MessageLeakError";
|
|
50
|
+
this.offendingHeaders = offendingHeaders;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @internal — header-safety check applied by {@link httpError} when a custom
|
|
55
|
+
* `res` is supplied. Exported for audits and tests.
|
|
56
|
+
*/
|
|
57
|
+
export function checkCustomErrorResponseHeaders(headers) {
|
|
58
|
+
const offending = [];
|
|
59
|
+
headers.forEach((value, name) => {
|
|
60
|
+
const lower = name.toLowerCase();
|
|
61
|
+
if (lower === "cache-control") {
|
|
62
|
+
const token = value.trim().toLowerCase();
|
|
63
|
+
if (token !== "no-store" && token !== "no-cache") {
|
|
64
|
+
offending.push({
|
|
65
|
+
name,
|
|
66
|
+
reason: `cache-control must be "no-store" or "no-cache"; got ${JSON.stringify(value)}`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (lower === "set-cookie" || lower === "set-cookie2") {
|
|
72
|
+
offending.push({ name, reason: "cookies are not permitted on a generic error response" });
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (lower === "server-timing") {
|
|
76
|
+
offending.push({ name, reason: "Server-Timing is a side-channel leak in error responses" });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (lower.startsWith("x-") && lower.endsWith("-token")) {
|
|
80
|
+
offending.push({ name, reason: "X-*-Token headers are request-scoped" });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (!SAFE_CUSTOM_ERROR_RESPONSE_HEADERS.has(lower)) {
|
|
84
|
+
offending.push({ name, reason: "not in the safe-custom-error-response allowlist" });
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
return offending;
|
|
88
|
+
}
|
|
89
|
+
function defaultIsProduction() {
|
|
90
|
+
return typeof process !== "undefined" && process.env?.NODE_ENV === "production";
|
|
91
|
+
}
|
|
92
|
+
function defaultSecureDefaults() {
|
|
93
|
+
// Mirrors App({ secureDefaults: true }) — on unless explicitly opted out.
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
function isSafeCustomErrorHeaderValue(name, value) {
|
|
97
|
+
const lower = name.toLowerCase();
|
|
98
|
+
return (SAFE_CUSTOM_ERROR_RESPONSE_HEADERS.has(lower) &&
|
|
99
|
+
!(lower === "cache-control" &&
|
|
100
|
+
value.trim().toLowerCase() !== "no-store" &&
|
|
101
|
+
value.trim().toLowerCase() !== "no-cache"));
|
|
102
|
+
}
|
|
103
|
+
function shouldCopyCustomErrorHeader(name, value) {
|
|
104
|
+
if (!isSafeCustomErrorHeaderValue(name, value))
|
|
105
|
+
return false;
|
|
106
|
+
// The custom Response body is intentionally ignored by httpError({ res });
|
|
107
|
+
// forwarding its Content-Length would describe the wrong problem+json body.
|
|
108
|
+
return name.toLowerCase() !== "content-length";
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Build an {@link HttpError} with optional safe-header extraction from a
|
|
112
|
+
* custom `Response`. See {@link HttpErrorOptions}.
|
|
113
|
+
*
|
|
114
|
+
* @since 0.32.0
|
|
115
|
+
*/
|
|
116
|
+
export function httpError(opts) {
|
|
117
|
+
const headers = new Headers(opts.headers);
|
|
118
|
+
if (opts.res) {
|
|
119
|
+
const isProd = opts.production ?? defaultIsProduction();
|
|
120
|
+
const secureDefaults = opts.secureDefaults ?? defaultSecureDefaults();
|
|
121
|
+
const offending = checkCustomErrorResponseHeaders(opts.res.headers);
|
|
122
|
+
if (isProd && secureDefaults && offending.length > 0) {
|
|
123
|
+
throw new MessageLeakError(offending);
|
|
124
|
+
}
|
|
125
|
+
opts.res.headers.forEach((value, name) => {
|
|
126
|
+
// Allow the safe headers through; disallowed ones are dropped in
|
|
127
|
+
// non-secureDefaults / dev contexts after a check-only pass.
|
|
128
|
+
if (shouldCopyCustomErrorHeader(name, value)) {
|
|
129
|
+
// Don't overwrite caller-supplied headers.
|
|
130
|
+
if (!headers.has(name))
|
|
131
|
+
headers.set(name, value);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return new HttpError(opts.status, opts.problem, Object.fromEntries(headers.entries()));
|
|
136
|
+
}
|
|
11
137
|
/**
|
|
12
138
|
* Base class for every DaloyJS HTTP error.
|
|
13
139
|
*
|
|
@@ -75,10 +201,25 @@ export class HttpError extends Error {
|
|
|
75
201
|
}
|
|
76
202
|
if (opts.requestId)
|
|
77
203
|
out.instance = `urn:request:${opts.requestId}`;
|
|
78
|
-
const headers = {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
204
|
+
const headers = new Headers({ "content-type": "application/problem+json" });
|
|
205
|
+
for (const [name, value] of Object.entries(this.headers ?? {})) {
|
|
206
|
+
headers.set(name, value);
|
|
207
|
+
}
|
|
208
|
+
// Merge Context.set.headers (CSRF rotation, session renewal,
|
|
209
|
+
// request-id, secureHeaders output) without overriding headers the
|
|
210
|
+
// error class baked in (e.g. `cache-control: no-store` on auth
|
|
211
|
+
// failures). The framework already merges these at the dispatch
|
|
212
|
+
// boundary; this branch lets direct callers (custom `onError` hooks,
|
|
213
|
+
// tests) get the same behavior.
|
|
214
|
+
if (opts.contextHeaders) {
|
|
215
|
+
const ctxHeaders = opts.contextHeaders instanceof Headers
|
|
216
|
+
? opts.contextHeaders
|
|
217
|
+
: new Headers(opts.contextHeaders);
|
|
218
|
+
ctxHeaders.forEach((value, name) => {
|
|
219
|
+
if (!headers.has(name))
|
|
220
|
+
headers.set(name, value);
|
|
221
|
+
});
|
|
222
|
+
}
|
|
82
223
|
return new Response(JSON.stringify(out), { status: this.status, headers });
|
|
83
224
|
}
|
|
84
225
|
}
|
|
@@ -160,7 +301,7 @@ export class UnauthorizedError extends HttpError {
|
|
|
160
301
|
title: "Unauthorized",
|
|
161
302
|
...(detail ? { detail } : {}),
|
|
162
303
|
},
|
|
163
|
-
//
|
|
304
|
+
// Auth-failure responses must never be cached. `no-store`
|
|
164
305
|
// already forbids both shared and private caches per RFC 9111 §5.2.2.5.
|
|
165
306
|
{ "cache-control": "no-store" });
|
|
166
307
|
this.name = "UnauthorizedError";
|
|
@@ -181,7 +322,7 @@ export class ForbiddenError extends HttpError {
|
|
|
181
322
|
title: "Forbidden",
|
|
182
323
|
...(detail ? { detail } : {}),
|
|
183
324
|
},
|
|
184
|
-
//
|
|
325
|
+
// Authorization-failure responses must never be cached.
|
|
185
326
|
{ "cache-control": "no-store" });
|
|
186
327
|
this.name = "ForbiddenError";
|
|
187
328
|
}
|
|
@@ -257,7 +398,7 @@ export class TooManyRequestsError extends HttpError {
|
|
|
257
398
|
type: "https://daloyjs.dev/errors/too-many-requests",
|
|
258
399
|
title: "Too Many Requests",
|
|
259
400
|
},
|
|
260
|
-
//
|
|
401
|
+
// Rate-limit responses must never be cached so a 429 from a
|
|
261
402
|
// private cache cannot extend the throttle window past `Retry-After`.
|
|
262
403
|
retryAfterSeconds !== undefined
|
|
263
404
|
? { "retry-after": String(retryAfterSeconds), "cache-control": "no-store" }
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/etag.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* First-party `etag()` helper with strong-validation default.
|
|
3
3
|
*
|
|
4
4
|
* Automatically computes a SHA-1 strong ETag for successful `GET` / `HEAD`
|
|
5
5
|
* responses, responds `304 Not Modified` on a matching `If-None-Match`, and
|
package/dist/etag.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* First-party `etag()` helper with strong-validation default.
|
|
3
3
|
*
|
|
4
4
|
* Automatically computes a SHA-1 strong ETag for successful `GET` / `HEAD`
|
|
5
5
|
* responses, responds `304 Not Modified` on a matching `If-None-Match`, and
|