@adonix.org/cloud-spark 0.0.61 → 0.0.62

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 CHANGED
@@ -67,38 +67,6 @@ declare enum MimeType {
67
67
  declare function setHeader(headers: Headers, key: string, value: string | string[]): void;
68
68
  declare function mergeHeader(headers: Headers, key: string, value: string | string[]): void;
69
69
 
70
- type LogLevel = "debug" | "info" | "warn" | "error";
71
- interface BaseLogEntry {
72
- timestamp: string;
73
- level: LogLevel;
74
- message: string;
75
- correlationId?: string;
76
- }
77
- interface ErrorLogEntry extends BaseLogEntry {
78
- level: "error";
79
- error?: string;
80
- stack?: string;
81
- }
82
- type LogEntry = BaseLogEntry | ErrorLogEntry;
83
- interface Logger {
84
- log(level: LogLevel, message: string, correlationId?: string, err?: Error): void;
85
- format(level: LogLevel, message: string): string;
86
- flush(): Promise<void>;
87
- debug(message: string, correlationId?: string): void;
88
- info(message: string, correlationId?: string): void;
89
- warn(message: string, correlationId?: string): void;
90
- error(message: string, error?: unknown, correlationId?: string): void;
91
- }
92
- declare class ConsoleLogger implements Logger {
93
- log(level: LogLevel, message: string, correlationId?: string, err?: unknown): void;
94
- format(_level: LogLevel, message: string): string;
95
- flush(): Promise<void>;
96
- debug(message: string, correlationId?: string): void;
97
- info(message: string, correlationId?: string): void;
98
- warn(message: string, correlationId?: string): void;
99
- error(message: string, err?: unknown, correlationId?: string): void;
100
- }
101
-
102
70
  interface CorsProvider {
103
71
  getOrigin(): string | null;
104
72
  getAllowOrigins(): string[];
@@ -195,12 +163,10 @@ declare abstract class BasicWorker implements CorsProvider {
195
163
  private readonly _request;
196
164
  private readonly _env;
197
165
  private readonly _ctx?;
198
- private readonly _logger;
199
- constructor(_request: Request, _env?: Env, _ctx?: ExecutionContext | undefined, _logger?: Logger);
166
+ constructor(_request: Request, _env?: Env, _ctx?: ExecutionContext | undefined);
200
167
  protected get request(): Request;
201
168
  protected get env(): Env;
202
169
  protected get ctx(): ExecutionContext | undefined;
203
- protected get log(): Logger;
204
170
  fetch(): Promise<Response>;
205
171
  protected dispatch(request: Request): Promise<Response>;
206
172
  protected get(): Promise<Response>;
@@ -245,4 +211,4 @@ declare abstract class RoutedWorker extends BasicWorker {
245
211
  protected delete(): Promise<Response>;
246
212
  }
247
213
 
248
- export { BadRequest, type BaseLogEntry, BasicWorker, ClonedResponse, ConsoleLogger, type CorsProvider, type ErrorJson, type ErrorLogEntry, Forbidden, Head, HtmlResponse, HttpError, InternalServerError, JsonResponse, type LogEntry, type LogLevel, type Logger, Method, MethodNotAllowed, MimeType, NotFound, NotImplemented, Options, Route, type RouteCallback, type RouteInit, RoutedWorker, Routes, ServiceUnavailable, TextResponse, Time, Unauthorized, WorkerResponse, getContentType, isMethod, mergeHeader, setHeader };
214
+ export { BadRequest, BasicWorker, ClonedResponse, type CorsProvider, type ErrorJson, Forbidden, Head, HtmlResponse, HttpError, InternalServerError, JsonResponse, Method, MethodNotAllowed, MimeType, NotFound, NotImplemented, Options, Route, type RouteCallback, type RouteInit, RoutedWorker, Routes, ServiceUnavailable, TextResponse, Time, Unauthorized, WorkerResponse, getContentType, isMethod, mergeHeader, setHeader };
package/dist/index.js CHANGED
@@ -111,56 +111,6 @@ function mergeHeader(headers, key, value) {
111
111
  }
112
112
  }
113
113
 
114
- // src/logging.ts
115
- var ConsoleLogger = class {
116
- log(level, message, correlationId, err) {
117
- const error = err instanceof Error ? err.message : err ? String(err) : void 0;
118
- const stack = err instanceof Error ? err.stack : void 0;
119
- const entry = {
120
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
121
- level,
122
- message,
123
- ...error ? { error, stack } : {},
124
- ...correlationId ? { correlationId } : {}
125
- };
126
- switch (level) {
127
- case "debug":
128
- console.debug(entry);
129
- break;
130
- case "info":
131
- console.info(entry);
132
- break;
133
- case "warn":
134
- console.warn(entry);
135
- break;
136
- case "error":
137
- console.error(entry);
138
- break;
139
- default:
140
- console.log(entry);
141
- break;
142
- }
143
- }
144
- format(_level, message) {
145
- return message;
146
- }
147
- async flush() {
148
- return;
149
- }
150
- debug(message, correlationId) {
151
- this.log("debug", message, correlationId);
152
- }
153
- info(message, correlationId) {
154
- this.log("info", message, correlationId);
155
- }
156
- warn(message, correlationId) {
157
- this.log("warn", message, correlationId);
158
- }
159
- error(message, err, correlationId) {
160
- this.log("error", message, correlationId, err);
161
- }
162
- };
163
-
164
114
  // src/response.ts
165
115
  import { getReasonPhrase, StatusCodes } from "http-status-codes";
166
116
  var BasicResponse = class {
@@ -334,11 +284,10 @@ var ServiceUnavailable = class extends HttpError {
334
284
 
335
285
  // src/basic-worker.ts
336
286
  var BasicWorker = class {
337
- constructor(_request, _env = {}, _ctx, _logger = new ConsoleLogger()) {
287
+ constructor(_request, _env = {}, _ctx) {
338
288
  this._request = _request;
339
289
  this._env = _env;
340
290
  this._ctx = _ctx;
341
- this._logger = _logger;
342
291
  }
343
292
  get request() {
344
293
  return this._request;
@@ -349,9 +298,6 @@ var BasicWorker = class {
349
298
  get ctx() {
350
299
  return this._ctx;
351
300
  }
352
- get log() {
353
- return this._logger;
354
- }
355
301
  async fetch() {
356
302
  if (!this.isAllowed(this.request.method)) {
357
303
  return this.getResponse(MethodNotAllowed, this.request.method);
@@ -490,7 +436,6 @@ export {
490
436
  BadRequest,
491
437
  BasicWorker,
492
438
  ClonedResponse,
493
- ConsoleLogger,
494
439
  Forbidden,
495
440
  Head,
496
441
  HtmlResponse,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/common.ts","../src/logging.ts","../src/response.ts","../src/basic-worker.ts","../src/routes.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 \"./basic-worker\";\nexport * from \"./common\";\nexport * from \"./logging\";\nexport * from \"./response\";\nexport * from \"./routes\";\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}\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\nexport function setHeader(headers: Headers, key: string, value: string | string[]): void {\n const raw = Array.isArray(value) ? value : [value];\n const values = Array.from(new Set(raw.map((v) => v.trim()))).filter((v) => v.length);\n\n if (!values.length) {\n headers.delete(key);\n return;\n }\n\n headers.set(key, values.join(\", \"));\n}\n\nexport function mergeHeader(headers: Headers, key: string, value: string | string[]): void {\n const values = Array.isArray(value) ? value : [value];\n if (!values.length) return;\n\n const existing = headers.get(key);\n if (existing) {\n const merged = existing.split(\",\").map((v) => v.trim());\n values.forEach((v) => merged.push(v.trim()));\n setHeader(headers, key, merged);\n } else {\n setHeader(headers, key, values);\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\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface BaseLogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n correlationId?: string;\n}\n\nexport interface ErrorLogEntry extends BaseLogEntry {\n level: \"error\";\n error?: string;\n stack?: string;\n}\n\nexport type LogEntry = BaseLogEntry | ErrorLogEntry;\n\nexport interface Logger {\n log(level: LogLevel, message: string, correlationId?: string, err?: Error): void;\n format(level: LogLevel, message: string): string;\n flush(): Promise<void>;\n\n debug(message: string, correlationId?: string): void;\n info(message: string, correlationId?: string): void;\n warn(message: string, correlationId?: string): void;\n error(message: string, error?: unknown, correlationId?: string): void;\n}\n\nexport class ConsoleLogger implements Logger {\n public log(level: LogLevel, message: string, correlationId?: string, err?: unknown): void {\n const error = err instanceof Error ? err.message : err ? String(err) : undefined;\n const stack = err instanceof Error ? err.stack : undefined;\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n message,\n ...(error ? { error, stack } : {}),\n ...(correlationId ? { correlationId } : {}),\n };\n\n switch (level) {\n case \"debug\":\n console.debug(entry);\n break;\n case \"info\":\n console.info(entry);\n break;\n case \"warn\":\n console.warn(entry);\n break;\n case \"error\":\n console.error(entry);\n break;\n default:\n console.log(entry);\n break;\n }\n }\n\n public format(_level: LogLevel, message: string): string {\n return message;\n }\n\n public async flush(): Promise<void> {\n return;\n }\n\n public debug(message: string, correlationId?: string): void {\n this.log(\"debug\", message, correlationId);\n }\n\n public info(message: string, correlationId?: string): void {\n this.log(\"info\", message, correlationId);\n }\n\n public warn(message: string, correlationId?: string): void {\n this.log(\"warn\", message, correlationId);\n }\n\n public error(message: string, err?: unknown, correlationId?: string): void {\n this.log(\"error\", message, correlationId, err);\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 { getReasonPhrase, StatusCodes } from \"http-status-codes\";\nimport { getContentType, mergeHeader, Method, MimeType, setHeader } from \"./common\";\n\nexport interface CorsProvider {\n getOrigin(): string | null;\n getAllowOrigins(): string[];\n getAllowMethods(): Method[];\n getAllowHeaders(): string[];\n getExposeHeaders(): string[];\n getMaxAge(): number;\n}\n\nexport interface ErrorJson {\n code: number;\n error: string;\n details: string;\n}\n\nclass BasicResponse {\n private _headers: Headers = new Headers();\n private _body: BodyInit | null;\n\n constructor(\n content: BodyInit | 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 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 setHeader(key: string, value: string | string[]): void {\n setHeader(this.headers, key, value);\n }\n\n protected mergeHeader(key: string, value: string | string[]): void {\n mergeHeader(this.headers, key, value);\n }\n}\n\nclass CorsResponse extends BasicResponse {\n constructor(\n protected readonly cors: CorsProvider,\n content: BodyInit | null = null,\n code: StatusCodes = StatusCodes.OK,\n mimeType: MimeType = MimeType.JSON\n ) {\n super(content, code, mimeType);\n }\n\n protected addCorsHeaders(): void {\n const origin = this.cors.getOrigin();\n if (!origin) return; // no Origin, skip CORS\n\n this.headers.delete(\"Access-Control-Allow-Origin\");\n\n const allowed = this.cors.getAllowOrigins();\n if (allowed.includes(\"*\")) {\n this.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n } else if (allowed.includes(origin)) {\n this.setHeader(\"Access-Control-Allow-Origin\", origin);\n this.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n this.mergeHeader(\"Vary\", \"Origin\");\n }\n\n this.mergeHeader(\"Access-Control-Expose-Headers\", this.cors.getExposeHeaders());\n this.setHeader(\"Access-Control-Allow-Headers\", this.cors.getAllowHeaders());\n this.setHeader(\"Access-Control-Allow-Methods\", this.cors.getAllowMethods());\n this.setHeader(\"Access-Control-Max-Age\", String(this.cors.getMaxAge()));\n this.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n }\n}\n\nexport class WorkerResponse extends CorsResponse {\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\nexport class ClonedResponse extends WorkerResponse {\n constructor(cors: CorsProvider, response: Response) {\n super(cors, response.body, response.status);\n this.headers = new Headers(response.headers);\n }\n}\n\nexport class JsonResponse extends WorkerResponse {\n private _json: object;\n constructor(cors: CorsProvider, content: object = {}, code: StatusCodes = StatusCodes.OK) {\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.setHeader(\"Allow\", this.cors.getAllowMethods());\n }\n}\n\nexport class HttpError extends JsonResponse {\n constructor(cors: CorsProvider, code: StatusCodes, protected details?: string) {\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 HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.BAD_REQUEST, detail);\n }\n}\n\nexport class Unauthorized extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.UNAUTHORIZED, detail);\n }\n}\n\nexport class Forbidden extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.FORBIDDEN, detail);\n }\n}\n\nexport class NotFound extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.NOT_FOUND, detail);\n }\n}\n\nexport class MethodNotAllowed extends HttpError {\n constructor(cors: CorsProvider, method: string) {\n super(cors, StatusCodes.METHOD_NOT_ALLOWED, `${method} method not allowed.`);\n this.setHeader(\"Allow\", this.cors.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 HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.INTERNAL_SERVER_ERROR, detail);\n }\n}\n\nexport class NotImplemented extends HttpError {\n constructor(cors: CorsProvider) {\n super(cors, StatusCodes.NOT_IMPLEMENTED);\n }\n}\n\nexport class ServiceUnavailable extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.SERVICE_UNAVAILABLE, detail);\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 { ConsoleLogger, Logger } from \"./logging\";\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 private readonly _logger: Logger = new ConsoleLogger()\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 protected get log(): Logger {\n return this._logger;\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 return await this.dispatch(this.request);\n } catch (error) {\n return this.getResponse(InternalServerError, String(error));\n }\n }\n\n protected async dispatch(request: Request): Promise<Response> {\n const method = request.method as Method;\n const handler: Record<Method, () => Promise<Response>> = {\n GET: () => this.get(),\n PUT: () => this.put(),\n POST: () => this.post(),\n PATCH: () => this.patch(),\n DELETE: () => this.delete(),\n HEAD: () => this.head(),\n OPTIONS: () => this.options(),\n };\n return (handler[method] ?? (() => this.getResponse(MethodNotAllowed, method)))();\n }\n\n protected async get(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async put(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async post(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async patch(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async delete(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async options(): Promise<Response> {\n return this.getResponse(Options);\n }\n\n protected async head(): Promise<Response> {\n // Dispatch a new GET request created from the HEAD request\n // and return the GET response with the body removed.\n return this.getResponse(\n Head,\n await this.dispatch(new Request(this.request, { method: Method.GET }))\n );\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] ? R : never\n ): Response {\n return new ResponseClass(this, ...args).createResponse();\n }\n\n public isAllowed(method: string): boolean {\n return isMethod(method) && this.getAllowMethods().includes(method);\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 getAllowHeaders(): string[] {\n return [\"Content-Type\"];\n }\n\n public getExposeHeaders(): string[] {\n return [];\n }\n\n public getMaxAge(): number {\n return Time.Week;\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 { Method } from \"./common\";\n\nexport type RouteCallback = (...matches: string[]) => Response | Promise<Response>;\n\nexport type RouteInit = [Method, string, RouteCallback];\n\nexport class Route {\n public readonly pattern: RegExp;\n\n constructor(pattern: RegExp | string, public readonly callback: RouteCallback) {\n this.pattern = new RegExp(pattern);\n }\n}\n\nexport class Routes {\n private readonly map = new Map<Method, Route[]>();\n\n public add(method: Method, route: Route) {\n const existing = this.map.get(method);\n if (existing) {\n existing.push(route);\n } else {\n this.map.set(method, [route]);\n }\n return this;\n }\n\n public get(method: Method, url: string): Route | undefined {\n const routes = this.map.get(method);\n if (!routes) return undefined;\n\n const pathname = new URL(url).pathname;\n return routes.find(({ pattern }) => pattern.test(pathname));\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 { Method } from \"./common\";\nimport { NotFound } from \"./response\";\nimport { Route, Routes, RouteInit, RouteCallback } from \"./routes\";\n\nexport abstract class RoutedWorker extends BasicWorker {\n private readonly routes: Routes = new Routes();\n\n protected initialize(routes: RouteInit[]) {\n routes.forEach(([method, pattern, callback]) => {\n this.add(method, pattern, callback);\n });\n }\n\n protected add(method: Method, pattern: RegExp | string, callback: RouteCallback) {\n this.routes.add(method, new Route(pattern, callback));\n return this;\n }\n\n protected async dispatch(request: Request): Promise<Response> {\n const route = this.routes.get(request.method as Method, request.url);\n if (!route) return super.dispatch(request);\n\n const match = new URL(request.url).pathname.match(route.pattern) ?? [];\n return route.callback.call(this, ...match);\n }\n\n protected override async get(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async put(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async post(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async patch(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async delete(): 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;AASZ,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;AAEM,SAAS,UAAU,SAAkB,KAAa,OAAgC;AACrF,QAAM,MAAM,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACjD,QAAM,SAAS,MAAM,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM;AAEnF,MAAI,CAAC,OAAO,QAAQ;AAChB,YAAQ,OAAO,GAAG;AAClB;AAAA,EACJ;AAEA,UAAQ,IAAI,KAAK,OAAO,KAAK,IAAI,CAAC;AACtC;AAEO,SAAS,YAAY,SAAkB,KAAa,OAAgC;AACvF,QAAM,SAAS,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACpD,MAAI,CAAC,OAAO,OAAQ;AAEpB,QAAM,WAAW,QAAQ,IAAI,GAAG;AAChC,MAAI,UAAU;AACV,UAAM,SAAS,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACtD,WAAO,QAAQ,CAAC,MAAM,OAAO,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3C,cAAU,SAAS,KAAK,MAAM;AAAA,EAClC,OAAO;AACH,cAAU,SAAS,KAAK,MAAM;AAAA,EAClC;AACJ;;;ACvFO,IAAM,gBAAN,MAAsC;AAAA,EAClC,IAAI,OAAiB,SAAiB,eAAwB,KAAqB;AACtF,UAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,MAAM,OAAO,GAAG,IAAI;AACvE,UAAM,QAAQ,eAAe,QAAQ,IAAI,QAAQ;AACjD,UAAM,QAAkB;AAAA,MACpB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA;AAAA,MACA,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC;AAAA,MAChC,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,IAC7C;AAEA,YAAQ,OAAO;AAAA,MACX,KAAK;AACD,gBAAQ,MAAM,KAAK;AACnB;AAAA,MACJ,KAAK;AACD,gBAAQ,KAAK,KAAK;AAClB;AAAA,MACJ,KAAK;AACD,gBAAQ,KAAK,KAAK;AAClB;AAAA,MACJ,KAAK;AACD,gBAAQ,MAAM,KAAK;AACnB;AAAA,MACJ;AACI,gBAAQ,IAAI,KAAK;AACjB;AAAA,IACR;AAAA,EACJ;AAAA,EAEO,OAAO,QAAkB,SAAyB;AACrD,WAAO;AAAA,EACX;AAAA,EAEA,MAAa,QAAuB;AAChC;AAAA,EACJ;AAAA,EAEO,MAAM,SAAiB,eAA8B;AACxD,SAAK,IAAI,SAAS,SAAS,aAAa;AAAA,EAC5C;AAAA,EAEO,KAAK,SAAiB,eAA8B;AACvD,SAAK,IAAI,QAAQ,SAAS,aAAa;AAAA,EAC3C;AAAA,EAEO,KAAK,SAAiB,eAA8B;AACvD,SAAK,IAAI,QAAQ,SAAS,aAAa;AAAA,EAC3C;AAAA,EAEO,MAAM,SAAiB,KAAe,eAA8B;AACvE,SAAK,IAAI,SAAS,SAAS,eAAe,GAAG;AAAA,EACjD;AACJ;;;AClFA,SAAS,iBAAiB,mBAAmB;AAkB7C,IAAM,gBAAN,MAAoB;AAAA,EAIhB,YACI,UAA2B,MACR,OAAoB,YAAY,IAChC,0CACrB;AAFqB;AACA;AAEnB,SAAK,QAAQ,KAAK,SAAS,YAAY,aAAa,OAAO;AAAA,EAC/D;AAAA,EATQ,WAAoB,IAAI,QAAQ;AAAA,EAChC;AAAA,EAUR,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,UAAU,KAAa,OAAgC;AAC7D,cAAU,KAAK,SAAS,KAAK,KAAK;AAAA,EACtC;AAAA,EAEU,YAAY,KAAa,OAAgC;AAC/D,gBAAY,KAAK,SAAS,KAAK,KAAK;AAAA,EACxC;AACJ;AAEA,IAAM,eAAN,cAA2B,cAAc;AAAA,EACrC,YACuB,MACnB,UAA2B,MAC3B,OAAoB,YAAY,IAChC,0CACF;AACE,UAAM,SAAS,MAAM,QAAQ;AALV;AAAA,EAMvB;AAAA,EAEU,iBAAuB;AAC7B,UAAM,SAAS,KAAK,KAAK,UAAU;AACnC,QAAI,CAAC,OAAQ;AAEb,SAAK,QAAQ,OAAO,6BAA6B;AAEjD,UAAM,UAAU,KAAK,KAAK,gBAAgB;AAC1C,QAAI,QAAQ,SAAS,GAAG,GAAG;AACvB,WAAK,UAAU,+BAA+B,GAAG;AAAA,IACrD,WAAW,QAAQ,SAAS,MAAM,GAAG;AACjC,WAAK,UAAU,+BAA+B,MAAM;AACpD,WAAK,UAAU,oCAAoC,MAAM;AACzD,WAAK,YAAY,QAAQ,QAAQ;AAAA,IACrC;AAEA,SAAK,YAAY,iCAAiC,KAAK,KAAK,iBAAiB,CAAC;AAC9E,SAAK,UAAU,gCAAgC,KAAK,KAAK,gBAAgB,CAAC;AAC1E,SAAK,UAAU,gCAAgC,KAAK,KAAK,gBAAgB,CAAC;AAC1E,SAAK,UAAU,0BAA0B,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC;AACtE,SAAK,UAAU,0BAA0B,SAAS;AAAA,EACtD;AACJ;AAEO,IAAM,iBAAN,cAA6B,aAAa;AAAA,EACtC,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;AACJ;AAEO,IAAM,iBAAN,cAA6B,eAAe;AAAA,EAC/C,YAAY,MAAoB,UAAoB;AAChD,UAAM,MAAM,SAAS,MAAM,SAAS,MAAM;AAC1C,SAAK,UAAU,IAAI,QAAQ,SAAS,OAAO;AAAA,EAC/C;AACJ;AAEO,IAAM,eAAN,cAA2B,eAAe;AAAA,EACrC;AAAA,EACR,YAAY,MAAoB,UAAkB,CAAC,GAAG,OAAoB,YAAY,IAAI;AACtF,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,UAAU,SAAS,KAAK,KAAK,gBAAgB,CAAC;AAAA,EACvD;AACJ;AAEO,IAAM,YAAN,cAAwB,aAAa;AAAA,EACxC,YAAY,MAAoB,MAA6B,SAAkB;AAC3E,UAAM,MAAM,CAAC,GAAG,IAAI;AADqC;AAAA,EAE7D;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,UAAU;AAAA,EACtC,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,aAAa,MAAM;AAAA,EAC/C;AACJ;AAEO,IAAM,eAAN,cAA2B,UAAU;AAAA,EACxC,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,cAAc,MAAM;AAAA,EAChD;AACJ;AAEO,IAAM,YAAN,cAAwB,UAAU;AAAA,EACrC,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,WAAW,MAAM;AAAA,EAC7C;AACJ;AAEO,IAAM,WAAN,cAAuB,UAAU;AAAA,EACpC,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,WAAW,MAAM;AAAA,EAC7C;AACJ;AAEO,IAAM,mBAAN,cAA+B,UAAU;AAAA,EAC5C,YAAY,MAAoB,QAAgB;AAC5C,UAAM,MAAM,YAAY,oBAAoB,GAAG,MAAM,sBAAsB;AAC3E,SAAK,UAAU,SAAS,KAAK,KAAK,gBAAgB,CAAC;AAAA,EACvD;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,UAAU;AAAA,EAC/C,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,uBAAuB,MAAM;AAAA,EACzD;AACJ;AAEO,IAAM,iBAAN,cAA6B,UAAU;AAAA,EAC1C,YAAY,MAAoB;AAC5B,UAAM,MAAM,YAAY,eAAe;AAAA,EAC3C;AACJ;AAEO,IAAM,qBAAN,cAAiC,UAAU;AAAA,EAC9C,YAAY,MAAoB,QAAiB;AAC7C,UAAM,MAAM,YAAY,qBAAqB,MAAM;AAAA,EACvD;AACJ;;;AChOO,IAAe,cAAf,MAAmD;AAAA,EACtD,YACqB,UACA,OAAY,CAAC,GACb,MACA,UAAkB,IAAI,cAAc,GACvD;AAJmB;AACA;AACA;AACA;AAAA,EAClB;AAAA,EAEH,IAAc,UAAmB;AAC7B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,MAAW;AACrB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,MAAoC;AAC9C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,MAAc;AACxB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAa,QAA2B;AACpC,QAAI,CAAC,KAAK,UAAU,KAAK,QAAQ,MAAM,GAAG;AACtC,aAAO,KAAK,YAAY,kBAAkB,KAAK,QAAQ,MAAM;AAAA,IACjE;AAEA,QAAI;AACA,aAAO,MAAM,KAAK,SAAS,KAAK,OAAO;AAAA,IAC3C,SAAS,OAAO;AACZ,aAAO,KAAK,YAAY,qBAAqB,OAAO,KAAK,CAAC;AAAA,IAC9D;AAAA,EACJ;AAAA,EAEA,MAAgB,SAAS,SAAqC;AAC1D,UAAM,SAAS,QAAQ;AACvB,UAAM,UAAmD;AAAA,MACrD,KAAK,MAAM,KAAK,IAAI;AAAA,MACpB,KAAK,MAAM,KAAK,IAAI;AAAA,MACpB,MAAM,MAAM,KAAK,KAAK;AAAA,MACtB,OAAO,MAAM,KAAK,MAAM;AAAA,MACxB,QAAQ,MAAM,KAAK,OAAO;AAAA,MAC1B,MAAM,MAAM,KAAK,KAAK;AAAA,MACtB,SAAS,MAAM,KAAK,QAAQ;AAAA,IAChC;AACA,YAAQ,QAAQ,MAAM,MAAM,MAAM,KAAK,YAAY,kBAAkB,MAAM,IAAI;AAAA,EACnF;AAAA,EAEA,MAAgB,MAAyB;AACrC,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAgB,MAAyB;AACrC,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAgB,OAA0B;AACtC,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAgB,QAA2B;AACvC,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAgB,SAA4B;AACxC,WAAO,KAAK,YAAY,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAgB,UAA6B;AACzC,WAAO,KAAK,YAAY,OAAO;AAAA,EACnC;AAAA,EAEA,MAAgB,OAA0B;AAGtC,WAAO,KAAK;AAAA,MACR;AAAA,MACA,MAAM,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,wBAAmB,CAAC,CAAC;AAAA,IACzE;AAAA,EACJ;AAAA,EAEU,YAIN,kBACG,MACK;AACR,WAAO,IAAI,cAAc,MAAM,GAAG,IAAI,EAAE,eAAe;AAAA,EAC3D;AAAA,EAEO,UAAU,QAAyB;AACtC,WAAO,SAAS,MAAM,KAAK,KAAK,gBAAgB,EAAE,SAAS,MAAM;AAAA,EACrE;AAAA,EAEO,kBAA4B;AAC/B,WAAO,CAAC,GAAG;AAAA,EACf;AAAA,EAEO,kBAA4B;AAC/B,WAAO,4DAAwC;AAAA,EACnD;AAAA,EAEO,kBAA4B;AAC/B,WAAO,CAAC,cAAc;AAAA,EAC1B;AAAA,EAEO,mBAA6B;AAChC,WAAO,CAAC;AAAA,EACZ;AAAA,EAEO,YAAoB;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,YAA2B;AAC9B,WAAO,KAAK,QAAQ,QAAQ,IAAI,QAAQ;AAAA,EAC5C;AACJ;;;AC9HO,IAAM,QAAN,MAAY;AAAA,EAGf,YAAY,SAA0C,UAAyB;AAAzB;AAClD,SAAK,UAAU,IAAI,OAAO,OAAO;AAAA,EACrC;AAAA,EAJgB;AAKpB;AAEO,IAAM,SAAN,MAAa;AAAA,EACC,MAAM,oBAAI,IAAqB;AAAA,EAEzC,IAAI,QAAgB,OAAc;AACrC,UAAM,WAAW,KAAK,IAAI,IAAI,MAAM;AACpC,QAAI,UAAU;AACV,eAAS,KAAK,KAAK;AAAA,IACvB,OAAO;AACH,WAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC;AAAA,IAChC;AACA,WAAO;AAAA,EACX;AAAA,EAEO,IAAI,QAAgB,KAAgC;AACvD,UAAM,SAAS,KAAK,IAAI,IAAI,MAAM;AAClC,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,WAAW,IAAI,IAAI,GAAG,EAAE;AAC9B,WAAO,OAAO,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,KAAK,QAAQ,CAAC;AAAA,EAC9D;AACJ;;;AC7BO,IAAe,eAAf,cAAoC,YAAY;AAAA,EAClC,SAAiB,IAAI,OAAO;AAAA,EAEnC,WAAW,QAAqB;AACtC,WAAO,QAAQ,CAAC,CAAC,QAAQ,SAAS,QAAQ,MAAM;AAC5C,WAAK,IAAI,QAAQ,SAAS,QAAQ;AAAA,IACtC,CAAC;AAAA,EACL;AAAA,EAEU,IAAI,QAAgB,SAA0B,UAAyB;AAC7E,SAAK,OAAO,IAAI,QAAQ,IAAI,MAAM,SAAS,QAAQ,CAAC;AACpD,WAAO;AAAA,EACX;AAAA,EAEA,MAAgB,SAAS,SAAqC;AAC1D,UAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ,QAAkB,QAAQ,GAAG;AACnE,QAAI,CAAC,MAAO,QAAO,MAAM,SAAS,OAAO;AAEzC,UAAM,QAAQ,IAAI,IAAI,QAAQ,GAAG,EAAE,SAAS,MAAM,MAAM,OAAO,KAAK,CAAC;AACrE,WAAO,MAAM,SAAS,KAAK,MAAM,GAAG,KAAK;AAAA,EAC7C;AAAA,EAEA,MAAyB,MAAyB;AAC9C,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAyB,MAAyB;AAC9C,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAyB,OAA0B;AAC/C,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAyB,QAA2B;AAChD,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAyB,SAA4B;AACjD,WAAO,KAAK,YAAY,QAAQ;AAAA,EACpC;AACJ;","names":["StatusCodes","Method","MimeType"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/common.ts","../src/response.ts","../src/basic-worker.ts","../src/routes.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 \"./basic-worker\";\nexport * from \"./common\";\nexport * from \"./response\";\nexport * from \"./routes\";\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}\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\nexport function setHeader(headers: Headers, key: string, value: string | string[]): void {\n const raw = Array.isArray(value) ? value : [value];\n const values = Array.from(new Set(raw.map((v) => v.trim()))).filter((v) => v.length);\n\n if (!values.length) {\n headers.delete(key);\n return;\n }\n\n headers.set(key, values.join(\", \"));\n}\n\nexport function mergeHeader(headers: Headers, key: string, value: string | string[]): void {\n const values = Array.isArray(value) ? value : [value];\n if (!values.length) return;\n\n const existing = headers.get(key);\n if (existing) {\n const merged = existing.split(\",\").map((v) => v.trim());\n values.forEach((v) => merged.push(v.trim()));\n setHeader(headers, key, merged);\n } else {\n setHeader(headers, key, values);\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 { getReasonPhrase, StatusCodes } from \"http-status-codes\";\nimport { getContentType, mergeHeader, Method, MimeType, setHeader } from \"./common\";\n\nexport interface CorsProvider {\n getOrigin(): string | null;\n getAllowOrigins(): string[];\n getAllowMethods(): Method[];\n getAllowHeaders(): string[];\n getExposeHeaders(): string[];\n getMaxAge(): number;\n}\n\nexport interface ErrorJson {\n code: number;\n error: string;\n details: string;\n}\n\nclass BasicResponse {\n private _headers: Headers = new Headers();\n private _body: BodyInit | null;\n\n constructor(\n content: BodyInit | 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 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 setHeader(key: string, value: string | string[]): void {\n setHeader(this.headers, key, value);\n }\n\n protected mergeHeader(key: string, value: string | string[]): void {\n mergeHeader(this.headers, key, value);\n }\n}\n\nclass CorsResponse extends BasicResponse {\n constructor(\n protected readonly cors: CorsProvider,\n content: BodyInit | null = null,\n code: StatusCodes = StatusCodes.OK,\n mimeType: MimeType = MimeType.JSON\n ) {\n super(content, code, mimeType);\n }\n\n protected addCorsHeaders(): void {\n const origin = this.cors.getOrigin();\n if (!origin) return; // no Origin, skip CORS\n\n this.headers.delete(\"Access-Control-Allow-Origin\");\n\n const allowed = this.cors.getAllowOrigins();\n if (allowed.includes(\"*\")) {\n this.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n } else if (allowed.includes(origin)) {\n this.setHeader(\"Access-Control-Allow-Origin\", origin);\n this.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n this.mergeHeader(\"Vary\", \"Origin\");\n }\n\n this.mergeHeader(\"Access-Control-Expose-Headers\", this.cors.getExposeHeaders());\n this.setHeader(\"Access-Control-Allow-Headers\", this.cors.getAllowHeaders());\n this.setHeader(\"Access-Control-Allow-Methods\", this.cors.getAllowMethods());\n this.setHeader(\"Access-Control-Max-Age\", String(this.cors.getMaxAge()));\n this.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n }\n}\n\nexport class WorkerResponse extends CorsResponse {\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\nexport class ClonedResponse extends WorkerResponse {\n constructor(cors: CorsProvider, response: Response) {\n super(cors, response.body, response.status);\n this.headers = new Headers(response.headers);\n }\n}\n\nexport class JsonResponse extends WorkerResponse {\n private _json: object;\n constructor(cors: CorsProvider, content: object = {}, code: StatusCodes = StatusCodes.OK) {\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.setHeader(\"Allow\", this.cors.getAllowMethods());\n }\n}\n\nexport class HttpError extends JsonResponse {\n constructor(cors: CorsProvider, code: StatusCodes, protected details?: string) {\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 HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.BAD_REQUEST, detail);\n }\n}\n\nexport class Unauthorized extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.UNAUTHORIZED, detail);\n }\n}\n\nexport class Forbidden extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.FORBIDDEN, detail);\n }\n}\n\nexport class NotFound extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.NOT_FOUND, detail);\n }\n}\n\nexport class MethodNotAllowed extends HttpError {\n constructor(cors: CorsProvider, method: string) {\n super(cors, StatusCodes.METHOD_NOT_ALLOWED, `${method} method not allowed.`);\n this.setHeader(\"Allow\", this.cors.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 HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.INTERNAL_SERVER_ERROR, detail);\n }\n}\n\nexport class NotImplemented extends HttpError {\n constructor(cors: CorsProvider) {\n super(cors, StatusCodes.NOT_IMPLEMENTED);\n }\n}\n\nexport class ServiceUnavailable extends HttpError {\n constructor(cors: CorsProvider, detail?: string) {\n super(cors, StatusCodes.SERVICE_UNAVAILABLE, detail);\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 return await this.dispatch(this.request);\n } catch (error) {\n return this.getResponse(InternalServerError, String(error));\n }\n }\n\n protected async dispatch(request: Request): Promise<Response> {\n const method = request.method as Method;\n const handler: Record<Method, () => Promise<Response>> = {\n GET: () => this.get(),\n PUT: () => this.put(),\n POST: () => this.post(),\n PATCH: () => this.patch(),\n DELETE: () => this.delete(),\n HEAD: () => this.head(),\n OPTIONS: () => this.options(),\n };\n return (handler[method] ?? (() => this.getResponse(MethodNotAllowed, method)))();\n }\n\n protected async get(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async put(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async post(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async patch(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async delete(): Promise<Response> {\n return this.getResponse(NotImplemented);\n }\n\n protected async options(): Promise<Response> {\n return this.getResponse(Options);\n }\n\n protected async head(): Promise<Response> {\n // Dispatch a new GET request created from the HEAD request\n // and return the GET response with the body removed.\n return this.getResponse(\n Head,\n await this.dispatch(new Request(this.request, { method: Method.GET }))\n );\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] ? R : never\n ): Response {\n return new ResponseClass(this, ...args).createResponse();\n }\n\n public isAllowed(method: string): boolean {\n return isMethod(method) && this.getAllowMethods().includes(method);\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 getAllowHeaders(): string[] {\n return [\"Content-Type\"];\n }\n\n public getExposeHeaders(): string[] {\n return [];\n }\n\n public getMaxAge(): number {\n return Time.Week;\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 { Method } from \"./common\";\n\nexport type RouteCallback = (...matches: string[]) => Response | Promise<Response>;\n\nexport type RouteInit = [Method, string, RouteCallback];\n\nexport class Route {\n public readonly pattern: RegExp;\n\n constructor(pattern: RegExp | string, public readonly callback: RouteCallback) {\n this.pattern = new RegExp(pattern);\n }\n}\n\nexport class Routes {\n private readonly map = new Map<Method, Route[]>();\n\n public add(method: Method, route: Route) {\n const existing = this.map.get(method);\n if (existing) {\n existing.push(route);\n } else {\n this.map.set(method, [route]);\n }\n return this;\n }\n\n public get(method: Method, url: string): Route | undefined {\n const routes = this.map.get(method);\n if (!routes) return undefined;\n\n const pathname = new URL(url).pathname;\n return routes.find(({ pattern }) => pattern.test(pathname));\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 { Method } from \"./common\";\nimport { NotFound } from \"./response\";\nimport { Route, Routes, RouteInit, RouteCallback } from \"./routes\";\n\nexport abstract class RoutedWorker extends BasicWorker {\n private readonly routes: Routes = new Routes();\n\n protected initialize(routes: RouteInit[]) {\n routes.forEach(([method, pattern, callback]) => {\n this.add(method, pattern, callback);\n });\n }\n\n protected add(method: Method, pattern: RegExp | string, callback: RouteCallback) {\n this.routes.add(method, new Route(pattern, callback));\n return this;\n }\n\n protected async dispatch(request: Request): Promise<Response> {\n const route = this.routes.get(request.method as Method, request.url);\n if (!route) return super.dispatch(request);\n\n const match = new URL(request.url).pathname.match(route.pattern) ?? [];\n return route.callback.call(this, ...match);\n }\n\n protected override async get(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async put(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async post(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async patch(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n\n protected override async delete(): Promise<Response> {\n return this.getResponse(NotFound);\n }\n}\n"],"mappings":"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","names":["StatusCodes","Method","MimeType"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonix.org/cloud-spark",
3
- "version": "0.0.61",
3
+ "version": "0.0.62",
4
4
  "description": "Ignite your Cloudflare Workers with a type-safe library for rapid development.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",