@daloyjs/core 0.17.0 → 0.28.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 +3 -3
- package/dist/adapters/bun.d.ts.map +1 -1
- package/dist/adapters/bun.js +38 -7
- package/dist/adapters/bun.js.map +1 -1
- package/dist/adapters/node.d.ts.map +1 -1
- package/dist/adapters/node.js +29 -7
- package/dist/adapters/node.js.map +1 -1
- package/dist/app.d.ts +322 -3
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +715 -29
- package/dist/app.js.map +1 -1
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +218 -1
- package/dist/cli.js.map +1 -1
- package/dist/combine.d.ts +97 -0
- package/dist/combine.d.ts.map +1 -0
- package/dist/combine.js +247 -0
- package/dist/combine.js.map +1 -0
- package/dist/compression.d.ts +127 -0
- package/dist/compression.d.ts.map +1 -0
- package/dist/compression.js +368 -0
- package/dist/compression.js.map +1 -0
- package/dist/config.d.ts +97 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +132 -0
- package/dist/config.js.map +1 -0
- package/dist/conn-info.d.ts +121 -0
- package/dist/conn-info.d.ts.map +1 -0
- package/dist/conn-info.js +145 -0
- package/dist/conn-info.js.map +1 -0
- package/dist/cookie.d.ts +112 -0
- package/dist/cookie.d.ts.map +1 -0
- package/dist/cookie.js +185 -0
- package/dist/cookie.js.map +1 -0
- package/dist/dependency.d.ts +47 -0
- package/dist/dependency.d.ts.map +1 -0
- package/dist/dependency.js +68 -0
- package/dist/dependency.js.map +1 -0
- package/dist/etag.d.ts +48 -0
- package/dist/etag.d.ts.map +1 -0
- package/dist/etag.js +117 -0
- package/dist/etag.js.map +1 -0
- package/dist/index.d.ts +40 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -4
- package/dist/index.js.map +1 -1
- package/dist/ip-restriction.d.ts +75 -0
- package/dist/ip-restriction.d.ts.map +1 -0
- package/dist/ip-restriction.js +203 -0
- package/dist/ip-restriction.js.map +1 -0
- package/dist/jwk.d.ts +82 -0
- package/dist/jwk.d.ts.map +1 -0
- package/dist/jwk.js +269 -0
- package/dist/jwk.js.map +1 -0
- package/dist/jwt.d.ts +103 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +437 -0
- package/dist/jwt.js.map +1 -0
- package/dist/load-shedding.d.ts +73 -0
- package/dist/load-shedding.d.ts.map +1 -0
- package/dist/load-shedding.js +171 -0
- package/dist/load-shedding.js.map +1 -0
- package/dist/middleware.d.ts +181 -2
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +367 -77
- package/dist/middleware.js.map +1 -1
- package/dist/multipart.d.ts +17 -0
- package/dist/multipart.d.ts.map +1 -1
- package/dist/multipart.js +117 -1
- package/dist/multipart.js.map +1 -1
- package/dist/openapi.d.ts +8 -0
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +18 -1
- package/dist/openapi.js.map +1 -1
- package/dist/security-schemes.d.ts +21 -5
- package/dist/security-schemes.d.ts.map +1 -1
- package/dist/security-schemes.js +32 -5
- package/dist/security-schemes.js.map +1 -1
- package/dist/session.d.ts +23 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +106 -86
- package/dist/session.js.map +1 -1
- package/dist/subdomains.d.ts +97 -0
- package/dist/subdomains.d.ts.map +1 -0
- package/dist/subdomains.js +157 -0
- package/dist/subdomains.js.map +1 -0
- package/dist/time-claims.d.ts +72 -0
- package/dist/time-claims.d.ts.map +1 -0
- package/dist/time-claims.js +88 -0
- package/dist/time-claims.js.map +1 -0
- package/dist/types.d.ts +50 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/websocket.d.ts +51 -34
- package/dist/websocket.d.ts.map +1 -1
- package/dist/websocket.js +162 -2
- package/dist/websocket.js.map +1 -1
- package/package.json +30 -3
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PSL-aware `subdomains()` helper (Wave 6 item 6).
|
|
3
|
+
*
|
|
4
|
+
* Splits a hostname into its registrable base + the subdomain labels above
|
|
5
|
+
* it, using a bundled Public Suffix List snapshot. The helper refuses to
|
|
6
|
+
* read a stale PSL snapshot (`> 90 days` since `PSL_SNAPSHOT_DATE`) in
|
|
7
|
+
* production so adjacent-tenant infrastructure names like `*.s3.amazonaws.com`,
|
|
8
|
+
* `*.github.io`, `*.vercel.app`, `*.workers.dev`, and every
|
|
9
|
+
* preview-deploy environment are split correctly instead of being treated
|
|
10
|
+
* as siblings under the same registrable domain.
|
|
11
|
+
*
|
|
12
|
+
* @since 0.24.0
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* ISO date the bundled PSL snapshot was generated. Refresh this value when
|
|
16
|
+
* you re-snapshot {@link PSL_PUBLIC_SUFFIXES} from the upstream Public
|
|
17
|
+
* Suffix List at https://publicsuffix.org/list/public_suffix_list.dat
|
|
18
|
+
*
|
|
19
|
+
* @since 0.24.0
|
|
20
|
+
*/
|
|
21
|
+
export const PSL_SNAPSHOT_DATE = "2026-05-20";
|
|
22
|
+
/**
|
|
23
|
+
* Bundled subset of the Public Suffix List. Hand-picked entries covering
|
|
24
|
+
* the common cases Daloy users hit (cloud preview deployments, shared
|
|
25
|
+
* hosting platforms, country-code second-level domains). Augment with
|
|
26
|
+
* `subdomains({ extraSuffixes: [...] })` for project-specific TLDs.
|
|
27
|
+
*
|
|
28
|
+
* @since 0.24.0
|
|
29
|
+
*/
|
|
30
|
+
export const PSL_PUBLIC_SUFFIXES = [
|
|
31
|
+
// Generic TLDs
|
|
32
|
+
"com",
|
|
33
|
+
"net",
|
|
34
|
+
"org",
|
|
35
|
+
"io",
|
|
36
|
+
"dev",
|
|
37
|
+
"app",
|
|
38
|
+
"ai",
|
|
39
|
+
"co",
|
|
40
|
+
// Country-code TLDs that frequently host commerce subdomains.
|
|
41
|
+
"uk",
|
|
42
|
+
"co.uk",
|
|
43
|
+
"ac.uk",
|
|
44
|
+
"gov.uk",
|
|
45
|
+
"jp",
|
|
46
|
+
"co.jp",
|
|
47
|
+
"ne.jp",
|
|
48
|
+
"ac.jp",
|
|
49
|
+
"au",
|
|
50
|
+
"com.au",
|
|
51
|
+
"net.au",
|
|
52
|
+
"ph",
|
|
53
|
+
"com.ph",
|
|
54
|
+
"no",
|
|
55
|
+
"de",
|
|
56
|
+
"fr",
|
|
57
|
+
"ca",
|
|
58
|
+
// PaaS / preview-deploy registrable suffixes — every entry below is a
|
|
59
|
+
// "subdomain isolates a tenant" surface where treating the suffix as a
|
|
60
|
+
// single registrable domain would name an adjacent tenant.
|
|
61
|
+
"vercel.app",
|
|
62
|
+
"netlify.app",
|
|
63
|
+
"netlify.com",
|
|
64
|
+
"workers.dev",
|
|
65
|
+
"pages.dev",
|
|
66
|
+
"fly.dev",
|
|
67
|
+
"github.io",
|
|
68
|
+
"githubusercontent.com",
|
|
69
|
+
"gitlab.io",
|
|
70
|
+
"herokuapp.com",
|
|
71
|
+
"azurewebsites.net",
|
|
72
|
+
"s3.amazonaws.com",
|
|
73
|
+
"cloudfront.net",
|
|
74
|
+
"appspot.com",
|
|
75
|
+
"firebaseapp.com",
|
|
76
|
+
"web.app",
|
|
77
|
+
"supabase.co",
|
|
78
|
+
"render.com",
|
|
79
|
+
"onrender.com",
|
|
80
|
+
];
|
|
81
|
+
export const MAX_SNAPSHOT_AGE_DAYS = 90;
|
|
82
|
+
/**
|
|
83
|
+
* Split a hostname into registrable base + subdomain labels using the
|
|
84
|
+
* bundled PSL snapshot. Refuses to read a stale snapshot in production.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```ts
|
|
88
|
+
* subdomains("api.tenant.example.co.uk")
|
|
89
|
+
* // => { baseDomain: "example.co.uk", subdomain: "api.tenant", labels: ["api", "tenant"] }
|
|
90
|
+
*
|
|
91
|
+
* subdomains("foo.bar.s3.amazonaws.com")
|
|
92
|
+
* // => { baseDomain: "bar.s3.amazonaws.com", subdomain: "foo", labels: ["foo"] }
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* @since 0.24.0
|
|
96
|
+
*/
|
|
97
|
+
export function subdomains(hostname, opts = {}) {
|
|
98
|
+
if (typeof hostname !== "string" || hostname.length === 0) {
|
|
99
|
+
throw new Error("subdomains(): hostname must be a non-empty string.");
|
|
100
|
+
}
|
|
101
|
+
// Strip a trailing dot (FQDN form) and lowercase for the PSL match.
|
|
102
|
+
const host = hostname.replace(/\.$/, "").toLowerCase();
|
|
103
|
+
// Production-mode staleness check.
|
|
104
|
+
if (opts.production) {
|
|
105
|
+
const snap = opts._snapshotDate ?? PSL_SNAPSHOT_DATE;
|
|
106
|
+
const now = opts._now ?? new Date();
|
|
107
|
+
const snapMs = Date.parse(snap);
|
|
108
|
+
if (Number.isNaN(snapMs)) {
|
|
109
|
+
throw new Error(`subdomains(): invalid snapshot date ${JSON.stringify(snap)}.`);
|
|
110
|
+
}
|
|
111
|
+
const ageDays = (now.getTime() - snapMs) / 86_400_000;
|
|
112
|
+
if (ageDays > MAX_SNAPSHOT_AGE_DAYS) {
|
|
113
|
+
throw new Error(`subdomains(): bundled Public Suffix List snapshot is ${Math.round(ageDays)} days old ` +
|
|
114
|
+
`(threshold ${MAX_SNAPSHOT_AGE_DAYS} days). Refresh PSL_PUBLIC_SUFFIXES or upgrade @daloyjs/core.`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (opts.baseDomain) {
|
|
118
|
+
const base = opts.baseDomain.toLowerCase();
|
|
119
|
+
if (host !== base && !host.endsWith(`.${base}`)) {
|
|
120
|
+
throw new Error(`subdomains(): host ${JSON.stringify(hostname)} is not under declared baseDomain ${JSON.stringify(opts.baseDomain)}.`);
|
|
121
|
+
}
|
|
122
|
+
return resultFor(host, base);
|
|
123
|
+
}
|
|
124
|
+
const suffixes = new Set([
|
|
125
|
+
...PSL_PUBLIC_SUFFIXES,
|
|
126
|
+
...(opts.extraSuffixes ?? []),
|
|
127
|
+
]);
|
|
128
|
+
const labels = host.split(".");
|
|
129
|
+
// Walk from the longest suffix candidate down to the shortest so the
|
|
130
|
+
// longest match wins (`s3.amazonaws.com` beats `com`).
|
|
131
|
+
let bestSuffixLabels = 0;
|
|
132
|
+
for (let i = 0; i < labels.length; i++) {
|
|
133
|
+
const candidate = labels.slice(i).join(".");
|
|
134
|
+
if (suffixes.has(candidate)) {
|
|
135
|
+
const suffixLabelCount = labels.length - i;
|
|
136
|
+
if (suffixLabelCount > bestSuffixLabels)
|
|
137
|
+
bestSuffixLabels = suffixLabelCount;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// No PSL match — treat the rightmost label as the public suffix
|
|
141
|
+
// (single-label TLD fallback).
|
|
142
|
+
if (bestSuffixLabels === 0)
|
|
143
|
+
bestSuffixLabels = 1;
|
|
144
|
+
// Registrable base = public suffix + one label to the left.
|
|
145
|
+
const baseLabelCount = Math.min(labels.length, bestSuffixLabels + 1);
|
|
146
|
+
const baseDomain = labels.slice(labels.length - baseLabelCount).join(".");
|
|
147
|
+
return resultFor(host, baseDomain);
|
|
148
|
+
}
|
|
149
|
+
function resultFor(host, baseDomain) {
|
|
150
|
+
if (host === baseDomain) {
|
|
151
|
+
return { baseDomain, subdomain: "", labels: [] };
|
|
152
|
+
}
|
|
153
|
+
const prefix = host.slice(0, host.length - baseDomain.length - 1);
|
|
154
|
+
const labels = prefix.split(".");
|
|
155
|
+
return { baseDomain, subdomain: prefix, labels };
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=subdomains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subdomains.js","sourceRoot":"","sources":["../src/subdomains.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for time-based JWT-style claim validation (Wave 8
|
|
3
|
+
* remaining bake-ins).
|
|
4
|
+
*
|
|
5
|
+
* Every first-party verifier — `createJwtVerifier()`, `jwk()`, and any future
|
|
6
|
+
* session-token verifier — MUST route through {@link assertTemporalClaims}
|
|
7
|
+
* so the framework has exactly one implementation of:
|
|
8
|
+
*
|
|
9
|
+
* - the `exp` (expiration) check;
|
|
10
|
+
* - the `nbf` (not-before) check;
|
|
11
|
+
* - the `iat` (issued-at) future-clock-skew refusal;
|
|
12
|
+
* - the clock-skew tolerance shape (a non-negative number of seconds,
|
|
13
|
+
* applied symmetrically to all three claims).
|
|
14
|
+
*
|
|
15
|
+
* Centralizing the check means a developer that ships a custom JWT-shaped
|
|
16
|
+
* token verifier inside their app reaches for the same helper instead of
|
|
17
|
+
* re-implementing the comparison (and getting the inequality sign wrong on
|
|
18
|
+
* `iat`).
|
|
19
|
+
*
|
|
20
|
+
* @since 0.27.0
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Error thrown by {@link assertTemporalClaims}. The `code` is machine
|
|
24
|
+
* readable so callers can map specific failures to RFC-6750-style
|
|
25
|
+
* `WWW-Authenticate` challenges without parsing the message.
|
|
26
|
+
*
|
|
27
|
+
* @since 0.27.0
|
|
28
|
+
*/
|
|
29
|
+
export declare class TemporalClaimError extends Error {
|
|
30
|
+
readonly code: TemporalClaimErrorCode;
|
|
31
|
+
constructor(code: TemporalClaimErrorCode, message: string);
|
|
32
|
+
}
|
|
33
|
+
/** @since 0.27.0 */
|
|
34
|
+
export type TemporalClaimErrorCode = "invalid_exp" | "token_expired" | "invalid_nbf" | "token_not_yet_valid" | "invalid_iat" | "iat_in_future" | "invalid_clock_skew";
|
|
35
|
+
/**
|
|
36
|
+
* Subset of a JWT-style payload that participates in temporal validation.
|
|
37
|
+
* All three claims are optional — the verifier only enforces what is
|
|
38
|
+
* present.
|
|
39
|
+
*
|
|
40
|
+
* @since 0.27.0
|
|
41
|
+
*/
|
|
42
|
+
export interface TemporalClaims {
|
|
43
|
+
readonly exp?: unknown;
|
|
44
|
+
readonly nbf?: unknown;
|
|
45
|
+
readonly iat?: unknown;
|
|
46
|
+
}
|
|
47
|
+
/** @since 0.27.0 */
|
|
48
|
+
export interface AssertTemporalClaimsOptions {
|
|
49
|
+
/** Current unix-seconds timestamp. Injectable for tests. */
|
|
50
|
+
readonly now: number;
|
|
51
|
+
/**
|
|
52
|
+
* Symmetric clock-skew tolerance applied to `exp` / `nbf` / `iat`. Default
|
|
53
|
+
* `0` — the verifier refuses tokens with no skew tolerance.
|
|
54
|
+
*/
|
|
55
|
+
readonly clockSkewSeconds?: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Validate the temporal claims (`exp`, `nbf`, `iat`) on a JWT-style
|
|
59
|
+
* payload. Throws {@link TemporalClaimError} on the first violation;
|
|
60
|
+
* returns normally when every present claim passes.
|
|
61
|
+
*
|
|
62
|
+
* Inequalities follow RFC 7519:
|
|
63
|
+
*
|
|
64
|
+
* - `exp` rejected when `now > exp + skew` (the token has expired);
|
|
65
|
+
* - `nbf` rejected when `now + skew < nbf` (not yet valid);
|
|
66
|
+
* - `iat` rejected when `iat - skew > now` (issued in the future — the
|
|
67
|
+
* issuer's clock is wrong, or someone pre-issued a token).
|
|
68
|
+
*
|
|
69
|
+
* @since 0.27.0
|
|
70
|
+
*/
|
|
71
|
+
export declare function assertTemporalClaims(claims: TemporalClaims, opts: AssertTemporalClaimsOptions): void;
|
|
72
|
+
//# sourceMappingURL=time-claims.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-claims.d.ts","sourceRoot":"","sources":["../src/time-claims.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;gBAC1B,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM;CAK1D;AAED,oBAAoB;AACpB,MAAM,MAAM,sBAAsB,GAC9B,aAAa,GACb,eAAe,GACf,aAAa,GACb,qBAAqB,GACrB,aAAa,GACb,eAAe,GACf,oBAAoB,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,oBAAoB;AACpB,MAAM,WAAW,2BAA2B;IAC1C,4DAA4D;IAC5D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,2BAA2B,GAChC,IAAI,CAuCN"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for time-based JWT-style claim validation (Wave 8
|
|
3
|
+
* remaining bake-ins).
|
|
4
|
+
*
|
|
5
|
+
* Every first-party verifier — `createJwtVerifier()`, `jwk()`, and any future
|
|
6
|
+
* session-token verifier — MUST route through {@link assertTemporalClaims}
|
|
7
|
+
* so the framework has exactly one implementation of:
|
|
8
|
+
*
|
|
9
|
+
* - the `exp` (expiration) check;
|
|
10
|
+
* - the `nbf` (not-before) check;
|
|
11
|
+
* - the `iat` (issued-at) future-clock-skew refusal;
|
|
12
|
+
* - the clock-skew tolerance shape (a non-negative number of seconds,
|
|
13
|
+
* applied symmetrically to all three claims).
|
|
14
|
+
*
|
|
15
|
+
* Centralizing the check means a developer that ships a custom JWT-shaped
|
|
16
|
+
* token verifier inside their app reaches for the same helper instead of
|
|
17
|
+
* re-implementing the comparison (and getting the inequality sign wrong on
|
|
18
|
+
* `iat`).
|
|
19
|
+
*
|
|
20
|
+
* @since 0.27.0
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Error thrown by {@link assertTemporalClaims}. The `code` is machine
|
|
24
|
+
* readable so callers can map specific failures to RFC-6750-style
|
|
25
|
+
* `WWW-Authenticate` challenges without parsing the message.
|
|
26
|
+
*
|
|
27
|
+
* @since 0.27.0
|
|
28
|
+
*/
|
|
29
|
+
export class TemporalClaimError extends Error {
|
|
30
|
+
code;
|
|
31
|
+
constructor(code, message) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = "TemporalClaimError";
|
|
34
|
+
this.code = code;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function isFiniteNumber(v) {
|
|
38
|
+
return typeof v === "number" && Number.isFinite(v);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Validate the temporal claims (`exp`, `nbf`, `iat`) on a JWT-style
|
|
42
|
+
* payload. Throws {@link TemporalClaimError} on the first violation;
|
|
43
|
+
* returns normally when every present claim passes.
|
|
44
|
+
*
|
|
45
|
+
* Inequalities follow RFC 7519:
|
|
46
|
+
*
|
|
47
|
+
* - `exp` rejected when `now > exp + skew` (the token has expired);
|
|
48
|
+
* - `nbf` rejected when `now + skew < nbf` (not yet valid);
|
|
49
|
+
* - `iat` rejected when `iat - skew > now` (issued in the future — the
|
|
50
|
+
* issuer's clock is wrong, or someone pre-issued a token).
|
|
51
|
+
*
|
|
52
|
+
* @since 0.27.0
|
|
53
|
+
*/
|
|
54
|
+
export function assertTemporalClaims(claims, opts) {
|
|
55
|
+
const skew = opts.clockSkewSeconds ?? 0;
|
|
56
|
+
if (!isFiniteNumber(skew) || skew < 0) {
|
|
57
|
+
throw new TemporalClaimError("invalid_clock_skew", "clockSkewSeconds must be a non-negative finite number.");
|
|
58
|
+
}
|
|
59
|
+
const now = opts.now;
|
|
60
|
+
if (!isFiniteNumber(now)) {
|
|
61
|
+
throw new TemporalClaimError("invalid_clock_skew", "now must be a finite number of unix seconds.");
|
|
62
|
+
}
|
|
63
|
+
if (claims.exp !== undefined) {
|
|
64
|
+
if (!isFiniteNumber(claims.exp)) {
|
|
65
|
+
throw new TemporalClaimError("invalid_exp", "payload.exp is not a finite number.");
|
|
66
|
+
}
|
|
67
|
+
if (now > claims.exp + skew) {
|
|
68
|
+
throw new TemporalClaimError("token_expired", "token has expired (exp).");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (claims.nbf !== undefined) {
|
|
72
|
+
if (!isFiniteNumber(claims.nbf)) {
|
|
73
|
+
throw new TemporalClaimError("invalid_nbf", "payload.nbf is not a finite number.");
|
|
74
|
+
}
|
|
75
|
+
if (now + skew < claims.nbf) {
|
|
76
|
+
throw new TemporalClaimError("token_not_yet_valid", "token is not yet valid (nbf).");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (claims.iat !== undefined) {
|
|
80
|
+
if (!isFiniteNumber(claims.iat)) {
|
|
81
|
+
throw new TemporalClaimError("invalid_iat", "payload.iat is not a finite number.");
|
|
82
|
+
}
|
|
83
|
+
if (claims.iat - skew > now) {
|
|
84
|
+
throw new TemporalClaimError("iat_in_future", "payload.iat is in the future.");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=time-claims.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-claims.js","sourceRoot":"","sources":["../src/time-claims.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;;;;GAMG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAyB;IACtC,YAAY,IAA4B,EAAE,OAAe;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAoCD,SAAS,cAAc,CAAC,CAAU;IAChC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAsB,EACtB,IAAiC;IAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,kBAAkB,CAC1B,oBAAoB,EACpB,wDAAwD,CACzD,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,kBAAkB,CAC1B,oBAAoB,EACpB,8CAA8C,CAC/C,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,kBAAkB,CAAC,aAAa,EAAE,qCAAqC,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,kBAAkB,CAAC,eAAe,EAAE,0BAA0B,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,kBAAkB,CAAC,aAAa,EAAE,qCAAqC,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,EAAE,+BAA+B,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,kBAAkB,CAAC,aAAa,EAAE,qCAAqC,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,kBAAkB,CAAC,eAAe,EAAE,+BAA+B,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -169,6 +169,16 @@ export interface AuthSpec {
|
|
|
169
169
|
scheme: string;
|
|
170
170
|
/** Optional scopes/permissions, surfaces in OpenAPI security requirement */
|
|
171
171
|
scopes?: string[];
|
|
172
|
+
/**
|
|
173
|
+
* Route-level payload/body-auth participation. Defaults to `true` when
|
|
174
|
+
* omitted. Setting `false` opts the route out of payload authentication;
|
|
175
|
+
* Daloy refuses that opt-out at route registration time when the referenced
|
|
176
|
+
* security scheme declares `requirePayloadAuth: true` (or the OpenAPI-safe
|
|
177
|
+
* `x-daloy-require-payload-auth: true` extension).
|
|
178
|
+
*
|
|
179
|
+
* @since 0.23.0
|
|
180
|
+
*/
|
|
181
|
+
payload?: boolean;
|
|
172
182
|
}
|
|
173
183
|
/**
|
|
174
184
|
* **Module-augmentation hook** for typing plugin-provided state.
|
|
@@ -193,6 +203,22 @@ export interface AuthSpec {
|
|
|
193
203
|
*/
|
|
194
204
|
export interface AppState {
|
|
195
205
|
}
|
|
206
|
+
/**
|
|
207
|
+
* Scheme-aware auth contract (Wave 6 item 13). Every shipped first-party
|
|
208
|
+
* auth helper writes through to `ctx.state.auth` with a discriminated
|
|
209
|
+
* `scheme` tag so audit logs, revocation hooks, and per-scheme
|
|
210
|
+
* `verify(credentials, ctx)` callbacks know which scheme issued the
|
|
211
|
+
* credential. Prevents the "session-cookie revocation list applied to a
|
|
212
|
+
* bearer-token request" class of cross-scheme confusion.
|
|
213
|
+
*
|
|
214
|
+
* @since 0.24.0
|
|
215
|
+
*/
|
|
216
|
+
export type AuthScheme = "bearer" | "basic" | "jwt" | "jwk" | "webhook" | "session" | "apiKey";
|
|
217
|
+
/** @since 0.24.0 */
|
|
218
|
+
export interface AuthContext<TCredentials = unknown> {
|
|
219
|
+
readonly scheme: AuthScheme;
|
|
220
|
+
readonly credentials: TCredentials;
|
|
221
|
+
}
|
|
196
222
|
/**
|
|
197
223
|
* The context object passed to every route handler and hook.
|
|
198
224
|
*
|
|
@@ -319,6 +345,30 @@ export interface RouteDefinition<P extends PathString = PathString, M extends Ht
|
|
|
319
345
|
* @since 0.16.0
|
|
320
346
|
*/
|
|
321
347
|
accepts?: string[];
|
|
348
|
+
/**
|
|
349
|
+
* Mark a route as internal. Requests reaching the route via the public
|
|
350
|
+
* `app.fetch(...)` entry point (i.e. any deployed adapter) receive a
|
|
351
|
+
* `404 Not Found` so existence cannot be probed, while in-process callers
|
|
352
|
+
* that go through `app.inject(...)` execute the handler normally. Pair
|
|
353
|
+
* with admin/cron endpoints, debugging shims, or platform-specific
|
|
354
|
+
* health probes that should never be reachable from the network.
|
|
355
|
+
*
|
|
356
|
+
* @example
|
|
357
|
+
* ```ts
|
|
358
|
+
* app.route({
|
|
359
|
+
* method: "POST",
|
|
360
|
+
* path: "/__admin/reindex",
|
|
361
|
+
* internal: true,
|
|
362
|
+
* responses: { 204: { description: "Started" } },
|
|
363
|
+
* handler: () => ({ status: 204 }),
|
|
364
|
+
* });
|
|
365
|
+
*
|
|
366
|
+
* await app.inject(new Request("http://app/__admin/reindex", { method: "POST" }));
|
|
367
|
+
* ```
|
|
368
|
+
*
|
|
369
|
+
* @since 0.19.0
|
|
370
|
+
*/
|
|
371
|
+
internal?: boolean;
|
|
322
372
|
/**
|
|
323
373
|
* Optional OpenAPI 3.1 callbacks (out-of-band requests this operation may
|
|
324
374
|
* trigger on the consumer). Each callback name maps to one or more runtime
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/websocket.d.ts
CHANGED
|
@@ -1,37 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
* WebSocket primitives — runtime-agnostic types, handshake, and RFC 6455
|
|
3
|
-
* frame protocol. Adapter packages (`@daloyjs/core/node`, `@daloyjs/core/bun`)
|
|
4
|
-
* wire these primitives into their respective servers.
|
|
5
|
-
*
|
|
6
|
-
* The public API mirrors the WHATWG `WebSocket` interface where it makes
|
|
7
|
-
* sense for the server side (`readyState`, `send`, `close`, `protocol`,
|
|
8
|
-
* `extensions`, `bufferedAmount`, `binaryType`) and uses Bun-style handler
|
|
9
|
-
* callbacks (`open`, `message`, `close`, `drain`, `error`) so the same
|
|
10
|
-
* handler shape runs on both Node and Bun.
|
|
11
|
-
*
|
|
12
|
-
* ```ts
|
|
13
|
-
* import { App } from "@daloyjs/core";
|
|
14
|
-
* import { serve } from "@daloyjs/core/node";
|
|
15
|
-
*
|
|
16
|
-
* const app = new App();
|
|
17
|
-
*
|
|
18
|
-
* app.ws("/chat/:room", {
|
|
19
|
-
* open(conn, ctx) {
|
|
20
|
-
* conn.data = { user: ctx.query.user ?? "anon", room: ctx.params.room };
|
|
21
|
-
* conn.send(`welcome ${(conn.data as any).user}`);
|
|
22
|
-
* },
|
|
23
|
-
* message(conn, data) {
|
|
24
|
-
* conn.send(typeof data === "string" ? data.toUpperCase() : data);
|
|
25
|
-
* },
|
|
26
|
-
* close(conn, code, reason) {
|
|
27
|
-
* // cleanup
|
|
28
|
-
* },
|
|
29
|
-
* });
|
|
30
|
-
*
|
|
31
|
-
* serve(app, { port: 3000 });
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
1
|
+
import { type RateLimitOptions } from "./middleware.js";
|
|
34
2
|
import { type RouteMatch } from "./router.js";
|
|
3
|
+
import type { StandardSchemaV1 } from "./schema.js";
|
|
35
4
|
import type { AppState, PathString, PathParams } from "./types.js";
|
|
36
5
|
/** RFC 6455 magic GUID used to compute `Sec-WebSocket-Accept`. */
|
|
37
6
|
export declare const WS_GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
|
@@ -66,6 +35,9 @@ export declare const WS_CLOSE_CODE: {
|
|
|
66
35
|
};
|
|
67
36
|
/** Maximum payload length permitted on a single control frame (RFC 6455 §5.5). */
|
|
68
37
|
export declare const WS_MAX_CONTROL_PAYLOAD = 125;
|
|
38
|
+
export declare const DEFAULT_WS_BACKPRESSURE_LIMIT: number;
|
|
39
|
+
export declare const DEFAULT_WS_MAX_PAYLOAD_LENGTH: number;
|
|
40
|
+
export declare const DEFAULT_WS_IDLE_TIMEOUT_SECONDS = 120;
|
|
69
41
|
/**
|
|
70
42
|
* Live, server-side view of a WebSocket connection. Implementations are
|
|
71
43
|
* supplied by the runtime adapter; user handlers receive an instance and
|
|
@@ -119,6 +91,20 @@ export interface WebSocketContext<P extends string = string, S = AppState> {
|
|
|
119
91
|
* same handler runs on both Node and Bun.
|
|
120
92
|
*/
|
|
121
93
|
export interface WebSocketHandler<P extends string = string, S = AppState, TData = unknown> {
|
|
94
|
+
/** Optional schema used for payload-size consistency checks. */
|
|
95
|
+
request?: {
|
|
96
|
+
body?: StandardSchemaV1;
|
|
97
|
+
};
|
|
98
|
+
/** Close the connection when queued outbound bytes exceed backpressureLimit. Default: true. */
|
|
99
|
+
closeOnBackpressureLimit?: boolean;
|
|
100
|
+
/** Maximum queued outbound bytes before backpressure handling triggers. Default: 1 MiB. */
|
|
101
|
+
backpressureLimit?: number;
|
|
102
|
+
/** Per-message compression. Default: false; refused in production secureDefaults. */
|
|
103
|
+
perMessageDeflate?: boolean;
|
|
104
|
+
/** Idle timeout in seconds. Default: 120; `0` is refused. */
|
|
105
|
+
idleTimeout?: number;
|
|
106
|
+
/** Maximum inbound message payload length in bytes. Default: 1 MiB. */
|
|
107
|
+
maxPayloadLength?: number;
|
|
122
108
|
beforeUpgrade?(request: Request, ctx: WebSocketContext<P, S>): Response | string | undefined | Promise<Response | string | undefined>;
|
|
123
109
|
open?(conn: WebSocketConnection<TData>, ctx: WebSocketContext<P, S>): void | Promise<void>;
|
|
124
110
|
message?(conn: WebSocketConnection<TData>, data: string | Uint8Array | ArrayBuffer, isBinary: boolean): void | Promise<void>;
|
|
@@ -126,12 +112,33 @@ export interface WebSocketHandler<P extends string = string, S = AppState, TData
|
|
|
126
112
|
error?(conn: WebSocketConnection<TData>, err: unknown): void | Promise<void>;
|
|
127
113
|
drain?(conn: WebSocketConnection<TData>): void | Promise<void>;
|
|
128
114
|
}
|
|
115
|
+
export interface NormalizedWebSocketOptions {
|
|
116
|
+
closeOnBackpressureLimit: boolean;
|
|
117
|
+
backpressureLimit: number;
|
|
118
|
+
perMessageDeflate: boolean;
|
|
119
|
+
idleTimeout: number;
|
|
120
|
+
maxPayloadLength: number;
|
|
121
|
+
}
|
|
122
|
+
export declare function normalizeWebSocketOptions(handler: WebSocketHandler<any, any, any>, context: {
|
|
123
|
+
production: boolean;
|
|
124
|
+
secureDefaults: boolean;
|
|
125
|
+
}): NormalizedWebSocketOptions;
|
|
126
|
+
export type WebSocketBeforeUpgrade<P extends string = string, S = AppState> = NonNullable<WebSocketHandler<P, S>["beforeUpgrade"]>;
|
|
127
|
+
/**
|
|
128
|
+
* Adapt `rateLimit({ groupId })` to the WebSocket upgrade boundary. Use it as
|
|
129
|
+
* a `beforeUpgrade` handler to spend from the same shared buckets as HTTP
|
|
130
|
+
* routes (for example, login and WebSocket session-establishment endpoints).
|
|
131
|
+
*
|
|
132
|
+
* @since 0.23.0
|
|
133
|
+
*/
|
|
134
|
+
export declare function wsRateLimit<P extends string = string, S = AppState>(options: RateLimitOptions): WebSocketBeforeUpgrade<P, S>;
|
|
129
135
|
/** Helper for declaring a handler with full type-inference. */
|
|
130
136
|
export declare function defineWebSocket<P extends string, S = AppState, TData = unknown>(handler: WebSocketHandler<P, S, TData>): WebSocketHandler<P, S, TData>;
|
|
131
137
|
export interface WebSocketRouteEntry {
|
|
132
138
|
path: PathString;
|
|
133
139
|
handler: WebSocketHandler<any, any, any>;
|
|
134
140
|
createState: WebSocketStateFactory;
|
|
141
|
+
options: NormalizedWebSocketOptions;
|
|
135
142
|
}
|
|
136
143
|
type WebSocketStateFactory = () => Record<string, unknown>;
|
|
137
144
|
/**
|
|
@@ -144,9 +151,11 @@ type WebSocketStateFactory = () => Record<string, unknown>;
|
|
|
144
151
|
export declare class WebSocketRegistry {
|
|
145
152
|
private router;
|
|
146
153
|
private _size;
|
|
147
|
-
|
|
154
|
+
private entries;
|
|
155
|
+
add(path: PathString, handler: WebSocketHandler<any, any, any>, createState?: WebSocketStateFactory, options?: NormalizedWebSocketOptions): void;
|
|
148
156
|
find(pathname: string): RouteMatch<WebSocketRouteEntry> | undefined;
|
|
149
157
|
get size(): number;
|
|
158
|
+
runtimeOptions(): NormalizedWebSocketOptions;
|
|
150
159
|
}
|
|
151
160
|
/**
|
|
152
161
|
* Compute the `Sec-WebSocket-Accept` response header value for a given
|
|
@@ -231,6 +240,11 @@ export declare function decodeClosePayload(payload: Uint8Array): {
|
|
|
231
240
|
export declare class WebSocketProtocolError extends Error {
|
|
232
241
|
constructor(message: string);
|
|
233
242
|
}
|
|
243
|
+
export declare class WebSocketPayloadTooLargeError extends WebSocketProtocolError {
|
|
244
|
+
readonly limit: number;
|
|
245
|
+
readonly actual: number;
|
|
246
|
+
constructor(limit: number, actual: number);
|
|
247
|
+
}
|
|
234
248
|
/**
|
|
235
249
|
* Incremental parser that buffers bytes from a socket and emits whole
|
|
236
250
|
* frames. Handles fragmentation, interleaved control frames, and UTF-8
|
|
@@ -259,12 +273,15 @@ export declare class FrameSink {
|
|
|
259
273
|
private buffer;
|
|
260
274
|
private fragments;
|
|
261
275
|
private fragmentOpcode;
|
|
276
|
+
private fragmentBytes;
|
|
262
277
|
private closed;
|
|
263
278
|
constructor(opts: FrameSinkEvents & {
|
|
264
279
|
requireMask?: boolean;
|
|
280
|
+
maxPayloadLength?: number;
|
|
265
281
|
});
|
|
266
282
|
push(chunk: Uint8Array): void;
|
|
267
283
|
private handle;
|
|
284
|
+
private assertMessageSize;
|
|
268
285
|
}
|
|
269
286
|
/** Coerce arbitrary `send()` payloads to a `Uint8Array` + opcode pair. */
|
|
270
287
|
export declare function encodeSendPayload(data: string | ArrayBufferLike | ArrayBufferView): {
|
package/dist/websocket.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAU,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAe,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChF,kEAAkE;AAClE,eAAO,MAAM,OAAO,yCAAyC,CAAC;AAE9D,+CAA+C;AAC/C,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AAEX,wBAAwB;AACxB,eAAO,MAAM,SAAS;;;;;;;CAOZ,CAAC;AAEX,0CAA0C;AAC1C,eAAO,MAAM,aAAa;;;;;;;;;;;CAWhB,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,6BAA6B,QAAc,CAAC;AACzD,eAAO,MAAM,6BAA6B,QAAc,CAAC;AACzD,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAInD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB,CAAC,KAAK,GAAG,OAAO;IAClD,0BAA0B;IAC1B,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,sDAAsD;IACtD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,2DAA2D;IAC3D,UAAU,EAAE,aAAa,GAAG,YAAY,CAAC;IACzC,6EAA6E;IAC7E,IAAI,EAAE,KAAK,CAAC;IACZ,mCAAmC;IACnC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,eAAe,GAAG,IAAI,CAAC;IAC7D,0DAA0D;IAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,uCAAuC;IACvC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,eAAe,GAAG,IAAI,CAAC;IAC9D,uCAAuC;IACvC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,eAAe,GAAG,IAAI,CAAC;IAC9D,mEAAmE;IACnE,SAAS,IAAI,IAAI,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,QAAQ;IACvE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,CAAC,CAAC;IACT,iFAAiF;IACjF,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB,CAC/B,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,CAAC,GAAG,QAAQ,EACZ,KAAK,GAAG,OAAO;IAEf,gEAAgE;IAChE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC;IACtC,+FAA+F;IAC/F,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2FAA2F;IAC3F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qFAAqF;IACrF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,CACZ,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC1B,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1E,IAAI,CAAC,CACH,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,EAChC,GAAG,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC1B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,CAAC,CACN,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,EAChC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,EACvC,QAAQ,EAAE,OAAO,GAChB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,CAAC,CACJ,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,CAAC,CAAC,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,KAAK,CAAC,CAAC,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,0BAA0B;IACzC,wBAAwB,EAAE,OAAO,CAAC;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAmCD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACxC,OAAO,EAAE;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,GACxD,0BAA0B,CAmC5B;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,QAAQ,IAAI,WAAW,CACvF,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CACxC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,QAAQ,EACjE,OAAO,EAAE,gBAAgB,GACxB,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CA4B9B;AAQD,+DAA+D;AAC/D,wBAAgB,eAAe,CAC7B,CAAC,SAAS,MAAM,EAChB,CAAC,GAAG,QAAQ,EACZ,KAAK,GAAG,OAAO,EACf,OAAO,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAEvE;AAID,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACzC,WAAW,EAAE,qBAAqB,CAAC;IACnC,OAAO,EAAE,0BAA0B,CAAC;CACrC;AAED,KAAK,qBAAqB,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3D;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAqC;IAAC,OAAO,CAAC,KAAK,CAAK;IACtE,OAAO,CAAC,OAAO,CAA6B;IAC5C,GAAG,CACD,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACxC,WAAW,GAAE,qBAAkC,EAC/C,OAAO,GAAE,0BAGP,GACD,IAAI;IAOP,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC,mBAAmB,CAAC,GAAG,SAAS;IAInE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,cAAc,IAAI,0BAA0B;CAoB7C;AAsBD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAM7E;AAID;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,MAAM,CAYR;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,GACpD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAClC,GAAG,OAAO,CAAC,eAAe,CAAC,CAuC3B;AAaD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,UAAU,CAAC;IACpB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,eAAqC,CAAC;AAEnE;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,UAAU,EACf,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,WAAW,GAAG,OAAO,gBAAgB,CAsFvC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,UAAU,CAgEb;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,UAAU,CAUxE;AAED,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,GAAG;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAUA;AAED,gFAAgF;AAChF,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,6BAA8B,SAAQ,sBAAsB;IAErE,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM;CAK1B;AAID;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,eAAe,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI,CAAC;CACpD;AAED;;;;GAIG;AACH,qBAAa,SAAS;IAQlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,MAAM,CAAS;gBAGJ,IAAI,EAAE,eAAe,GAAG;QACvC,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B;IAGH,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IA8B7B,OAAO,CAAC,MAAM;IA6Dd,OAAO,CAAC,iBAAiB;CAQ1B;AAID,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,eAAe,GAC/C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAiBzC"}
|