@pegasusheavy/nestjs-platform-deno 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +330 -0
- package/dist/index.cjs +1708 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +786 -0
- package/dist/index.d.ts +786 -0
- package/dist/index.js +1673 -0
- package/dist/index.js.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/adapters/deno-adapter.ts","../src/compat/express-compat.ts","../src/compat/fastify-compat.ts"],"sourcesContent":["/**\n * @module @pegasus-heavy/nestjs-platform-deno\n *\n * NestJS HTTP adapter for the Deno runtime.\n *\n * This package provides a platform adapter that allows NestJS applications\n * to run on Deno's native HTTP server (Deno.serve) without requiring\n * Express, Fastify, or other Node.js HTTP frameworks.\n *\n * @example\n * ```typescript\n * import { NestFactory } from '@nestjs/core';\n * import { DenoAdapter } from '@pegasus-heavy/nestjs-platform-deno';\n * import { AppModule } from './app.module.ts';\n *\n * async function bootstrap() {\n * const app = await NestFactory.create(AppModule, new DenoAdapter());\n * await app.listen(3000);\n * }\n * bootstrap();\n * ```\n *\n * @example Express Middleware Support\n * ```typescript\n * import helmet from 'helmet';\n * import compression from 'compression';\n *\n * const adapter = new DenoAdapter();\n * adapter.useExpressMiddleware(helmet());\n * adapter.useExpressMiddleware(compression());\n *\n * const app = await NestFactory.create(AppModule, adapter);\n * await app.listen(3000);\n * ```\n */\n\n// Main adapter export\nexport { DenoAdapter } from './adapters/deno-adapter.js';\nexport type { DenoRequest, DenoResponse } from './adapters/deno-adapter.js';\n\n// Interface exports\nexport type {\n DenoHttpOptions,\n DenoHttpServer,\n DenoCorsOptions,\n DenoStaticAssetsOptions,\n DenoBodyParserOptions,\n} from './interfaces/deno-http-options.interface.js';\n\nexport type { NestDenoApplication } from './interfaces/nest-deno-application.interface.js';\n\n// Express compatibility exports\nexport {\n wrapExpressMiddleware,\n createExpressRequest,\n createExpressResponse,\n} from './compat/express-compat.js';\n\nexport type {\n ExpressCompatRequest,\n ExpressCompatResponse,\n ExpressMiddleware,\n ExpressErrorMiddleware,\n ExpressNextFunction,\n ExpressLikeApp,\n CookieOptions,\n} from './compat/express-compat.js';\n\n// Fastify compatibility exports\nexport {\n wrapFastifyHook,\n wrapFastifyPlugin,\n createFastifyRequest,\n createFastifyReply,\n createFastifyLogger,\n} from './compat/fastify-compat.js';\n\nexport type {\n FastifyCompatRequest,\n FastifyCompatReply,\n FastifyHook,\n FastifyHookAsync,\n FastifyHookCallback,\n FastifyHookName,\n FastifyDoneCallback,\n FastifyErrorHook,\n FastifyOnSendHook,\n FastifyPlugin,\n FastifyPluginAsync,\n FastifyRouteHandler,\n FastifyRouteOptions,\n FastifyLikeInstance,\n FastifyLogger,\n} from './compat/fastify-compat.js';\n","import { AbstractHttpAdapter } from '@nestjs/core';\nimport { type RequestMethod, HttpStatus } from '@nestjs/common';\nimport type {\n DenoHttpServer,\n DenoCorsOptions,\n DenoStaticAssetsOptions,\n} from '../interfaces/deno-http-options.interface.js';\nimport {\n wrapExpressMiddleware,\n createExpressRequest,\n createExpressResponse,\n type ExpressMiddleware,\n type ExpressErrorMiddleware,\n type ExpressLikeApp,\n} from '../compat/express-compat.js';\nimport {\n wrapFastifyHook,\n wrapFastifyPlugin,\n createFastifyRequest,\n createFastifyReply,\n createFastifyLogger,\n type FastifyHook,\n type FastifyPlugin,\n type FastifyPluginAsync,\n type FastifyLikeInstance,\n type FastifyRouteHandler,\n type FastifyRouteOptions,\n type FastifyErrorHook,\n type FastifyOnSendHook,\n type FastifyHookName,\n} from '../compat/fastify-compat.js';\n\n// Declare Deno namespace for type safety when running in Deno\ndeclare const Deno: {\n serve: (\n options: {\n port?: number;\n hostname?: string;\n signal?: AbortSignal;\n onListen?: (params: { port: number; hostname: string }) => void;\n },\n handler: (request: Request) => Response | Promise<Response>,\n ) => DenoHttpServer;\n open: (\n path: string,\n options: { read: boolean },\n ) => Promise<{\n readable: ReadableStream;\n close: () => void;\n stat: () => Promise<{\n isDirectory: boolean;\n size: number;\n mtime: Date | null;\n }>;\n }>;\n};\n\ntype RequestHandler = (req: DenoRequest, res: DenoResponse) => Promise<void> | void;\n\n/**\n * Extended Request object for Deno adapter\n */\nexport interface DenoRequest {\n readonly raw: Request;\n readonly url: string;\n readonly method: string;\n readonly headers: Headers;\n params: Record<string, string>;\n readonly query: Record<string, string>;\n body?: unknown;\n ip?: string;\n hostname?: string;\n protocol?: string;\n secure?: boolean;\n originalUrl?: string;\n baseUrl?: string;\n path?: string;\n}\n\n/**\n * Extended Response object for Deno adapter\n */\nexport interface DenoResponse {\n statusCode: number;\n headers: Headers;\n body?: BodyInit | null;\n headersSent: boolean;\n status(code: number): this;\n setHeader(name: string, value: string): this;\n getHeader(name: string): string | null;\n removeHeader(name: string): this;\n send(body?: BodyInit | object | null): void;\n json(body: unknown): void;\n redirect(url: string, statusCode?: number): void;\n end(body?: BodyInit | null): void;\n}\n\ninterface RouteHandler {\n path: string | RegExp;\n method: string;\n handler: RequestHandler;\n keys: string[];\n}\n\ninterface Middleware {\n path: string;\n handler: (\n req: DenoRequest,\n res: DenoResponse,\n next: () => Promise<void>,\n ) => Promise<void> | void;\n}\n\n/**\n * DenoAdapter - NestJS HTTP adapter for Deno runtime\n *\n * This adapter allows NestJS applications to run on Deno's native HTTP server\n * (Deno.serve) without requiring Express, Fastify, or other Node.js frameworks.\n */\nexport class DenoAdapter extends AbstractHttpAdapter<\n DenoHttpServer | undefined,\n DenoRequest,\n DenoResponse\n> {\n private readonly routes: RouteHandler[] = [];\n private readonly middlewares: Middleware[] = [];\n private server: DenoHttpServer | undefined;\n private abortController: AbortController | undefined;\n private corsOptions: DenoCorsOptions | undefined;\n private errorHandler:\n | ((error: Error, req: DenoRequest, res: DenoResponse) => void)\n | undefined;\n private notFoundHandler:\n | ((req: DenoRequest, res: DenoResponse) => void)\n | undefined;\n private staticAssetsPath: string | undefined;\n private staticAssetsOptions: DenoStaticAssetsOptions | undefined;\n\n constructor(instance?: unknown) {\n super(instance || {});\n }\n\n /**\n * Create a new DenoAdapter instance\n */\n public static create(): DenoAdapter {\n return new DenoAdapter();\n }\n\n /**\n * Start listening on the specified port\n */\n public async listen(\n port: string | number,\n callback?: () => void,\n ): Promise<void>;\n public async listen(\n port: string | number,\n hostname: string,\n callback?: () => void,\n ): Promise<void>;\n public async listen(\n port: string | number,\n hostnameOrCallback?: string | (() => void),\n callback?: () => void,\n ): Promise<void> {\n const portNum = typeof port === 'string' ? parseInt(port, 10) : port;\n const hostname =\n typeof hostnameOrCallback === 'string' ? hostnameOrCallback : '0.0.0.0';\n const cb =\n typeof hostnameOrCallback === 'function' ? hostnameOrCallback : callback;\n\n this.abortController = new AbortController();\n\n const serveOptions = {\n port: portNum,\n hostname,\n signal: this.abortController.signal,\n onListen: () => {\n cb?.();\n },\n };\n\n this.server = Deno.serve(\n serveOptions,\n this.handleRequest.bind(this),\n );\n }\n\n /**\n * Handle incoming HTTP requests\n */\n private async handleRequest(request: Request): Promise<Response> {\n const url = new URL(request.url);\n const path = url.pathname;\n const method = request.method.toUpperCase();\n\n // Create Deno request object\n const req = await this.createRequest(request, url);\n\n // Create Deno response object\n const res = this.createResponse();\n\n try {\n // Handle CORS preflight\n if (this.corsOptions && method === 'OPTIONS') {\n this.handleCors(req, res);\n return this.buildResponse(res);\n }\n\n // Apply CORS headers for all requests\n if (this.corsOptions) {\n this.applyCorsHeaders(req, res);\n }\n\n // Serve static assets\n if (this.staticAssetsPath && path.startsWith(this.staticAssetsOptions?.prefix || '/')) {\n const staticResponse = await this.serveStaticAsset(path);\n if (staticResponse) {\n return staticResponse;\n }\n }\n\n // Run middlewares\n await this.runMiddlewares(req, res, path);\n\n if (res.headersSent) {\n return this.buildResponse(res);\n }\n\n // Find and execute route handler\n const route = this.findRoute(path, method);\n\n if (route) {\n req.params = this.extractParams(route, path);\n await route.handler(req, res);\n } else if (this.notFoundHandler) {\n this.notFoundHandler(req, res);\n } else {\n res.status(HttpStatus.NOT_FOUND).json({\n statusCode: HttpStatus.NOT_FOUND,\n message: 'Cannot ' + method + ' ' + path,\n error: 'Not Found',\n });\n }\n\n return this.buildResponse(res);\n } catch (error) {\n if (this.errorHandler) {\n this.errorHandler(error as Error, req, res);\n return this.buildResponse(res);\n }\n\n res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({\n statusCode: HttpStatus.INTERNAL_SERVER_ERROR,\n message: (error as Error).message || 'Internal Server Error',\n error: 'Internal Server Error',\n });\n\n return this.buildResponse(res);\n }\n }\n\n /**\n * Create a DenoRequest object from a native Request\n */\n private async createRequest(\n request: Request,\n url: URL,\n ): Promise<DenoRequest> {\n let body: unknown = undefined;\n\n // Parse body for methods that typically have a body\n if (['POST', 'PUT', 'PATCH', 'DELETE'].includes(request.method.toUpperCase())) {\n const contentType = request.headers.get('content-type') || '';\n\n if (contentType.includes('application/json')) {\n try {\n body = await request.json();\n } catch {\n body = undefined;\n }\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n try {\n const formData = await request.formData();\n const entries: Record<string, FormDataEntryValue> = {};\n formData.forEach((value, key) => {\n entries[key] = value;\n });\n body = entries;\n } catch {\n body = undefined;\n }\n } else if (contentType.includes('text/')) {\n try {\n body = await request.text();\n } catch {\n body = undefined;\n }\n } else if (contentType.includes('multipart/form-data')) {\n try {\n body = await request.formData();\n } catch {\n body = undefined;\n }\n }\n }\n\n const query: Record<string, string> = {};\n url.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n return {\n raw: request,\n url: request.url,\n method: request.method,\n headers: request.headers,\n params: {},\n query,\n body,\n ip: undefined, // Deno doesn't expose client IP in the same way\n hostname: url.hostname,\n protocol: url.protocol.replace(':', ''),\n secure: url.protocol === 'https:',\n originalUrl: url.pathname + url.search,\n baseUrl: '',\n path: url.pathname,\n };\n }\n\n /**\n * Create a DenoResponse object\n */\n private createResponse(): DenoResponse {\n const headers = new Headers();\n let statusCode = 200;\n let body: BodyInit | null = null;\n let headersSent = false;\n\n const res: DenoResponse = {\n get statusCode() {\n return statusCode;\n },\n set statusCode(code: number) {\n statusCode = code;\n },\n headers,\n get body() {\n return body;\n },\n set body(b: BodyInit | null | undefined) {\n body = b ?? null;\n },\n get headersSent() {\n return headersSent;\n },\n set headersSent(sent: boolean) {\n headersSent = sent;\n },\n status(code: number) {\n statusCode = code;\n return this;\n },\n setHeader(name: string, value: string) {\n headers.set(name, value);\n return this;\n },\n getHeader(name: string) {\n return headers.get(name);\n },\n removeHeader(name: string) {\n headers.delete(name);\n return this;\n },\n send(responseBody?: BodyInit | object | null) {\n headersSent = true;\n if (responseBody === undefined || responseBody === null) {\n body = null;\n } else if (typeof responseBody === 'object' && !(responseBody instanceof Blob) && !(responseBody instanceof ReadableStream) && !(responseBody instanceof FormData) && !(responseBody instanceof URLSearchParams) && !(responseBody instanceof ArrayBuffer)) {\n headers.set('Content-Type', 'application/json');\n body = JSON.stringify(responseBody);\n } else {\n body = responseBody as BodyInit;\n }\n },\n json(responseBody: unknown) {\n headersSent = true;\n headers.set('Content-Type', 'application/json');\n body = JSON.stringify(responseBody);\n },\n redirect(url: string, code = 302) {\n headersSent = true;\n statusCode = code;\n headers.set('Location', url);\n body = null;\n },\n end(responseBody?: BodyInit | null) {\n headersSent = true;\n body = responseBody ?? null;\n },\n };\n\n return res;\n }\n\n /**\n * Build a Response object from DenoResponse\n */\n private buildResponse(res: DenoResponse): Response {\n return new Response(res.body, {\n status: res.statusCode,\n headers: res.headers,\n });\n }\n\n /**\n * Run all matching middlewares\n */\n private async runMiddlewares(\n req: DenoRequest,\n res: DenoResponse,\n path: string,\n ): Promise<void> {\n const matchingMiddlewares = this.middlewares.filter(\n (m) => path.startsWith(m.path) || m.path === '*' || m.path === '/',\n );\n\n let index = 0;\n\n const next = async (): Promise<void> => {\n if (index < matchingMiddlewares.length && !res.headersSent) {\n const middleware = matchingMiddlewares[index++];\n await middleware.handler(req, res, next);\n }\n };\n\n await next();\n }\n\n /**\n * Find a matching route\n */\n private findRoute(path: string, method: string): RouteHandler | undefined {\n return this.routes.find((route) => {\n const methodMatch = route.method === method || route.method === 'ALL';\n\n if (typeof route.path === 'string') {\n const pattern = this.pathToRegex(route.path);\n return methodMatch && pattern.test(path);\n }\n\n return methodMatch && route.path.test(path);\n });\n }\n\n /**\n * Extract route parameters from path\n */\n private extractParams(\n route: RouteHandler,\n path: string,\n ): Record<string, string> {\n const params: Record<string, string> = {};\n\n if (typeof route.path === 'string') {\n const pattern = this.pathToRegex(route.path);\n const match = path.match(pattern);\n\n if (match) {\n route.keys.forEach((key, index) => {\n params[key] = match[index + 1] || '';\n });\n }\n }\n\n return params;\n }\n\n /**\n * Convert a path pattern to a RegExp\n */\n private pathToRegex(path: string): RegExp {\n const escaped = path\n .replace(/([.+?^${}()|[\\]\\\\])/g, '\\\\$1')\n .replace(/:(\\w+)/g, '([^/]+)')\n .replace(/\\*/g, '.*');\n\n return new RegExp(`^${escaped}$`);\n }\n\n /**\n * Extract parameter keys from path pattern\n */\n private extractKeys(path: string): string[] {\n const keys: string[] = [];\n const regex = /:(\\w+)/g;\n let match;\n\n while ((match = regex.exec(path)) !== null) {\n keys.push(match[1]);\n }\n\n return keys;\n }\n\n /**\n * Register a route handler\n */\n private registerRoute(\n method: string,\n path: string,\n handler: RequestHandler,\n ): void {\n this.routes.push({\n path,\n method,\n handler,\n keys: this.extractKeys(path),\n });\n }\n\n // HTTP Method Handlers - implementing the AbstractHttpAdapter signatures\n public get(handler: RequestHandler): void;\n public get(path: string, handler: RequestHandler): void;\n public get(pathOrHandler: string | RequestHandler, handler?: RequestHandler): void {\n if (typeof pathOrHandler === 'function') {\n this.registerRoute('GET', '/', pathOrHandler);\n } else if (handler) {\n this.registerRoute('GET', pathOrHandler, handler);\n }\n }\n\n public post(handler: RequestHandler): void;\n public post(path: string, handler: RequestHandler): void;\n public post(pathOrHandler: string | RequestHandler, handler?: RequestHandler): void {\n if (typeof pathOrHandler === 'function') {\n this.registerRoute('POST', '/', pathOrHandler);\n } else if (handler) {\n this.registerRoute('POST', pathOrHandler, handler);\n }\n }\n\n public put(handler: RequestHandler): void;\n public put(path: string, handler: RequestHandler): void;\n public put(pathOrHandler: string | RequestHandler, handler?: RequestHandler): void {\n if (typeof pathOrHandler === 'function') {\n this.registerRoute('PUT', '/', pathOrHandler);\n } else if (handler) {\n this.registerRoute('PUT', pathOrHandler, handler);\n }\n }\n\n public delete(handler: RequestHandler): void;\n public delete(path: string, handler: RequestHandler): void;\n public delete(pathOrHandler: string | RequestHandler, handler?: RequestHandler): void {\n if (typeof pathOrHandler === 'function') {\n this.registerRoute('DELETE', '/', pathOrHandler);\n } else if (handler) {\n this.registerRoute('DELETE', pathOrHandler, handler);\n }\n }\n\n public patch(handler: RequestHandler): void;\n public patch(path: string, handler: RequestHandler): void;\n public patch(pathOrHandler: string | RequestHandler, handler?: RequestHandler): void {\n if (typeof pathOrHandler === 'function') {\n this.registerRoute('PATCH', '/', pathOrHandler);\n } else if (handler) {\n this.registerRoute('PATCH', pathOrHandler, handler);\n }\n }\n\n public options(handler: RequestHandler): void;\n public options(path: string, handler: RequestHandler): void;\n public options(pathOrHandler: string | RequestHandler, handler?: RequestHandler): void {\n if (typeof pathOrHandler === 'function') {\n this.registerRoute('OPTIONS', '/', pathOrHandler);\n } else if (handler) {\n this.registerRoute('OPTIONS', pathOrHandler, handler);\n }\n }\n\n public head(handler: RequestHandler): void;\n public head(path: string, handler: RequestHandler): void;\n public head(pathOrHandler: string | RequestHandler, handler?: RequestHandler): void {\n if (typeof pathOrHandler === 'function') {\n this.registerRoute('HEAD', '/', pathOrHandler);\n } else if (handler) {\n this.registerRoute('HEAD', pathOrHandler, handler);\n }\n }\n\n public all(handler: RequestHandler): void;\n public all(path: string, handler: RequestHandler): void;\n public all(pathOrHandler: string | RequestHandler, handler?: RequestHandler): void {\n if (typeof pathOrHandler === 'function') {\n this.registerRoute('ALL', '/', pathOrHandler);\n } else if (handler) {\n this.registerRoute('ALL', pathOrHandler, handler);\n }\n }\n\n /**\n * Add middleware\n */\n public use(\n handler: (\n req: DenoRequest,\n res: DenoResponse,\n next: () => Promise<void>,\n ) => Promise<void> | void,\n ): void;\n public use(\n path: string,\n handler: (\n req: DenoRequest,\n res: DenoResponse,\n next: () => Promise<void>,\n ) => Promise<void> | void,\n ): void;\n public use(\n pathOrHandler:\n | string\n | ((\n req: DenoRequest,\n res: DenoResponse,\n next: () => Promise<void>,\n ) => Promise<void> | void),\n handler?: (\n req: DenoRequest,\n res: DenoResponse,\n next: () => Promise<void>,\n ) => Promise<void> | void,\n ): void {\n if (typeof pathOrHandler === 'function') {\n this.middlewares.push({\n path: '*',\n handler: pathOrHandler,\n });\n } else if (handler) {\n this.middlewares.push({\n path: pathOrHandler,\n handler,\n });\n }\n }\n\n /**\n * Use Express middleware with the Deno adapter\n *\n * This method wraps Express middleware to be compatible with the Deno adapter,\n * allowing you to use existing Express middleware packages.\n *\n * @example\n * ```typescript\n * import helmet from 'helmet';\n * import compression from 'compression';\n *\n * const adapter = new DenoAdapter();\n * adapter.useExpressMiddleware(helmet());\n * adapter.useExpressMiddleware('/api', compression());\n * ```\n */\n public useExpressMiddleware(middleware: ExpressMiddleware | ExpressErrorMiddleware): void;\n public useExpressMiddleware(\n path: string,\n middleware: ExpressMiddleware | ExpressErrorMiddleware,\n ): void;\n public useExpressMiddleware(\n pathOrMiddleware: string | ExpressMiddleware | ExpressErrorMiddleware,\n middleware?: ExpressMiddleware | ExpressErrorMiddleware,\n ): void {\n if (typeof pathOrMiddleware === 'function') {\n const wrappedMiddleware = wrapExpressMiddleware(pathOrMiddleware);\n this.middlewares.push({\n path: '*',\n handler: wrappedMiddleware,\n });\n } else if (middleware) {\n const wrappedMiddleware = wrapExpressMiddleware(middleware);\n this.middlewares.push({\n path: pathOrMiddleware,\n handler: wrappedMiddleware,\n });\n }\n }\n\n /**\n * Create an Express-like app instance for middleware that requires app.use()\n *\n * Some Express middleware (like express-session) require an Express app instance.\n * This creates a compatible shim that routes middleware through the Deno adapter.\n *\n * @example\n * ```typescript\n * import session from 'express-session';\n *\n * const adapter = new DenoAdapter();\n * const expressApp = adapter.getExpressApp();\n *\n * expressApp.use(session({ secret: 'keyboard cat' }));\n * ```\n */\n public getExpressApp(): ExpressLikeApp {\n const self = this;\n const settings: Record<string, unknown> = {};\n\n const app: ExpressLikeApp = {\n locals: {},\n settings,\n\n use(...args: unknown[]) {\n if (args.length === 1 && typeof args[0] === 'function') {\n self.useExpressMiddleware(args[0] as ExpressMiddleware);\n } else if (args.length === 2 && typeof args[0] === 'string' && typeof args[1] === 'function') {\n self.useExpressMiddleware(args[0], args[1] as ExpressMiddleware);\n } else if (args.length >= 2) {\n // Multiple middleware handlers\n const path = typeof args[0] === 'string' ? args[0] : '*';\n const handlers = typeof args[0] === 'string' ? args.slice(1) : args;\n handlers.forEach((handler) => {\n if (typeof handler === 'function') {\n self.useExpressMiddleware(path, handler as ExpressMiddleware);\n }\n });\n }\n },\n\n get(path: string, ...handlers: ExpressMiddleware[]) {\n handlers.forEach((handler) => {\n self.get(path, async (req, res) => {\n const expressReq = createExpressRequest(req);\n const expressRes = createExpressResponse(res);\n await handler(expressReq, expressRes, () => {});\n });\n });\n },\n\n post(path: string, ...handlers: ExpressMiddleware[]) {\n handlers.forEach((handler) => {\n self.post(path, async (req, res) => {\n const expressReq = createExpressRequest(req);\n const expressRes = createExpressResponse(res);\n await handler(expressReq, expressRes, () => {});\n });\n });\n },\n\n put(path: string, ...handlers: ExpressMiddleware[]) {\n handlers.forEach((handler) => {\n self.put(path, async (req, res) => {\n const expressReq = createExpressRequest(req);\n const expressRes = createExpressResponse(res);\n await handler(expressReq, expressRes, () => {});\n });\n });\n },\n\n delete(path: string, ...handlers: ExpressMiddleware[]) {\n handlers.forEach((handler) => {\n self.delete(path, async (req, res) => {\n const expressReq = createExpressRequest(req);\n const expressRes = createExpressResponse(res);\n await handler(expressReq, expressRes, () => {});\n });\n });\n },\n\n patch(path: string, ...handlers: ExpressMiddleware[]) {\n handlers.forEach((handler) => {\n self.patch(path, async (req, res) => {\n const expressReq = createExpressRequest(req);\n const expressRes = createExpressResponse(res);\n await handler(expressReq, expressRes, () => {});\n });\n });\n },\n\n options(path: string, ...handlers: ExpressMiddleware[]) {\n handlers.forEach((handler) => {\n self.options(path, async (req, res) => {\n const expressReq = createExpressRequest(req);\n const expressRes = createExpressResponse(res);\n await handler(expressReq, expressRes, () => {});\n });\n });\n },\n\n head(path: string, ...handlers: ExpressMiddleware[]) {\n handlers.forEach((handler) => {\n self.head(path, async (req, res) => {\n const expressReq = createExpressRequest(req);\n const expressRes = createExpressResponse(res);\n await handler(expressReq, expressRes, () => {});\n });\n });\n },\n\n all(path: string, ...handlers: ExpressMiddleware[]) {\n handlers.forEach((handler) => {\n self.all(path, async (req, res) => {\n const expressReq = createExpressRequest(req);\n const expressRes = createExpressResponse(res);\n await handler(expressReq, expressRes, () => {});\n });\n });\n },\n\n set(key: string, value: unknown) {\n settings[key] = value;\n },\n\n enable(key: string) {\n settings[key] = true;\n },\n\n disable(key: string) {\n settings[key] = false;\n },\n\n enabled(key: string) {\n return Boolean(settings[key]);\n },\n\n disabled(key: string) {\n return !settings[key];\n },\n };\n\n return app;\n }\n\n /**\n * Use Fastify middleware/hooks with the Deno adapter\n *\n * This method wraps Fastify hooks to be compatible with the Deno adapter,\n * allowing you to use Fastify-style middleware.\n *\n * @example\n * ```typescript\n * const adapter = new DenoAdapter();\n *\n * // Use a Fastify hook\n * adapter.useFastifyHook('onRequest', async (request, reply) => {\n * console.log('Request received:', request.url);\n * });\n *\n * // Use with callback style\n * adapter.useFastifyHook('preHandler', (request, reply, done) => {\n * // Do something\n * done();\n * });\n * ```\n */\n public useFastifyHook(_name: FastifyHookName, hook: FastifyHook): void {\n // Note: Hook name is preserved for future hook-specific handling\n const wrappedHook = wrapFastifyHook(hook);\n this.middlewares.push({\n path: '*',\n handler: wrappedHook,\n });\n }\n\n /**\n * Register a Fastify plugin with the Deno adapter\n *\n * This allows using Fastify plugins that add hooks, decorators, or routes.\n *\n * @example\n * ```typescript\n * import fastifyCors from '@fastify/cors';\n * import fastifyHelmet from '@fastify/helmet';\n *\n * const adapter = new DenoAdapter();\n * const fastify = adapter.getFastifyInstance();\n *\n * // Register plugins\n * await adapter.registerFastifyPlugin(fastifyCors, { origin: '*' });\n * await adapter.registerFastifyPlugin(fastifyHelmet);\n * ```\n */\n public async registerFastifyPlugin<Options = Record<string, unknown>>(\n plugin: FastifyPlugin<Options> | FastifyPluginAsync<Options>,\n opts?: Options,\n ): Promise<void> {\n const instance = this.getFastifyInstance();\n await wrapFastifyPlugin(plugin, instance, opts);\n }\n\n /**\n * Get a Fastify-like instance for plugins that require it\n *\n * This creates a Fastify-compatible interface that routes hooks and routes\n * through the Deno adapter.\n *\n * @example\n * ```typescript\n * const adapter = new DenoAdapter();\n * const fastify = adapter.getFastifyInstance();\n *\n * // Add hooks\n * fastify.addHook('onRequest', async (request, reply) => {\n * console.log('Request:', request.method, request.url);\n * });\n *\n * // Add decorators\n * fastify.decorateRequest('user', null);\n * ```\n */\n public getFastifyInstance(): FastifyLikeInstance {\n const self = this;\n const decorators: Record<string, unknown> = {};\n const requestDecorators: Record<string, unknown> = {};\n const replyDecorators: Record<string, unknown> = {};\n\n const instance: FastifyLikeInstance = {\n log: createFastifyLogger(),\n prefix: '',\n\n // Decorators\n decorate(name: string, value: unknown) {\n decorators[name] = value;\n return this;\n },\n\n decorateRequest(name: string, value: unknown) {\n requestDecorators[name] = value;\n return this;\n },\n\n decorateReply(name: string, value: unknown) {\n replyDecorators[name] = value;\n return this;\n },\n\n hasDecorator(name: string) {\n return name in decorators;\n },\n\n hasRequestDecorator(name: string) {\n return name in requestDecorators;\n },\n\n hasReplyDecorator(name: string) {\n return name in replyDecorators;\n },\n\n // Hooks\n addHook(name: FastifyHookName, hook: FastifyHook | FastifyErrorHook | FastifyOnSendHook) {\n if (['onRequest', 'preParsing', 'preValidation', 'preHandler', 'onResponse'].includes(name)) {\n self.useFastifyHook(name, hook as FastifyHook);\n }\n // Note: preSerialization, onSend, onError need special handling\n return this;\n },\n\n // Plugin registration\n register<Options = Record<string, unknown>>(\n plugin: FastifyPlugin<Options> | FastifyPluginAsync<Options>,\n opts?: Options,\n ) {\n // Queue plugin registration (will be async)\n wrapFastifyPlugin(plugin, this, opts).catch(console.error);\n return this;\n },\n\n // Routes\n route(opts: FastifyRouteOptions) {\n const methods = Array.isArray(opts.method) ? opts.method : [opts.method];\n\n methods.forEach((method) => {\n const handler = async (req: DenoRequest, res: DenoResponse) => {\n const fastifyReq = createFastifyRequest(req);\n const fastifyReply = createFastifyReply(res);\n\n // Apply request decorators\n Object.entries(requestDecorators).forEach(([key, value]) => {\n fastifyReq[key] = typeof value === 'function' ? value() : value;\n });\n\n // Apply reply decorators\n Object.entries(replyDecorators).forEach(([key, value]) => {\n fastifyReply[key] = typeof value === 'function' ? value() : value;\n });\n\n // Run route-specific hooks\n const hooks = [\n ...(opts.onRequest ? (Array.isArray(opts.onRequest) ? opts.onRequest : [opts.onRequest]) : []),\n ...(opts.preValidation ? (Array.isArray(opts.preValidation) ? opts.preValidation : [opts.preValidation]) : []),\n ...(opts.preHandler ? (Array.isArray(opts.preHandler) ? opts.preHandler : [opts.preHandler]) : []),\n ];\n\n for (const hook of hooks) {\n if (fastifyReply.sent) break;\n await new Promise<void>((resolve, reject) => {\n if (hook.length <= 2) {\n (hook as (req: unknown, rep: unknown) => Promise<void>)(fastifyReq, fastifyReply)\n .then(resolve)\n .catch(reject);\n } else {\n (hook as (req: unknown, rep: unknown, done: (err?: Error) => void) => void)(\n fastifyReq,\n fastifyReply,\n (err?: Error) => (err ? reject(err) : resolve()),\n );\n }\n });\n }\n\n if (!fastifyReply.sent) {\n const result = await opts.handler(fastifyReq, fastifyReply);\n if (result !== undefined && !fastifyReply.sent) {\n fastifyReply.send(result);\n }\n }\n };\n\n switch (method.toUpperCase()) {\n case 'GET':\n self.get(opts.url, handler);\n break;\n case 'POST':\n self.post(opts.url, handler);\n break;\n case 'PUT':\n self.put(opts.url, handler);\n break;\n case 'DELETE':\n self.delete(opts.url, handler);\n break;\n case 'PATCH':\n self.patch(opts.url, handler);\n break;\n case 'OPTIONS':\n self.options(opts.url, handler);\n break;\n case 'HEAD':\n self.head(opts.url, handler);\n break;\n default:\n self.all(opts.url, handler);\n }\n });\n\n return this;\n },\n\n // HTTP method shortcuts\n get(path: string, optsOrHandler?: Partial<FastifyRouteOptions> | FastifyRouteHandler, handler?: FastifyRouteHandler) {\n const h = typeof optsOrHandler === 'function' ? optsOrHandler : handler!;\n const opts = typeof optsOrHandler === 'object' ? optsOrHandler : {};\n return this.route({ ...opts, method: 'GET', url: path, handler: h });\n },\n\n post(path: string, optsOrHandler?: Partial<FastifyRouteOptions> | FastifyRouteHandler, handler?: FastifyRouteHandler) {\n const h = typeof optsOrHandler === 'function' ? optsOrHandler : handler!;\n const opts = typeof optsOrHandler === 'object' ? optsOrHandler : {};\n return this.route({ ...opts, method: 'POST', url: path, handler: h });\n },\n\n put(path: string, optsOrHandler?: Partial<FastifyRouteOptions> | FastifyRouteHandler, handler?: FastifyRouteHandler) {\n const h = typeof optsOrHandler === 'function' ? optsOrHandler : handler!;\n const opts = typeof optsOrHandler === 'object' ? optsOrHandler : {};\n return this.route({ ...opts, method: 'PUT', url: path, handler: h });\n },\n\n delete(path: string, optsOrHandler?: Partial<FastifyRouteOptions> | FastifyRouteHandler, handler?: FastifyRouteHandler) {\n const h = typeof optsOrHandler === 'function' ? optsOrHandler : handler!;\n const opts = typeof optsOrHandler === 'object' ? optsOrHandler : {};\n return this.route({ ...opts, method: 'DELETE', url: path, handler: h });\n },\n\n patch(path: string, optsOrHandler?: Partial<FastifyRouteOptions> | FastifyRouteHandler, handler?: FastifyRouteHandler) {\n const h = typeof optsOrHandler === 'function' ? optsOrHandler : handler!;\n const opts = typeof optsOrHandler === 'object' ? optsOrHandler : {};\n return this.route({ ...opts, method: 'PATCH', url: path, handler: h });\n },\n\n options(path: string, optsOrHandler?: Partial<FastifyRouteOptions> | FastifyRouteHandler, handler?: FastifyRouteHandler) {\n const h = typeof optsOrHandler === 'function' ? optsOrHandler : handler!;\n const opts = typeof optsOrHandler === 'object' ? optsOrHandler : {};\n return this.route({ ...opts, method: 'OPTIONS', url: path, handler: h });\n },\n\n head(path: string, optsOrHandler?: Partial<FastifyRouteOptions> | FastifyRouteHandler, handler?: FastifyRouteHandler) {\n const h = typeof optsOrHandler === 'function' ? optsOrHandler : handler!;\n const opts = typeof optsOrHandler === 'object' ? optsOrHandler : {};\n return this.route({ ...opts, method: 'HEAD', url: path, handler: h });\n },\n\n all(path: string, optsOrHandler?: Partial<FastifyRouteOptions> | FastifyRouteHandler, handler?: FastifyRouteHandler) {\n const h = typeof optsOrHandler === 'function' ? optsOrHandler : handler!;\n const opts = typeof optsOrHandler === 'object' ? optsOrHandler : {};\n return this.route({ ...opts, method: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'], url: path, handler: h });\n },\n };\n\n return instance;\n }\n\n /**\n * Get the underlying HTTP server\n */\n public getHttpServer(): DenoHttpServer | undefined {\n return this.server;\n }\n\n /**\n * Set the HTTP server instance\n */\n public setHttpServer(server: DenoHttpServer): void {\n this.server = server;\n }\n\n /**\n * Close the server\n */\n public async close(): Promise<void> {\n if (this.abortController) {\n this.abortController.abort();\n await this.server?.finished;\n }\n }\n\n /**\n * Set error handler\n */\n public setErrorHandler(\n handler: (error: Error, req: DenoRequest, res: DenoResponse) => void,\n ): void {\n this.errorHandler = handler;\n }\n\n /**\n * Set 404 handler\n */\n public setNotFoundHandler(\n handler: (req: DenoRequest, res: DenoResponse) => void,\n ): void {\n this.notFoundHandler = handler;\n }\n\n /**\n * Enable CORS\n */\n public enableCors(options?: DenoCorsOptions): void {\n this.corsOptions = options || {\n origin: '*',\n methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',\n credentials: false,\n };\n }\n\n /**\n * Handle CORS preflight requests\n */\n private handleCors(req: DenoRequest, res: DenoResponse): void {\n this.applyCorsHeaders(req, res);\n res.status(this.corsOptions?.optionsSuccessStatus || 204).end();\n }\n\n /**\n * Apply CORS headers to response\n */\n private applyCorsHeaders(req: DenoRequest, res: DenoResponse): void {\n if (!this.corsOptions) return;\n\n const origin = req.headers.get('origin') || '*';\n let allowOrigin = '*';\n\n if (typeof this.corsOptions.origin === 'string') {\n allowOrigin = this.corsOptions.origin;\n } else if (typeof this.corsOptions.origin === 'boolean') {\n allowOrigin = this.corsOptions.origin ? origin : '';\n } else if (Array.isArray(this.corsOptions.origin)) {\n allowOrigin = this.corsOptions.origin.includes(origin) ? origin : '';\n } else if (typeof this.corsOptions.origin === 'function') {\n const result = this.corsOptions.origin(origin);\n allowOrigin = typeof result === 'string' ? result : result ? origin : '';\n }\n\n res.setHeader('Access-Control-Allow-Origin', allowOrigin);\n\n if (this.corsOptions.credentials) {\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n\n const methods = Array.isArray(this.corsOptions.methods)\n ? this.corsOptions.methods.join(',')\n : this.corsOptions.methods || 'GET,HEAD,PUT,PATCH,POST,DELETE';\n\n res.setHeader('Access-Control-Allow-Methods', methods);\n\n if (this.corsOptions.allowedHeaders) {\n const headers = Array.isArray(this.corsOptions.allowedHeaders)\n ? this.corsOptions.allowedHeaders.join(',')\n : this.corsOptions.allowedHeaders;\n res.setHeader('Access-Control-Allow-Headers', headers);\n } else {\n const requestHeaders = req.headers.get('access-control-request-headers');\n if (requestHeaders) {\n res.setHeader('Access-Control-Allow-Headers', requestHeaders);\n }\n }\n\n if (this.corsOptions.exposedHeaders) {\n const exposed = Array.isArray(this.corsOptions.exposedHeaders)\n ? this.corsOptions.exposedHeaders.join(',')\n : this.corsOptions.exposedHeaders;\n res.setHeader('Access-Control-Expose-Headers', exposed);\n }\n\n if (this.corsOptions.maxAge) {\n res.setHeader('Access-Control-Max-Age', String(this.corsOptions.maxAge));\n }\n }\n\n /**\n * Use static assets\n */\n public useStaticAssets(path: string, options?: DenoStaticAssetsOptions): void {\n this.staticAssetsPath = path;\n this.staticAssetsOptions = options;\n }\n\n /**\n * Serve static asset\n */\n private async serveStaticAsset(urlPath: string): Promise<Response | null> {\n if (!this.staticAssetsPath) return null;\n\n const prefix = this.staticAssetsOptions?.prefix || '/';\n const relativePath = urlPath.replace(prefix, '').replace(/^\\//, '');\n const filePath = `${this.staticAssetsPath}/${relativePath}`;\n\n try {\n const file = await Deno.open(filePath, { read: true });\n const stat = await file.stat();\n\n if (stat.isDirectory) {\n file.close();\n if (this.staticAssetsOptions?.index !== false) {\n const indexFile = typeof this.staticAssetsOptions?.index === 'string'\n ? this.staticAssetsOptions.index\n : 'index.html';\n return this.serveStaticAsset(`${urlPath}/${indexFile}`);\n }\n return null;\n }\n\n const headers = new Headers();\n\n // Set content type based on extension\n const ext = filePath.split('.').pop()?.toLowerCase();\n const mimeTypes: Record<string, string> = {\n html: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n json: 'application/json',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n svg: 'image/svg+xml',\n ico: 'image/x-icon',\n woff: 'font/woff',\n woff2: 'font/woff2',\n ttf: 'font/ttf',\n eot: 'application/vnd.ms-fontobject',\n txt: 'text/plain',\n xml: 'application/xml',\n pdf: 'application/pdf',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n };\n\n headers.set('Content-Type', mimeTypes[ext || ''] || 'application/octet-stream');\n\n if (this.staticAssetsOptions?.etag !== false) {\n headers.set('ETag', `\"${stat.size}-${stat.mtime?.getTime() || 0}\"`);\n }\n\n if (this.staticAssetsOptions?.lastModified !== false && stat.mtime) {\n headers.set('Last-Modified', stat.mtime.toUTCString());\n }\n\n if (this.staticAssetsOptions?.maxAge) {\n let cacheControl = `max-age=${this.staticAssetsOptions.maxAge}`;\n if (this.staticAssetsOptions.immutable) {\n cacheControl += ', immutable';\n }\n headers.set('Cache-Control', cacheControl);\n }\n\n return new Response(file.readable, {\n status: 200,\n headers,\n });\n } catch (error) {\n if ((error as { name?: string }).name === 'NotFound') {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Set view engine (not implemented for base adapter)\n */\n public setViewEngine(_engine: string): void {\n console.warn('View engine is not supported in the base Deno adapter');\n }\n\n /**\n * Render view (not implemented for base adapter)\n */\n public render(_response: DenoResponse, _view: string, _options: object): void {\n console.warn('Render is not supported in the base Deno adapter');\n }\n\n /**\n * Get request hostname\n */\n public getRequestHostname(request: DenoRequest): string {\n return request.hostname || request.headers.get('host') || '';\n }\n\n /**\n * Get request method\n */\n public getRequestMethod(request: DenoRequest): string {\n return request.method;\n }\n\n /**\n * Get request URL\n */\n public getRequestUrl(request: DenoRequest): string {\n return request.path || new URL(request.url).pathname;\n }\n\n /**\n * Send a reply\n */\n public reply(\n response: DenoResponse,\n body: unknown,\n statusCode?: number,\n ): void {\n if (statusCode) {\n response.status(statusCode);\n }\n\n if (body === undefined || body === null) {\n response.end();\n } else if (typeof body === 'object') {\n response.json(body);\n } else {\n response.send(String(body));\n }\n }\n\n /**\n * Set response status\n */\n public status(response: DenoResponse, statusCode: number): void {\n response.status(statusCode);\n }\n\n /**\n * Redirect response\n */\n public redirect(\n response: DenoResponse,\n statusCode: number,\n url: string,\n ): void {\n response.redirect(url, statusCode);\n }\n\n /**\n * Set response header\n */\n public setHeader(response: DenoResponse, name: string, value: string): void {\n response.setHeader(name, value);\n }\n\n /**\n * Get response header\n */\n public getHeader(response: DenoResponse, name: string): string | null {\n return response.getHeader(name);\n }\n\n /**\n * Append value to header\n */\n public appendHeader(response: DenoResponse, name: string, value: string): void {\n const existing = response.getHeader(name);\n if (existing) {\n response.setHeader(name, `${existing}, ${value}`);\n } else {\n response.setHeader(name, value);\n }\n }\n\n /**\n * End response\n */\n public end(response: DenoResponse, message?: string): void {\n response.end(message);\n }\n\n /**\n * Check if headers have been sent\n */\n public isHeadersSent(response: DenoResponse): boolean {\n return response.headersSent;\n }\n\n /**\n * Register body parser middleware\n */\n public registerParserMiddleware(): void {\n // Body parsing is handled in createRequest\n }\n\n /**\n * Create middleware factory\n */\n public createMiddlewareFactory(\n _requestMethod: RequestMethod,\n ): (path: string, callback: Function) => void {\n return (path: string, callback: Function) => {\n this.use(path, async (req, res, next) => {\n await callback(req, res, next);\n });\n };\n }\n\n /**\n * Initialize the adapter\n */\n public initHttpServer(): void {\n // Initialization is handled in listen()\n }\n\n /**\n * Get the adapter type\n */\n public getType(): string {\n return 'deno';\n }\n\n /**\n * Apply version filter\n */\n public applyVersionFilter(\n handler: Function,\n _version: unknown,\n _versioningOptions: unknown,\n ): (req: DenoRequest, res: DenoResponse, next: () => void) => Function {\n return (_req: DenoRequest, _res: DenoResponse, _next: () => void) => {\n // Version filtering can be implemented here if needed\n return handler;\n };\n }\n}\n","import type { DenoRequest, DenoResponse } from '../adapters/deno-adapter.js';\n\n/**\n * Express-compatible Request interface\n * Provides a compatibility layer for Express middleware\n */\nexport interface ExpressCompatRequest {\n // Core properties\n method: string;\n url: string;\n originalUrl: string;\n baseUrl: string;\n path: string;\n hostname: string;\n ip: string | undefined;\n protocol: string;\n secure: boolean;\n headers: Record<string, string | string[] | undefined>;\n\n // Parsed data\n params: Record<string, string>;\n query: Record<string, string>;\n body: unknown;\n\n // Express-specific methods\n get(name: string): string | undefined;\n header(name: string): string | undefined;\n is(type: string | string[]): string | false | null;\n accepts(...types: string[]): string | false;\n acceptsEncodings(...encodings: string[]): string | false;\n acceptsCharsets(...charsets: string[]): string | false;\n acceptsLanguages(...langs: string[]): string | false;\n\n // Raw Deno request access\n raw: Request;\n\n // Additional Express properties some middleware expect\n cookies?: Record<string, string>;\n signedCookies?: Record<string, string>;\n fresh?: boolean;\n stale?: boolean;\n xhr?: boolean;\n subdomains?: string[];\n\n // Allow arbitrary properties (Express middleware often adds custom props)\n [key: string]: unknown;\n}\n\n/**\n * Express-compatible Response interface\n * Provides a compatibility layer for Express middleware\n */\nexport interface ExpressCompatResponse {\n // Status\n statusCode: number;\n statusMessage: string;\n headersSent: boolean;\n\n // Methods\n status(code: number): this;\n sendStatus(code: number): this;\n\n // Headers\n set(field: string, value: string | string[]): this;\n set(field: Record<string, string | string[]>): this;\n header(field: string, value?: string | string[]): this | string | undefined;\n get(field: string): string | undefined;\n append(field: string, value: string | string[]): this;\n\n // Body\n send(body?: unknown): this;\n json(body?: unknown): this;\n jsonp(body?: unknown): this;\n end(data?: unknown, encoding?: string): this;\n\n // Redirect\n redirect(url: string): void;\n redirect(status: number, url: string): void;\n\n // Content type\n type(type: string): this;\n contentType(type: string): this;\n\n // Cookies\n cookie(name: string, value: string, options?: CookieOptions): this;\n clearCookie(name: string, options?: CookieOptions): this;\n\n // Other\n location(url: string): this;\n links(links: Record<string, string>): this;\n vary(field: string): this;\n format(obj: Record<string, () => void>): this;\n\n // Allow arbitrary properties\n [key: string]: unknown;\n}\n\n/**\n * Cookie options interface\n */\nexport interface CookieOptions {\n domain?: string;\n encode?: (value: string) => string;\n expires?: Date;\n httpOnly?: boolean;\n maxAge?: number;\n path?: string;\n sameSite?: boolean | 'lax' | 'strict' | 'none';\n secure?: boolean;\n signed?: boolean;\n}\n\n/**\n * Express NextFunction type\n */\nexport type ExpressNextFunction = (err?: unknown) => void;\n\n/**\n * Express middleware function signature\n */\nexport type ExpressMiddleware = (\n req: ExpressCompatRequest,\n res: ExpressCompatResponse,\n next: ExpressNextFunction,\n) => void | Promise<void>;\n\n/**\n * Express error-handling middleware function signature\n */\nexport type ExpressErrorMiddleware = (\n err: unknown,\n req: ExpressCompatRequest,\n res: ExpressCompatResponse,\n next: ExpressNextFunction,\n) => void | Promise<void>;\n\n// HTTP status messages\nconst STATUS_MESSAGES: Record<number, string> = {\n 100: 'Continue',\n 101: 'Switching Protocols',\n 102: 'Processing',\n 200: 'OK',\n 201: 'Created',\n 202: 'Accepted',\n 204: 'No Content',\n 206: 'Partial Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 303: 'See Other',\n 304: 'Not Modified',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 413: 'Payload Too Large',\n 415: 'Unsupported Media Type',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n};\n\n/**\n * Convert Deno Headers to Express-style headers object\n */\nfunction headersToObject(headers: Headers): Record<string, string | string[] | undefined> {\n const result: Record<string, string | string[] | undefined> = {};\n headers.forEach((value, key) => {\n const existing = result[key.toLowerCase()];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n result[key.toLowerCase()] = [existing, value];\n }\n } else {\n result[key.toLowerCase()] = value;\n }\n });\n return result;\n}\n\n/**\n * Parse Accept header and match against types\n */\nfunction parseAccept(acceptHeader: string | undefined, types: string[]): string | false {\n if (!acceptHeader || types.length === 0) return false;\n\n const accepts = acceptHeader.split(',').map(part => {\n const [type, ...params] = part.trim().split(';');\n let q = 1;\n params.forEach(p => {\n const [key, value] = p.trim().split('=');\n if (key === 'q') q = parseFloat(value) || 1;\n });\n return { type: type.trim(), q };\n }).sort((a, b) => b.q - a.q);\n\n for (const accept of accepts) {\n for (const type of types) {\n if (accept.type === '*/*' || accept.type === type ||\n accept.type.endsWith('/*') && type.startsWith(accept.type.slice(0, -1))) {\n return type;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Serialize cookie with options\n */\nfunction serializeCookie(name: string, value: string, options: CookieOptions = {}): string {\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n\n if (options.maxAge !== undefined) {\n cookie += `; Max-Age=${options.maxAge}`;\n }\n if (options.domain) {\n cookie += `; Domain=${options.domain}`;\n }\n if (options.path) {\n cookie += `; Path=${options.path}`;\n } else {\n cookie += '; Path=/';\n }\n if (options.expires) {\n cookie += `; Expires=${options.expires.toUTCString()}`;\n }\n if (options.httpOnly) {\n cookie += '; HttpOnly';\n }\n if (options.secure) {\n cookie += '; Secure';\n }\n if (options.sameSite) {\n if (options.sameSite === true) {\n cookie += '; SameSite=Strict';\n } else {\n cookie += `; SameSite=${options.sameSite.charAt(0).toUpperCase() + options.sameSite.slice(1)}`;\n }\n }\n\n return cookie;\n}\n\n/**\n * Create an Express-compatible request wrapper from a DenoRequest\n */\nexport function createExpressRequest(denoReq: DenoRequest): ExpressCompatRequest {\n const headersObj = headersToObject(denoReq.headers);\n\n // Parse cookies from header\n const cookieHeader = denoReq.headers.get('cookie') || '';\n const cookies: Record<string, string> = {};\n cookieHeader.split(';').forEach(cookie => {\n const [name, ...valueParts] = cookie.trim().split('=');\n if (name) {\n cookies[decodeURIComponent(name.trim())] = decodeURIComponent(valueParts.join('='));\n }\n });\n\n const req: ExpressCompatRequest = {\n // Core properties\n method: denoReq.method,\n url: denoReq.originalUrl || denoReq.path || '/',\n originalUrl: denoReq.originalUrl || denoReq.path || '/',\n baseUrl: denoReq.baseUrl || '',\n path: denoReq.path || '/',\n hostname: denoReq.hostname || '',\n ip: denoReq.ip,\n protocol: denoReq.protocol || 'http',\n secure: denoReq.secure || false,\n headers: headersObj,\n\n // Parsed data\n params: denoReq.params,\n query: denoReq.query,\n body: denoReq.body,\n\n // Raw access\n raw: denoReq.raw,\n\n // Cookies\n cookies,\n signedCookies: {},\n\n // Computed properties\n xhr: denoReq.headers.get('x-requested-with')?.toLowerCase() === 'xmlhttprequest',\n subdomains: denoReq.hostname?.split('.').slice(0, -2).reverse() || [],\n\n // Methods\n get(name: string): string | undefined {\n const key = name.toLowerCase();\n const value = headersObj[key];\n return Array.isArray(value) ? value[0] : value;\n },\n\n header(name: string): string | undefined {\n return this.get(name);\n },\n\n is(type: string | string[]): string | false | null {\n const contentType = denoReq.headers.get('content-type');\n if (!contentType) return null;\n\n const types = Array.isArray(type) ? type : [type];\n for (const t of types) {\n if (contentType.includes(t) || contentType.includes(t.replace('/', ''))) {\n return t;\n }\n }\n return false;\n },\n\n accepts(...types: string[]): string | false {\n return parseAccept(denoReq.headers.get('accept') || undefined, types);\n },\n\n acceptsEncodings(...encodings: string[]): string | false {\n return parseAccept(denoReq.headers.get('accept-encoding') || undefined, encodings);\n },\n\n acceptsCharsets(...charsets: string[]): string | false {\n return parseAccept(denoReq.headers.get('accept-charset') || undefined, charsets);\n },\n\n acceptsLanguages(...langs: string[]): string | false {\n return parseAccept(denoReq.headers.get('accept-language') || undefined, langs);\n },\n };\n\n // Check freshness\n const modifiedSince = denoReq.headers.get('if-modified-since');\n const noneMatch = denoReq.headers.get('if-none-match');\n req.fresh = !!(modifiedSince || noneMatch);\n req.stale = !req.fresh;\n\n return req;\n}\n\n/**\n * Create an Express-compatible response wrapper from a DenoResponse\n */\nexport function createExpressResponse(denoRes: DenoResponse): ExpressCompatResponse {\n let statusMessage = 'OK';\n const cookies: string[] = [];\n\n const res: ExpressCompatResponse = {\n // Properties\n get statusCode() {\n return denoRes.statusCode;\n },\n set statusCode(code: number) {\n denoRes.statusCode = code;\n statusMessage = STATUS_MESSAGES[code] || 'Unknown';\n },\n get statusMessage() {\n return statusMessage;\n },\n set statusMessage(msg: string) {\n statusMessage = msg;\n },\n get headersSent() {\n return denoRes.headersSent;\n },\n\n // Status methods\n status(code: number) {\n denoRes.status(code);\n statusMessage = STATUS_MESSAGES[code] || 'Unknown';\n return this;\n },\n\n sendStatus(code: number) {\n this.status(code);\n denoRes.send(STATUS_MESSAGES[code] || String(code));\n return this;\n },\n\n // Header methods\n set(field: string | Record<string, string | string[]>, value?: string | string[]) {\n if (typeof field === 'object') {\n Object.entries(field).forEach(([key, val]) => {\n if (Array.isArray(val)) {\n val.forEach(v => denoRes.headers.append(key, v));\n } else {\n denoRes.setHeader(key, val);\n }\n });\n } else if (value !== undefined) {\n if (Array.isArray(value)) {\n value.forEach(v => denoRes.headers.append(field, v));\n } else {\n denoRes.setHeader(field, value);\n }\n }\n return this;\n },\n\n header(field: string, value?: string | string[]): string | undefined | ExpressCompatResponse {\n if (value === undefined) {\n return denoRes.getHeader(field) || undefined;\n }\n return this.set(field, value);\n },\n\n get(field: string) {\n return denoRes.getHeader(field) || undefined;\n },\n\n append(field: string, value: string | string[]) {\n if (Array.isArray(value)) {\n value.forEach(v => denoRes.headers.append(field, v));\n } else {\n denoRes.headers.append(field, value);\n }\n return this;\n },\n\n // Body methods\n send(body?: unknown) {\n if (body === undefined) {\n denoRes.end();\n } else if (typeof body === 'string') {\n if (!denoRes.getHeader('Content-Type')) {\n denoRes.setHeader('Content-Type', 'text/html; charset=utf-8');\n }\n denoRes.send(body);\n } else if (Buffer.isBuffer(body)) {\n if (!denoRes.getHeader('Content-Type')) {\n denoRes.setHeader('Content-Type', 'application/octet-stream');\n }\n denoRes.send(body as unknown as BodyInit);\n } else if (typeof body === 'object') {\n return this.json(body);\n } else {\n denoRes.send(String(body));\n }\n return this;\n },\n\n json(body?: unknown) {\n denoRes.json(body);\n return this;\n },\n\n jsonp(body?: unknown) {\n // For JSONP, we'd need to wrap in a callback\n // For now, just send as JSON\n denoRes.json(body);\n return this;\n },\n\n end(data?: unknown) {\n if (data !== undefined) {\n denoRes.end(typeof data === 'string' ? data : JSON.stringify(data));\n } else {\n denoRes.end();\n }\n return this;\n },\n\n // Redirect\n redirect(statusOrUrl: number | string, url?: string) {\n if (typeof statusOrUrl === 'number' && url) {\n denoRes.redirect(url, statusOrUrl);\n } else if (typeof statusOrUrl === 'string') {\n denoRes.redirect(statusOrUrl, 302);\n }\n },\n\n // Content type\n type(type: string) {\n // Simple MIME type mapping\n const mimeTypes: Record<string, string> = {\n html: 'text/html',\n json: 'application/json',\n xml: 'application/xml',\n text: 'text/plain',\n js: 'application/javascript',\n css: 'text/css',\n };\n const contentType = mimeTypes[type] || type;\n denoRes.setHeader('Content-Type', contentType);\n return this;\n },\n\n contentType(type: string) {\n return this.type(type);\n },\n\n // Cookies\n cookie(name: string, value: string, options: CookieOptions = {}) {\n const cookieStr = serializeCookie(name, value, options);\n cookies.push(cookieStr);\n denoRes.headers.append('Set-Cookie', cookieStr);\n return this;\n },\n\n clearCookie(name: string, options: CookieOptions = {}) {\n const clearOptions = { ...options, expires: new Date(0), maxAge: 0 };\n return this.cookie(name, '', clearOptions);\n },\n\n // Other methods\n location(url: string) {\n denoRes.setHeader('Location', url);\n return this;\n },\n\n links(links: Record<string, string>) {\n const linkHeader = Object.entries(links)\n .map(([rel, href]) => `<${href}>; rel=\"${rel}\"`)\n .join(', ');\n denoRes.setHeader('Link', linkHeader);\n return this;\n },\n\n vary(field: string) {\n const existing = denoRes.getHeader('Vary');\n if (existing) {\n denoRes.setHeader('Vary', `${existing}, ${field}`);\n } else {\n denoRes.setHeader('Vary', field);\n }\n return this;\n },\n\n format(obj: Record<string, () => void>) {\n const accept = denoRes.headers.get?.('Accept') || '*/*';\n const types = Object.keys(obj);\n const matched = parseAccept(accept, types);\n\n if (matched && obj[matched]) {\n obj[matched]();\n } else if (obj.default) {\n obj.default();\n }\n return this;\n },\n };\n\n return res;\n}\n\n/**\n * Wrap an Express middleware to work with the Deno adapter\n */\nexport function wrapExpressMiddleware(\n middleware: ExpressMiddleware | ExpressErrorMiddleware,\n): (\n req: DenoRequest,\n res: DenoResponse,\n next: () => Promise<void>,\n) => Promise<void> {\n return async (denoReq: DenoRequest, denoRes: DenoResponse, next: () => Promise<void>) => {\n const expressReq = createExpressRequest(denoReq);\n const expressRes = createExpressResponse(denoRes);\n\n return new Promise<void>((resolve, reject) => {\n const expressNext: ExpressNextFunction = (err?: unknown) => {\n if (err) {\n // If it's an error middleware (4 params), call it with the error\n if (middleware.length === 4) {\n try {\n const result = (middleware as ExpressErrorMiddleware)(err, expressReq, expressRes, expressNext);\n // Handle async error middleware\n if (result instanceof Promise) {\n result.catch(reject);\n }\n } catch (e) {\n reject(e);\n }\n } else {\n reject(err);\n }\n } else {\n next().then(resolve).catch(reject);\n }\n };\n\n try {\n const result = (middleware as ExpressMiddleware)(expressReq, expressRes, expressNext);\n\n // Handle async middleware\n if (result instanceof Promise) {\n result.catch(reject);\n }\n } catch (err) {\n reject(err);\n }\n });\n };\n}\n\n/**\n * Create an Express-like app object for middleware that expects app.use()\n */\nexport interface ExpressLikeApp {\n use: (...args: unknown[]) => void;\n get: (path: string, ...handlers: ExpressMiddleware[]) => void;\n post: (path: string, ...handlers: ExpressMiddleware[]) => void;\n put: (path: string, ...handlers: ExpressMiddleware[]) => void;\n delete: (path: string, ...handlers: ExpressMiddleware[]) => void;\n patch: (path: string, ...handlers: ExpressMiddleware[]) => void;\n options: (path: string, ...handlers: ExpressMiddleware[]) => void;\n head: (path: string, ...handlers: ExpressMiddleware[]) => void;\n all: (path: string, ...handlers: ExpressMiddleware[]) => void;\n locals: Record<string, unknown>;\n settings: Record<string, unknown>;\n set: (key: string, value: unknown) => void;\n enable: (key: string) => void;\n disable: (key: string) => void;\n enabled: (key: string) => boolean;\n disabled: (key: string) => boolean;\n}\n","import type { DenoRequest, DenoResponse } from '../adapters/deno-adapter.js';\n\n/**\n * Fastify-compatible Request interface\n * Provides a compatibility layer for Fastify middleware and hooks\n */\nexport interface FastifyCompatRequest {\n // Core properties\n id: string;\n params: Record<string, string>;\n query: Record<string, string>;\n body: unknown;\n headers: Record<string, string | string[] | undefined>;\n raw: Request;\n\n // URL info\n url: string;\n originalUrl: string;\n method: string;\n hostname: string;\n ip: string | undefined;\n protocol: 'http' | 'https';\n\n // Routing\n routerPath?: string;\n routerMethod?: string;\n\n // Validation\n validationError?: Error;\n\n // Custom properties storage\n [key: string]: unknown;\n}\n\n/**\n * Fastify-compatible Reply interface\n * Provides a compatibility layer for Fastify middleware and hooks\n */\nexport interface FastifyCompatReply {\n // Status\n statusCode: number;\n sent: boolean;\n\n // Methods - all return this for chaining\n code(statusCode: number): this;\n status(statusCode: number): this;\n\n // Headers\n header(key: string, value: string | number | boolean): this;\n headers(headers: Record<string, string | number | boolean>): this;\n getHeader(key: string): string | undefined;\n getHeaders(): Record<string, string | undefined>;\n removeHeader(key: string): this;\n hasHeader(key: string): boolean;\n\n // Body\n send(payload?: unknown): this;\n\n // Serialization\n serialize(payload: unknown): string;\n serializer(fn: (payload: unknown) => string): this;\n\n // Type\n type(contentType: string): this;\n\n // Redirect\n redirect(url: string): this;\n redirect(statusCode: number, url: string): this;\n\n // Utility\n callNotFound(): void;\n getResponseTime(): number;\n\n // Raw access\n raw: DenoResponse;\n\n // Custom properties\n [key: string]: unknown;\n}\n\n/**\n * Fastify hook types\n */\nexport type FastifyHookName =\n | 'onRequest'\n | 'preParsing'\n | 'preValidation'\n | 'preHandler'\n | 'preSerialization'\n | 'onSend'\n | 'onResponse'\n | 'onError'\n | 'onTimeout'\n | 'onReady'\n | 'onClose';\n\n/**\n * Fastify done callback\n */\nexport type FastifyDoneCallback = (err?: Error) => void;\n\n/**\n * Fastify hook function (callback style)\n */\nexport type FastifyHookCallback = (\n request: FastifyCompatRequest,\n reply: FastifyCompatReply,\n done: FastifyDoneCallback,\n) => void;\n\n/**\n * Fastify hook function (async style)\n */\nexport type FastifyHookAsync = (\n request: FastifyCompatRequest,\n reply: FastifyCompatReply,\n) => Promise<void>;\n\n/**\n * Fastify hook function (either style)\n */\nexport type FastifyHook = FastifyHookCallback | FastifyHookAsync;\n\n/**\n * Fastify onError hook\n */\nexport type FastifyErrorHook = (\n request: FastifyCompatRequest,\n reply: FastifyCompatReply,\n error: Error,\n done: FastifyDoneCallback,\n) => void;\n\n/**\n * Fastify onSend hook with payload\n */\nexport type FastifyOnSendHook = (\n request: FastifyCompatRequest,\n reply: FastifyCompatReply,\n payload: unknown,\n done: (err?: Error, payload?: unknown) => void,\n) => void;\n\n/**\n * Fastify plugin function\n */\nexport type FastifyPlugin<Options = Record<string, unknown>> = (\n instance: FastifyLikeInstance,\n opts: Options,\n done: FastifyDoneCallback,\n) => void;\n\n/**\n * Fastify async plugin function\n */\nexport type FastifyPluginAsync<Options = Record<string, unknown>> = (\n instance: FastifyLikeInstance,\n opts: Options,\n) => Promise<void>;\n\n/**\n * Fastify route handler\n */\nexport type FastifyRouteHandler = (\n request: FastifyCompatRequest,\n reply: FastifyCompatReply,\n) => unknown | Promise<unknown>;\n\n/**\n * Fastify route options\n */\nexport interface FastifyRouteOptions {\n method: string | string[];\n url: string;\n handler: FastifyRouteHandler;\n schema?: unknown;\n preValidation?: FastifyHook | FastifyHook[];\n preHandler?: FastifyHook | FastifyHook[];\n preSerialization?: FastifyOnSendHook | FastifyOnSendHook[];\n onRequest?: FastifyHook | FastifyHook[];\n onResponse?: FastifyHook | FastifyHook[];\n onSend?: FastifyOnSendHook | FastifyOnSendHook[];\n onError?: FastifyErrorHook | FastifyErrorHook[];\n}\n\n/**\n * Fastify-like instance interface\n */\nexport interface FastifyLikeInstance {\n // Decorators\n decorate(name: string, value: unknown): this;\n decorateRequest(name: string, value: unknown): this;\n decorateReply(name: string, value: unknown): this;\n hasDecorator(name: string): boolean;\n hasRequestDecorator(name: string): boolean;\n hasReplyDecorator(name: string): boolean;\n\n // Hooks\n addHook(name: 'onRequest', hook: FastifyHook): this;\n addHook(name: 'preParsing', hook: FastifyHook): this;\n addHook(name: 'preValidation', hook: FastifyHook): this;\n addHook(name: 'preHandler', hook: FastifyHook): this;\n addHook(name: 'preSerialization', hook: FastifyOnSendHook): this;\n addHook(name: 'onSend', hook: FastifyOnSendHook): this;\n addHook(name: 'onResponse', hook: FastifyHook): this;\n addHook(name: 'onError', hook: FastifyErrorHook): this;\n addHook(name: FastifyHookName, hook: FastifyHook | FastifyErrorHook | FastifyOnSendHook): this;\n\n // Plugin registration\n register<Options = Record<string, unknown>>(\n plugin: FastifyPlugin<Options> | FastifyPluginAsync<Options>,\n opts?: Options,\n ): this;\n\n // Routes\n route(opts: FastifyRouteOptions): this;\n get(path: string, handler: FastifyRouteHandler): this;\n get(path: string, opts: Partial<FastifyRouteOptions>, handler: FastifyRouteHandler): this;\n post(path: string, handler: FastifyRouteHandler): this;\n post(path: string, opts: Partial<FastifyRouteOptions>, handler: FastifyRouteHandler): this;\n put(path: string, handler: FastifyRouteHandler): this;\n put(path: string, opts: Partial<FastifyRouteOptions>, handler: FastifyRouteHandler): this;\n delete(path: string, handler: FastifyRouteHandler): this;\n delete(path: string, opts: Partial<FastifyRouteOptions>, handler: FastifyRouteHandler): this;\n patch(path: string, handler: FastifyRouteHandler): this;\n patch(path: string, opts: Partial<FastifyRouteOptions>, handler: FastifyRouteHandler): this;\n options(path: string, handler: FastifyRouteHandler): this;\n options(path: string, opts: Partial<FastifyRouteOptions>, handler: FastifyRouteHandler): this;\n head(path: string, handler: FastifyRouteHandler): this;\n head(path: string, opts: Partial<FastifyRouteOptions>, handler: FastifyRouteHandler): this;\n all(path: string, handler: FastifyRouteHandler): this;\n all(path: string, opts: Partial<FastifyRouteOptions>, handler: FastifyRouteHandler): this;\n\n // Settings\n log: FastifyLogger;\n prefix: string;\n}\n\n/**\n * Fastify logger interface\n */\nexport interface FastifyLogger {\n info(msg: string, ...args: unknown[]): void;\n error(msg: string, ...args: unknown[]): void;\n debug(msg: string, ...args: unknown[]): void;\n warn(msg: string, ...args: unknown[]): void;\n trace(msg: string, ...args: unknown[]): void;\n fatal(msg: string, ...args: unknown[]): void;\n child(bindings: Record<string, unknown>): FastifyLogger;\n}\n\n// Generate unique request IDs\nlet requestIdCounter = 0;\nfunction generateRequestId(): string {\n return `req-${Date.now()}-${++requestIdCounter}`;\n}\n\n/**\n * Convert Deno Headers to Fastify-style headers object\n */\nfunction headersToObject(headers: Headers): Record<string, string | string[] | undefined> {\n const result: Record<string, string | string[] | undefined> = {};\n headers.forEach((value, key) => {\n const lowerKey = key.toLowerCase();\n const existing = result[lowerKey];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n result[lowerKey] = [existing, value];\n }\n } else {\n result[lowerKey] = value;\n }\n });\n return result;\n}\n\n/**\n * Create a Fastify-compatible request from a DenoRequest\n */\nexport function createFastifyRequest(denoReq: DenoRequest): FastifyCompatRequest {\n const headersObj = headersToObject(denoReq.headers);\n\n const req: FastifyCompatRequest = {\n id: generateRequestId(),\n params: denoReq.params,\n query: denoReq.query,\n body: denoReq.body,\n headers: headersObj,\n raw: denoReq.raw,\n url: denoReq.originalUrl || denoReq.path || '/',\n originalUrl: denoReq.originalUrl || denoReq.path || '/',\n method: denoReq.method,\n hostname: denoReq.hostname || '',\n ip: denoReq.ip,\n protocol: denoReq.secure ? 'https' : 'http',\n routerPath: denoReq.path,\n routerMethod: denoReq.method,\n };\n\n return req;\n}\n\n/**\n * Create a Fastify-compatible reply from a DenoResponse\n */\nexport function createFastifyReply(denoRes: DenoResponse): FastifyCompatReply {\n let serializer: (payload: unknown) => string = JSON.stringify;\n const startTime = Date.now();\n\n const reply: FastifyCompatReply = {\n get statusCode() {\n return denoRes.statusCode;\n },\n set statusCode(code: number) {\n denoRes.statusCode = code;\n },\n get sent() {\n return denoRes.headersSent;\n },\n\n raw: denoRes,\n\n code(statusCode: number) {\n denoRes.status(statusCode);\n return this;\n },\n\n status(statusCode: number) {\n return this.code(statusCode);\n },\n\n header(key: string, value: string | number | boolean) {\n denoRes.setHeader(key, String(value));\n return this;\n },\n\n headers(headers: Record<string, string | number | boolean>) {\n Object.entries(headers).forEach(([key, value]) => {\n denoRes.setHeader(key, String(value));\n });\n return this;\n },\n\n getHeader(key: string) {\n return denoRes.getHeader(key) || undefined;\n },\n\n getHeaders() {\n const result: Record<string, string | undefined> = {};\n denoRes.headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n },\n\n removeHeader(key: string) {\n denoRes.removeHeader(key);\n return this;\n },\n\n hasHeader(key: string) {\n return denoRes.getHeader(key) !== null;\n },\n\n send(payload?: unknown) {\n if (payload === undefined) {\n denoRes.end();\n } else if (typeof payload === 'string') {\n if (!denoRes.getHeader('Content-Type')) {\n denoRes.setHeader('Content-Type', 'text/plain; charset=utf-8');\n }\n denoRes.send(payload);\n } else if (payload instanceof Uint8Array || payload instanceof ArrayBuffer) {\n if (!denoRes.getHeader('Content-Type')) {\n denoRes.setHeader('Content-Type', 'application/octet-stream');\n }\n denoRes.send(payload as BodyInit);\n } else if (typeof payload === 'object') {\n if (!denoRes.getHeader('Content-Type')) {\n denoRes.setHeader('Content-Type', 'application/json; charset=utf-8');\n }\n denoRes.send(serializer(payload));\n } else {\n denoRes.send(String(payload));\n }\n return this;\n },\n\n serialize(payload: unknown) {\n return serializer(payload);\n },\n\n serializer(fn: (payload: unknown) => string) {\n serializer = fn;\n return this;\n },\n\n type(contentType: string) {\n denoRes.setHeader('Content-Type', contentType);\n return this;\n },\n\n redirect(statusCodeOrUrl: number | string, url?: string) {\n if (typeof statusCodeOrUrl === 'number' && url) {\n denoRes.redirect(url, statusCodeOrUrl);\n } else if (typeof statusCodeOrUrl === 'string') {\n denoRes.redirect(statusCodeOrUrl, 302);\n }\n return this;\n },\n\n callNotFound() {\n denoRes.status(404).json({\n statusCode: 404,\n error: 'Not Found',\n message: 'Route not found',\n });\n },\n\n getResponseTime() {\n return Date.now() - startTime;\n },\n };\n\n return reply;\n}\n\n/**\n * Check if a hook function is async (no done callback)\n */\nfunction isAsyncHook(hook: FastifyHook): hook is FastifyHookAsync {\n return hook.length <= 2;\n}\n\n/**\n * Wrap a Fastify hook to work with the Deno adapter middleware system\n */\nexport function wrapFastifyHook(\n hook: FastifyHook,\n): (\n req: DenoRequest,\n res: DenoResponse,\n next: () => Promise<void>,\n) => Promise<void> {\n return async (denoReq: DenoRequest, denoRes: DenoResponse, next: () => Promise<void>) => {\n const fastifyReq = createFastifyRequest(denoReq);\n const fastifyReply = createFastifyReply(denoRes);\n\n if (isAsyncHook(hook)) {\n await hook(fastifyReq, fastifyReply);\n if (!fastifyReply.sent) {\n await next();\n }\n } else {\n return new Promise<void>((resolve, reject) => {\n const done: FastifyDoneCallback = (err?: Error) => {\n if (err) {\n reject(err);\n } else if (!fastifyReply.sent) {\n next().then(resolve).catch(reject);\n } else {\n resolve();\n }\n };\n\n try {\n (hook as FastifyHookCallback)(fastifyReq, fastifyReply, done);\n } catch (err) {\n reject(err);\n }\n });\n }\n };\n}\n\n/**\n * Wrap a Fastify plugin for use with the Deno adapter\n * This allows using Fastify plugins that add hooks or decorators\n */\nexport function wrapFastifyPlugin<Options = Record<string, unknown>>(\n plugin: FastifyPlugin<Options> | FastifyPluginAsync<Options>,\n instance: FastifyLikeInstance,\n opts: Options = {} as Options,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n if (plugin.length <= 2) {\n // Async plugin\n const result = (plugin as FastifyPluginAsync<Options>)(instance, opts);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n } else {\n resolve();\n }\n } else {\n // Callback plugin\n try {\n (plugin as FastifyPlugin<Options>)(instance, opts, (err?: Error) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n } catch (err) {\n reject(err);\n }\n }\n });\n}\n\n/**\n * Create a simple logger that matches Fastify's logger interface\n */\nexport function createFastifyLogger(): FastifyLogger {\n const createLogFn = (level: string) => (msg: string, ...args: unknown[]) => {\n console.log(`[${level.toUpperCase()}] ${msg}`, ...args);\n };\n\n return {\n info: createLogFn('info'),\n error: createLogFn('error'),\n debug: createLogFn('debug'),\n warn: createLogFn('warn'),\n trace: createLogFn('trace'),\n fatal: createLogFn('fatal'),\n child(bindings: Record<string, unknown>) {\n const prefix = Object.entries(bindings)\n .map(([k, v]) => `${k}=${v}`)\n .join(' ');\n const childLog = createFastifyLogger();\n const wrap = (fn: (msg: string, ...args: unknown[]) => void) =>\n (msg: string, ...args: unknown[]) => fn(`[${prefix}] ${msg}`, ...args);\n return {\n ...childLog,\n info: wrap(childLog.info),\n error: wrap(childLog.error),\n debug: wrap(childLog.debug),\n warn: wrap(childLog.warn),\n trace: wrap(childLog.trace),\n fatal: wrap(childLog.fatal),\n };\n },\n };\n}\n"],"mappings":"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","names":["headersToObject"]}
|