@adonix.org/cloud-spark 0.0.26 → 0.0.27
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/dist/index.d.ts +19 -19
- package/dist/index.js +55 -48
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -86,8 +86,7 @@ declare class WorkerResponse {
|
|
|
86
86
|
constructor(cors: CorsProvider, content?: string | null, code?: StatusCodes, mimeType?: MimeType);
|
|
87
87
|
createResponse(): Response;
|
|
88
88
|
protected get responseInit(): ResponseInit;
|
|
89
|
-
protected get body():
|
|
90
|
-
protected set body(body: string | null);
|
|
89
|
+
protected get body(): BodyInit | null;
|
|
91
90
|
protected get headers(): Headers;
|
|
92
91
|
protected set headers(headers: Headers);
|
|
93
92
|
protected addCorsHeaders(): void;
|
|
@@ -101,7 +100,7 @@ declare class JsonResponse extends WorkerResponse {
|
|
|
101
100
|
constructor(cors: CorsProvider, content?: object, code?: StatusCodes);
|
|
102
101
|
get json(): object;
|
|
103
102
|
set json(json: object);
|
|
104
|
-
|
|
103
|
+
protected get body(): string;
|
|
105
104
|
}
|
|
106
105
|
declare class HtmlResponse extends WorkerResponse {
|
|
107
106
|
constructor(cors: CorsProvider, content: string, code?: StatusCodes, type?: MimeType);
|
|
@@ -148,22 +147,21 @@ declare class NotImplemented extends ErrorResponse {
|
|
|
148
147
|
constructor(cors: CorsProvider);
|
|
149
148
|
}
|
|
150
149
|
|
|
151
|
-
declare
|
|
152
|
-
private readonly _request;
|
|
150
|
+
declare class BasicWorker implements CorsProvider {
|
|
153
151
|
private readonly _env;
|
|
154
152
|
private readonly _ctx?;
|
|
155
|
-
|
|
156
|
-
|
|
153
|
+
private origin;
|
|
154
|
+
constructor(_env?: Env, _ctx?: ExecutionContext | undefined);
|
|
157
155
|
protected get env(): Env;
|
|
158
156
|
protected get ctx(): ExecutionContext | undefined;
|
|
159
|
-
fetch(): Promise<Response>;
|
|
160
|
-
protected get(): Response | Promise<Response>;
|
|
161
|
-
protected put(): Response | Promise<Response>;
|
|
162
|
-
protected post(): Response | Promise<Response>;
|
|
163
|
-
protected patch(): Response | Promise<Response>;
|
|
164
|
-
protected delete(): Response | Promise<Response>;
|
|
157
|
+
fetch(request: Request): Promise<Response>;
|
|
158
|
+
protected get(_request: Request): Response | Promise<Response>;
|
|
159
|
+
protected put(_request: Request): Response | Promise<Response>;
|
|
160
|
+
protected post(_request: Request): Response | Promise<Response>;
|
|
161
|
+
protected patch(_request: Request): Response | Promise<Response>;
|
|
162
|
+
protected delete(_request: Request): Response | Promise<Response>;
|
|
165
163
|
private options;
|
|
166
|
-
|
|
164
|
+
protected head(request: Request): Promise<Response>;
|
|
167
165
|
protected getResponse<T extends WorkerResponse, Ctor extends new (cors: CorsProvider, ...args: any[]) => T>(ResponseClass: Ctor, ...args: ConstructorParameters<Ctor> extends [any, ...infer R] ? R : never): Response;
|
|
168
166
|
getAllowOrigins(): string[];
|
|
169
167
|
getAllowMethods(): Method[];
|
|
@@ -173,12 +171,14 @@ declare abstract class BasicWorker implements CorsProvider {
|
|
|
173
171
|
getOrigin(): string | null;
|
|
174
172
|
}
|
|
175
173
|
|
|
176
|
-
declare
|
|
174
|
+
declare class RoutedWorker extends BasicWorker {
|
|
177
175
|
private routes;
|
|
178
|
-
constructor(
|
|
179
|
-
protected
|
|
180
|
-
protected addRoute(route: string | RegExp, callback: () => Response | Promise<Response>, method?: Method): void;
|
|
181
|
-
fetch(): Promise<Response>;
|
|
176
|
+
constructor(env?: Env, ctx?: ExecutionContext);
|
|
177
|
+
protected addRoutes(): void;
|
|
178
|
+
protected addRoute(route: string | RegExp, callback: (...matches: string[]) => Response | Promise<Response>, method?: Method): void;
|
|
179
|
+
fetch(request: Request): Promise<Response>;
|
|
180
|
+
private search;
|
|
181
|
+
protected head(request: Request): Promise<Response>;
|
|
182
182
|
protected get(): Response | Promise<Response>;
|
|
183
183
|
protected put(): Response | Promise<Response>;
|
|
184
184
|
protected post(): Response | Promise<Response>;
|
package/dist/index.js
CHANGED
|
@@ -118,9 +118,6 @@ var WorkerResponse = class {
|
|
|
118
118
|
get body() {
|
|
119
119
|
return this._body;
|
|
120
120
|
}
|
|
121
|
-
set body(body) {
|
|
122
|
-
this._body = body;
|
|
123
|
-
}
|
|
124
121
|
get headers() {
|
|
125
122
|
return this._headers;
|
|
126
123
|
}
|
|
@@ -134,6 +131,8 @@ var WorkerResponse = class {
|
|
|
134
131
|
this.headers.set("Access-Control-Allow-Origin", "*");
|
|
135
132
|
} else if (this.getAllowOrigins().includes(origin)) {
|
|
136
133
|
this.headers.set("Access-Control-Allow-Origin", origin);
|
|
134
|
+
this.headers.set("Access-Control-Allow-Credentials", "true");
|
|
135
|
+
this.headers.set("Vary", "Origin");
|
|
137
136
|
}
|
|
138
137
|
this.headers.set(
|
|
139
138
|
"Access-Control-Allow-Headers",
|
|
@@ -171,9 +170,8 @@ var JsonResponse = class extends WorkerResponse {
|
|
|
171
170
|
set json(json) {
|
|
172
171
|
this._json = json;
|
|
173
172
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
return super.createResponse();
|
|
173
|
+
get body() {
|
|
174
|
+
return JSON.stringify(this.json);
|
|
177
175
|
}
|
|
178
176
|
};
|
|
179
177
|
var HtmlResponse = class extends WorkerResponse {
|
|
@@ -260,70 +258,65 @@ var NotImplemented = class extends ErrorResponse {
|
|
|
260
258
|
|
|
261
259
|
// src/basic-worker.ts
|
|
262
260
|
var BasicWorker = class {
|
|
263
|
-
constructor(
|
|
264
|
-
this._request = _request;
|
|
261
|
+
constructor(_env = {}, _ctx) {
|
|
265
262
|
this._env = _env;
|
|
266
263
|
this._ctx = _ctx;
|
|
267
264
|
}
|
|
268
|
-
|
|
269
|
-
return this._request;
|
|
270
|
-
}
|
|
265
|
+
origin = null;
|
|
271
266
|
get env() {
|
|
272
267
|
return this._env;
|
|
273
268
|
}
|
|
274
269
|
get ctx() {
|
|
275
270
|
return this._ctx;
|
|
276
271
|
}
|
|
277
|
-
async fetch() {
|
|
278
|
-
if (!this.isAllowed(
|
|
279
|
-
return this.getResponse(MethodNotAllowed,
|
|
272
|
+
async fetch(request) {
|
|
273
|
+
if (!this.isAllowed(request.method)) {
|
|
274
|
+
return this.getResponse(MethodNotAllowed, request.method);
|
|
280
275
|
}
|
|
276
|
+
this.origin = request.headers.get("Origin");
|
|
281
277
|
try {
|
|
282
|
-
switch (
|
|
278
|
+
switch (request.method) {
|
|
283
279
|
case "GET" /* GET */:
|
|
284
|
-
return await this.get();
|
|
280
|
+
return await this.get(request);
|
|
285
281
|
case "PUT" /* PUT */:
|
|
286
|
-
return await this.put();
|
|
282
|
+
return await this.put(request);
|
|
287
283
|
case "POST" /* POST */:
|
|
288
|
-
return await this.post();
|
|
284
|
+
return await this.post(request);
|
|
289
285
|
case "PATCH" /* PATCH */:
|
|
290
|
-
return await this.patch();
|
|
286
|
+
return await this.patch(request);
|
|
291
287
|
case "DELETE" /* DELETE */:
|
|
292
|
-
return await this.delete();
|
|
288
|
+
return await this.delete(request);
|
|
293
289
|
case "HEAD" /* HEAD */:
|
|
294
|
-
return await this.head();
|
|
290
|
+
return await this.head(request);
|
|
295
291
|
case "OPTIONS" /* OPTIONS */:
|
|
296
|
-
return await this.options();
|
|
292
|
+
return await this.options(request);
|
|
297
293
|
default:
|
|
298
|
-
return this.getResponse(
|
|
299
|
-
MethodNotAllowed,
|
|
300
|
-
this.request.method
|
|
301
|
-
);
|
|
294
|
+
return this.getResponse(MethodNotAllowed, request.method);
|
|
302
295
|
}
|
|
303
296
|
} catch (error) {
|
|
304
297
|
return this.getResponse(InternalServerError, String(error));
|
|
305
298
|
}
|
|
306
299
|
}
|
|
307
|
-
get() {
|
|
300
|
+
get(_request) {
|
|
308
301
|
return this.getResponse(NotImplemented);
|
|
309
302
|
}
|
|
310
|
-
put() {
|
|
303
|
+
put(_request) {
|
|
311
304
|
return this.getResponse(NotImplemented);
|
|
312
305
|
}
|
|
313
|
-
post() {
|
|
306
|
+
post(_request) {
|
|
314
307
|
return this.getResponse(NotImplemented);
|
|
315
308
|
}
|
|
316
|
-
patch() {
|
|
309
|
+
patch(_request) {
|
|
317
310
|
return this.getResponse(NotImplemented);
|
|
318
311
|
}
|
|
319
|
-
delete() {
|
|
312
|
+
delete(_request) {
|
|
320
313
|
return this.getResponse(NotImplemented);
|
|
321
314
|
}
|
|
322
|
-
options() {
|
|
315
|
+
options(_request) {
|
|
323
316
|
return this.getResponse(Options);
|
|
324
317
|
}
|
|
325
|
-
async head() {
|
|
326
|
-
return this.getResponse(Head, await this.get());
|
|
318
|
+
async head(request) {
|
|
319
|
+
return this.getResponse(Head, await this.get(request));
|
|
327
320
|
}
|
|
328
321
|
getResponse(ResponseClass, ...args) {
|
|
329
322
|
return new ResponseClass(this, ...args).createResponse();
|
|
@@ -344,17 +337,19 @@ var BasicWorker = class {
|
|
|
344
337
|
return Time.Day;
|
|
345
338
|
}
|
|
346
339
|
getOrigin() {
|
|
347
|
-
return this.
|
|
340
|
+
return this.origin;
|
|
348
341
|
}
|
|
349
342
|
};
|
|
350
343
|
|
|
351
344
|
// src/routed-worker.ts
|
|
352
345
|
var RoutedWorker = class extends BasicWorker {
|
|
353
346
|
routes = /* @__PURE__ */ new Map();
|
|
354
|
-
constructor(
|
|
355
|
-
super(
|
|
347
|
+
constructor(env = {}, ctx) {
|
|
348
|
+
super(env, ctx);
|
|
356
349
|
this.addRoutes();
|
|
357
350
|
}
|
|
351
|
+
addRoutes() {
|
|
352
|
+
}
|
|
358
353
|
addRoute(route, callback, method = "GET" /* GET */) {
|
|
359
354
|
if (!isMethod(method)) {
|
|
360
355
|
throw new Error(`Unknown method ${method}`);
|
|
@@ -364,37 +359,49 @@ var RoutedWorker = class extends BasicWorker {
|
|
|
364
359
|
`${method} is not currently allowed. Update or override getAllowedMethods()`
|
|
365
360
|
);
|
|
366
361
|
}
|
|
367
|
-
const
|
|
362
|
+
const bound = callback.bind(this);
|
|
368
363
|
const handlers = this.routes.get(method) ?? [];
|
|
369
|
-
handlers.push({ route, callback:
|
|
364
|
+
handlers.push({ route, callback: bound });
|
|
370
365
|
this.routes.set(method, handlers);
|
|
371
366
|
}
|
|
372
|
-
async fetch() {
|
|
373
|
-
const method =
|
|
367
|
+
async fetch(request) {
|
|
368
|
+
const method = request.method;
|
|
374
369
|
if (!isMethod(method)) {
|
|
375
370
|
throw new Error(`Unsupported method ${method}`);
|
|
376
371
|
}
|
|
377
|
-
if (!this.isAllowed(
|
|
378
|
-
return this.getResponse(MethodNotAllowed,
|
|
372
|
+
if (!this.isAllowed(method)) {
|
|
373
|
+
return this.getResponse(MethodNotAllowed, method);
|
|
379
374
|
}
|
|
380
375
|
let url;
|
|
381
376
|
try {
|
|
382
|
-
url = new URL(
|
|
377
|
+
url = new URL(request.url);
|
|
383
378
|
} catch {
|
|
384
379
|
return this.getResponse(BadRequest, "Malformed URL");
|
|
385
380
|
}
|
|
381
|
+
return await this.search(method, url) ?? super.fetch(request);
|
|
382
|
+
}
|
|
383
|
+
async search(method, url) {
|
|
386
384
|
const handlers = this.routes.get(method) ?? [];
|
|
387
|
-
const
|
|
385
|
+
const handler = handlers.find(
|
|
388
386
|
({ route }) => route instanceof RegExp ? route.test(url.pathname) : route === url.pathname
|
|
389
387
|
);
|
|
390
|
-
if (
|
|
388
|
+
if (handler) {
|
|
391
389
|
try {
|
|
392
|
-
|
|
390
|
+
if (handler.route instanceof RegExp) {
|
|
391
|
+
const match = url.pathname.match(handler.route);
|
|
392
|
+
return await handler.callback(...match ?? []);
|
|
393
|
+
} else {
|
|
394
|
+
return await handler.callback();
|
|
395
|
+
}
|
|
393
396
|
} catch (err) {
|
|
394
397
|
return this.getResponse(InternalServerError, String(err));
|
|
395
398
|
}
|
|
396
399
|
}
|
|
397
|
-
return
|
|
400
|
+
return void 0;
|
|
401
|
+
}
|
|
402
|
+
async head(request) {
|
|
403
|
+
const getRequest = new Request(request, { method: "GET" /* GET */ });
|
|
404
|
+
return this.getResponse(Head, await this.fetch(getRequest));
|
|
398
405
|
}
|
|
399
406
|
get() {
|
|
400
407
|
return this.getResponse(NotFound);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/common.ts","../src/response.ts","../src/basic-worker.ts","../src/routed-worker.ts"],"sourcesContent":["/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { StatusCodes } from \"http-status-codes\";\n\nexport * from \"./common\";\nexport * from \"./response\";\nexport * from \"./basic-worker\";\nexport * from \"./routed-worker\";\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const Time = {\n Second: 1,\n Minute: 60,\n Hour: 60 * 60,\n Day: 60 * 60 * 24,\n Week: 60 * 60 * 24 * 7,\n} as const;\n\nexport enum Method {\n GET = \"GET\",\n PUT = \"PUT\",\n POST = \"POST\",\n PATCH = \"PATCH\",\n DELETE = \"DELETE\",\n HEAD = \"HEAD\",\n OPTIONS = \"OPTIONS\",\n}\n\nconst METHOD_SET: Set<string> = new Set(Object.values(Method));\n\nexport function isMethod(value: string): value is Method {\n return METHOD_SET.has(value);\n}\n\nexport function getContentType(type: MimeType): string {\n if (ADD_CHARSET.has(type)) {\n return `${type}; charset=utf-8`;\n }\n return type;\n}\n\nexport enum MimeType {\n PLAIN_TEXT = \"text/plain\",\n HTML = \"text/html\",\n CSS = \"text/css\",\n CSV = \"text/csv\",\n XML = \"text/xml\",\n MARKDOWN = \"text/markdown\",\n RICH_TEXT = \"text/richtext\",\n JSON = \"application/json\",\n XML_APP = \"application/xml\",\n YAML = \"application/x-yaml\",\n FORM_URLENCODED = \"application/x-www-form-urlencoded\",\n NDJSON = \"application/x-ndjson\",\n MSGPACK = \"application/x-msgpack\",\n PROTOBUF = \"application/x-protobuf\",\n MULTIPART_FORM_DATA = \"multipart/form-data\",\n MULTIPART_MIXED = \"multipart/mixed\",\n MULTIPART_ALTERNATIVE = \"multipart/alternative\",\n MULTIPART_DIGEST = \"multipart/digest\",\n MULTIPART_RELATED = \"multipart/related\",\n MULTIPART_SIGNED = \"multipart/signed\",\n MULTIPART_ENCRYPTED = \"multipart/encrypted\",\n OCTET_STREAM = \"application/octet-stream\",\n PDF = \"application/pdf\",\n ZIP = \"application/zip\",\n GZIP = \"application/gzip\",\n MSWORD = \"application/msword\",\n DOCX = \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n EXCEL = \"application/vnd.ms-excel\",\n XLSX = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n POWERPOINT = \"application/vnd.ms-powerpoint\",\n PPTX = \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n ICO = \"image/x-icon\",\n ICO_MS = \"image/vnd.microsoft.icon\",\n GIF = \"image/gif\",\n PNG = \"image/png\",\n JPEG = \"image/jpeg\",\n WEBP = \"image/webp\",\n SVG = \"image/svg+xml\",\n HEIF = \"image/heif\",\n AVIF = \"image/avif\",\n EVENT_STREAM = \"text/event-stream\",\n TAR = \"application/x-tar\",\n BZIP2 = \"application/x-bzip2\",\n}\n\nconst ADD_CHARSET: Set<MimeType> = new Set([\n MimeType.PLAIN_TEXT,\n MimeType.HTML,\n MimeType.CSS,\n MimeType.CSV,\n MimeType.MARKDOWN,\n MimeType.XML,\n MimeType.JSON,\n MimeType.XML_APP,\n MimeType.FORM_URLENCODED,\n MimeType.NDJSON,\n MimeType.RICH_TEXT,\n MimeType.SVG,\n]);\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getReasonPhrase, StatusCodes } from \"http-status-codes\";\nimport { getContentType, Method, MimeType } from \"./common\";\n\nexport interface CorsProvider {\n getOrigin(): string | null;\n getAllowOrigins(): string[];\n getAllowMethods(): Method[];\n getAllowHeaders(): string[];\n getMaxAge(): number;\n}\n\nexport interface ErrorJson {\n code: number;\n error: string;\n details: string;\n}\n\nexport class WorkerResponse {\n private _headers: Headers = new Headers();\n private _body: string | null;\n\n constructor(\n protected readonly cors: CorsProvider,\n content: string | null = null,\n protected readonly code: StatusCodes = StatusCodes.OK,\n protected readonly mimeType: MimeType = MimeType.JSON\n ) {\n this._body = this.code === StatusCodes.NO_CONTENT ? null : content;\n }\n\n public createResponse(): Response {\n this.addCorsHeaders();\n if (this.body) {\n this.headers.set(\"Content-Type\", getContentType(this.mimeType));\n }\n return new Response(this.body, this.responseInit);\n }\n\n protected get responseInit(): ResponseInit {\n return {\n headers: this.headers,\n status: this.code,\n statusText: getReasonPhrase(this.code),\n };\n }\n\n protected get body(): string | null {\n return this._body;\n }\n\n protected set body(body: string | null) {\n this._body = body;\n }\n\n protected get headers(): Headers {\n return this._headers;\n }\n\n protected set headers(headers: Headers) {\n this._headers = headers;\n }\n\n protected addCorsHeaders(): void {\n const origin = this.cors.getOrigin();\n if (!origin) return; // no Origin, skip CORS\n\n if (this.getAllowOrigins().includes(\"*\")) {\n this.headers.set(\"Access-Control-Allow-Origin\", \"*\");\n } else if (this.getAllowOrigins().includes(origin)) {\n this.headers.set(\"Access-Control-Allow-Origin\", origin);\n }\n this.headers.set(\n \"Access-Control-Allow-Headers\",\n this.getAllowHeaders()\n );\n this.headers.set(\n \"Access-Control-Allow-Methods\",\n this.getAllowMethods()\n );\n this.headers.set(\"Access-Control-Max-Age\", this.getMaxAge());\n this.headers.set(\"X-Content-Type-Options\", \"nosniff\");\n }\n\n protected getAllowMethods(): string {\n return this.cors.getAllowMethods().join(\", \");\n }\n\n protected getAllowHeaders(): string {\n return this.cors.getAllowHeaders().join(\", \");\n }\n\n protected getAllowOrigins(): string[] {\n return this.cors.getAllowOrigins();\n }\n\n protected getMaxAge(): string {\n return String(this.cors.getMaxAge());\n }\n}\n\nexport class JsonResponse extends WorkerResponse {\n private _json: object;\n constructor(\n cors: CorsProvider,\n content: object = {},\n code: StatusCodes = StatusCodes.OK\n ) {\n super(cors, null, code, MimeType.JSON);\n this._json = content;\n }\n\n public get json(): object {\n return this._json;\n }\n\n public set json(json: object) {\n this._json = json;\n }\n\n public override createResponse(): Response {\n this.body = JSON.stringify(this.json);\n return super.createResponse();\n }\n}\n\nexport class HtmlResponse extends WorkerResponse {\n constructor(\n cors: CorsProvider,\n content: string,\n code: StatusCodes = StatusCodes.OK,\n type: MimeType = MimeType.HTML\n ) {\n super(cors, content, code, type);\n }\n}\n\nexport class TextResponse extends WorkerResponse {\n constructor(\n cors: CorsProvider,\n content: string,\n code: StatusCodes = StatusCodes.OK,\n type: MimeType = MimeType.PLAIN_TEXT\n ) {\n super(cors, content, code, type);\n }\n}\n\n/**\n * Remove the body from a GET response.\n */\nexport class Head extends WorkerResponse {\n constructor(cors: CorsProvider, response: Response) {\n super(cors, null, response.status);\n this.headers = new Headers(response.headers);\n }\n}\n\nexport class Options extends WorkerResponse {\n constructor(cors: CorsProvider) {\n super(cors, null, StatusCodes.NO_CONTENT);\n this.headers.set(\"Allow\", this.getAllowMethods());\n }\n}\n\nexport class ErrorResponse extends JsonResponse {\n constructor(\n cors: CorsProvider,\n code: StatusCodes,\n protected details?: string\n ) {\n super(cors, {}, code);\n }\n\n public override get json(): ErrorJson {\n return {\n code: this.code,\n error: getReasonPhrase(this.code),\n details: this.details ?? getReasonPhrase(this.code),\n };\n }\n}\n\nexport class BadRequest extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.BAD_REQUEST, detail);\n }\n}\n\nexport class Unauthorized extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.UNAUTHORIZED, detail);\n }\n}\n\nexport class Forbidden extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.FORBIDDEN, detail);\n }\n}\n\nexport class NotFound extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.NOT_FOUND, detail);\n }\n}\n\nexport class MethodNotAllowed extends ErrorResponse {\n constructor(cors: CorsProvider, method: string) {\n super(\n cors,\n StatusCodes.METHOD_NOT_ALLOWED,\n `${method} method not allowed.`\n );\n this.headers.set(\"Allow\", this.getAllowMethods());\n }\n\n public override get json(): ErrorJson & { allowed: Method[] } {\n return {\n ...super.json,\n allowed: this.cors.getAllowMethods(),\n };\n }\n}\n\nexport class InternalServerError extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.INTERNAL_SERVER_ERROR, detail);\n }\n}\n\nexport class NotImplemented extends ErrorResponse {\n constructor(cors: CorsProvider) {\n super(cors, StatusCodes.NOT_IMPLEMENTED);\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isMethod, Method, Time } from \"./common\";\nimport {\n CorsProvider,\n Head,\n InternalServerError,\n MethodNotAllowed,\n NotImplemented,\n Options,\n WorkerResponse,\n} from \"./response\";\n\nexport abstract class BasicWorker implements CorsProvider {\n constructor(\n private readonly _request: Request,\n private readonly _env: Env = {},\n private readonly _ctx?: ExecutionContext\n ) {}\n\n protected get request(): Request {\n return this._request;\n }\n\n protected get env(): Env {\n return this._env;\n }\n\n protected get ctx(): ExecutionContext | undefined {\n return this._ctx;\n }\n\n public async fetch(): Promise<Response> {\n if (!this.isAllowed(this.request.method)) {\n return this.getResponse(MethodNotAllowed, this.request.method);\n }\n\n try {\n switch (this.request.method) {\n case Method.GET:\n return await this.get();\n case Method.PUT:\n return await this.put();\n case Method.POST:\n return await this.post();\n case Method.PATCH:\n return await this.patch();\n case Method.DELETE:\n return await this.delete();\n case Method.HEAD:\n return await this.head();\n case Method.OPTIONS:\n return await this.options();\n default:\n return this.getResponse(\n MethodNotAllowed,\n this.request.method\n );\n }\n } catch (error) {\n return this.getResponse(InternalServerError, String(error));\n }\n }\n\n protected get(): Response | Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected put(): Response | Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected post(): Response | Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected patch(): Response | Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected delete(): Response | Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n private options(): Response | Promise<Response> {\n return this.getResponse(Options);\n }\n\n private async head(): Promise<Response> {\n return this.getResponse(Head, await this.get());\n }\n\n protected getResponse<\n T extends WorkerResponse,\n Ctor extends new (cors: CorsProvider, ...args: any[]) => T\n >(\n ResponseClass: Ctor,\n ...args: ConstructorParameters<Ctor> extends [any, ...infer R]\n ? R\n : never\n ): Response {\n return new ResponseClass(this, ...args).createResponse();\n }\n\n public getAllowOrigins(): string[] {\n return [\"*\"];\n }\n\n public getAllowMethods(): Method[] {\n return [Method.GET, Method.OPTIONS, Method.HEAD];\n }\n\n public isAllowed(method: string): boolean {\n return isMethod(method) && this.getAllowMethods().includes(method);\n }\n\n public getAllowHeaders(): string[] {\n return [\"Content-Type\"];\n }\n\n public getMaxAge(): number {\n return Time.Day;\n }\n\n public getOrigin(): string | null {\n return this.request.headers.get(\"Origin\");\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BasicWorker } from \"./basic-worker\";\nimport { isMethod, Method } from \"./common\";\nimport {\n BadRequest,\n InternalServerError,\n MethodNotAllowed,\n NotFound,\n} from \"./response\";\n\ninterface RouteHandler {\n route: string | RegExp;\n callback: () => Response | Promise<Response>;\n}\n\nexport abstract class RoutedWorker extends BasicWorker {\n private routes: Map<Method, RouteHandler[]> = new Map();\n\n constructor(request: Request, env: Env = {}, ctx?: ExecutionContext) {\n super(request, env, ctx);\n this.addRoutes();\n }\n\n protected abstract addRoutes(): void;\n\n protected addRoute(\n route: string | RegExp,\n callback: () => Response | Promise<Response>,\n method: Method = Method.GET\n ): void {\n if (!isMethod(method)) {\n throw new Error(`Unknown method ${method}`);\n }\n if (!this.getAllowMethods().includes(method)) {\n throw new Error(\n `${method} is not currently allowed. Update or override getAllowedMethods()`\n );\n }\n\n const boundCallback = callback.bind(this);\n const handlers = this.routes.get(method) ?? [];\n handlers.push({ route, callback: boundCallback });\n this.routes.set(method, handlers);\n }\n\n public override async fetch(): Promise<Response> {\n const method = this.request.method;\n if (!isMethod(method)) {\n throw new Error(`Unsupported method ${method}`);\n }\n if (!this.isAllowed(this.request.method)) {\n return this.getResponse(MethodNotAllowed, this.request.method);\n }\n\n let url: URL;\n try {\n url = new URL(this.request.url);\n } catch {\n return this.getResponse(BadRequest, \"Malformed URL\");\n }\n\n const handlers = this.routes.get(method) ?? [];\n const match = handlers.find(({ route }) =>\n route instanceof RegExp\n ? route.test(url.pathname)\n : route === url.pathname\n );\n\n if (match) {\n try {\n return await match.callback();\n } catch (err) {\n return this.getResponse(InternalServerError, String(err));\n }\n }\n return await super.fetch();\n }\n\n protected override get(): Response | Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override put(): Response | Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override post(): Response | Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override patch(): Response | Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override delete(): Response | Promise<Response> {\n return this.getResponse(NotFound);\n }\n}\n"],"mappings":"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","names":["StatusCodes","Method","MimeType"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/common.ts","../src/response.ts","../src/basic-worker.ts","../src/routed-worker.ts"],"sourcesContent":["/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { StatusCodes } from \"http-status-codes\";\n\nexport * from \"./common\";\nexport * from \"./response\";\nexport * from \"./basic-worker\";\nexport * from \"./routed-worker\";\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const Time = {\n Second: 1,\n Minute: 60,\n Hour: 60 * 60,\n Day: 60 * 60 * 24,\n Week: 60 * 60 * 24 * 7,\n} as const;\n\nexport enum Method {\n GET = \"GET\",\n PUT = \"PUT\",\n POST = \"POST\",\n PATCH = \"PATCH\",\n DELETE = \"DELETE\",\n HEAD = \"HEAD\",\n OPTIONS = \"OPTIONS\",\n}\n\nconst METHOD_SET: Set<string> = new Set(Object.values(Method));\n\nexport function isMethod(value: string): value is Method {\n return METHOD_SET.has(value);\n}\n\nexport function getContentType(type: MimeType): string {\n if (ADD_CHARSET.has(type)) {\n return `${type}; charset=utf-8`;\n }\n return type;\n}\n\nexport enum MimeType {\n PLAIN_TEXT = \"text/plain\",\n HTML = \"text/html\",\n CSS = \"text/css\",\n CSV = \"text/csv\",\n XML = \"text/xml\",\n MARKDOWN = \"text/markdown\",\n RICH_TEXT = \"text/richtext\",\n JSON = \"application/json\",\n XML_APP = \"application/xml\",\n YAML = \"application/x-yaml\",\n FORM_URLENCODED = \"application/x-www-form-urlencoded\",\n NDJSON = \"application/x-ndjson\",\n MSGPACK = \"application/x-msgpack\",\n PROTOBUF = \"application/x-protobuf\",\n MULTIPART_FORM_DATA = \"multipart/form-data\",\n MULTIPART_MIXED = \"multipart/mixed\",\n MULTIPART_ALTERNATIVE = \"multipart/alternative\",\n MULTIPART_DIGEST = \"multipart/digest\",\n MULTIPART_RELATED = \"multipart/related\",\n MULTIPART_SIGNED = \"multipart/signed\",\n MULTIPART_ENCRYPTED = \"multipart/encrypted\",\n OCTET_STREAM = \"application/octet-stream\",\n PDF = \"application/pdf\",\n ZIP = \"application/zip\",\n GZIP = \"application/gzip\",\n MSWORD = \"application/msword\",\n DOCX = \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n EXCEL = \"application/vnd.ms-excel\",\n XLSX = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n POWERPOINT = \"application/vnd.ms-powerpoint\",\n PPTX = \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n ICO = \"image/x-icon\",\n ICO_MS = \"image/vnd.microsoft.icon\",\n GIF = \"image/gif\",\n PNG = \"image/png\",\n JPEG = \"image/jpeg\",\n WEBP = \"image/webp\",\n SVG = \"image/svg+xml\",\n HEIF = \"image/heif\",\n AVIF = \"image/avif\",\n EVENT_STREAM = \"text/event-stream\",\n TAR = \"application/x-tar\",\n BZIP2 = \"application/x-bzip2\",\n}\n\nconst ADD_CHARSET: Set<MimeType> = new Set([\n MimeType.PLAIN_TEXT,\n MimeType.HTML,\n MimeType.CSS,\n MimeType.CSV,\n MimeType.MARKDOWN,\n MimeType.XML,\n MimeType.JSON,\n MimeType.XML_APP,\n MimeType.FORM_URLENCODED,\n MimeType.NDJSON,\n MimeType.RICH_TEXT,\n MimeType.SVG,\n]);\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getReasonPhrase, StatusCodes } from \"http-status-codes\";\nimport { getContentType, Method, MimeType } from \"./common\";\n\nexport interface CorsProvider {\n getOrigin(): string | null;\n getAllowOrigins(): string[];\n getAllowMethods(): Method[];\n getAllowHeaders(): string[];\n getMaxAge(): number;\n}\n\nexport interface ErrorJson {\n code: number;\n error: string;\n details: string;\n}\n\nexport class WorkerResponse {\n private _headers: Headers = new Headers();\n private _body: BodyInit | null;\n\n constructor(\n protected readonly cors: CorsProvider,\n content: string | null = null,\n protected readonly code: StatusCodes = StatusCodes.OK,\n protected readonly mimeType: MimeType = MimeType.JSON\n ) {\n this._body = this.code === StatusCodes.NO_CONTENT ? null : content;\n }\n\n public createResponse(): Response {\n this.addCorsHeaders();\n if (this.body) {\n this.headers.set(\"Content-Type\", getContentType(this.mimeType));\n }\n return new Response(this.body, this.responseInit);\n }\n\n protected get responseInit(): ResponseInit {\n return {\n headers: this.headers,\n status: this.code,\n statusText: getReasonPhrase(this.code),\n };\n }\n\n protected get body(): BodyInit | null {\n return this._body;\n }\n\n protected get headers(): Headers {\n return this._headers;\n }\n\n protected set headers(headers: Headers) {\n this._headers = headers;\n }\n\n protected addCorsHeaders(): void {\n const origin = this.cors.getOrigin();\n if (!origin) return; // no Origin, skip CORS\n\n if (this.getAllowOrigins().includes(\"*\")) {\n this.headers.set(\"Access-Control-Allow-Origin\", \"*\");\n } else if (this.getAllowOrigins().includes(origin)) {\n this.headers.set(\"Access-Control-Allow-Origin\", origin);\n this.headers.set(\"Access-Control-Allow-Credentials\", \"true\");\n this.headers.set(\"Vary\", \"Origin\");\n }\n this.headers.set(\n \"Access-Control-Allow-Headers\",\n this.getAllowHeaders()\n );\n this.headers.set(\n \"Access-Control-Allow-Methods\",\n this.getAllowMethods()\n );\n this.headers.set(\"Access-Control-Max-Age\", this.getMaxAge());\n this.headers.set(\"X-Content-Type-Options\", \"nosniff\");\n }\n\n protected getAllowMethods(): string {\n return this.cors.getAllowMethods().join(\", \");\n }\n\n protected getAllowHeaders(): string {\n return this.cors.getAllowHeaders().join(\", \");\n }\n\n protected getAllowOrigins(): string[] {\n return this.cors.getAllowOrigins();\n }\n\n protected getMaxAge(): string {\n return String(this.cors.getMaxAge());\n }\n}\n\nexport class JsonResponse extends WorkerResponse {\n private _json: object;\n constructor(\n cors: CorsProvider,\n content: object = {},\n code: StatusCodes = StatusCodes.OK\n ) {\n super(cors, null, code, MimeType.JSON);\n this._json = content;\n }\n\n public get json(): object {\n return this._json;\n }\n\n public set json(json: object) {\n this._json = json;\n }\n\n protected override get body(): string {\n return JSON.stringify(this.json);\n }\n}\n\nexport class HtmlResponse extends WorkerResponse {\n constructor(\n cors: CorsProvider,\n content: string,\n code: StatusCodes = StatusCodes.OK,\n type: MimeType = MimeType.HTML\n ) {\n super(cors, content, code, type);\n }\n}\n\nexport class TextResponse extends WorkerResponse {\n constructor(\n cors: CorsProvider,\n content: string,\n code: StatusCodes = StatusCodes.OK,\n type: MimeType = MimeType.PLAIN_TEXT\n ) {\n super(cors, content, code, type);\n }\n}\n\n/**\n * Remove the body from a GET response.\n */\nexport class Head extends WorkerResponse {\n constructor(cors: CorsProvider, response: Response) {\n super(cors, null, response.status);\n this.headers = new Headers(response.headers);\n }\n}\n\nexport class Options extends WorkerResponse {\n constructor(cors: CorsProvider) {\n super(cors, null, StatusCodes.NO_CONTENT);\n this.headers.set(\"Allow\", this.getAllowMethods());\n }\n}\n\nexport class ErrorResponse extends JsonResponse {\n constructor(\n cors: CorsProvider,\n code: StatusCodes,\n protected details?: string\n ) {\n super(cors, {}, code);\n }\n\n public override get json(): ErrorJson {\n return {\n code: this.code,\n error: getReasonPhrase(this.code),\n details: this.details ?? getReasonPhrase(this.code),\n };\n }\n}\n\nexport class BadRequest extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.BAD_REQUEST, detail);\n }\n}\n\nexport class Unauthorized extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.UNAUTHORIZED, detail);\n }\n}\n\nexport class Forbidden extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.FORBIDDEN, detail);\n }\n}\n\nexport class NotFound extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.NOT_FOUND, detail);\n }\n}\n\nexport class MethodNotAllowed extends ErrorResponse {\n constructor(cors: CorsProvider, method: string) {\n super(\n cors,\n StatusCodes.METHOD_NOT_ALLOWED,\n `${method} method not allowed.`\n );\n this.headers.set(\"Allow\", this.getAllowMethods());\n }\n\n public override get json(): ErrorJson & { allowed: Method[] } {\n return {\n ...super.json,\n allowed: this.cors.getAllowMethods(),\n };\n }\n}\n\nexport class InternalServerError extends ErrorResponse {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.INTERNAL_SERVER_ERROR, detail);\n }\n}\n\nexport class NotImplemented extends ErrorResponse {\n constructor(cors: CorsProvider) {\n super(cors, StatusCodes.NOT_IMPLEMENTED);\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isMethod, Method, Time } from \"./common\";\nimport {\n CorsProvider,\n Head,\n InternalServerError,\n MethodNotAllowed,\n NotImplemented,\n Options,\n WorkerResponse,\n} from \"./response\";\n\nexport class BasicWorker implements CorsProvider {\n private origin: string | null = null;\n\n constructor(\n private readonly _env: Env = {},\n private readonly _ctx?: ExecutionContext\n ) {}\n\n protected get env(): Env {\n return this._env;\n }\n\n protected get ctx(): ExecutionContext | undefined {\n return this._ctx;\n }\n\n public async fetch(request: Request): Promise<Response> {\n if (!this.isAllowed(request.method)) {\n return this.getResponse(MethodNotAllowed, request.method);\n }\n\n this.origin = request.headers.get(\"Origin\");\n\n try {\n switch (request.method) {\n case Method.GET:\n return await this.get(request);\n case Method.PUT:\n return await this.put(request);\n case Method.POST:\n return await this.post(request);\n case Method.PATCH:\n return await this.patch(request);\n case Method.DELETE:\n return await this.delete(request);\n case Method.HEAD:\n return await this.head(request);\n case Method.OPTIONS:\n return await this.options(request);\n default:\n return this.getResponse(MethodNotAllowed, request.method);\n }\n } catch (error) {\n return this.getResponse(InternalServerError, String(error));\n }\n }\n\n protected get(_request: Request): Response | Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected put(_request: Request): Response | Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected post(_request: Request): Response | Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected patch(_request: Request): Response | Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected delete(_request: Request): Response | Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n private options(_request: Request): Response | Promise<Response> {\n return this.getResponse(Options);\n }\n\n protected async head(request: Request): Promise<Response> {\n return this.getResponse(Head, await this.get(request));\n }\n\n protected getResponse<\n T extends WorkerResponse,\n Ctor extends new (cors: CorsProvider, ...args: any[]) => T\n >(\n ResponseClass: Ctor,\n ...args: ConstructorParameters<Ctor> extends [any, ...infer R]\n ? R\n : never\n ): Response {\n return new ResponseClass(this, ...args).createResponse();\n }\n\n public getAllowOrigins(): string[] {\n return [\"*\"];\n }\n\n public getAllowMethods(): Method[] {\n return [Method.GET, Method.OPTIONS, Method.HEAD];\n }\n\n public isAllowed(method: string): boolean {\n return isMethod(method) && this.getAllowMethods().includes(method);\n }\n\n public getAllowHeaders(): string[] {\n return [\"Content-Type\"];\n }\n\n public getMaxAge(): number {\n return Time.Day;\n }\n\n public getOrigin(): string | null {\n return this.origin;\n }\n}\n","/*\n * Copyright (C) 2025 Ty Busby\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BasicWorker } from \"./basic-worker\";\nimport { isMethod, Method } from \"./common\";\nimport {\n BadRequest,\n Head,\n InternalServerError,\n MethodNotAllowed,\n NotFound,\n} from \"./response\";\n\ninterface RouteHandler {\n route: string | RegExp;\n callback: (...matches: string[]) => Response | Promise<Response>;\n}\n\nexport class RoutedWorker extends BasicWorker {\n private routes: Map<Method, RouteHandler[]> = new Map();\n\n constructor(env: Env = {}, ctx?: ExecutionContext) {\n super(env, ctx);\n this.addRoutes();\n }\n\n protected addRoutes(): void {}\n\n protected addRoute(\n route: string | RegExp,\n callback: (...matches: string[]) => Response | Promise<Response>,\n method: Method = Method.GET\n ): void {\n if (!isMethod(method)) {\n throw new Error(`Unknown method ${method}`);\n }\n if (!this.getAllowMethods().includes(method)) {\n throw new Error(\n `${method} is not currently allowed. Update or override getAllowedMethods()`\n );\n }\n\n const bound = callback.bind(this);\n const handlers = this.routes.get(method) ?? [];\n handlers.push({ route, callback: bound });\n this.routes.set(method, handlers);\n }\n\n public override async fetch(request: Request): Promise<Response> {\n const method = request.method;\n if (!isMethod(method)) {\n throw new Error(`Unsupported method ${method}`);\n }\n if (!this.isAllowed(method)) {\n return this.getResponse(MethodNotAllowed, method);\n }\n let url: URL;\n try {\n url = new URL(request.url);\n } catch {\n return this.getResponse(BadRequest, \"Malformed URL\");\n }\n\n return (await this.search(method, url)) ?? super.fetch(request);\n }\n\n private async search(\n method: Method,\n url: URL\n ): Promise<Response | undefined> {\n const handlers = this.routes.get(method) ?? [];\n const handler = handlers.find(({ route }) =>\n route instanceof RegExp\n ? route.test(url.pathname)\n : route === url.pathname\n );\n if (handler) {\n try {\n if (handler.route instanceof RegExp) {\n const match = url.pathname.match(handler.route);\n return await handler.callback(...(match ?? []));\n } else {\n return await handler.callback();\n }\n } catch (err) {\n return this.getResponse(InternalServerError, String(err));\n }\n }\n return undefined;\n }\n\n protected override async head(request: Request): Promise<Response> {\n const getRequest = new Request(request, { method: Method.GET });\n return this.getResponse(Head, await this.fetch(getRequest));\n }\n\n protected override get(): Response | Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override put(): Response | Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override post(): Response | Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override patch(): Response | Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override delete(): Response | Promise<Response> {\n return this.getResponse(NotFound);\n }\n}\n"],"mappings":";AAgBA,SAAS,eAAAA,oBAAmB;;;ACArB,IAAM,OAAO;AAAA,EAChB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM,KAAK;AAAA,EACX,KAAK,KAAK,KAAK;AAAA,EACf,MAAM,KAAK,KAAK,KAAK;AACzB;AAEO,IAAK,SAAL,kBAAKC,YAAL;AACH,EAAAA,QAAA,SAAM;AACN,EAAAA,QAAA,SAAM;AACN,EAAAA,QAAA,UAAO;AACP,EAAAA,QAAA,WAAQ;AACR,EAAAA,QAAA,YAAS;AACT,EAAAA,QAAA,UAAO;AACP,EAAAA,QAAA,aAAU;AAPF,SAAAA;AAAA,GAAA;AAUZ,IAAM,aAA0B,IAAI,IAAI,OAAO,OAAO,MAAM,CAAC;AAEtD,SAAS,SAAS,OAAgC;AACrD,SAAO,WAAW,IAAI,KAAK;AAC/B;AAEO,SAAS,eAAe,MAAwB;AACnD,MAAI,YAAY,IAAI,IAAI,GAAG;AACvB,WAAO,GAAG,IAAI;AAAA,EAClB;AACA,SAAO;AACX;AAEO,IAAK,WAAL,kBAAKC,cAAL;AACH,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,qBAAkB;AAClB,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,yBAAsB;AACtB,EAAAA,UAAA,qBAAkB;AAClB,EAAAA,UAAA,2BAAwB;AACxB,EAAAA,UAAA,sBAAmB;AACnB,EAAAA,UAAA,uBAAoB;AACpB,EAAAA,UAAA,sBAAmB;AACnB,EAAAA,UAAA,yBAAsB;AACtB,EAAAA,UAAA,kBAAe;AACf,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,kBAAe;AACf,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,WAAQ;AA3CA,SAAAA;AAAA,GAAA;AA8CZ,IAAM,cAA6B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;;;AC1FD,SAAS,iBAAiB,mBAAmB;AAiBtC,IAAM,iBAAN,MAAqB;AAAA,EAIxB,YACuB,MACnB,UAAyB,MACN,OAAoB,YAAY,IAChC,0CACrB;AAJqB;AAEA;AACA;AAEnB,SAAK,QAAQ,KAAK,SAAS,YAAY,aAAa,OAAO;AAAA,EAC/D;AAAA,EAVQ,WAAoB,IAAI,QAAQ;AAAA,EAChC;AAAA,EAWD,iBAA2B;AAC9B,SAAK,eAAe;AACpB,QAAI,KAAK,MAAM;AACX,WAAK,QAAQ,IAAI,gBAAgB,eAAe,KAAK,QAAQ,CAAC;AAAA,IAClE;AACA,WAAO,IAAI,SAAS,KAAK,MAAM,KAAK,YAAY;AAAA,EACpD;AAAA,EAEA,IAAc,eAA6B;AACvC,WAAO;AAAA,MACH,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,YAAY,gBAAgB,KAAK,IAAI;AAAA,IACzC;AAAA,EACJ;AAAA,EAEA,IAAc,OAAwB;AAClC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,UAAmB;AAC7B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,QAAQ,SAAkB;AACpC,SAAK,WAAW;AAAA,EACpB;AAAA,EAEU,iBAAuB;AAC7B,UAAM,SAAS,KAAK,KAAK,UAAU;AACnC,QAAI,CAAC,OAAQ;AAEb,QAAI,KAAK,gBAAgB,EAAE,SAAS,GAAG,GAAG;AACtC,WAAK,QAAQ,IAAI,+BAA+B,GAAG;AAAA,IACvD,WAAW,KAAK,gBAAgB,EAAE,SAAS,MAAM,GAAG;AAChD,WAAK,QAAQ,IAAI,+BAA+B,MAAM;AACtD,WAAK,QAAQ,IAAI,oCAAoC,MAAM;AAC3D,WAAK,QAAQ,IAAI,QAAQ,QAAQ;AAAA,IACrC;AACA,SAAK,QAAQ;AAAA,MACT;AAAA,MACA,KAAK,gBAAgB;AAAA,IACzB;AACA,SAAK,QAAQ;AAAA,MACT;AAAA,MACA,KAAK,gBAAgB;AAAA,IACzB;AACA,SAAK,QAAQ,IAAI,0BAA0B,KAAK,UAAU,CAAC;AAC3D,SAAK,QAAQ,IAAI,0BAA0B,SAAS;AAAA,EACxD;AAAA,EAEU,kBAA0B;AAChC,WAAO,KAAK,KAAK,gBAAgB,EAAE,KAAK,IAAI;AAAA,EAChD;AAAA,EAEU,kBAA0B;AAChC,WAAO,KAAK,KAAK,gBAAgB,EAAE,KAAK,IAAI;AAAA,EAChD;AAAA,EAEU,kBAA4B;AAClC,WAAO,KAAK,KAAK,gBAAgB;AAAA,EACrC;AAAA,EAEU,YAAoB;AAC1B,WAAO,OAAO,KAAK,KAAK,UAAU,CAAC;AAAA,EACvC;AACJ;AAEO,IAAM,eAAN,cAA2B,eAAe;AAAA,EACrC;AAAA,EACR,YACI,MACA,UAAkB,CAAC,GACnB,OAAoB,YAAY,IAClC;AACE,UAAM,MAAM,MAAM,mCAAmB;AACrC,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,IAAW,OAAe;AACtB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,KAAK,MAAc;AAC1B,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,IAAuB,OAAe;AAClC,WAAO,KAAK,UAAU,KAAK,IAAI;AAAA,EACnC;AACJ;AAEO,IAAM,eAAN,cAA2B,eAAe;AAAA,EAC7C,YACI,MACA,SACA,OAAoB,YAAY,IAChC,+BACF;AACE,UAAM,MAAM,SAAS,MAAM,IAAI;AAAA,EACnC;AACJ;AAEO,IAAM,eAAN,cAA2B,eAAe;AAAA,EAC7C,YACI,MACA,SACA,OAAoB,YAAY,IAChC,sCACF;AACE,UAAM,MAAM,SAAS,MAAM,IAAI;AAAA,EACnC;AACJ;AAKO,IAAM,OAAN,cAAmB,eAAe;AAAA,EACrC,YAAY,MAAoB,UAAoB;AAChD,UAAM,MAAM,MAAM,SAAS,MAAM;AACjC,SAAK,UAAU,IAAI,QAAQ,SAAS,OAAO;AAAA,EAC/C;AACJ;AAEO,IAAM,UAAN,cAAsB,eAAe;AAAA,EACxC,YAAY,MAAoB;AAC5B,UAAM,MAAM,MAAM,YAAY,UAAU;AACxC,SAAK,QAAQ,IAAI,SAAS,KAAK,gBAAgB,CAAC;AAAA,EACpD;AACJ;AAEO,IAAM,gBAAN,cAA4B,aAAa;AAAA,EAC5C,YACI,MACA,MACU,SACZ;AACE,UAAM,MAAM,CAAC,GAAG,IAAI;AAFV;AAAA,EAGd;AAAA,EAEA,IAAoB,OAAkB;AAClC,WAAO;AAAA,MACH,MAAM,KAAK;AAAA,MACX,OAAO,gBAAgB,KAAK,IAAI;AAAA,MAChC,SAAS,KAAK,WAAW,gBAAgB,KAAK,IAAI;AAAA,IACtD;AAAA,EACJ;AACJ;AAEO,IAAM,aAAN,cAAyB,cAAc;AAAA,EAC1C,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,aAAa,MAAM;AAAA,EAC/C;AACJ;AAEO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC5C,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,cAAc,MAAM;AAAA,EAChD;AACJ;AAEO,IAAM,YAAN,cAAwB,cAAc;AAAA,EACzC,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,WAAW,MAAM;AAAA,EAC7C;AACJ;AAEO,IAAM,WAAN,cAAuB,cAAc;AAAA,EACxC,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,WAAW,MAAM;AAAA,EAC7C;AACJ;AAEO,IAAM,mBAAN,cAA+B,cAAc;AAAA,EAChD,YAAY,MAAoB,QAAgB;AAC5C;AAAA,MACI;AAAA,MACA,YAAY;AAAA,MACZ,GAAG,MAAM;AAAA,IACb;AACA,SAAK,QAAQ,IAAI,SAAS,KAAK,gBAAgB,CAAC;AAAA,EACpD;AAAA,EAEA,IAAoB,OAA0C;AAC1D,WAAO;AAAA,MACH,GAAG,MAAM;AAAA,MACT,SAAS,KAAK,KAAK,gBAAgB;AAAA,IACvC;AAAA,EACJ;AACJ;AAEO,IAAM,sBAAN,cAAkC,cAAc;AAAA,EACnD,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,uBAAuB,MAAM;AAAA,EACzD;AACJ;AAEO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAC9C,YAAY,MAAoB;AAC5B,UAAM,MAAM,YAAY,eAAe;AAAA,EAC3C;AACJ;;;AC5NO,IAAM,cAAN,MAA0C;AAAA,EAG7C,YACqB,OAAY,CAAC,GACb,MACnB;AAFmB;AACA;AAAA,EAClB;AAAA,EALK,SAAwB;AAAA,EAOhC,IAAc,MAAW;AACrB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,MAAoC;AAC9C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAa,MAAM,SAAqC;AACpD,QAAI,CAAC,KAAK,UAAU,QAAQ,MAAM,GAAG;AACjC,aAAO,KAAK,YAAY,kBAAkB,QAAQ,MAAM;AAAA,IAC5D;AAEA,SAAK,SAAS,QAAQ,QAAQ,IAAI,QAAQ;AAE1C,QAAI;AACA,cAAQ,QAAQ,QAAQ;AAAA,QACpB;AACI,iBAAO,MAAM,KAAK,IAAI,OAAO;AAAA,QACjC;AACI,iBAAO,MAAM,KAAK,IAAI,OAAO;AAAA,QACjC;AACI,iBAAO,MAAM,KAAK,KAAK,OAAO;AAAA,QAClC;AACI,iBAAO,MAAM,KAAK,MAAM,OAAO;AAAA,QACnC;AACI,iBAAO,MAAM,KAAK,OAAO,OAAO;AAAA,QACpC;AACI,iBAAO,MAAM,KAAK,KAAK,OAAO;AAAA,QAClC;AACI,iBAAO,MAAM,KAAK,QAAQ,OAAO;AAAA,QACrC;AACI,iBAAO,KAAK,YAAY,kBAAkB,QAAQ,MAAM;AAAA,MAChE;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,KAAK,YAAY,qBAAqB,OAAO,KAAK,CAAC;AAAA,IAC9D;AAAA,EACJ;AAAA,EAEU,IAAI,UAAiD;AAC3D,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEU,IAAI,UAAiD;AAC3D,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEU,KAAK,UAAiD;AAC5D,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEU,MAAM,UAAiD;AAC7D,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEU,OAAO,UAAiD;AAC9D,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEQ,QAAQ,UAAiD;AAC7D,WAAO,KAAK,YAAY,OAAO;AAAA,EACnC;AAAA,EAEA,MAAgB,KAAK,SAAqC;AACtD,WAAO,KAAK,YAAY,MAAM,MAAM,KAAK,IAAI,OAAO,CAAC;AAAA,EACzD;AAAA,EAEU,YAIN,kBACG,MAGK;AACR,WAAO,IAAI,cAAc,MAAM,GAAG,IAAI,EAAE,eAAe;AAAA,EAC3D;AAAA,EAEO,kBAA4B;AAC/B,WAAO,CAAC,GAAG;AAAA,EACf;AAAA,EAEO,kBAA4B;AAC/B,WAAO,4DAAwC;AAAA,EACnD;AAAA,EAEO,UAAU,QAAyB;AACtC,WAAO,SAAS,MAAM,KAAK,KAAK,gBAAgB,EAAE,SAAS,MAAM;AAAA,EACrE;AAAA,EAEO,kBAA4B;AAC/B,WAAO,CAAC,cAAc;AAAA,EAC1B;AAAA,EAEO,YAAoB;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,YAA2B;AAC9B,WAAO,KAAK;AAAA,EAChB;AACJ;;;AC1GO,IAAM,eAAN,cAA2B,YAAY;AAAA,EAClC,SAAsC,oBAAI,IAAI;AAAA,EAEtD,YAAY,MAAW,CAAC,GAAG,KAAwB;AAC/C,UAAM,KAAK,GAAG;AACd,SAAK,UAAU;AAAA,EACnB;AAAA,EAEU,YAAkB;AAAA,EAAC;AAAA,EAEnB,SACN,OACA,UACA,0BACI;AACJ,QAAI,CAAC,SAAS,MAAM,GAAG;AACnB,YAAM,IAAI,MAAM,kBAAkB,MAAM,EAAE;AAAA,IAC9C;AACA,QAAI,CAAC,KAAK,gBAAgB,EAAE,SAAS,MAAM,GAAG;AAC1C,YAAM,IAAI;AAAA,QACN,GAAG,MAAM;AAAA,MACb;AAAA,IACJ;AAEA,UAAM,QAAQ,SAAS,KAAK,IAAI;AAChC,UAAM,WAAW,KAAK,OAAO,IAAI,MAAM,KAAK,CAAC;AAC7C,aAAS,KAAK,EAAE,OAAO,UAAU,MAAM,CAAC;AACxC,SAAK,OAAO,IAAI,QAAQ,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAsB,MAAM,SAAqC;AAC7D,UAAM,SAAS,QAAQ;AACvB,QAAI,CAAC,SAAS,MAAM,GAAG;AACnB,YAAM,IAAI,MAAM,sBAAsB,MAAM,EAAE;AAAA,IAClD;AACA,QAAI,CAAC,KAAK,UAAU,MAAM,GAAG;AACzB,aAAO,KAAK,YAAY,kBAAkB,MAAM;AAAA,IACpD;AACA,QAAI;AACJ,QAAI;AACA,YAAM,IAAI,IAAI,QAAQ,GAAG;AAAA,IAC7B,QAAQ;AACJ,aAAO,KAAK,YAAY,YAAY,eAAe;AAAA,IACvD;AAEA,WAAQ,MAAM,KAAK,OAAO,QAAQ,GAAG,KAAM,MAAM,MAAM,OAAO;AAAA,EAClE;AAAA,EAEA,MAAc,OACV,QACA,KAC6B;AAC7B,UAAM,WAAW,KAAK,OAAO,IAAI,MAAM,KAAK,CAAC;AAC7C,UAAM,UAAU,SAAS;AAAA,MAAK,CAAC,EAAE,MAAM,MACnC,iBAAiB,SACX,MAAM,KAAK,IAAI,QAAQ,IACvB,UAAU,IAAI;AAAA,IACxB;AACA,QAAI,SAAS;AACT,UAAI;AACA,YAAI,QAAQ,iBAAiB,QAAQ;AACjC,gBAAM,QAAQ,IAAI,SAAS,MAAM,QAAQ,KAAK;AAC9C,iBAAO,MAAM,QAAQ,SAAS,GAAI,SAAS,CAAC,CAAE;AAAA,QAClD,OAAO;AACH,iBAAO,MAAM,QAAQ,SAAS;AAAA,QAClC;AAAA,MACJ,SAAS,KAAK;AACV,eAAO,KAAK,YAAY,qBAAqB,OAAO,GAAG,CAAC;AAAA,MAC5D;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAyB,KAAK,SAAqC;AAC/D,UAAM,aAAa,IAAI,QAAQ,SAAS,EAAE,wBAAmB,CAAC;AAC9D,WAAO,KAAK,YAAY,MAAM,MAAM,KAAK,MAAM,UAAU,CAAC;AAAA,EAC9D;AAAA,EAEmB,MAAoC;AACnD,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEmB,MAAoC;AACnD,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEmB,OAAqC;AACpD,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEmB,QAAsC;AACrD,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEmB,SAAuC;AACtD,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AACJ;","names":["StatusCodes","Method","MimeType"]}
|