@barqel/barq 0.0.0-stage → 1.0.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/LICENSE +21 -0
- package/README.md +89 -2
- package/dist/app.d.ts +159 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +1370 -0
- package/dist/app.js.map +1 -0
- package/dist/context.d.ts +55 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +261 -0
- package/dist/context.js.map +1 -0
- package/dist/cookies.d.ts +5 -0
- package/dist/cookies.d.ts.map +1 -0
- package/dist/cookies.js +234 -0
- package/dist/cookies.js.map +1 -0
- package/dist/cors.d.ts +11 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +82 -0
- package/dist/cors.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +81 -0
- package/dist/errors.js.map +1 -0
- package/dist/http.d.ts +7 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +127 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/ip.d.ts +6 -0
- package/dist/internal/ip.d.ts.map +1 -0
- package/dist/internal/ip.js +151 -0
- package/dist/internal/ip.js.map +1 -0
- package/dist/internal/pathname.d.ts +9 -0
- package/dist/internal/pathname.d.ts.map +1 -0
- package/dist/internal/pathname.js +158 -0
- package/dist/internal/pathname.js.map +1 -0
- package/dist/internal/query.d.ts +5 -0
- package/dist/internal/query.d.ts.map +1 -0
- package/dist/internal/query.js +126 -0
- package/dist/internal/query.js.map +1 -0
- package/dist/internal/scan.d.ts +33 -0
- package/dist/internal/scan.d.ts.map +1 -0
- package/dist/internal/scan.js +1069 -0
- package/dist/internal/scan.js.map +1 -0
- package/dist/internal/shutdown.d.ts +7 -0
- package/dist/internal/shutdown.d.ts.map +1 -0
- package/dist/internal/shutdown.js +30 -0
- package/dist/internal/shutdown.js.map +1 -0
- package/dist/internal/trie.d.ts +43 -0
- package/dist/internal/trie.d.ts.map +1 -0
- package/dist/internal/trie.js +560 -0
- package/dist/internal/trie.js.map +1 -0
- package/dist/middleware.d.ts +13 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +269 -0
- package/dist/middleware.js.map +1 -0
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +27 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +32 -0
- package/dist/validation.js.map +1 -0
- package/package.json +58 -4
package/dist/cookies.js
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { timingSafeEqual } from "node:crypto";
|
|
2
|
+
class CookieJarImpl {
|
|
3
|
+
secret;
|
|
4
|
+
onMutation;
|
|
5
|
+
state;
|
|
6
|
+
constructor(secret, requestHeaders, onMutation) {
|
|
7
|
+
this.secret = secret;
|
|
8
|
+
this.onMutation = onMutation;
|
|
9
|
+
this.state = { cookies: null, requestHeaders, pending: null };
|
|
10
|
+
}
|
|
11
|
+
get(name) {
|
|
12
|
+
return getCookies(this.state).get(name);
|
|
13
|
+
}
|
|
14
|
+
getSigned(name, customSecret) {
|
|
15
|
+
const signed = getCookies(this.state).get(name);
|
|
16
|
+
if (!signed)
|
|
17
|
+
return null;
|
|
18
|
+
const signingSecret = customSecret ?? this.secret;
|
|
19
|
+
if (!signingSecret)
|
|
20
|
+
return null;
|
|
21
|
+
return unsign(signed, signingSecret);
|
|
22
|
+
}
|
|
23
|
+
set(name, value, options) {
|
|
24
|
+
const cookieOptions = snapshotOptions(options);
|
|
25
|
+
validateCookie(name, cookieOptions);
|
|
26
|
+
getCookies(this.state).set(name, value);
|
|
27
|
+
getPending(this.state).push({
|
|
28
|
+
name,
|
|
29
|
+
headerString: buildCookieString(name, value, cookieOptions),
|
|
30
|
+
});
|
|
31
|
+
this.onMutation?.();
|
|
32
|
+
}
|
|
33
|
+
setSigned(name, value, options, customSecret) {
|
|
34
|
+
const signingSecret = customSecret ?? this.secret;
|
|
35
|
+
if (!signingSecret) {
|
|
36
|
+
throw new Error("A non-empty secret is required to set a signed cookie");
|
|
37
|
+
}
|
|
38
|
+
const cookieOptions = snapshotOptions(options);
|
|
39
|
+
validateCookie(name, cookieOptions);
|
|
40
|
+
const signed = sign(value, signingSecret);
|
|
41
|
+
getCookies(this.state).set(name, signed);
|
|
42
|
+
getPending(this.state).push({
|
|
43
|
+
name,
|
|
44
|
+
headerString: buildCookieString(name, signed, cookieOptions),
|
|
45
|
+
});
|
|
46
|
+
this.onMutation?.();
|
|
47
|
+
}
|
|
48
|
+
delete(name, options) {
|
|
49
|
+
const cookieOptions = snapshotOptions(options);
|
|
50
|
+
validateCookie(name, cookieOptions);
|
|
51
|
+
getCookies(this.state).delete(name);
|
|
52
|
+
getPending(this.state).push({
|
|
53
|
+
name,
|
|
54
|
+
headerString: buildCookieString(name, "", {
|
|
55
|
+
...cookieOptions,
|
|
56
|
+
maxAge: 0,
|
|
57
|
+
expires: new Date(0),
|
|
58
|
+
}),
|
|
59
|
+
});
|
|
60
|
+
this.onMutation?.();
|
|
61
|
+
}
|
|
62
|
+
hasPending() {
|
|
63
|
+
return (this.state.pending?.length ?? 0) > 0;
|
|
64
|
+
}
|
|
65
|
+
apply(headers) {
|
|
66
|
+
const pending = this.state.pending;
|
|
67
|
+
if (pending === null)
|
|
68
|
+
return;
|
|
69
|
+
for (const cookie of pending) {
|
|
70
|
+
headers.append("set-cookie", cookie.headerString);
|
|
71
|
+
}
|
|
72
|
+
pending.length = 0;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function normalizeSameSite(value) {
|
|
76
|
+
if (!value)
|
|
77
|
+
return "Lax";
|
|
78
|
+
const lower = value.toLowerCase();
|
|
79
|
+
if (lower === "strict")
|
|
80
|
+
return "Strict";
|
|
81
|
+
if (lower === "lax")
|
|
82
|
+
return "Lax";
|
|
83
|
+
if (lower === "none")
|
|
84
|
+
return "None";
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
87
|
+
function buildCookieString(name, value, options) {
|
|
88
|
+
validateCookie(name, options);
|
|
89
|
+
let cookie = `${name}=${encodeURIComponent(value)}`;
|
|
90
|
+
if (options.path)
|
|
91
|
+
cookie += `; Path=${options.path}`;
|
|
92
|
+
if (options.domain)
|
|
93
|
+
cookie += `; Domain=${options.domain}`;
|
|
94
|
+
if (options.maxAge !== undefined)
|
|
95
|
+
cookie += `; Max-Age=${options.maxAge}`;
|
|
96
|
+
if (options.expires)
|
|
97
|
+
cookie += `; Expires=${options.expires.toUTCString()}`;
|
|
98
|
+
if (options.httpOnly !== false)
|
|
99
|
+
cookie += "; HttpOnly";
|
|
100
|
+
if (options.secure)
|
|
101
|
+
cookie += "; Secure";
|
|
102
|
+
const sameSite = normalizeSameSite(options.sameSite);
|
|
103
|
+
if (sameSite)
|
|
104
|
+
cookie += `; SameSite=${sameSite}`;
|
|
105
|
+
return cookie;
|
|
106
|
+
}
|
|
107
|
+
function sign(value, secret) {
|
|
108
|
+
const hasher = new Bun.CryptoHasher("sha256", secret);
|
|
109
|
+
hasher.update(value);
|
|
110
|
+
const sig = hasher.digest("base64url");
|
|
111
|
+
return `${value}.${sig}`;
|
|
112
|
+
}
|
|
113
|
+
function unsign(signedValue, secret) {
|
|
114
|
+
const lastDot = signedValue.lastIndexOf(".");
|
|
115
|
+
if (lastDot <= 0 || lastDot === signedValue.length - 1)
|
|
116
|
+
return null;
|
|
117
|
+
const value = signedValue.slice(0, lastDot);
|
|
118
|
+
const sig = signedValue.slice(lastDot + 1);
|
|
119
|
+
const hasher = new Bun.CryptoHasher("sha256", secret);
|
|
120
|
+
hasher.update(value);
|
|
121
|
+
const expected = hasher.digest("base64url");
|
|
122
|
+
const actualBytes = Buffer.from(sig);
|
|
123
|
+
const expectedBytes = Buffer.from(expected);
|
|
124
|
+
if (actualBytes.length !== expectedBytes.length)
|
|
125
|
+
return null;
|
|
126
|
+
if (!timingSafeEqual(actualBytes, expectedBytes))
|
|
127
|
+
return null;
|
|
128
|
+
return value;
|
|
129
|
+
}
|
|
130
|
+
function decodeCookieValue(value) {
|
|
131
|
+
try {
|
|
132
|
+
return decodeURIComponent(value);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// A malformed percent escape is an invalid cookie value, not a request error.
|
|
136
|
+
return value;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function validateCookie(name, options) {
|
|
140
|
+
if (!/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/.test(name)) {
|
|
141
|
+
throw new TypeError("Cookie name must be a valid HTTP token");
|
|
142
|
+
}
|
|
143
|
+
if (options.path !== undefined &&
|
|
144
|
+
(!options.path.startsWith("/") || /[;\r\n\0]/.test(options.path))) {
|
|
145
|
+
throw new TypeError("Cookie path must start with '/' and contain no controls");
|
|
146
|
+
}
|
|
147
|
+
if (options.domain !== undefined &&
|
|
148
|
+
(!/^(?:\.?[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)*$/.test(options.domain) ||
|
|
149
|
+
options.domain.includes(".."))) {
|
|
150
|
+
throw new TypeError("Cookie domain is invalid");
|
|
151
|
+
}
|
|
152
|
+
if (options.maxAge !== undefined &&
|
|
153
|
+
(!Number.isSafeInteger(options.maxAge) || options.maxAge < 0)) {
|
|
154
|
+
throw new TypeError("Cookie maxAge must be a non-negative safe integer");
|
|
155
|
+
}
|
|
156
|
+
if (options.expires !== undefined &&
|
|
157
|
+
!Number.isFinite(options.expires.getTime())) {
|
|
158
|
+
throw new TypeError("Cookie expires must be a valid Date");
|
|
159
|
+
}
|
|
160
|
+
if (options.sameSite !== undefined &&
|
|
161
|
+
!["strict", "lax", "none"].includes(options.sameSite.toLowerCase())) {
|
|
162
|
+
throw new TypeError("Cookie sameSite must be Strict, Lax, or None");
|
|
163
|
+
}
|
|
164
|
+
if (options.sameSite?.toLowerCase() === "none" && !options.secure) {
|
|
165
|
+
throw new TypeError("SameSite=None cookies must also be Secure");
|
|
166
|
+
}
|
|
167
|
+
if (name.startsWith("__Secure-") && !options.secure) {
|
|
168
|
+
throw new TypeError("__Secure- cookies must also be Secure");
|
|
169
|
+
}
|
|
170
|
+
if (name.startsWith("__Host-") &&
|
|
171
|
+
(!options.secure || options.path !== "/" || options.domain !== undefined)) {
|
|
172
|
+
throw new TypeError("__Host- cookies must be Secure, use Path=/, and omit Domain");
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function snapshotOptions(options) {
|
|
176
|
+
if (!options)
|
|
177
|
+
return {};
|
|
178
|
+
return {
|
|
179
|
+
...options,
|
|
180
|
+
...(options.expires === undefined
|
|
181
|
+
? {}
|
|
182
|
+
: { expires: new Date(options.expires.getTime()) }),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function parseCookieHeader(header) {
|
|
186
|
+
const cookies = new Map();
|
|
187
|
+
let pos = 0;
|
|
188
|
+
const len = header.length;
|
|
189
|
+
while (pos < len) {
|
|
190
|
+
while (pos < len && header.charCodeAt(pos) === 32)
|
|
191
|
+
pos++;
|
|
192
|
+
if (pos >= len)
|
|
193
|
+
break;
|
|
194
|
+
const eq = header.indexOf("=", pos);
|
|
195
|
+
if (eq === -1)
|
|
196
|
+
break;
|
|
197
|
+
const name = header.slice(pos, eq).trim();
|
|
198
|
+
pos = eq + 1;
|
|
199
|
+
let end = header.indexOf(";", pos);
|
|
200
|
+
if (end === -1)
|
|
201
|
+
end = len;
|
|
202
|
+
const value = header.slice(pos, end);
|
|
203
|
+
if (name)
|
|
204
|
+
cookies.set(name, decodeCookieValue(value));
|
|
205
|
+
pos = end + 1;
|
|
206
|
+
}
|
|
207
|
+
return cookies;
|
|
208
|
+
}
|
|
209
|
+
function getCookies(state) {
|
|
210
|
+
if (state.cookies !== null)
|
|
211
|
+
return state.cookies;
|
|
212
|
+
const header = state.requestHeaders?.get("cookie") ?? "";
|
|
213
|
+
state.requestHeaders = undefined;
|
|
214
|
+
state.cookies = header.length === 0 ? new Map() : parseCookieHeader(header);
|
|
215
|
+
return state.cookies;
|
|
216
|
+
}
|
|
217
|
+
function getPending(state) {
|
|
218
|
+
if (state.pending === null)
|
|
219
|
+
state.pending = [];
|
|
220
|
+
return state.pending;
|
|
221
|
+
}
|
|
222
|
+
export function createCookieJar(secret, requestHeaders, onMutation) {
|
|
223
|
+
return new CookieJarImpl(secret ?? "", requestHeaders, onMutation);
|
|
224
|
+
}
|
|
225
|
+
export function hasPendingCookies(cookieJar) {
|
|
226
|
+
return cookieJar instanceof CookieJarImpl && cookieJar.hasPending();
|
|
227
|
+
}
|
|
228
|
+
export function applyPendingCookies(cookieJar, headers) {
|
|
229
|
+
if (!(cookieJar instanceof CookieJarImpl)) {
|
|
230
|
+
throw new TypeError("CookieJar was not created by Barq");
|
|
231
|
+
}
|
|
232
|
+
cookieJar.apply(headers);
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=cookies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookies.js","sourceRoot":"","sources":["../src/cookies.ts"],"names":[],"mappings":"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"}
|
package/dist/cors.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Middleware } from "./types";
|
|
2
|
+
export interface CorsOptions {
|
|
3
|
+
origin?: string | string[] | ((origin: string) => boolean | string);
|
|
4
|
+
methods?: string[];
|
|
5
|
+
allowedHeaders?: string[];
|
|
6
|
+
exposedHeaders?: string[];
|
|
7
|
+
credentials?: boolean;
|
|
8
|
+
maxAge?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function cors(options?: CorsOptions): Middleware;
|
|
11
|
+
//# sourceMappingURL=cors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAAC,CAAC;IACpE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,UAAU,CAyF1D"}
|
package/dist/cors.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export function cors(options = {}) {
|
|
2
|
+
const methods = (options.methods ?? ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"]).join(", ");
|
|
3
|
+
const allowedHeaders = options.allowedHeaders?.join(", ");
|
|
4
|
+
const exposedHeaders = options.exposedHeaders?.join(", ");
|
|
5
|
+
const maxAge = options.maxAge !== undefined ? String(options.maxAge) : null;
|
|
6
|
+
const credentials = options.credentials === true;
|
|
7
|
+
function resolveOrigin(reqOrigin) {
|
|
8
|
+
if (!options.origin || options.origin === "*") {
|
|
9
|
+
return credentials ? (reqOrigin ?? "*") : "*";
|
|
10
|
+
}
|
|
11
|
+
if (!reqOrigin)
|
|
12
|
+
return null;
|
|
13
|
+
if (typeof options.origin === "string") {
|
|
14
|
+
return options.origin === reqOrigin ? reqOrigin : null;
|
|
15
|
+
}
|
|
16
|
+
if (Array.isArray(options.origin)) {
|
|
17
|
+
return options.origin.includes(reqOrigin) ? reqOrigin : null;
|
|
18
|
+
}
|
|
19
|
+
if (typeof options.origin === "function") {
|
|
20
|
+
const result = options.origin(reqOrigin);
|
|
21
|
+
if (typeof result === "string")
|
|
22
|
+
return result;
|
|
23
|
+
return result ? reqOrigin : null;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
function setCorsHeaders(headers, matchedOrigin) {
|
|
28
|
+
if (matchedOrigin) {
|
|
29
|
+
headers.set("access-control-allow-origin", matchedOrigin);
|
|
30
|
+
if (matchedOrigin !== "*") {
|
|
31
|
+
headers.append("vary", "Origin");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (credentials) {
|
|
35
|
+
headers.set("access-control-allow-credentials", "true");
|
|
36
|
+
}
|
|
37
|
+
if (exposedHeaders) {
|
|
38
|
+
headers.set("access-control-expose-headers", exposedHeaders);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
before(ctx) {
|
|
43
|
+
const reqOrigin = ctx.req.headers.get("origin");
|
|
44
|
+
const matchedOrigin = resolveOrigin(reqOrigin);
|
|
45
|
+
if (ctx.req.method === "OPTIONS") {
|
|
46
|
+
const headers = new Headers();
|
|
47
|
+
setCorsHeaders(headers, matchedOrigin);
|
|
48
|
+
headers.set("access-control-allow-methods", methods);
|
|
49
|
+
if (allowedHeaders) {
|
|
50
|
+
headers.set("access-control-allow-headers", allowedHeaders);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const reqHeaders = ctx.req.headers.get("access-control-request-headers");
|
|
54
|
+
if (reqHeaders) {
|
|
55
|
+
headers.set("access-control-allow-headers", reqHeaders);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (maxAge) {
|
|
59
|
+
headers.set("access-control-max-age", maxAge);
|
|
60
|
+
}
|
|
61
|
+
headers.set("content-length", "0");
|
|
62
|
+
return new Response(null, { status: 204, headers });
|
|
63
|
+
}
|
|
64
|
+
ctx.state._corsOrigin = matchedOrigin;
|
|
65
|
+
},
|
|
66
|
+
after(ctx, res) {
|
|
67
|
+
const matchedOrigin = ctx.state
|
|
68
|
+
._corsOrigin;
|
|
69
|
+
if (matchedOrigin !== undefined) {
|
|
70
|
+
const headers = new Headers(res.headers);
|
|
71
|
+
setCorsHeaders(headers, matchedOrigin);
|
|
72
|
+
return new Response(res.body, {
|
|
73
|
+
status: res.status,
|
|
74
|
+
statusText: res.statusText,
|
|
75
|
+
headers,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return res;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=cors.js.map
|
package/dist/cors.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type HeadersInit = NonNullable<ResponseInit["headers"]>;
|
|
2
|
+
export declare class HttpError extends Error {
|
|
3
|
+
readonly status: number;
|
|
4
|
+
readonly body: unknown;
|
|
5
|
+
readonly headers?: HeadersInit;
|
|
6
|
+
constructor(status: number, body?: unknown, headers?: HeadersInit);
|
|
7
|
+
}
|
|
8
|
+
export declare function errorToResponse(err: unknown, development: boolean): Response;
|
|
9
|
+
export declare const createErrorResponse: typeof errorToResponse;
|
|
10
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;AAE/D,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;gBAEnB,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW;CAYlE;AAwDD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,QAAQ,CAa5E;AAED,eAAO,MAAM,mBAAmB,wBAAkB,CAAC"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { json } from "./http";
|
|
2
|
+
export class HttpError extends Error {
|
|
3
|
+
status;
|
|
4
|
+
body;
|
|
5
|
+
headers;
|
|
6
|
+
constructor(status, body, headers) {
|
|
7
|
+
if (!Number.isInteger(status) || status < 100 || status > 599) {
|
|
8
|
+
throw new Error(`Invalid HTTP status code: ${status}. Must be an integer between 100 and 599.`);
|
|
9
|
+
}
|
|
10
|
+
super(typeof body === "string" ? body : `HTTP ${status}`);
|
|
11
|
+
this.name = "HttpError";
|
|
12
|
+
this.status = status;
|
|
13
|
+
this.body = body ?? { error: defaultStatusText(status) };
|
|
14
|
+
if (headers !== undefined)
|
|
15
|
+
this.headers = headers;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function defaultStatusText(status) {
|
|
19
|
+
switch (status) {
|
|
20
|
+
case 400:
|
|
21
|
+
return "Bad Request";
|
|
22
|
+
case 401:
|
|
23
|
+
return "Unauthorized";
|
|
24
|
+
case 403:
|
|
25
|
+
return "Forbidden";
|
|
26
|
+
case 404:
|
|
27
|
+
return "Not Found";
|
|
28
|
+
case 405:
|
|
29
|
+
return "Method Not Allowed";
|
|
30
|
+
case 408:
|
|
31
|
+
return "Request Timeout";
|
|
32
|
+
case 409:
|
|
33
|
+
return "Conflict";
|
|
34
|
+
case 413:
|
|
35
|
+
return "Payload Too Large";
|
|
36
|
+
case 418:
|
|
37
|
+
return "I'm a teapot";
|
|
38
|
+
case 422:
|
|
39
|
+
return "Unprocessable Entity";
|
|
40
|
+
case 429:
|
|
41
|
+
return "Too Many Requests";
|
|
42
|
+
case 500:
|
|
43
|
+
return "Internal Server Error";
|
|
44
|
+
case 502:
|
|
45
|
+
return "Bad Gateway";
|
|
46
|
+
case 503:
|
|
47
|
+
return "Service Unavailable";
|
|
48
|
+
case 504:
|
|
49
|
+
return "Gateway Timeout";
|
|
50
|
+
default:
|
|
51
|
+
return status >= 500 ? "Internal Server Error" : "Error";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function safeJson(status, body, headers) {
|
|
55
|
+
try {
|
|
56
|
+
const init = headers !== undefined ? { status, headers } : { status };
|
|
57
|
+
return json(body, init);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return new Response("Internal Server Error", {
|
|
61
|
+
status: 500,
|
|
62
|
+
headers: { "content-type": "text/plain; charset=utf-8" },
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function errorToResponse(err, development) {
|
|
67
|
+
if (err instanceof Response) {
|
|
68
|
+
return err;
|
|
69
|
+
}
|
|
70
|
+
if (err instanceof HttpError) {
|
|
71
|
+
return safeJson(err.status, err.body, err.headers);
|
|
72
|
+
}
|
|
73
|
+
if (development) {
|
|
74
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
75
|
+
const stack = err instanceof Error ? err.stack : undefined;
|
|
76
|
+
return safeJson(500, { error: "Internal Server Error", message, stack });
|
|
77
|
+
}
|
|
78
|
+
return safeJson(500, { error: "Internal Server Error" });
|
|
79
|
+
}
|
|
80
|
+
export const createErrorResponse = errorToResponse;
|
|
81
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type HeadersInit = NonNullable<ResponseInit["headers"]>;
|
|
2
|
+
export declare function isNullBodyStatus(status: number): boolean;
|
|
3
|
+
export declare function json(data: unknown, init?: number | ResponseInit): Response;
|
|
4
|
+
export declare function text(body: string, init?: number | ResponseInit): Response;
|
|
5
|
+
export declare function empty(status?: number, headers?: HeadersInit): Response;
|
|
6
|
+
export declare function redirect(url: string, status?: number, allowlist?: ReadonlySet<string>): Response;
|
|
7
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;AAE/D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAExD;AAeD,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,CAoC1E;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,CAiCzE;AAED,wBAAgB,KAAK,CAAC,MAAM,SAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAInE;AAOD,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,MAAM,SAAM,EACZ,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAC9B,QAAQ,CAqCV"}
|
package/dist/http.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
const NULL_BODY_STATUSES = new Set([204, 205, 304]);
|
|
2
|
+
const DEFAULT_JSON_HEADERS = Object.freeze({
|
|
3
|
+
"content-type": "application/json; charset=utf-8",
|
|
4
|
+
});
|
|
5
|
+
const DEFAULT_JSON_INIT = Object.freeze({
|
|
6
|
+
status: 200,
|
|
7
|
+
headers: DEFAULT_JSON_HEADERS,
|
|
8
|
+
});
|
|
9
|
+
const DEFAULT_TEXT_HEADERS = Object.freeze({
|
|
10
|
+
"content-type": "text/plain; charset=utf-8",
|
|
11
|
+
});
|
|
12
|
+
export function isNullBodyStatus(status) {
|
|
13
|
+
return (status >= 100 && status < 200) || NULL_BODY_STATUSES.has(status);
|
|
14
|
+
}
|
|
15
|
+
function createJsonResponse(data, init) {
|
|
16
|
+
// Preserve JSON.stringify's empty-body behavior for values that do not
|
|
17
|
+
// produce a JSON value, while using Bun's native serializer otherwise.
|
|
18
|
+
if (data === undefined ||
|
|
19
|
+
typeof data === "function" ||
|
|
20
|
+
typeof data === "symbol") {
|
|
21
|
+
return new Response(JSON.stringify(data), init);
|
|
22
|
+
}
|
|
23
|
+
return Response.json(data, init);
|
|
24
|
+
}
|
|
25
|
+
export function json(data, init) {
|
|
26
|
+
if (init === undefined) {
|
|
27
|
+
if (typeof data === "object" && data !== null) {
|
|
28
|
+
return new Response(JSON.stringify(data), DEFAULT_JSON_INIT);
|
|
29
|
+
}
|
|
30
|
+
return createJsonResponse(data, DEFAULT_JSON_INIT);
|
|
31
|
+
}
|
|
32
|
+
if (typeof init === "number") {
|
|
33
|
+
if (isNullBodyStatus(init)) {
|
|
34
|
+
return new Response(null, { status: init });
|
|
35
|
+
}
|
|
36
|
+
return createJsonResponse(data, {
|
|
37
|
+
status: init,
|
|
38
|
+
headers: DEFAULT_JSON_HEADERS,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const status = init.status ?? 200;
|
|
42
|
+
if (isNullBodyStatus(status)) {
|
|
43
|
+
return new Response(null, { ...init, status });
|
|
44
|
+
}
|
|
45
|
+
if (init.headers === undefined) {
|
|
46
|
+
return createJsonResponse(data, {
|
|
47
|
+
...init,
|
|
48
|
+
status,
|
|
49
|
+
headers: DEFAULT_JSON_HEADERS,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const headers = new Headers(init.headers);
|
|
53
|
+
if (!headers.has("content-type")) {
|
|
54
|
+
headers.set("content-type", "application/json; charset=utf-8");
|
|
55
|
+
}
|
|
56
|
+
return createJsonResponse(data, { ...init, status, headers });
|
|
57
|
+
}
|
|
58
|
+
export function text(body, init) {
|
|
59
|
+
if (init === undefined) {
|
|
60
|
+
return new Response(body);
|
|
61
|
+
}
|
|
62
|
+
if (typeof init === "number") {
|
|
63
|
+
if (isNullBodyStatus(init)) {
|
|
64
|
+
return new Response(null, { status: init });
|
|
65
|
+
}
|
|
66
|
+
return new Response(body, {
|
|
67
|
+
status: init,
|
|
68
|
+
headers: DEFAULT_TEXT_HEADERS,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
const status = init.status ?? 200;
|
|
72
|
+
if (isNullBodyStatus(status)) {
|
|
73
|
+
return new Response(null, { ...init, status });
|
|
74
|
+
}
|
|
75
|
+
if (init.headers === undefined) {
|
|
76
|
+
return new Response(body, {
|
|
77
|
+
...init,
|
|
78
|
+
status,
|
|
79
|
+
headers: DEFAULT_TEXT_HEADERS,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const headers = new Headers(init.headers);
|
|
83
|
+
if (!headers.has("content-type")) {
|
|
84
|
+
headers.set("content-type", "text/plain; charset=utf-8");
|
|
85
|
+
}
|
|
86
|
+
return new Response(body, { ...init, status, headers });
|
|
87
|
+
}
|
|
88
|
+
export function empty(status = 204, headers) {
|
|
89
|
+
const init = headers !== undefined ? { status, headers } : { status };
|
|
90
|
+
return new Response(null, init);
|
|
91
|
+
}
|
|
92
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: This regex detects control characters in redirect targets.
|
|
93
|
+
const CONTROL_CHARS = /[\u0000-\u001f\u007f]/;
|
|
94
|
+
const ALLOWED_REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
|
|
95
|
+
export function redirect(url, status = 302, allowlist) {
|
|
96
|
+
if (!ALLOWED_REDIRECT_STATUSES.has(status)) {
|
|
97
|
+
throw new TypeError(`redirect status must be one of: ${Array.from(ALLOWED_REDIRECT_STATUSES).join(", ")}`);
|
|
98
|
+
}
|
|
99
|
+
if (CONTROL_CHARS.test(url) || url.includes("\\")) {
|
|
100
|
+
throw new TypeError("redirect target contains control or backslash characters");
|
|
101
|
+
}
|
|
102
|
+
if (url.charCodeAt(0) === 47) {
|
|
103
|
+
if (url.charCodeAt(1) === 47) {
|
|
104
|
+
throw new TypeError("redirect target must not be protocol-relative");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
let parsed;
|
|
109
|
+
try {
|
|
110
|
+
parsed = new URL(url);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
throw new TypeError("redirect target must be a root-relative path or an absolute URL");
|
|
114
|
+
}
|
|
115
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
116
|
+
throw new TypeError(`redirect target protocol is not allowed: ${parsed.protocol}`);
|
|
117
|
+
}
|
|
118
|
+
const host = parsed.host.toLowerCase();
|
|
119
|
+
if (allowlist !== undefined && !allowlist.has(host)) {
|
|
120
|
+
throw new TypeError(`redirect target host is not allowlisted: ${host}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const res = new Response(null, { status });
|
|
124
|
+
res.headers.set("location", url);
|
|
125
|
+
return res;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type { AppOptions, RouteHandlerArg, ShutdownResult, WebSocketOptions, } from "./app";
|
|
2
|
+
export { App, RouteGroup } from "./app";
|
|
3
|
+
export type { ContextApplication } from "./context";
|
|
4
|
+
export { Context } from "./context";
|
|
5
|
+
export { createCookieJar } from "./cookies";
|
|
6
|
+
export type { CorsOptions } from "./cors";
|
|
7
|
+
export { cors } from "./cors";
|
|
8
|
+
export { createErrorResponse, errorToResponse, HttpError } from "./errors";
|
|
9
|
+
export { empty, json, redirect, text } from "./http";
|
|
10
|
+
export { parseRequestTarget } from "./internal/pathname";
|
|
11
|
+
export type { MiddlewareDispatcher } from "./middleware";
|
|
12
|
+
export { composeMiddlewareDispatcher, composeMiddlewares, isThenable, runPipeline, unwindAfter, } from "./middleware";
|
|
13
|
+
export type { BeforeResult, CookieJar, ErrorHandler, Handler, HandlerResult, HttpMethod, Middleware, NotFoundHandler, Params, ResponseHandler, RouteParams, SetCookieOptions, WebSocketHandlers, } from "./types";
|
|
14
|
+
export type { StandardSchemaV1, StandardSchemaV1Issue, Validator, } from "./validation";
|
|
15
|
+
export { validateJson } from "./validation";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,OAAO,EACP,aAAa,EACb,UAAU,EACV,UAAU,EACV,eAAe,EACf,MAAM,EACN,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { App, RouteGroup } from "./app";
|
|
2
|
+
export { Context } from "./context";
|
|
3
|
+
export { createCookieJar } from "./cookies";
|
|
4
|
+
export { cors } from "./cors";
|
|
5
|
+
export { createErrorResponse, errorToResponse, HttpError } from "./errors";
|
|
6
|
+
export { empty, json, redirect, text } from "./http";
|
|
7
|
+
export { parseRequestTarget } from "./internal/pathname";
|
|
8
|
+
export { composeMiddlewareDispatcher, composeMiddlewares, isThenable, runPipeline, unwindAfter, } from "./middleware";
|
|
9
|
+
export { validateJson } from "./validation";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,GACZ,MAAM,cAAc,CAAC;AAqBtB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type IpMatcher = (ip: string) => boolean;
|
|
2
|
+
export declare function compileTrustProxy(trust: boolean | string | readonly string[] | ((ip: string) => boolean) | undefined): IpMatcher;
|
|
3
|
+
export declare function isIpRange(value: string): boolean;
|
|
4
|
+
export declare function ipMatchesRange(ip: string, range: string): boolean;
|
|
5
|
+
export declare function isValidIpAddress(value: string): boolean;
|
|
6
|
+
//# sourceMappingURL=ip.d.ts.map
|