@iskra-bun/web-kit 0.1.0 β†’ 0.2.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/kernel.ts","../src/driver.ts","../src/server.ts","../src/router.ts","../src/features/cors.ts","../src/features/error-handler.ts","../src/errors.ts","../src/features/health.ts","../src/features/logger.ts","../src/features/request-id.ts","../src/features/storage/adapters/local.ts","../src/features/storage/index.ts","../src/features/db.ts","../src/features/cache.ts","../src/features/session.ts","../src/features/auth/index.ts","../src/features/auth/better-auth-config.ts","../src/features/auth/schema.ts","../src/features/rate-limit.ts","../src/features/permissions.ts","../src/features/api-key.ts","../src/features/csrf.ts","../src/responses.ts","../src/features/validation.ts","../src/features/json-schema-validation.ts","../src/features/openapi.ts","../src/features/upload/helper.ts","../src/features/upload/index.ts","../src/features/tracing.ts","../src/features/email/index.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport type { Context, Next } from \"hono\";\nimport type { Feature, KernelConfig } from \"./types\";\n\n/**\n * Core microkernel orchestrator that manages features, dependencies, and application lifecycle.\n */\nexport class Kernel {\n private app: Hono;\n private config: KernelConfig;\n private features: Map<string, Feature> = new Map();\n private initialized = false;\n\n constructor(config: KernelConfig = {}) {\n this.config = {\n port: 8000,\n hostname: \"localhost\",\n ...config,\n };\n this.app = new Hono();\n\n // Add default error handler for HTTPException\n this.app.onError((err: Error, c: Context): Response | Promise<Response> => {\n if (err instanceof HTTPException) {\n return c.json(\n { message: err.message },\n err.status,\n );\n }\n\n console.error(\"Unhandled error:\", err);\n return c.json(\n { message: \"Internal Server Error\" },\n 500,\n );\n });\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n throw new Error(\"Kernel already initialized\");\n }\n\n console.log(\"πŸš€ Initializing Web-Kit Kernel...\");\n\n this.validateFeatureDependencies();\n await this.validatePeerDependencies();\n this.applySecurityHeaders();\n\n const orderedFeatures = this.sortFeaturesByDependencies();\n for (const feature of orderedFeatures) {\n await this.initializeFeature(feature);\n }\n\n this.initialized = true;\n console.log(\"βœ… Web-Kit Kernel initialized\");\n }\n\n private applySecurityHeaders(): void {\n if (!this.config.securityHeaders) {\n this.config.securityHeaders = {\n xFrameOptions: \"SAMEORIGIN\",\n xContentTypeOptions: true,\n xXssProtection: true,\n referrerPolicy: \"strict-origin-when-cross-origin\",\n };\n }\n\n const headers = this.config.securityHeaders;\n\n this.app.use(\"*\", async (c: Context, next: Next) => {\n await next();\n\n if (headers.xFrameOptions) {\n c.res.headers.set(\"X-Frame-Options\", headers.xFrameOptions);\n }\n if (headers.xContentTypeOptions) {\n c.res.headers.set(\"X-Content-Type-Options\", \"nosniff\");\n }\n if (headers.xXssProtection) {\n c.res.headers.set(\"X-XSS-Protection\", \"1; mode=block\");\n }\n if (headers.referrerPolicy) {\n c.res.headers.set(\"Referrer-Policy\", headers.referrerPolicy);\n }\n if (headers.strictTransportSecurity) {\n const hsts = headers.strictTransportSecurity;\n let hstsValue = `max-age=${hsts.maxAge || 31536000}`;\n if (hsts.includeSubDomains) hstsValue += \"; includeSubDomains\";\n if (hsts.preload) hstsValue += \"; preload\";\n c.res.headers.set(\"Strict-Transport-Security\", hstsValue);\n }\n if (headers.contentSecurityPolicy) {\n if (typeof headers.contentSecurityPolicy === \"string\") {\n c.res.headers.set(\n \"Content-Security-Policy\",\n headers.contentSecurityPolicy,\n );\n } else if (headers.contentSecurityPolicy.directives) {\n const directives = Object.entries(\n headers.contentSecurityPolicy.directives,\n )\n .map(([key, value]) => {\n const values = Array.isArray(value) ? value.join(\" \") : value;\n return `${key} ${values}`;\n })\n .join(\"; \");\n c.res.headers.set(\"Content-Security-Policy\", directives);\n }\n }\n if (headers.permissionsPolicy) {\n const policy = Object.entries(headers.permissionsPolicy)\n .map(([key, value]) => `${key}=(${value.join(\" \")})`)\n .join(\", \");\n c.res.headers.set(\"Permissions-Policy\", policy);\n }\n });\n }\n\n registerFeature(feature: Feature): void {\n if (this.initialized) {\n throw new Error(\"Cannot register features after initialization\");\n }\n\n if (feature.peerDependencies) {\n for (const dep of feature.peerDependencies) {\n try {\n import(dep);\n } catch {\n console.warn(\n `⚠️ Warning: Feature '${feature.name}' requires peer dependency: ${dep}`,\n );\n }\n }\n }\n\n this.features.set(feature.name, feature);\n console.log(`πŸ“¦ Registered feature: ${feature.name}`);\n }\n\n private validateFeatureDependencies(): void {\n for (const [name, feature] of this.features) {\n if (feature.dependencies) {\n for (const dep of feature.dependencies) {\n if (!this.features.has(dep)) {\n throw new Error(\n `Feature '${name}' requires feature '${dep}' which is not registered`,\n );\n }\n }\n }\n }\n }\n\n private async validatePeerDependencies(): Promise<void> {\n for (const [featureName, feature] of this.features) {\n if (feature.peerDependencies) {\n for (const dep of feature.peerDependencies) {\n // In Node/Bun dynamic import usually works for installed packages\n // We can skip hard failure here or make it safer\n }\n }\n }\n }\n\n private sortFeaturesByDependencies(): Feature[] {\n const sorted: Feature[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (name: string) => {\n if (visited.has(name)) return;\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected for feature: ${name}`);\n }\n\n visiting.add(name);\n const feature = this.features.get(name)!;\n\n if (feature.dependencies) {\n for (const dep of feature.dependencies) {\n visit(dep);\n }\n }\n\n visiting.delete(name);\n visited.add(name);\n sorted.push(feature);\n };\n\n for (const name of this.features.keys()) {\n visit(name);\n }\n\n return sorted;\n }\n\n private async initializeFeature(feature: Feature): Promise<void> {\n console.log(`βš™οΈ Initializing feature: ${feature.name}`);\n await feature.initialize(this);\n\n if (feature.routes) {\n feature.routes(this.app);\n }\n }\n\n getApp(): Hono {\n return this.app;\n }\n\n getFeature<T extends Feature>(name: string): T | undefined {\n return this.features.get(name) as T;\n }\n\n private server: any;\n\n async start(): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n // Iskra uses Bun, so we can use Bun.serve\n // Hono handles this automatically if using the right adapter or just passing app.fetch to Bun.serve\n // But let's assume standard Bun usage from the user\n console.log(\n `🌐 Server running at http://${this.config.hostname}:${this.config.port}`,\n );\n\n if (typeof Bun !== \"undefined\") {\n this.server = Bun.serve({\n port: this.config.port,\n hostname: this.config.hostname,\n fetch: this.app.fetch,\n });\n } else {\n console.warn(\"Not running in Bun, start() might strictly need an adapter.\");\n }\n }\n\n async shutdown(): Promise<void> {\n console.log(\"πŸ›‘ Shutting down...\");\n\n if (this.server) {\n this.server.stop();\n this.server = null;\n }\n\n const features = Array.from(this.features.values()).reverse();\n for (const feature of features) {\n if (feature.shutdown) {\n await feature.shutdown();\n }\n }\n console.log(\"πŸ‘‹ Server shut down gracefully\");\n }\n}\n","import type { App, Driver } from '@iskra-bun/core';\nimport { Hono } from 'hono';\nimport { Kernel } from './kernel';\nimport type { Feature, KernelConfig } from './types';\n\nexport interface WebPluginConfig extends KernelConfig {\n router?: Hono;\n features?: Feature[];\n}\n\nexport class WebPlugin implements Driver {\n name = 'WebPlugin';\n private app: App | null = null;\n private kernel: Kernel;\n private runningServer: any;\n private router?: Hono;\n\n constructor(config: WebPluginConfig = {}) {\n const { router, features, ...kernelConfig } = config;\n this.kernel = new Kernel(kernelConfig);\n this.router = router;\n\n if (features) {\n for (const feature of features) {\n this.kernel.registerFeature(feature);\n }\n }\n }\n\n async init(app: App) {\n this.app = app;\n await this.kernel.initialize();\n\n if (this.router) {\n this.kernel.getApp().route('/', this.router);\n }\n }\n\n getHonoApp(): Hono {\n return this.kernel.getApp();\n }\n\n async start() {\n this.app?.logger.info(`Starting WebPlugin...`);\n // We let the kernel start or we start it manually using Bun\n // Kernel.start() does Bun.serve.\n await this.kernel.start();\n this.runningServer = true; // Placeholder, Kernel.start() might block or not return server instance directly\n }\n\n async stop() {\n await this.kernel.shutdown();\n this.app?.logger.info('WebPlugin stopped');\n }\n}\n","import { OpenAPIHono, createRoute } from '@hono/zod-openapi';\nimport { z } from 'zod';\nimport type { Driver, App } from '@iskra-bun/core';\nimport type { RouteOptions } from './router';\n\nexport interface WebServerOptions {\n port?: number;\n routes?: RouteOptions[];\n debug?: boolean;\n openApi?: {\n path: string;\n title: string;\n version: string;\n };\n}\n\nexport class WebDriver implements Driver {\n name = 'WebDriver';\n private app: App | null = null;\n private server: OpenAPIHono;\n private options: WebServerOptions;\n private runningServer: any;\n\n constructor(options: WebServerOptions = {}) {\n this.options = options;\n this.server = new OpenAPIHono();\n }\n\n init(app: App) {\n this.app = app;\n this.setupRoutes();\n this.setupOpenApi();\n }\n\n private setupOpenApi() {\n if (this.options.openApi) {\n this.server.doc(this.options.openApi.path, {\n openapi: '3.0.0',\n info: {\n version: this.options.openApi.version,\n title: this.options.openApi.title,\n },\n });\n }\n }\n\n private setupRoutes() {\n if (!this.options.routes) return;\n\n for (const route of this.options.routes) {\n // Map simple RouteOptions to OpenAPI RouteConfig\n // We assume JSON for body\n\n const routeConfig: any = {\n method: route.method.toLowerCase(),\n path: route.path,\n tags: route.doc?.tags,\n summary: route.doc?.summary,\n description: route.doc?.description,\n request: {},\n responses: {\n 200: {\n description: 'Successful response',\n content: {\n 'application/json': {\n schema: z.any() // We don't enforce response schema yet\n }\n }\n },\n 500: {\n description: 'Internal Server Error'\n }\n }\n };\n\n if (route.schema?.body) {\n routeConfig.request.body = {\n content: {\n 'application/json': {\n schema: route.schema.body\n }\n }\n };\n }\n if (route.schema?.query) {\n routeConfig.request.query = route.schema.query;\n }\n if (route.schema?.params) {\n routeConfig.request.params = route.schema.params;\n }\n\n const openApiRoute = createRoute(routeConfig);\n\n this.server.openapi(openApiRoute, async (c) => {\n if (!this.app) throw new Error('App not initialized');\n\n const webCtx = {\n raw: c,\n // Hono/zod-openapi puts validated data in c.req.valid('json') etc similar to validator middleware\n body: route.schema?.body ? (c as any).req.valid('json') : undefined,\n query: route.schema?.query ? (c as any).req.valid('query') : undefined,\n params: c.req.param(),\n app: this.app\n };\n\n try {\n const result = await route.handler(webCtx);\n if (result instanceof Response) return result;\n return c.json(result);\n } catch (err: any) {\n this.app.logger.error(err);\n return c.json({ error: err.message }, 500);\n }\n });\n }\n }\n\n start() {\n const port = this.options.port || 3000;\n this.app?.logger.info(`Starting WebServer on port ${port}...`);\n\n // Bun.serve works with OpenAPIHono just like Hono\n this.runningServer = Bun.serve({\n fetch: this.server.fetch,\n port\n });\n }\n\n stop() {\n if (this.runningServer) {\n this.runningServer.stop();\n }\n this.app?.logger.info('WebServer stopped');\n }\n}\n","import type { Hono, Context } from 'hono';\nimport { z } from 'zod';\nimport { zValidator } from '@hono/zod-validator';\nimport type { App } from '@iskra-bun/core';\nimport type { Driver } from '@iskra-bun/core';\n\nexport interface RouteOptions<B = any, Q = any> {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n schema?: {\n body?: z.ZodType<B>;\n query?: z.ZodType<Q>;\n params?: z.ZodType;\n };\n handler: (ctx: WebContext<B, Q>) => Promise<any> | any;\n doc?: {\n summary?: string;\n tags?: string[];\n description?: string;\n };\n}\n\nexport interface WebContext<B = any, Q = any> {\n raw: Context;\n body: B;\n query: Q;\n params: Record<string, string>;\n app: App;\n}\n\nexport const createRouter = (routes: RouteOptions[]) => routes;\n","import type { Feature, CorsConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport { cors } from \"hono/cors\";\n\nexport class CorsFeature implements Feature {\n name = \"cors\";\n\n constructor(private config: CorsConfig = {}) {\n if (!this.config.origin) {\n this.config.origin = \"*\";\n }\n if (this.config.credentials === undefined) {\n this.config.credentials = false;\n }\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n\n const honoConfig: any = { ...this.config };\n\n if (typeof this.config.origin === \"function\") {\n honoConfig.origin = (origin: string) => {\n // @ts-expect-error - origin is narrowed to a function above\n const result = this.config.origin(origin);\n return result ? origin : null;\n };\n }\n\n app.use(\"*\", cors(honoConfig));\n console.log(\"βœ… CORS feature initialized\");\n }\n}\n","import type { Feature, ErrorHandlerConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { IskraError } from '@iskra-bun/core';\nimport { HttpError } from '../errors';\n\nexport class ErrorHandlerFeature implements Feature {\n name = \"error-handler\";\n\n private config: ErrorHandlerConfig;\n\n constructor(config: ErrorHandlerConfig = {}) {\n this.config = {\n includeStack: config.includeStack !== undefined\n ? config.includeStack\n : process.env.NODE_ENV === \"development\",\n customHandlers: config.customHandlers,\n logger: config.logger,\n };\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n\n app.onError((err, c) => {\n return this.handleError(err, c);\n });\n\n console.log(\"βœ… Error handler feature initialized\");\n }\n\n private handleError(err: Error | HTTPException, c: Context): Response {\n if (this.config.logger) {\n this.config.logger(err as Error, c);\n } else {\n console.error(\"Error:\", err);\n }\n\n // Iskra HttpError β€” convertir a HTTPException para mantener compatibilidad con Hono\n if (err instanceof HttpError) {\n const status = err.status;\n if (this.config.customHandlers?.[status]) {\n return this.config.customHandlers[status](err, c);\n }\n\n const response: any = {\n error: err.message,\n status,\n code: err.code,\n };\n\n if (Object.keys(err.context).length > 0) {\n response.context = err.context;\n }\n\n if (this.config.includeStack && err.stack) {\n response.stack = err.stack;\n }\n\n const requestId = c.get(\"requestId\");\n if (requestId) response.requestId = requestId;\n\n return c.json(response, status as any);\n }\n\n // IskraError genΓ©rico (no-HTTP) β€” devolver como 500\n if (err instanceof IskraError) {\n const status = 500;\n if (this.config.customHandlers?.[status]) {\n return this.config.customHandlers[status](err, c);\n }\n\n const response: any = {\n error: this.config.includeStack ? err.message : \"Internal Server Error\",\n status,\n code: err.code,\n };\n\n if (this.config.includeStack && err.stack) {\n response.stack = err.stack;\n }\n\n const requestId = c.get(\"requestId\");\n if (requestId) response.requestId = requestId;\n\n return c.json(response, status);\n }\n\n // Hono HTTPException nativa\n if (err instanceof HTTPException) {\n const status = err.status;\n if (this.config.customHandlers?.[status]) {\n return this.config.customHandlers[status](err, c);\n }\n\n const response: any = {\n error: err.message || this.getStatusText(status),\n status,\n };\n\n if (this.config.includeStack && err.stack) {\n response.stack = err.stack;\n }\n\n return c.json(response, status);\n }\n\n // Error genΓ©rico\n const status = 500;\n if (this.config.customHandlers?.[status]) {\n return this.config.customHandlers[status](err, c);\n }\n\n const response: any = {\n error: this.config.includeStack ? err.message : \"Internal Server Error\",\n status,\n };\n\n if (this.config.includeStack && err.stack) {\n response.stack = err.stack;\n }\n\n const requestId = c.get(\"requestId\");\n if (requestId) {\n response.requestId = requestId;\n }\n\n return c.json(response, status);\n }\n\n private getStatusText(status: number): string {\n const statusTexts: Record<number, string> = {\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 500: \"Internal Server Error\",\n };\n return statusTexts[status] || \"Error\";\n }\n}\n\nexport function createHttpError(status: number, message: string): HTTPException {\n // @ts-expect-error - status is a number, HTTPException expects a ContentfulStatusCode\n return new HTTPException(status, { message });\n}\n","import { IskraError, ErrorCodes, type ErrorCode } from '@iskra-bun/core';\nimport { HTTPException } from 'hono/http-exception';\n\n// ─── HTTP Errors ─────────────────────────────────────────────────────────────\n\nexport class HttpError extends IskraError {\n public readonly status: number;\n\n constructor(status: number, message: string, options?: { code?: ErrorCode; cause?: Error; context?: Record<string, unknown> }) {\n super(message, { code: options?.code ?? ErrorCodes.INTERNAL_ERROR, cause: options?.cause, context: options?.context });\n this.name = 'HttpError';\n this.status = status;\n }\n\n toHTTPException(): HTTPException {\n return new HTTPException(this.status as any, { message: this.message, cause: this });\n }\n}\n\n// ─── Validation Error ────────────────────────────────────────────────────────\n\nexport class ValidationError extends HttpError {\n public readonly details: unknown;\n\n constructor(message: string, details?: unknown, options?: { cause?: Error; context?: Record<string, unknown> }) {\n super(400, message, { code: ErrorCodes.VALIDATION_ERROR, ...options });\n this.name = 'ValidationError';\n this.details = details;\n }\n}\n\n// ─── Auth Error ──────────────────────────────────────────────────────────────\n\nexport class AuthError extends HttpError {\n constructor(message: string = 'Unauthorized', options?: { cause?: Error; context?: Record<string, unknown> }) {\n super(401, message, { code: ErrorCodes.UNAUTHORIZED, ...options });\n this.name = 'AuthError';\n }\n}\n\n// ─── Forbidden Error ─────────────────────────────────────────────────────────\n\nexport class ForbiddenError extends HttpError {\n constructor(message: string = 'Forbidden', options?: { cause?: Error; context?: Record<string, unknown> }) {\n super(403, message, { code: ErrorCodes.FORBIDDEN, ...options });\n this.name = 'ForbiddenError';\n }\n}\n\n// ─── Not Found Error ─────────────────────────────────────────────────────────\n\nexport class NotFoundError extends HttpError {\n constructor(message: string = 'Not Found', options?: { cause?: Error; context?: Record<string, unknown> }) {\n super(404, message, { code: ErrorCodes.NOT_FOUND, ...options });\n this.name = 'NotFoundError';\n }\n}\n\n// ─── Conflict Error ──────────────────────────────────────────────────────────\n\nexport class ConflictError extends HttpError {\n constructor(message: string = 'Conflict', options?: { cause?: Error; context?: Record<string, unknown> }) {\n super(409, message, { code: ErrorCodes.CONFLICT, ...options });\n this.name = 'ConflictError';\n }\n}\n","import type { Feature, HealthCheckConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context } from \"hono\";\n\nexport class HealthCheckFeature implements Feature {\n name = \"health\";\n\n private kernel?: Kernel;\n private config: Required<Omit<HealthCheckConfig, \"checks\">> & { checks?: HealthCheckConfig[\"checks\"] };\n\n constructor(config: HealthCheckConfig = {}) {\n this.config = {\n path: config.path || \"/health\",\n readinessPath: config.readinessPath || \"/health/ready\",\n livenessPath: config.livenessPath || \"/health/live\",\n includeDetails: config.includeDetails !== undefined ? config.includeDetails : true,\n checks: config.checks,\n };\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n this.kernel = kernel;\n const app = kernel.getApp();\n\n app.get(this.config.path, async (c: Context) => await this.handleHealthCheck(c));\n app.get(this.config.readinessPath, async (c: Context) => await this.handleReadinessCheck(c));\n app.get(this.config.livenessPath, async (c: Context) => await this.handleLivenessCheck(c));\n\n console.log(\"βœ… Health check feature initialized\");\n }\n\n private async handleHealthCheck(c: Context) {\n const response: any = {\n status: \"ok\",\n timestamp: new Date().toISOString(),\n };\n\n if (this.config.includeDetails && this.kernel) {\n // @ts-expect-error - features is a private kernel field accessed for diagnostics\n response.features = Array.from(this.kernel.features.keys());\n const featureHealth: any = {};\n\n const dbFeature = this.kernel.getFeature(\"db\");\n if (dbFeature) await this.checkFeatureHealth(c, dbFeature, featureHealth, \"db\", \"query\", \"SELECT 1\");\n\n const cacheFeature = this.kernel.getFeature(\"cache\");\n if (cacheFeature) await this.checkFeatureHealth(c, cacheFeature, featureHealth, \"cache\", \"exists\", \"__health_check__\");\n\n if (Object.keys(featureHealth).length > 0) {\n response.checks = featureHealth;\n }\n\n if (this.config.checks) {\n const customChecks: any = {};\n for (const [name, check] of Object.entries(this.config.checks)) {\n try {\n customChecks[name] = await check(c);\n } catch (error) {\n customChecks[name] = { status: \"error\", error: String(error) };\n }\n }\n response.customChecks = customChecks;\n }\n }\n\n return c.json(response);\n }\n\n private async checkFeatureHealth(c: Context, feature: any, report: any, key: string, method: string, ...args: any[]) {\n try {\n // Abstracted check logic\n const instance = c.get(key as any);\n if (instance && typeof instance[method] === \"function\") {\n await instance[method](...args);\n report[key] = { status: \"ok\" };\n }\n } catch (e) {\n report[key] = { status: \"error\", error: String(e) };\n }\n }\n\n private async handleReadinessCheck(c: Context) {\n // Simplified readiness check\n return c.json({ status: \"ready\" });\n }\n\n private async handleLivenessCheck(c: Context) {\n return c.json({\n status: \"alive\",\n timestamp: new Date().toISOString(),\n uptime: process.uptime()\n });\n }\n}\n","import type { Feature, LoggerConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n logger: any;\n }\n}\n\n// Simple Logger implementation to avoid heavy dependency unless necessary\nclass SimpleLogger {\n constructor(private config: LoggerConfig) { }\n\n info(message: string, ...args: any[]) {\n if (this.shouldLog(\"info\")) console.log(`[INFO] ${message}`, ...args);\n }\n error(message: string, ...args: any[]) {\n if (this.shouldLog(\"error\")) console.error(`[ERROR] ${message}`, ...args);\n }\n warn(message: string, ...args: any[]) {\n if (this.shouldLog(\"warn\")) console.warn(`[WARN] ${message}`, ...args);\n }\n debug(message: string, ...args: any[]) {\n if (this.shouldLog(\"debug\")) console.debug(`[DEBUG] ${message}`, ...args);\n }\n\n private shouldLog(level: string) {\n // Basic level check (can be improved)\n return true;\n }\n}\n\nexport class LoggerFeature implements Feature {\n name = \"logger\";\n\n private config: LoggerConfig;\n private logger: SimpleLogger;\n\n constructor(config: LoggerConfig = {}) {\n this.config = config;\n this.logger = new SimpleLogger(config);\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n\n app.use(\"*\", async (c: Context, next: Next) => {\n c.set(\"logger\", this.logger);\n await next();\n });\n\n if (this.config.logRequests) {\n app.use(\"*\", async (c: Context, next: Next) => {\n const start = Date.now();\n const requestId = c.get(\"requestId\");\n this.logger.info(`Incoming request ${c.req.method} ${c.req.path}`, { requestId });\n\n await next();\n\n const duration = Date.now() - start;\n if (this.config.logResponses) {\n this.logger.info(`Request completed ${c.res.status} ${duration}ms`, { requestId });\n }\n });\n }\n\n console.log(\"βœ… Logger feature initialized\");\n }\n}\n","import type { Feature, RequestIdConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\n\n// Extend Hono's context with requestId\ndeclare module \"hono\" {\n interface ContextVariableMap {\n requestId: string;\n }\n}\n\nexport class RequestIdFeature implements Feature {\n name = \"request-id\";\n\n private config: Required<RequestIdConfig>;\n\n constructor(config: RequestIdConfig = {}) {\n this.config = {\n headerName: config.headerName || \"X-Request-ID\",\n generator: config.generator || this.defaultGenerator,\n };\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n\n app.use(\"*\", async (c: Context, next: Next) => {\n let requestId = c.req.header(this.config.headerName);\n\n if (!requestId) {\n requestId = this.config.generator();\n }\n\n c.set(\"requestId\", requestId);\n await next();\n c.res.headers.set(this.config.headerName, requestId);\n });\n\n console.log(\"βœ… Request ID feature initialized\");\n }\n\n private defaultGenerator(): string {\n return crypto.randomUUID();\n }\n}\n","import { BaseStorageAdapter, type PutOptions, type StorageConfig, type StorageFile } from \"../base\";\nimport path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\n\nexport class LocalStorageAdapter extends BaseStorageAdapter {\n private basePath: string;\n\n constructor(config: StorageConfig) {\n super();\n this.basePath = config.basePath || \"./storage\";\n }\n\n async connect(): Promise<void> {\n await fs.mkdir(this.basePath, { recursive: true });\n this.connected = true;\n console.log(`βœ… Local storage connected at: ${this.basePath}`);\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n }\n\n async put(filePath: string, data: Uint8Array | Buffer, options?: PutOptions): Promise<StorageFile> {\n this.ensureConnected();\n\n const sanitizedPath = this.sanitizePath(filePath);\n const fullPath = path.join(this.basePath, sanitizedPath);\n\n await fs.mkdir(path.dirname(fullPath), { recursive: true });\n await fs.writeFile(fullPath, data);\n\n const stat = await fs.stat(fullPath);\n\n return {\n name: path.basename(sanitizedPath),\n path: sanitizedPath,\n size: stat.size,\n mimeType: options?.contentType || this.getMimeType(sanitizedPath),\n lastModified: stat.mtime,\n url: await this.url(sanitizedPath),\n };\n }\n\n async get(filePath: string): Promise<Uint8Array | null> {\n this.ensureConnected();\n const sanitizedPath = this.sanitizePath(filePath);\n const fullPath = path.join(this.basePath, sanitizedPath);\n\n try {\n return await fs.readFile(fullPath);\n } catch (error: any) {\n if (error.code === 'ENOENT') return null;\n throw error;\n }\n }\n\n async delete(filePath: string): Promise<void> {\n this.ensureConnected();\n const sanitizedPath = this.sanitizePath(filePath);\n const fullPath = path.join(this.basePath, sanitizedPath);\n\n try {\n await fs.unlink(fullPath);\n } catch (error: any) {\n if (error.code !== 'ENOENT') throw error;\n }\n }\n\n async exists(filePath: string): Promise<boolean> {\n this.ensureConnected();\n const sanitizedPath = this.sanitizePath(filePath);\n const fullPath = path.join(this.basePath, sanitizedPath);\n try {\n await fs.access(fullPath);\n return true;\n } catch {\n return false;\n }\n }\n\n async isDirectory(filePath: string): Promise<boolean> {\n this.ensureConnected();\n const sanitizedPath = this.sanitizePath(filePath);\n const fullPath = path.join(this.basePath, sanitizedPath);\n try {\n const stat = await fs.stat(fullPath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n }\n\n async list(prefix?: string): Promise<StorageFile[]> {\n this.ensureConnected();\n const searchPath = prefix ? path.join(this.basePath, this.sanitizePath(prefix)) : this.basePath;\n const files: StorageFile[] = [];\n\n // Simple recursive walk\n const walk = async (dir: string) => {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath);\n } else {\n const relativePath = path.relative(this.basePath, fullPath);\n const stat = await fs.stat(fullPath);\n files.push({\n name: entry.name,\n path: this.sanitizePath(relativePath),\n size: stat.size,\n mimeType: this.getMimeType(entry.name),\n lastModified: stat.mtime,\n url: await this.url(this.sanitizePath(relativePath))\n });\n }\n }\n } catch (e: any) {\n if (e.code !== 'ENOENT') throw e;\n }\n };\n\n await walk(searchPath);\n return files;\n }\n\n async url(filePath: string, _expiresIn?: number): Promise<string> {\n const sanitizedPath = this.sanitizePath(filePath);\n return `/storage/${sanitizedPath}`;\n }\n}\n","import type { Feature } from \"../../types\";\nimport type { Kernel } from \"../../kernel\";\nimport type { StorageConfig } from \"./base\";\nimport { BaseStorageAdapter } from \"./base\";\nimport type { Context, Next } from \"hono\";\nimport { LocalStorageAdapter } from \"./adapters/local\";\n\nexport { BaseStorageAdapter, LocalStorageAdapter };\nexport type { StorageConfig, StorageFile } from \"./base\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n storage: BaseStorageAdapter;\n }\n}\n\nexport class StorageFeature implements Feature {\n name = \"storage\";\n private adapter?: BaseStorageAdapter;\n\n constructor(private config: StorageConfig) { }\n\n async initialize(kernel: Kernel): Promise<void> {\n if (this.config.adapter === \"local\") {\n this.adapter = new LocalStorageAdapter(this.config);\n } else if (this.config.adapter === \"s3\" || this.config.adapter === \"minio\") {\n const { S3StorageAdapter } = await import(\"./adapters/s3\");\n this.adapter = new S3StorageAdapter(this.config);\n } else {\n throw new Error(`Adapter ${this.config.adapter} not supported.`);\n }\n\n await this.adapter.connect();\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n c.set(\"storage\", this.adapter!);\n await next();\n });\n\n console.log(`βœ… StorageFeature initialized - ${this.config.adapter}`);\n }\n\n async shutdown(): Promise<void> {\n if (this.adapter) {\n await this.adapter.disconnect();\n }\n }\n\n getAdapter(): BaseStorageAdapter | undefined {\n return this.adapter;\n }\n}\n","import type { Feature, DbConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { drizzle } from 'drizzle-orm/postgres-js';\nimport { drizzle as drizzleMysql } from 'drizzle-orm/mysql2';\nimport { drizzle as drizzleBunSqlite } from 'drizzle-orm/bun-sqlite';\nimport postgres from 'postgres';\nimport mysql from 'mysql2/promise';\nimport { Database } from 'bun:sqlite';\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n db: any;\n }\n}\n\nexport class DbFeature implements Feature {\n name = \"db\";\n private client: any;\n public db: any;\n public readonly adapter: string;\n\n constructor(private config: DbConfig) {\n this.adapter = config.adapter;\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const config = this.config;\n console.log(`βš™οΈ Initializing DB driver: ${config.adapter}`);\n\n try {\n switch (config.adapter) {\n case 'postgres': {\n if (!config.connection) throw new Error(\"Missing connection info\");\n const pgConfig = config.connection.connectionString ? config.connection.connectionString : {\n host: config.connection.host || 'localhost',\n port: config.connection.port || 5432,\n database: config.connection.database!,\n user: config.connection.user!,\n password: config.connection.password!\n };\n this.client = postgres(pgConfig as any);\n this.db = drizzle(this.client);\n break;\n }\n case 'mysql': {\n if (!config.connection) throw new Error(\"Missing connection info\");\n const mysqlConfig = config.connection.connectionString ? config.connection.connectionString : {\n host: config.connection.host || 'localhost',\n port: config.connection.port || 3306,\n database: config.connection.database!,\n user: config.connection.user!,\n password: config.connection.password!\n };\n this.client = await mysql.createConnection(mysqlConfig as any);\n this.db = drizzleMysql(this.client);\n break;\n }\n case 'sqlite': {\n const url = config.connection?.database || ':memory:';\n this.client = new Database(url);\n this.db = drizzleBunSqlite(this.client);\n break;\n }\n default:\n throw new Error(`Unsupported DB adapter: ${config.adapter}`);\n }\n console.log('βœ… DB connected successfully.');\n } catch (error) {\n console.error('❌ Failed to connect to DB', error);\n throw error;\n }\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n c.set(\"db\", this.db);\n await next();\n });\n }\n\n async shutdown(): Promise<void> {\n if (this.client) {\n if (this.client.end) {\n await this.client.end();\n } else if (this.client.close) {\n this.client.close();\n }\n }\n }\n}\n","import type { Feature, CacheConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport Redis from \"ioredis\";\n\n// Standard Cache Interface\nexport interface CacheAdapter {\n get(key: string): Promise<any>;\n set(key: string, value: any, ttl?: number): Promise<void>;\n delete(key: string): Promise<void>;\n exists(key: string): Promise<boolean>;\n increment?(key: string): Promise<number>;\n disconnect?(): Promise<void>;\n}\n\n// Simple Memory Adapter\nclass MemoryAdapter implements CacheAdapter {\n private store = new Map<string, { value: any, expires: number | null }>();\n\n async get(key: string) {\n const item = this.store.get(key);\n if (!item) return null;\n if (item.expires && item.expires < Date.now()) {\n this.store.delete(key);\n return null;\n }\n return item.value;\n }\n\n async set(key: string, value: any, ttl?: number) {\n const expires = ttl ? Date.now() + ttl * 1000 : null;\n this.store.set(key, { value, expires });\n }\n\n async delete(key: string) {\n this.store.delete(key);\n }\n\n async exists(key: string) {\n return this.store.has(key);\n }\n\n async increment(key: string): Promise<number> {\n const item = this.store.get(key);\n if (!item || (item.expires && item.expires < Date.now())) {\n return 0;\n }\n const newVal = Number(item.value) + 1;\n item.value = newVal;\n return newVal;\n }\n}\n\n// Redis Adapter\nclass RedisAdapter implements CacheAdapter {\n private client: Redis;\n\n constructor(options: any) {\n this.client = new Redis(options);\n }\n\n async get(key: string) {\n const value = await this.client.get(key);\n try {\n return value ? JSON.parse(value) : null;\n } catch {\n return value;\n }\n }\n\n async set(key: string, value: any, ttl?: number) {\n const stringValue = typeof value === 'string' ? value : JSON.stringify(value);\n if (ttl) {\n await this.client.set(key, stringValue, 'EX', ttl);\n } else {\n await this.client.set(key, stringValue);\n }\n }\n\n async delete(key: string) {\n await this.client.del(key);\n }\n\n async exists(key: string) {\n const result = await this.client.exists(key);\n return result === 1;\n }\n\n async increment(key: string): Promise<number> {\n return await this.client.incr(key);\n }\n\n async disconnect() {\n await this.client.quit();\n }\n}\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n cache: CacheAdapter;\n }\n}\n\nexport class CacheFeature implements Feature {\n name = \"cache\";\n public client!: CacheAdapter;\n\n constructor(private config: CacheConfig = { adapter: \"memory\" }) { }\n\n async initialize(kernel: Kernel): Promise<void> {\n console.log(`βš™οΈ Initializing Cache: ${this.config.adapter}`);\n\n if (this.config.adapter === \"redis\") {\n const conn = this.config.connection || {};\n try {\n this.client = new RedisAdapter({\n host: conn.host || \"localhost\",\n port: conn.port || 6379,\n password: conn.password,\n db: conn.db || 0\n });\n } catch (err) {\n console.warn(\"⚠️ Redis connection failed, falling back to memory cache\");\n this.client = new MemoryAdapter();\n }\n } else {\n this.client = new MemoryAdapter();\n }\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n c.set(\"cache\", this.client);\n await next();\n });\n\n console.log('βœ… Cache initialized.');\n }\n\n async shutdown(): Promise<void> {\n if (this.client.disconnect) {\n await this.client.disconnect();\n }\n }\n}\n","import type { Feature, SessionConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { getCookie, setCookie, deleteCookie } from \"hono/cookie\";\nimport { createHmac } from \"crypto\";\nimport { sql, eq } from \"drizzle-orm\";\nimport { pgTable, text as pgText, bigint as pgBigint } from \"drizzle-orm/pg-core\";\nimport { mysqlTable, varchar as myVarchar, text as myText, bigint as myBigint } from \"drizzle-orm/mysql-core\";\nimport { sqliteTable, text as sqliteText, integer as sqliteInteger } from \"drizzle-orm/sqlite-core\";\n\n// ─── Session Store Interface ─────────────────────────────────────────────────\n\ninterface SessionStore {\n get(id: string): Promise<Record<string, any> | null>;\n set(id: string, data: Record<string, any>, ttl: number): Promise<void>;\n destroy(id: string): Promise<void>;\n}\n\n// ─── Memory Store ────────────────────────────────────────────────────────────\n\nclass MemorySessionStore implements SessionStore {\n private store = new Map<string, { data: Record<string, any>; expiresAt: number }>();\n private cleanupInterval: ReturnType<typeof setInterval>;\n\n constructor() {\n this.cleanupInterval = setInterval(() => this.cleanup(), 300_000);\n }\n\n async get(id: string) {\n const entry = this.store.get(id);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(id);\n return null;\n }\n return entry.data;\n }\n\n async set(id: string, data: Record<string, any>, ttl: number) {\n this.store.set(id, { data, expiresAt: Date.now() + ttl * 1000 });\n }\n\n async destroy(id: string) {\n this.store.delete(id);\n }\n\n private cleanup() {\n const now = Date.now();\n for (const [key, entry] of this.store.entries()) {\n if (now > entry.expiresAt) this.store.delete(key);\n }\n }\n\n dispose() {\n clearInterval(this.cleanupInterval);\n }\n}\n\n// ─── Cache Store ─────────────────────────────────────────────────────────────\n\nclass CacheSessionStore implements SessionStore {\n constructor(private cache: any) { }\n\n async get(id: string) {\n const data = await this.cache.get(`session:${id}`);\n return data || null;\n }\n\n async set(id: string, data: Record<string, any>, ttl: number) {\n await this.cache.set(`session:${id}`, data, ttl);\n }\n\n async destroy(id: string) {\n await this.cache.delete(`session:${id}`);\n }\n}\n\n// ─── DB Store ────────────────────────────────────────────────────────────────\n\ntype SessionDialect = \"postgres\" | \"mysql\" | \"sqlite\";\n\n// One table definition per dialect (column types differ). The Drizzle query\n// builder parameterizes every value, so user data in a session can never break\n// out of a SQL string.\nconst sessionTables = {\n postgres: pgTable(\"sessions\", {\n id: pgText(\"id\").primaryKey(),\n data: pgText(\"data\").notNull(),\n expiresAt: pgBigint(\"expires_at\", { mode: \"number\" }).notNull(),\n }),\n mysql: mysqlTable(\"sessions\", {\n id: myVarchar(\"id\", { length: 255 }).primaryKey(),\n data: myText(\"data\").notNull(),\n expiresAt: myBigint(\"expires_at\", { mode: \"number\" }).notNull(),\n }),\n sqlite: sqliteTable(\"sessions\", {\n id: sqliteText(\"id\").primaryKey(),\n data: sqliteText(\"data\").notNull(),\n expiresAt: sqliteInteger(\"expires_at\").notNull(),\n }),\n} as const;\n\nconst createTableDdl: Record<SessionDialect, string> = {\n postgres: \"CREATE TABLE IF NOT EXISTS sessions (id TEXT PRIMARY KEY, data TEXT NOT NULL, expires_at BIGINT NOT NULL)\",\n mysql: \"CREATE TABLE IF NOT EXISTS sessions (id VARCHAR(255) PRIMARY KEY, data TEXT NOT NULL, expires_at BIGINT NOT NULL)\",\n sqlite: \"CREATE TABLE IF NOT EXISTS sessions (id TEXT PRIMARY KEY, data TEXT NOT NULL, expires_at INTEGER NOT NULL)\",\n};\n\nclass DbSessionStore implements SessionStore {\n private initialized = false;\n private dialect: SessionDialect;\n private table: (typeof sessionTables)[SessionDialect];\n\n constructor(private db: any, dialect: SessionDialect = \"sqlite\") {\n this.dialect = sessionTables[dialect] ? dialect : \"sqlite\";\n this.table = sessionTables[this.dialect];\n }\n\n private async ensureTable() {\n if (this.initialized) return;\n try {\n const ddl = sql.raw(createTableDdl[this.dialect]);\n // sqlite drivers expose run(); postgres/mysql expose execute().\n if (this.dialect === \"sqlite\") {\n await this.db.run(ddl);\n } else {\n await this.db.execute(ddl);\n }\n } catch (err) {\n console.error(\"[session] Failed to ensure sessions table:\", err);\n }\n this.initialized = true;\n }\n\n async get(id: string) {\n await this.ensureTable();\n try {\n const rows = await this.db\n .select()\n .from(this.table)\n .where(eq(this.table.id, id))\n .limit(1);\n\n const row = rows?.[0];\n if (!row) return null;\n\n if (Date.now() > Number(row.expiresAt)) {\n await this.destroy(id);\n return null;\n }\n return JSON.parse(row.data);\n } catch (err) {\n console.error(\"[session] Failed to read session:\", err);\n return null;\n }\n }\n\n async set(id: string, data: Record<string, any>, ttl: number) {\n await this.ensureTable();\n const row = { id, data: JSON.stringify(data), expiresAt: Date.now() + ttl * 1000 };\n\n try {\n // Portable upsert: delete-then-insert works identically across all\n // three dialects without per-dialect ON CONFLICT / ON DUPLICATE syntax.\n await this.db.delete(this.table).where(eq(this.table.id, id));\n await this.db.insert(this.table).values(row);\n } catch (err) {\n console.error(\"[session] Failed to write session:\", err);\n }\n }\n\n async destroy(id: string) {\n try {\n await this.db.delete(this.table).where(eq(this.table.id, id));\n } catch (err) {\n console.error(\"[session] Failed to destroy session:\", err);\n }\n }\n}\n\n// ─── Cookie Signing ──────────────────────────────────────────────────────────\n\nfunction signValue(value: string, secret: string): string {\n const signature = createHmac(\"sha256\", secret).update(value).digest(\"base64url\");\n return `${value}.${signature}`;\n}\n\nfunction verifySignedValue(signed: string, secret: string): string | null {\n const lastDot = signed.lastIndexOf(\".\");\n if (lastDot === -1) return null;\n\n const value = signed.substring(0, lastDot);\n const signature = signed.substring(lastDot + 1);\n const expected = createHmac(\"sha256\", secret).update(value).digest(\"base64url\");\n\n if (signature !== expected) return null;\n return value;\n}\n\n// ─── Session Feature ─────────────────────────────────────────────────────────\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n session: Record<string, any>;\n sessionId: string;\n destroySession: () => Promise<void>;\n }\n}\n\nexport class SessionFeature implements Feature {\n name = \"session\";\n dependencies?: string[];\n\n private store?: SessionStore;\n private ttl: number;\n private cookieName: string;\n\n constructor(private config: SessionConfig) {\n this.ttl = config.ttl || 86400; // 24 hours default\n this.cookieName = config.cookieName || \"sid\";\n\n // Set dependencies based on store type\n if (config.store === \"cache\") {\n this.dependencies = [\"cache\"];\n } else if (config.store === \"db\") {\n this.dependencies = [\"db\"];\n }\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n console.log(`βš™οΈ Initializing Session: store=${this.config.store}`);\n\n switch (this.config.store) {\n case \"memory\":\n this.store = new MemorySessionStore();\n break;\n case \"cache\": {\n const cacheFeature = kernel.getFeature(\"cache\") as any;\n if (!cacheFeature?.client) {\n console.warn(\"⚠️ Cache feature not available, falling back to memory session store\");\n this.store = new MemorySessionStore();\n } else {\n this.store = new CacheSessionStore(cacheFeature.client);\n }\n break;\n }\n case \"db\": {\n const dbFeature = kernel.getFeature(\"db\") as any;\n if (!dbFeature?.db) {\n console.warn(\"⚠️ DB feature not available, falling back to memory session store\");\n this.store = new MemorySessionStore();\n } else {\n this.store = new DbSessionStore(dbFeature.db, dbFeature.adapter);\n }\n break;\n }\n }\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n const signedCookie = getCookie(c, this.cookieName);\n let sessionId: string | null = null;\n let session: Record<string, any> = {};\n\n if (signedCookie) {\n sessionId = verifySignedValue(signedCookie, this.config.secret);\n if (sessionId) {\n const data = await this.store!.get(sessionId);\n if (data) {\n session = data;\n } else {\n sessionId = null; // Session expired or not found\n }\n }\n }\n\n if (!sessionId) {\n sessionId = crypto.randomUUID();\n }\n\n let destroyed = false;\n\n c.set(\"session\", session);\n c.set(\"sessionId\", sessionId);\n c.set(\"destroySession\", async () => {\n destroyed = true;\n await this.store!.destroy(sessionId!);\n deleteCookie(c, this.cookieName);\n });\n\n await next();\n\n // A destroyed session must not be re-persisted (otherwise the save\n // block below would immediately recreate it and override deleteCookie).\n if (destroyed) return;\n\n // Save session after response\n const currentSession = c.get(\"session\");\n if (currentSession && Object.keys(currentSession).length > 0) {\n await this.store!.set(sessionId, currentSession, this.ttl);\n const signed = signValue(sessionId, this.config.secret);\n const opts = this.config.cookieOptions || {};\n setCookie(c, this.cookieName, signed, {\n httpOnly: true,\n sameSite: opts.sameSite || \"Lax\",\n secure: opts.secure ?? false,\n domain: opts.domain,\n path: opts.path || \"/\",\n maxAge: this.ttl,\n });\n }\n });\n\n console.log(\"βœ… Session initialized\");\n }\n\n async shutdown(): Promise<void> {\n if (this.store instanceof MemorySessionStore) {\n (this.store as any).dispose?.();\n }\n }\n}\n","import type { AuthConfig, Feature, Kernel } from \"../../types\";\nimport type { Context, Hono, Next } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { type Auth, createBetterAuth } from \"./better-auth-config\";\nimport { z } from \"@hono/zod-openapi\";\nimport type { DbFeature } from \"../db\";\nimport type { OpenAPIFeature } from \"../openapi\";\nimport type { User } from \"./types\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n user: User | null;\n authUser: User | null;\n }\n}\n\n// ─── OpenAPI Schemas ─────────────────────────────────────────────────────────\n\nconst SignInSchema = z.object({\n email: z.string().email(),\n password: z.string().min(1),\n});\n\nconst SignUpSchema = z.object({\n email: z.string().email(),\n password: z.string().min(8),\n name: z.string().optional(),\n});\n\nconst AuthSuccessSchema = z.object({\n token: z.string().optional(),\n user: z.object({\n id: z.string(),\n email: z.string(),\n name: z.string().optional(),\n }).optional(),\n session: z.any().optional(),\n});\n\nconst SessionResponseSchema = z.object({\n session: z.any().nullable(),\n user: z.any().nullable(),\n});\n\n// ─── Auth Feature ────────────────────────────────────────────────────────────\n\nexport class AuthFeature implements Feature {\n name = \"auth\";\n dependencies = [\"db\"];\n\n private auth: Auth | undefined;\n private config: Required<Pick<AuthConfig, \"secret\" | \"basePath\">> & AuthConfig;\n private kernel?: Kernel;\n private authMode: \"oidc\" | \"email\";\n\n constructor(config: AuthConfig) {\n this.config = {\n ...config,\n basePath: config.basePath || \"/api/sso\",\n baseURL: config.baseURL || \"http://localhost:3000\",\n };\n\n if (config.authMode === \"oidc\" || config.authMode === \"email\") {\n this.authMode = config.authMode;\n } else {\n this.authMode = config.oidcConfig ? \"oidc\" : \"email\";\n }\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n this.kernel = kernel;\n const dbFeature = kernel.getFeature(\"db\") as unknown as DbFeature;\n if (!dbFeature) {\n throw new Error(\"AuthFeature requires DbFeature\");\n }\n\n const db = dbFeature.db;\n const adapterType = dbFeature.adapter as \"postgres\" | \"mysql\" | \"sqlite\";\n\n if (!adapterType) {\n throw new Error(\"DbFeature must expose 'adapter' type (postgres, mysql, sqlite)\");\n }\n\n this.auth = createBetterAuth({\n db,\n adapterType,\n secret: this.config.secret,\n baseURL: this.config.baseURL,\n basePath: this.config.basePath,\n trustedOrigins: this.config.trustedOrigins,\n enableEmailPassword: true,\n disableCSRFCheck: this.config.disableCSRFCheck,\n socialProviders: this.config.socialProviders,\n oidcConfig: this.config.oidcConfig,\n });\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n try {\n const session = await this.auth!.api.getSession({\n headers: c.req.raw.headers,\n });\n\n if (session && session.user) {\n c.set(\"user\", session.user);\n c.set(\"authUser\", session.user);\n }\n } catch (error) {\n // Ignore session errors (just not logged in)\n }\n await next();\n });\n\n console.log(\"βœ… Auth feature initialized (better-auth)\");\n }\n\n routes(app: Hono): void {\n if (!this.auth) {\n throw new Error(\"Auth not initialized\");\n }\n\n const base = this.config.basePath!;\n const openapi = this.kernel?.getFeature(\"openapi\") as OpenAPIFeature | undefined;\n\n // Register explicit OpenAPI-documented routes\n if (openapi) {\n openapi.addRoute(\n {\n method: \"post\",\n path: `${base}/sign-in/email`,\n tags: [\"Auth\"],\n summary: \"Sign in with email and password\",\n request: {\n body: {\n content: { \"application/json\": { schema: SignInSchema } },\n },\n },\n responses: {\n 200: {\n description: \"Sign in successful\",\n content: { \"application/json\": { schema: AuthSuccessSchema } },\n },\n 401: { description: \"Invalid credentials\" },\n },\n },\n (c: any) => this.auth!.handler(c.req.raw),\n );\n\n openapi.addRoute(\n {\n method: \"post\",\n path: `${base}/sign-up/email`,\n tags: [\"Auth\"],\n summary: \"Create a new account\",\n request: {\n body: {\n content: { \"application/json\": { schema: SignUpSchema } },\n },\n },\n responses: {\n 200: {\n description: \"Account created\",\n content: { \"application/json\": { schema: AuthSuccessSchema } },\n },\n 400: { description: \"Validation error\" },\n },\n },\n (c: any) => this.auth!.handler(c.req.raw),\n );\n\n openapi.addRoute(\n {\n method: \"post\",\n path: `${base}/sign-out`,\n tags: [\"Auth\"],\n summary: \"Sign out\",\n responses: {\n 200: { description: \"Signed out\" },\n },\n },\n (c: any) => this.auth!.handler(c.req.raw),\n );\n\n openapi.addRoute(\n {\n method: \"get\",\n path: `${base}/get-session`,\n tags: [\"Auth\"],\n summary: \"Get current session\",\n responses: {\n 200: {\n description: \"Current session\",\n content: { \"application/json\": { schema: SessionResponseSchema } },\n },\n },\n },\n (c: any) => this.auth!.handler(c.req.raw),\n );\n }\n\n // Catch-all for all other auth routes (OAuth callbacks, etc.)\n app.on([\"POST\", \"GET\"], `${base}/*`, (c) => {\n return this.auth!.handler(c.req.raw);\n });\n }\n\n getAuth(): Auth | undefined {\n return this.auth;\n }\n}\n\nexport function requireAuth(kernel: Kernel) {\n return async (c: Context, next: Next) => {\n const authFeature = kernel.getFeature(\"auth\") as AuthFeature;\n if (!authFeature) throw new HTTPException(500, { message: \"Auth not initialized\" });\n\n const auth = authFeature.getAuth();\n if (!auth) throw new HTTPException(500, { message: \"Auth not ready\" });\n\n const session = await auth.api.getSession({ headers: c.req.raw.headers });\n if (!session || !session.user) {\n throw new HTTPException(401, { message: \"Unauthorized\" });\n }\n\n c.set(\"user\", session.user);\n c.set(\"authUser\", session.user);\n await next();\n };\n}\n","import { betterAuth, type Auth as BetterAuthInstance } from \"better-auth\";\nimport { drizzleAdapter } from \"better-auth/adapters/drizzle\";\nimport { genericOAuth } from \"better-auth/plugins/generic-oauth\";\nimport { pgSchema, mysqlSchema, sqliteSchema } from \"./schema\";\n\nexport interface BetterAuthConfigOptions {\n db: any; // Drizzle instance\n adapterType: \"postgres\" | \"mysql\" | \"sqlite\";\n secret: string;\n baseURL?: string;\n basePath?: string;\n trustedOrigins?: string[];\n enableEmailPassword?: boolean;\n disableCSRFCheck?: boolean;\n // deno-lint-ignore no-explicit-any\n socialProviders?: Record<string, any>;\n oidcConfig?: {\n clientId: string;\n clientSecret: string;\n issuer: string;\n providerId?: string;\n authorizationEndpoint?: string;\n tokenEndpoint?: string;\n userinfoEndpoint?: string;\n jwksEndpoint?: string;\n discoveryEndpoint?: string;\n scopes?: string[];\n pkce?: boolean;\n mapping?: {\n id?: string;\n email?: string;\n emailVerified?: string;\n name?: string;\n image?: string;\n extraFields?: Record<string, string>;\n };\n };\n}\n\nexport function createBetterAuth(options: BetterAuthConfigOptions): BetterAuthInstance {\n const {\n db,\n adapterType,\n secret,\n baseURL = \"http://localhost:3000\",\n basePath = \"/api/auth\",\n trustedOrigins = [],\n enableEmailPassword = true,\n disableCSRFCheck = false,\n socialProviders,\n oidcConfig,\n } = options;\n\n const baseOrigin = new URL(baseURL).origin;\n const allTrustedOrigins = trustedOrigins.includes(baseOrigin)\n ? trustedOrigins\n : [baseOrigin, ...trustedOrigins];\n\n console.log(\"[BetterAuth Config] Creating Drizzle adapter...\");\n\n let schema;\n let provider: \"pg\" | \"mysql\" | \"sqlite\";\n\n switch (adapterType) {\n case \"postgres\":\n schema = pgSchema;\n provider = \"pg\";\n break;\n case \"mysql\":\n schema = mysqlSchema;\n provider = \"mysql\";\n break;\n case \"sqlite\":\n schema = sqliteSchema;\n provider = \"sqlite\";\n break;\n default:\n throw new Error(`Unsupported adapter type: ${adapterType}`);\n }\n\n const database = drizzleAdapter(db, {\n provider,\n schema\n });\n\n console.log(\"[BetterAuth Config] Initializing betterAuth with config:\", {\n baseURL,\n basePath,\n provider,\n enableEmailPassword\n });\n\n const plugins = [];\n if (oidcConfig) {\n const authorizationUrl = oidcConfig.authorizationEndpoint ||\n `${oidcConfig.issuer}/protocol/openid-connect/auth`;\n const tokenUrl = oidcConfig.tokenEndpoint ||\n `${oidcConfig.issuer}/protocol/openid-connect/token`;\n const userInfoUrl = oidcConfig.userinfoEndpoint ||\n `${oidcConfig.issuer}/protocol/openid-connect/userinfo`;\n\n plugins.push(\n genericOAuth({\n config: [\n {\n providerId: oidcConfig.providerId || \"oidc\",\n clientId: oidcConfig.clientId,\n clientSecret: oidcConfig.clientSecret,\n authorizationUrl,\n tokenUrl,\n userInfoUrl,\n discoveryUrl: oidcConfig.discoveryEndpoint ||\n `${oidcConfig.issuer}/.well-known/openid-configuration`,\n scopes: oidcConfig.scopes || [\"openid\", \"email\", \"profile\"],\n pkce: oidcConfig.pkce !== undefined ? oidcConfig.pkce : false,\n mapProfileToUser: (profile: any) => {\n return {\n id: profile.sub || profile.id,\n email: profile.email,\n name: profile.name || profile.preferred_username,\n image: profile.picture || profile.image,\n emailVerified: profile.email_verified || false,\n };\n },\n },\n ],\n }),\n );\n }\n\n return betterAuth({\n database,\n secret,\n baseURL,\n basePath,\n trustedOrigins: allTrustedOrigins,\n emailAndPassword: enableEmailPassword\n ? {\n enabled: true,\n autoSignIn: true,\n }\n : undefined,\n socialProviders: Object.keys(socialProviders || {}).length > 0 ? socialProviders : undefined,\n plugins,\n session: {\n expiresIn: 60 * 60 * 24 * 7,\n updateAge: 60 * 60 * 24,\n cookieCache: {\n enabled: true,\n maxAge: 5 * 60,\n },\n },\n advanced: {\n disableCSRFCheck,\n generateId: () => crypto.randomUUID().replace(/-/g, \"\"),\n },\n }) as unknown as BetterAuthInstance;\n}\n\nexport type Auth = ReturnType<typeof createBetterAuth>;\n","import { pgTable, text, timestamp, boolean } from \"drizzle-orm/pg-core\";\nimport { mysqlTable, varchar, timestamp as mysqlTimestamp, boolean as mysqlBoolean, text as mysqlText } from \"drizzle-orm/mysql-core\";\nimport { sqliteTable, text as sqliteText, integer } from \"drizzle-orm/sqlite-core\";\n\n// ==========================================\n// PostgreSQL Schema\n// ==========================================\n\nexport const pgUser = pgTable(\"user\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\"),\n email: text(\"email\").notNull().unique(),\n emailVerified: boolean(\"emailVerified\").notNull(),\n image: text(\"image\"),\n createdAt: timestamp(\"createdAt\").notNull(),\n updatedAt: timestamp(\"updatedAt\").notNull()\n});\n\nexport const pgSession = pgTable(\"session\", {\n id: text(\"id\").primaryKey(),\n expiresAt: timestamp(\"expiresAt\").notNull(),\n token: text(\"token\").notNull().unique(),\n createdAt: timestamp(\"createdAt\").notNull(),\n updatedAt: timestamp(\"updatedAt\").notNull(),\n ipAddress: text(\"ipAddress\"),\n userAgent: text(\"userAgent\"),\n userId: text(\"userId\").notNull().references(() => pgUser.id)\n});\n\nexport const pgAccount = pgTable(\"account\", {\n id: text(\"id\").primaryKey(),\n accountId: text(\"accountId\").notNull(),\n providerId: text(\"providerId\").notNull(),\n userId: text(\"userId\").notNull().references(() => pgUser.id),\n accessToken: text(\"accessToken\"),\n refreshToken: text(\"refreshToken\"),\n idToken: text(\"idToken\"),\n accessTokenExpiresAt: timestamp(\"accessTokenExpiresAt\"),\n refreshTokenExpiresAt: timestamp(\"refreshTokenExpiresAt\"),\n scope: text(\"scope\"),\n password: text(\"password\"),\n createdAt: timestamp(\"createdAt\").notNull(),\n updatedAt: timestamp(\"updatedAt\").notNull()\n});\n\nexport const pgVerification = pgTable(\"verification\", {\n id: text(\"id\").primaryKey(),\n identifier: text(\"identifier\").notNull(),\n value: text(\"value\").notNull(),\n expiresAt: timestamp(\"expiresAt\").notNull(),\n createdAt: timestamp(\"createdAt\"),\n updatedAt: timestamp(\"updatedAt\")\n});\n\nexport const pgSchema = {\n user: pgUser,\n session: pgSession,\n account: pgAccount,\n verification: pgVerification\n};\n\n// ==========================================\n// MySQL Schema\n// ==========================================\n\nexport const mysqlUser = mysqlTable(\"user\", {\n id: varchar(\"id\", { length: 36 }).primaryKey(),\n name: varchar(\"name\", { length: 255 }),\n email: varchar(\"email\", { length: 255 }).notNull().unique(),\n emailVerified: mysqlBoolean(\"emailVerified\").notNull(),\n image: varchar(\"image\", { length: 255 }),\n createdAt: mysqlTimestamp(\"createdAt\").notNull(),\n updatedAt: mysqlTimestamp(\"updatedAt\").notNull()\n});\n\nexport const mysqlSession = mysqlTable(\"session\", {\n id: varchar(\"id\", { length: 36 }).primaryKey(),\n expiresAt: mysqlTimestamp(\"expiresAt\").notNull(),\n token: varchar(\"token\", { length: 255 }).notNull().unique(),\n createdAt: mysqlTimestamp(\"createdAt\").notNull(),\n updatedAt: mysqlTimestamp(\"updatedAt\").notNull(),\n ipAddress: varchar(\"ipAddress\", { length: 45 }),\n userAgent: mysqlText(\"userAgent\"),\n userId: varchar(\"userId\", { length: 36 }).notNull().references(() => mysqlUser.id)\n});\n\nexport const mysqlAccount = mysqlTable(\"account\", {\n id: varchar(\"id\", { length: 36 }).primaryKey(),\n accountId: varchar(\"accountId\", { length: 255 }).notNull(),\n providerId: varchar(\"providerId\", { length: 255 }).notNull(),\n userId: varchar(\"userId\", { length: 36 }).notNull().references(() => mysqlUser.id),\n accessToken: mysqlText(\"accessToken\"),\n refreshToken: mysqlText(\"refreshToken\"),\n idToken: mysqlText(\"idToken\"),\n accessTokenExpiresAt: mysqlTimestamp(\"accessTokenExpiresAt\"),\n refreshTokenExpiresAt: mysqlTimestamp(\"refreshTokenExpiresAt\"),\n scope: mysqlText(\"scope\"),\n password: varchar(\"password\", { length: 255 }),\n createdAt: mysqlTimestamp(\"createdAt\").notNull(),\n updatedAt: mysqlTimestamp(\"updatedAt\").notNull()\n});\n\nexport const mysqlVerification = mysqlTable(\"verification\", {\n id: varchar(\"id\", { length: 36 }).primaryKey(),\n identifier: varchar(\"identifier\", { length: 255 }).notNull(),\n value: varchar(\"value\", { length: 255 }).notNull(),\n expiresAt: mysqlTimestamp(\"expiresAt\").notNull(),\n createdAt: mysqlTimestamp(\"createdAt\"),\n updatedAt: mysqlTimestamp(\"updatedAt\")\n});\n\nexport const mysqlSchema = {\n user: mysqlUser,\n session: mysqlSession,\n account: mysqlAccount,\n verification: mysqlVerification\n};\n\n// ==========================================\n// SQLite Schema\n// ==========================================\n\nexport const sqliteUser = sqliteTable(\"user\", {\n id: sqliteText(\"id\").primaryKey(),\n name: sqliteText(\"name\"),\n email: sqliteText(\"email\").notNull().unique(),\n emailVerified: integer(\"emailVerified\", { mode: \"boolean\" }).notNull(),\n image: sqliteText(\"image\"),\n createdAt: integer(\"createdAt\", { mode: \"timestamp\" }).notNull(),\n updatedAt: integer(\"updatedAt\", { mode: \"timestamp\" }).notNull()\n});\n\nexport const sqliteSession = sqliteTable(\"session\", {\n id: sqliteText(\"id\").primaryKey(),\n expiresAt: integer(\"expiresAt\", { mode: \"timestamp\" }).notNull(),\n token: sqliteText(\"token\").notNull().unique(),\n createdAt: integer(\"createdAt\", { mode: \"timestamp\" }).notNull(),\n updatedAt: integer(\"updatedAt\", { mode: \"timestamp\" }).notNull(),\n ipAddress: sqliteText(\"ipAddress\"),\n userAgent: sqliteText(\"userAgent\"),\n userId: sqliteText(\"userId\").notNull().references(() => sqliteUser.id)\n});\n\nexport const sqliteAccount = sqliteTable(\"account\", {\n id: sqliteText(\"id\").primaryKey(),\n accountId: sqliteText(\"accountId\").notNull(),\n providerId: sqliteText(\"providerId\").notNull(),\n userId: sqliteText(\"userId\").notNull().references(() => sqliteUser.id),\n accessToken: sqliteText(\"accessToken\"),\n refreshToken: sqliteText(\"refreshToken\"),\n idToken: sqliteText(\"idToken\"),\n accessTokenExpiresAt: integer(\"accessTokenExpiresAt\", { mode: \"timestamp\" }),\n refreshTokenExpiresAt: integer(\"refreshTokenExpiresAt\", { mode: \"timestamp\" }),\n scope: sqliteText(\"scope\"),\n password: sqliteText(\"password\"),\n createdAt: integer(\"createdAt\", { mode: \"timestamp\" }).notNull(),\n updatedAt: integer(\"updatedAt\", { mode: \"timestamp\" }).notNull()\n});\n\nexport const sqliteVerification = sqliteTable(\"verification\", {\n id: sqliteText(\"id\").primaryKey(),\n identifier: sqliteText(\"identifier\").notNull(),\n value: sqliteText(\"value\").notNull(),\n expiresAt: integer(\"expiresAt\", { mode: \"timestamp\" }).notNull(),\n createdAt: integer(\"createdAt\", { mode: \"timestamp\" }),\n updatedAt: integer(\"updatedAt\", { mode: \"timestamp\" })\n});\n\nexport const sqliteSchema = {\n user: sqliteUser,\n session: sqliteSession,\n account: sqliteAccount,\n verification: sqliteVerification\n};\n","import type { Feature, RateLimitConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\n\ninterface RateLimitStore {\n get(key: string): Promise<number | null>;\n set(key: string, value: number, ttl: number): Promise<void>;\n increment(key: string, ttl: number): Promise<number>;\n}\n\nclass MemoryStore implements RateLimitStore {\n private store = new Map<string, { count: number; expiresAt: number }>();\n\n async get(key: string): Promise<number | null> {\n const entry = this.store.get(key);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return null;\n }\n return entry.count;\n }\n\n async set(key: string, value: number, ttl: number): Promise<void> {\n this.store.set(key, { count: value, expiresAt: Date.now() + ttl });\n }\n\n async increment(key: string, ttl: number): Promise<number> {\n const entry = this.store.get(key);\n if (!entry || Date.now() > entry.expiresAt) {\n this.store.set(key, { count: 1, expiresAt: Date.now() + ttl });\n return 1;\n }\n entry.count++;\n return entry.count;\n }\n\n cleanup(): void {\n const now = Date.now();\n for (const [key, entry] of this.store.entries()) {\n if (now > entry.expiresAt) this.store.delete(key);\n }\n }\n}\n\nclass CacheStoreWrapper implements RateLimitStore {\n constructor(private cache: any) { }\n\n async get(key: string): Promise<number | null> {\n return await this.cache.get(key);\n }\n\n async set(key: string, value: number, ttl: number): Promise<void> {\n await this.cache.set(key, value, ttl / 1000); // Cache feature expects seconds typically if using Redis, but check implementation\n }\n\n async increment(key: string, ttl: number): Promise<number> {\n const ttlSeconds = Math.ceil(ttl / 1000);\n const current = await this.cache.get(key);\n if (current === null) {\n await this.cache.set(key, 1, ttlSeconds);\n return 1;\n }\n // Use atomic increment if available (Redis INCR)\n if (this.cache.increment) return await this.cache.increment(key);\n\n // Fallback: increment and re-set with TTL\n const newVal = Number(current) + 1;\n await this.cache.set(key, newVal, ttlSeconds);\n return newVal;\n }\n}\n\nexport class RateLimitFeature implements Feature {\n name = \"rate-limit\";\n private config: Required<Omit<RateLimitConfig, \"keyGenerator\" | \"skip\" | \"handler\">> & {\n keyGenerator?: RateLimitConfig[\"keyGenerator\"];\n skip?: RateLimitConfig[\"skip\"];\n handler?: RateLimitConfig[\"handler\"];\n };\n private store?: RateLimitStore;\n private cleanupInterval?: ReturnType<typeof setInterval>;\n\n constructor(config: RateLimitConfig = {}) {\n this.config = {\n windowMs: config.windowMs || 15 * 60 * 1000,\n max: config.max || 100,\n standardHeaders: config.standardHeaders ?? true,\n store: config.store || \"memory\",\n keyGenerator: config.keyGenerator,\n skip: config.skip,\n handler: config.handler\n };\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n if (this.config.store === \"cache\") {\n const cacheFeature = kernel.getFeature(\"cache\") as any;\n if (cacheFeature?.client) {\n this.store = new CacheStoreWrapper(cacheFeature.client);\n } else {\n console.warn(\"⚠️ Cache feature not available for rate-limit, falling back to memory store\");\n const mem = new MemoryStore();\n this.store = mem;\n this.cleanupInterval = setInterval(() => mem.cleanup(), 300000);\n }\n }\n\n if (this.config.store === \"memory\") {\n const mem = new MemoryStore();\n this.store = mem;\n this.cleanupInterval = setInterval(() => mem.cleanup(), 300000);\n }\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n await this.middleware(c, next);\n });\n console.log(\"βœ… Rate limit feature initialized\");\n }\n\n private async middleware(c: Context, next: Next) {\n if (this.config.skip && this.config.skip(c)) {\n await next();\n return;\n }\n\n let store = this.store;\n if (!store && this.config.store === \"cache\") {\n const cache = c.get(\"cache\");\n if (cache) {\n store = new CacheStoreWrapper(cache);\n } else {\n if (!this.store) {\n this.store = new MemoryStore(); // Fallback\n this.cleanupInterval = setInterval(() => (this.store as MemoryStore).cleanup(), 300000);\n }\n store = this.store;\n }\n }\n\n if (!store) {\n await next();\n return;\n }\n\n const key = this.config.keyGenerator ? this.config.keyGenerator(c) : this.defaultKeyGenerator(c);\n const rlKey = `rate_limit:${key}`;\n const count = await store.increment(rlKey, this.config.windowMs);\n\n if (count > this.config.max) {\n if (this.config.handler) return this.config.handler(c);\n throw new HTTPException(429, { message: \"Too many requests\" });\n }\n\n if (this.config.standardHeaders) {\n c.header(\"X-RateLimit-Limit\", String(this.config.max));\n c.header(\"X-RateLimit-Remaining\", String(Math.max(0, this.config.max - count)));\n c.header(\"X-RateLimit-Reset\", String(Math.ceil((Date.now() + this.config.windowMs) / 1000)));\n }\n\n await next();\n }\n\n private defaultKeyGenerator(c: Context): string {\n return c.req.header(\"x-forwarded-for\") || c.req.header(\"x-real-ip\") || \"unknown\";\n }\n\n async shutdown() {\n if (this.cleanupInterval) clearInterval(this.cleanupInterval);\n }\n}\n","import type { Feature, PermissionsConfig, Role } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n userPermissions: string[];\n checkPermission: (permission: string) => boolean;\n hasRole: (role: string) => boolean;\n hasAnyRole: (...roles: string[]) => boolean;\n hasAllRoles: (...roles: string[]) => boolean;\n }\n}\n\nconst DEFAULT_ROLES: Record<string, Role> = {\n admin: { name: \"admin\", permissions: [\"*\"], description: \"Full access\" },\n user: { name: \"user\", permissions: [\"read:own\", \"write:own\"], description: \"User access\" },\n guest: { name: \"guest\", permissions: [\"read:public\"], description: \"Guest access\" }\n};\n\nexport class PermissionsFeature implements Feature {\n name = \"permissions\";\n dependencies = [\"auth\"];\n private config: Required<PermissionsConfig>;\n private roles: Map<string, Role> = new Map();\n\n constructor(config: PermissionsConfig = {}) {\n this.config = {\n loadPermissions: config.loadPermissions || (async () => [\"read:own\"]),\n loadRoles: config.loadRoles || (async () => [\"user\"]),\n anonymousPermissions: config.anonymousPermissions || [\"read:public\"],\n enableRBAC: config.enableRBAC ?? true,\n cachePermissions: config.cachePermissions ?? true,\n cacheTTL: config.cacheTTL || 3600\n };\n Object.values(DEFAULT_ROLES).forEach(r => this.roles.set(r.name, r));\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n await this.permissionsMiddleware(c, next, kernel);\n });\n console.log(\"βœ… Permissions feature initialized\");\n }\n\n private async permissionsMiddleware(c: Context, next: Next, _kernel: Kernel) {\n const user = c.get(\"user\") || (c.get(\"session\") as any)?.user;\n const userId = user?.id;\n\n let permissions: string[] = [];\n let roles: string[] = [];\n\n if (userId) {\n if (this.config.cachePermissions) {\n const cache = c.get(\"cache\");\n if (cache) {\n const cached = await cache.get(`permissions:${userId}`);\n if (cached) {\n permissions = cached.permissions || [];\n roles = cached.roles || [];\n }\n }\n }\n\n if (permissions.length === 0) {\n permissions = await this.config.loadPermissions(userId);\n if (this.config.enableRBAC) {\n roles = await this.config.loadRoles(userId);\n for (const rName of roles) {\n const r = this.roles.get(rName);\n if (r) permissions.push(...r.permissions);\n }\n }\n\n if (this.config.cachePermissions) {\n const cache = c.get(\"cache\");\n if (cache) {\n // Assume cache set exists and supports object storage (json stringify maybe required depending on cache impl)\n // Simple cache might require string\n await cache.set(`permissions:${userId}`, { permissions, roles }, this.config.cacheTTL);\n }\n }\n }\n } else {\n permissions = this.config.anonymousPermissions;\n }\n\n permissions = [...new Set(permissions)];\n\n c.set(\"userPermissions\", permissions);\n c.set(\"checkPermission\", (p: string) => this.checkPermission(permissions, p));\n c.set(\"hasRole\", (r: string) => roles.includes(r));\n c.set(\"hasAnyRole\", (...rs: string[]) => rs.some(r => roles.includes(r)));\n c.set(\"hasAllRoles\", (...rs: string[]) => rs.every(r => roles.includes(r)));\n\n await next();\n }\n\n private checkPermission(userPerms: string[], required: string): boolean {\n if (userPerms.includes(\"*\")) return true;\n if (userPerms.includes(required)) return true;\n\n const parts = required.split(\":\");\n for (let i = parts.length - 1; i > 0; i--) {\n const pattern = parts.slice(0, i).join(\":\") + \":*\";\n if (userPerms.includes(pattern)) return true;\n }\n return false;\n }\n}\n\nexport function requirePermission(permission: string) {\n return async (c: Context, next: Next) => {\n const check = c.get(\"checkPermission\");\n if (!check || !check(permission)) throw new HTTPException(403, { message: `Missing permission: ${permission}` });\n await next();\n };\n}\n\nexport function requireRole(role: string) {\n return async (c: Context, next: Next) => {\n const check = c.get(\"hasRole\");\n if (!check || !check(role)) throw new HTTPException(403, { message: `Missing role: ${role}` });\n await next();\n };\n}\n","import type { Feature, ApiKeyConfig, ApiKeyMetadata, ApiKeyValidationResult } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\n\n// --- ApiKeyStore ---\n\nexport class ApiKeyStore {\n private staticKeysMap: Map<string, ApiKeyMetadata> = new Map();\n private cache?: any;\n\n constructor(private config: Required<ApiKeyConfig>, private kernel: Kernel) {\n this.initializeStaticKeys();\n }\n\n private getCache() {\n if (!this.cache && this.config.enableCache) {\n const cacheFeature = this.kernel.getFeature<any>('cache');\n if (cacheFeature) {\n this.cache = cacheFeature.client;\n }\n }\n return this.cache;\n }\n\n private initializeStaticKeys(): void {\n if (!this.config.staticKeys || this.config.staticKeys.length === 0) {\n return;\n }\n\n for (const staticKey of this.config.staticKeys) {\n const metadata: ApiKeyMetadata = {\n id: this.generateId(staticKey.key),\n key: staticKey.key,\n name: staticKey.name,\n scopes: staticKey.scopes,\n rateLimit: staticKey.rateLimit,\n expiresAt: staticKey.expiresAt,\n createdAt: new Date(),\n metadata: staticKey.metadata,\n lastUsedAt: undefined // Explicitly undefined initially\n };\n\n this.staticKeysMap.set(staticKey.key, metadata);\n }\n console.log(`βœ… Loaded ${this.staticKeysMap.size} static API keys`);\n }\n\n private generateId(key: string): string {\n return key.substring(0, 8);\n }\n\n private compareKeys(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n }\n\n private isExpired(expiresAt?: Date): boolean {\n if (!expiresAt) return false;\n return new Date() > expiresAt;\n }\n\n async validate(key: string): Promise<ApiKeyValidationResult> {\n if (!key) return { isValid: false, error: \"API key is required\" };\n\n const cache = this.getCache();\n const cacheKey = `apikey:${key}`;\n\n if (cache) {\n try {\n const cached = await cache.get(cacheKey);\n if (cached) {\n const metadata = typeof cached === 'string' ? JSON.parse(cached) : cached;\n return { isValid: true, key: metadata };\n }\n } catch (err) {\n // Cache error, ignore\n }\n }\n\n // Check static keys\n for (const [staticKey, metadata] of this.staticKeysMap) {\n if (this.compareKeys(key, staticKey)) {\n if (this.isExpired(metadata.expiresAt)) {\n return { isValid: false, error: \"API key has expired\" };\n }\n metadata.lastUsedAt = new Date();\n\n if (cache) {\n const ttl = this.config.cacheTtl ? Math.floor(this.config.cacheTtl / 1000) : 300;\n try {\n await cache.set(cacheKey, JSON.stringify(metadata), ttl);\n } catch {\n // ignore cache write failures β€” validation already succeeded\n }\n }\n\n return { isValid: true, key: metadata };\n }\n }\n\n return { isValid: false, error: \"Invalid API key\" };\n }\n\n hasScopes(key: ApiKeyMetadata, requiredScopes: string[]): boolean {\n if (!requiredScopes || requiredScopes.length === 0) return true;\n if (!key.scopes || key.scopes.length === 0) return false;\n\n for (const requiredScope of requiredScopes) {\n const hasScope = key.scopes.some((scope) => {\n if (scope.endsWith(\"*\")) {\n const prefix = scope.slice(0, -1);\n return requiredScope.startsWith(prefix);\n }\n return scope === requiredScope;\n });\n\n if (!hasScope) return false;\n }\n return true;\n }\n}\n\n// --- ApiKeyFeature ---\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n apiKey?: ApiKeyMetadata;\n apiKeyScopes?: string[];\n hasScope?: (scope: string) => boolean;\n hasAnyScope?: (...scopes: string[]) => boolean;\n hasAllScopes?: (...scopes: string[]) => boolean;\n }\n}\n\nexport class ApiKeyFeature implements Feature {\n name = \"apiKey\";\n private store?: ApiKeyStore;\n private config: Required<ApiKeyConfig>;\n\n constructor(config: ApiKeyConfig = {}) {\n this.config = {\n staticKeys: config.staticKeys || [],\n headerName: config.headerName || \"X-API-Key\",\n queryParamName: config.queryParamName || \"api_key\",\n extractStrategies: config.extractStrategies || [\"header\", \"bearer\"],\n // Defaults for other optional properties\n vaultService: undefined,\n customExtractor: undefined,\n enableCache: config.enableCache ?? true,\n cacheTtl: config.cacheTtl ?? 300000,\n requireScopes: config.requireScopes ?? false,\n skipPaths: config.skipPaths || [],\n onError: config.onError,\n onValidated: config.onValidated\n } as unknown as Required<ApiKeyConfig>;\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n this.store = new ApiKeyStore(this.config, kernel);\n const app = kernel.getApp();\n\n app.use(\"*\", async (c: Context, next: Next) => {\n if (this.shouldSkipPath(c.req.path)) {\n await next();\n return;\n }\n\n const apiKey = this.extractApiKey(c);\n if (!apiKey) {\n c.set(\"apiKey\", undefined);\n c.set(\"apiKeyScopes\", undefined);\n await next();\n return;\n }\n\n const result = await this.store!.validate(apiKey);\n if (!result.isValid) {\n throw new HTTPException(401, { message: result.error || \"Invalid API key\" });\n }\n\n c.set(\"apiKey\", result.key);\n c.set(\"apiKeyScopes\", result.key?.scopes || []);\n\n c.set(\"hasScope\", (scope: string) => this.store!.hasScopes(result.key!, [scope]));\n c.set(\"hasAnyScope\", (...scopes: string[]) => scopes.some(s => this.store!.hasScopes(result.key!, [s])));\n c.set(\"hasAllScopes\", (...scopes: string[]) => this.store!.hasScopes(result.key!, scopes));\n\n await next();\n });\n\n console.log(\"βœ… API Key feature initialized\");\n }\n\n private shouldSkipPath(path: string): boolean {\n if (!this.config.skipPaths?.length) return false;\n return this.config.skipPaths.some(skip => {\n if (skip.endsWith(\"*\")) return path.startsWith(skip.slice(0, -1));\n return path === skip;\n });\n }\n\n private extractApiKey(c: Context): string | null {\n for (const strategy of (this.config.extractStrategies || [])) {\n let key: string | null = null;\n switch (strategy) {\n case \"header\":\n key = c.req.header(this.config.headerName) || null;\n break;\n case \"bearer\": {\n const auth = c.req.header(\"Authorization\");\n if (auth?.startsWith(\"Bearer \")) key = auth.substring(7);\n break;\n }\n case \"query\":\n key = c.req.query(this.config.queryParamName) || null;\n break;\n }\n if (key) return key;\n }\n return null;\n }\n}\n\nexport function requireApiKey() {\n return async (c: Context, next: Next) => {\n if (!c.get(\"apiKey\")) throw new HTTPException(401, { message: \"API key is required\" });\n await next();\n };\n}\n\nexport function requireScope(...scopes: string[]) {\n return async (c: Context, next: Next) => {\n const hasAll = c.get(\"hasAllScopes\");\n if (!c.get(\"apiKey\")) throw new HTTPException(401, { message: \"API key is required\" });\n if (!hasAll || !hasAll(...scopes)) throw new HTTPException(403, { message: \"Insufficient scopes\" });\n await next();\n };\n}\n","import type { Feature, CsrfConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { getCookie, setCookie } from \"hono/cookie\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n csrfToken: string;\n }\n}\n\nexport class CsrfFeature implements Feature {\n name = \"csrf\";\n private config: Required<CsrfConfig>;\n\n constructor(config: CsrfConfig) {\n if (!config.secret) throw new Error(\"CSRF secret is required\");\n this.config = {\n secret: config.secret,\n cookieName: config.cookieName || \"_csrf\",\n headerName: config.headerName || \"X-CSRF-Token\",\n ignoreMethods: config.ignoreMethods || [\"GET\", \"HEAD\", \"OPTIONS\"],\n cookieOptions: {\n httpOnly: true,\n secure: true,\n sameSite: \"Strict\",\n maxAge: 86400,\n ...config.cookieOptions\n }\n } as Required<CsrfConfig>;\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n await this.middleware(c, next);\n });\n console.log(\"βœ… CSRF feature initialized\");\n }\n\n private async middleware(c: Context, next: Next) {\n const method = c.req.method.toUpperCase();\n let token = getCookie(c, this.config.cookieName);\n\n if (!token) {\n token = crypto.randomUUID().replace(/-/g, '');\n setCookie(c, this.config.cookieName, token, {\n httpOnly: this.config.cookieOptions.httpOnly,\n secure: this.config.cookieOptions.secure,\n sameSite: this.config.cookieOptions.sameSite as any,\n maxAge: this.config.cookieOptions.maxAge,\n path: \"/\"\n });\n }\n\n c.set(\"csrfToken\", token);\n\n if (this.config.ignoreMethods.includes(method)) {\n await next();\n return;\n }\n\n const isValid = await this.validateToken(c, token);\n if (!isValid) {\n throw new HTTPException(403, { message: \"Invalid CSRF token\" });\n }\n\n await next();\n }\n\n private async validateToken(c: Context, expectedToken: string): Promise<boolean> {\n const headerToken = c.req.header(this.config.headerName);\n if (headerToken === expectedToken) return true;\n\n try {\n const contentType = c.req.header(\"content-type\");\n if (contentType?.includes(\"application/x-www-form-urlencoded\")) {\n const body = await c.req.parseBody();\n const bodyToken = body._csrf || body[this.config.cookieName];\n if (String(bodyToken) === expectedToken) return true;\n }\n } catch { /* ignored */ }\n\n return false;\n }\n}\n\nexport function requireCsrf() {\n return async (c: Context, next: Next) => {\n if (!c.get(\"csrfToken\")) throw new HTTPException(403, { message: \"CSRF token required\" });\n await next();\n };\n}\n","export interface SuccessResponse<T = unknown> {\n success: true;\n data?: T;\n message?: string;\n}\n\nexport interface ErrorResponse {\n success: false;\n error: string;\n code?: string;\n details?: unknown;\n timestamp?: string;\n}\n\nexport type ApiResponse<T = unknown> = SuccessResponse<T> | ErrorResponse;\n\nexport function successResponse<T = unknown>(data?: T, message?: string): SuccessResponse<T> {\n const response: SuccessResponse<T> = { success: true };\n if (data !== undefined) response.data = data;\n if (message) response.message = message;\n return response;\n}\n\nexport function errorResponse(error: string | Error, code?: string, details?: unknown): ErrorResponse {\n const message = error instanceof Error ? error.message : error;\n const response: ErrorResponse = {\n success: false,\n error: message,\n timestamp: new Date().toISOString(),\n };\n if (code) response.code = code;\n if (details !== undefined) response.details = details;\n return response;\n}\n\n// Re-exportado desde @iskra-bun/core para compatibilidad\nexport { ErrorCodes, type ErrorCode } from '@iskra-bun/core';\n","import type { Feature } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next, Hono, Handler } from \"hono\";\nimport { z } from \"zod\";\nimport { ErrorCodes, errorResponse } from \"../responses\";\n\n// Extend Hono Context to include valid() method\ndeclare module \"hono\" {\n interface Context {\n valid<T = any>(): T;\n }\n}\n\n// Extend Hono to include *Validated methods if possible, \n// or simpler: just provide middleware factory.\n// Monkey patching Hono class is tricky in strict TS if types aren't augmented in global/module scope correctly.\n// But we can try to follow kollective's approach if we augment module \"hono\".\n\nexport interface ValidationSchema {\n params?: z.ZodSchema<any>;\n query?: z.ZodSchema<any>;\n body?: z.ZodSchema<any>;\n}\n\nexport interface ValidationOptions {\n logErrors?: boolean;\n status?: number;\n}\n\nfunction createValidationMiddleware(schema: ValidationSchema, options: ValidationOptions = {}) {\n const { logErrors = true, status = 400 } = options;\n\n return async (c: Context, next: Next) => {\n try {\n const validated: Record<string, any> = {};\n\n if (schema.params) {\n const parsed = schema.params.safeParse(c.req.param());\n if (!parsed.success) {\n return c.json(errorResponse(\"Invalid route params\", ErrorCodes.VALIDATION_ERROR, parsed.error.flatten()), status as any);\n }\n validated.params = parsed.data;\n }\n\n if (schema.query) {\n const parsed = schema.query.safeParse(c.req.query());\n if (!parsed.success) {\n return c.json(errorResponse(\"Invalid query params\", ErrorCodes.VALIDATION_ERROR, parsed.error.flatten()), status as any);\n }\n validated.query = parsed.data;\n }\n\n if (schema.body) {\n let data: unknown = {};\n const contentType = c.req.header(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n data = await c.req.json().catch(() => ({}));\n } else if (contentType.includes(\"application/x-www-form-urlencoded\") || contentType.includes(\"multipart/form-data\")) {\n data = await c.req.parseBody();\n }\n\n const parsed = schema.body.safeParse(data);\n if (!parsed.success) {\n return c.json(errorResponse(\"Invalid body\", ErrorCodes.VALIDATION_ERROR, parsed.error.flatten()), status as any);\n }\n validated.body = parsed.data;\n }\n\n // Attach to context\n (c as any).valid = () => validated;\n\n await next();\n } catch (err) {\n if (logErrors) console.error(\"Validation error:\", err);\n return c.json(errorResponse(\"Validation middleware failed\", ErrorCodes.INTERNAL_ERROR), 500);\n }\n };\n}\n\n// Helper to monkey patch Hono\nfunction extendHonoWithValidation(app: Hono) {\n const methods = [\"get\", \"post\", \"put\", \"delete\"] as const;\n for (const method of methods) {\n (app as any)[`${method}Validated`] = function (path: string, schema: ValidationSchema, handler: Handler, options?: ValidationOptions) {\n const middleware = createValidationMiddleware(schema, options);\n (this as any)[method](path, middleware, handler);\n return this;\n };\n }\n}\n\nexport class ValidationFeature implements Feature {\n name = \"validation\";\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n extendHonoWithValidation(app);\n\n // Add context helper if not already present via middleware factory logic\n // The middleware factory adds .valid() to the SPECIFIC request context\n console.log(\"βœ… Validation feature initialized\");\n }\n}\n\nexport { createValidationMiddleware };\n","import type { Feature } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next, Hono, Handler } from \"hono\";\nimport Ajv from \"ajv\";\nimport addErrors from \"ajv-errors\";\nimport addFormats from \"ajv-formats\";\nimport type { ErrorObject } from \"ajv\";\nimport { ErrorCodes, errorResponse } from \"../responses\";\n\n// ─── Module Augmentation ────────────────────────────────────────────────────\n\ndeclare module \"hono\" {\n interface Hono {\n getJsonValidated(path: string, schema: JsonValidationSchema, handler: Handler, options?: JsonValidationOptions): Hono;\n postJsonValidated(path: string, schema: JsonValidationSchema, handler: Handler, options?: JsonValidationOptions): Hono;\n putJsonValidated(path: string, schema: JsonValidationSchema, handler: Handler, options?: JsonValidationOptions): Hono;\n deleteJsonValidated(path: string, schema: JsonValidationSchema, handler: Handler, options?: JsonValidationOptions): Hono;\n }\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface JsonValidationSchema {\n params?: Record<string, unknown>;\n query?: Record<string, unknown>;\n body?: Record<string, unknown>;\n}\n\nexport interface JsonValidationOptions {\n logErrors?: boolean;\n status?: number;\n allErrors?: boolean;\n coerceTypes?: boolean;\n}\n\nexport interface FormattedValidationErrors {\n fields: Record<string, string[]>;\n errors: string[];\n}\n\n// ─── Ajv Instance Factory ───────────────────────────────────────────────────\n\nfunction createAjvInstance(options: JsonValidationOptions = {}): Ajv {\n const ajv = new Ajv({\n allErrors: options.allErrors ?? true,\n coerceTypes: options.coerceTypes ?? true,\n verbose: true,\n $data: true,\n });\n addFormats(ajv);\n addErrors(ajv);\n return ajv;\n}\n\n// ─── Error Formatter ────────────────────────────────────────────────────────\n\nfunction formatAjvErrors(errors: ErrorObject[] | null | undefined): FormattedValidationErrors {\n const result: FormattedValidationErrors = { fields: {}, errors: [] };\n if (!errors) return result;\n\n for (const err of errors) {\n let fieldPath: string;\n\n if (err.instancePath) {\n fieldPath = err.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n } else if (err.params && \"missingProperty\" in err.params) {\n fieldPath = err.params.missingProperty as string;\n } else {\n fieldPath = \"_root\";\n }\n\n const message = err.message || \"Invalid value\";\n\n if (!result.fields[fieldPath]) {\n result.fields[fieldPath] = [];\n }\n\n if (!result.fields[fieldPath].includes(message)) {\n result.fields[fieldPath].push(message);\n }\n\n const formatted = fieldPath === \"_root\" ? message : `${fieldPath}: ${message}`;\n if (!result.errors.includes(formatted)) {\n result.errors.push(formatted);\n }\n }\n\n return result;\n}\n\n// ─── Validation Middleware ───────────────────────────────────────────────────\n\nexport function createJsonSchemaValidationMiddleware(\n schema: JsonValidationSchema,\n options: JsonValidationOptions = {},\n) {\n const { logErrors = true, status = 400 } = options;\n const ajv = createAjvInstance(options);\n\n const validators = {\n params: schema.params ? ajv.compile(schema.params) : null,\n query: schema.query ? ajv.compile(schema.query) : null,\n body: schema.body ? ajv.compile(schema.body) : null,\n };\n\n return async (c: Context, next: Next) => {\n try {\n const validated: Record<string, any> = {};\n\n if (validators.params) {\n const data = { ...c.req.param() };\n const valid = validators.params(data);\n if (!valid) {\n const details = formatAjvErrors(validators.params.errors);\n return c.json(errorResponse(\"Invalid route params\", ErrorCodes.VALIDATION_ERROR, details), status as any);\n }\n validated.params = data;\n }\n\n if (validators.query) {\n const data = { ...c.req.query() };\n const valid = validators.query(data);\n if (!valid) {\n const details = formatAjvErrors(validators.query.errors);\n return c.json(errorResponse(\"Invalid query params\", ErrorCodes.VALIDATION_ERROR, details), status as any);\n }\n validated.query = data;\n }\n\n if (validators.body) {\n let data: unknown = {};\n const contentType = c.req.header(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n data = await c.req.json().catch(() => ({}));\n } else if (contentType.includes(\"application/x-www-form-urlencoded\") || contentType.includes(\"multipart/form-data\")) {\n data = await c.req.parseBody();\n }\n\n const valid = validators.body(data);\n if (!valid) {\n const details = formatAjvErrors(validators.body.errors);\n return c.json(errorResponse(\"Invalid body\", ErrorCodes.VALIDATION_ERROR, details), status as any);\n }\n validated.body = data;\n }\n\n (c as any).valid = () => validated;\n await next();\n } catch (err) {\n if (logErrors) console.error(\"JSON Schema validation error:\", err);\n return c.json(errorResponse(\"Validation middleware failed\", ErrorCodes.INTERNAL_ERROR), 500);\n }\n };\n}\n\n// ─── Hono Extension ─────────────────────────────────────────────────────────\n\nfunction extendHonoWithJsonSchemaValidation(app: Hono) {\n const methods = [\"get\", \"post\", \"put\", \"delete\"] as const;\n for (const method of methods) {\n (app as any)[`${method}JsonValidated`] = function (\n path: string,\n schema: JsonValidationSchema,\n handler: Handler,\n options?: JsonValidationOptions,\n ) {\n const middleware = createJsonSchemaValidationMiddleware(schema, options);\n (this as any)[method](path, middleware, handler);\n return this;\n };\n }\n}\n\n// ─── Feature Class ──────────────────────────────────────────────────────────\n\nexport class JsonSchemaValidationFeature implements Feature {\n name = \"json-schema-validation\";\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n extendHonoWithJsonSchemaValidation(app);\n console.log(\"βœ… JSON Schema validation feature initialized\");\n }\n}\n\nexport { formatAjvErrors };\n","import type { Feature, OpenAPIConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Handler, Hono } from \"hono\";\nimport { OpenAPIHono, createRoute, z } from \"@hono/zod-openapi\";\nimport { ErrorCodes, errorResponse } from \"../responses\";\n\nexport class OpenAPIFeature implements Feature {\n name = \"openapi\";\n private app?: OpenAPIHono;\n private config: OpenAPIConfig;\n private kernel?: Kernel;\n private autoGeneratedRoutes: Array<{ path: string; method: string; tags: string[]; summary: string }> = [];\n private queuedRoutes: Array<{ route: any; handler: Handler }> = [];\n\n constructor(config: OpenAPIConfig) {\n this.config = config;\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n this.kernel = kernel;\n this.app = new OpenAPIHono({\n defaultHook: (result: any, c: Context) => {\n if (!result.success) {\n return c.json(errorResponse(\"Validation Error\", ErrorCodes.VALIDATION_ERROR, result.error.flatten()), 400);\n }\n }\n });\n\n this.processQueuedRoutes();\n console.log(\"βœ… OpenAPIFeature initialized\");\n }\n\n addRoute(route: any, handler: Handler) {\n if (!this.app) {\n this.queuedRoutes.push({ route, handler });\n return;\n }\n this.app.openapi(createRoute(route), handler);\n this.autoGeneratedRoutes.push({\n path: route.path,\n method: route.method.toUpperCase(),\n tags: route.tags || [],\n summary: route.summary || \"\"\n });\n }\n\n private processQueuedRoutes() {\n if (!this.app) return;\n for (const { route, handler } of this.queuedRoutes) {\n this.addRoute(route, handler);\n }\n this.queuedRoutes = [];\n }\n\n routes(app: Hono) {\n if (this.app) {\n app.route(\"/\", this.app);\n }\n\n app.get(\"/openapi.json\", (c: Context) => {\n if (!this.app) return c.json({ error: \"OpenAPI not initialized\" }, 500);\n\n const spec = this.app.getOpenAPIDocument({\n openapi: \"3.1.0\",\n info: {\n title: this.config.title,\n version: this.config.version,\n description: this.config.description || \"API Documentation\",\n contact: this.config.contact,\n license: this.config.license\n },\n servers: this.config.servers || [{ url: \"http://localhost:8000\", description: \"Dev Server\" }],\n tags: this.config.tags || [],\n externalDocs: this.config.externalDocs,\n security: this.config.security\n });\n\n if (this.config.securitySchemes) {\n if (!spec.components) spec.components = {};\n spec.components.securitySchemes = this.config.securitySchemes;\n }\n\n return c.json(spec);\n });\n\n app.get(\"/docs\", (c) => c.html(this.generateScalarHTML()));\n }\n\n private generateScalarHTML(): string {\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>${this.config.title} - API Documentation</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>body { margin: 0; padding: 0; }</style>\n</head>\n<body>\n <script id=\"api-reference\" data-url=\"/openapi.json\" data-configuration='{\"theme\":\"purple\",\"layout\":\"modern\",\"showSidebar\":true}'></script>\n <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference@latest\"></script>\n</body>\n</html>`.trim();\n }\n}\n\nexport { createRoute, OpenAPIHono, z };\n","import type { StorageFeature } from \"../storage\";\nimport type { BaseStorageAdapter, PutOptions } from \"../storage/base\";\n\nexport interface UploadOptions {\n metadata?: Record<string, string>;\n contentType?: string;\n}\n\nexport interface UploadResult {\n path: string;\n filename: string;\n size: number;\n uploadedAt: Date;\n}\n\nexport class UploadHelper {\n private basePath: string;\n\n constructor(private storage: BaseStorageAdapter, private projectName: string) {\n this.basePath = `${projectName}/`;\n }\n\n getBasePath(): string {\n return this.basePath;\n }\n\n private buildPath(filename: string, subfolder?: string): string {\n if (subfolder) {\n const normalized = subfolder.replace(/^\\/+|\\/+$/g, \"\");\n return `${this.basePath}${normalized}/${filename}`;\n }\n return `${this.basePath}${filename}`;\n }\n\n async upload(filename: string, data: Uint8Array | string, subfolder?: string, options?: UploadOptions): Promise<UploadResult> {\n const fullPath = this.buildPath(filename, subfolder);\n const fileData = typeof data === \"string\" ? new TextEncoder().encode(data) : data;\n\n const putOptions: PutOptions | undefined = options ? {\n contentType: options.contentType,\n metadata: options.metadata\n } : undefined;\n\n await this.storage.put(fullPath, fileData, putOptions);\n\n return {\n path: fullPath,\n filename,\n size: fileData.length,\n uploadedAt: new Date()\n };\n }\n\n // uploadFromRequest: Not implementing raw request reading here to avoid Node/Bun specific request stream issues unless necessary\n // or implementing simplified Version\n async uploadFromRequest(request: Request, fieldName: string, subfolder?: string, options?: UploadOptions): Promise<UploadResult> {\n const formData = await request.formData();\n const file = formData.get(fieldName);\n if (!file || !(file instanceof File)) throw new Error(`No file found in field: ${fieldName}`);\n\n const data = new Uint8Array(await file.arrayBuffer());\n const opts = { ...options, contentType: options?.contentType || file.type };\n return this.upload(file.name, data, subfolder, opts);\n }\n\n async list(subfolder?: string) {\n const prefix = subfolder ? `${this.basePath}${subfolder.replace(/^\\/+|\\/+$/g, \"\")}/` : this.basePath;\n return await this.storage.list(prefix);\n }\n\n async get(filename: string, subfolder?: string) {\n const fullPath = this.buildPath(filename, subfolder);\n return await this.storage.get(fullPath);\n }\n\n async delete(filename: string, subfolder?: string) {\n const fullPath = this.buildPath(filename, subfolder);\n await this.storage.delete(fullPath);\n }\n\n async getUrl(filename: string, subfolder?: string, expiresIn?: number) {\n const fullPath = this.buildPath(filename, subfolder);\n return await this.storage.url(fullPath, expiresIn);\n }\n}\n","import type { Feature, UploadConfig } from \"../../types\";\nimport type { Kernel } from \"../../kernel\";\nimport type { Hono, Context, Next } from \"hono\";\nimport { UploadHelper } from \"./helper\";\nimport type { StorageFeature } from \"../storage\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n upload: UploadHelper;\n }\n}\n\nexport class UploadFeature implements Feature {\n name = \"upload\";\n dependencies = [\"storage\"];\n private helper?: UploadHelper;\n private config: Required<UploadConfig>;\n\n constructor(config: UploadConfig) {\n this.config = {\n projectName: config.projectName,\n maxFileSize: config.maxFileSize || 10 * 1024 * 1024,\n allowedExtensions: config.allowedExtensions || [],\n exposeRoutes: config.exposeRoutes || false,\n routePrefix: config.routePrefix || \"/upload\"\n };\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const storageFeature = kernel.getFeature(\"storage\") as unknown as StorageFeature;\n if (!storageFeature) throw new Error(\"Upload feature requires storage feature\");\n const storage = storageFeature.getAdapter();\n if (!storage) throw new Error(\"Storage adapter not ready\");\n\n this.helper = new UploadHelper(storage, this.config.projectName);\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n c.set(\"upload\", this.helper!);\n await next();\n });\n\n console.log(`βœ… Upload feature initialized: ${this.config.projectName}`);\n }\n\n routes(app: Hono) {\n if (!this.config.exposeRoutes) return;\n\n const prefix = this.config.routePrefix;\n\n // POST β€” upload a file\n app.post(`${prefix}`, async (c) => {\n const upload = c.get(\"upload\");\n try {\n const subfolder = c.req.query(\"subfolder\");\n const formData = await c.req.formData();\n const file = formData.get(\"file\");\n if (!file || !(file instanceof File)) return c.json({ error: \"No file\" }, 400);\n\n if (file.size > this.config.maxFileSize) return c.json({ error: \"File too large\" }, 400);\n if (this.config.allowedExtensions.length > 0) {\n if (!this.config.allowedExtensions.some(e => file.name.toLowerCase().endsWith(e))) {\n return c.json({ error: \"Invalid extension\" }, 400);\n }\n }\n\n const data = new Uint8Array(await file.arrayBuffer());\n const result = await upload.upload(file.name, data, subfolder, { contentType: file.type });\n return c.json({ success: true, ...result });\n\n } catch (e: any) {\n return c.json({ error: e.message }, 500);\n }\n });\n\n // GET β€” list files\n app.get(`${prefix}`, async (c) => {\n const upload = c.get(\"upload\");\n try {\n const subfolder = c.req.query(\"subfolder\");\n const files = await upload.list(subfolder);\n return c.json({ success: true, files });\n } catch (e: any) {\n return c.json({ error: e.message }, 500);\n }\n });\n\n // GET β€” download a file\n app.get(`${prefix}/*`, async (c) => {\n const upload = c.get(\"upload\");\n try {\n const filePath = c.req.path.replace(`${prefix}/`, \"\");\n const segments = filePath.split(\"/\");\n const filename = segments.pop() || \"\";\n const subfolder = segments.length > 0 ? segments.join(\"/\") : undefined;\n\n const data = await upload.get(filename, subfolder);\n if (!data) {\n return c.json({ error: \"File not found\" }, 404);\n }\n\n const ext = filename.split(\".\").pop()?.toLowerCase() || \"\";\n const mimeTypes: Record<string, string> = {\n jpg: \"image/jpeg\", jpeg: \"image/jpeg\", png: \"image/png\", gif: \"image/gif\",\n pdf: \"application/pdf\", txt: \"text/plain\", json: \"application/json\", zip: \"application/zip\",\n };\n const contentType = mimeTypes[ext] || \"application/octet-stream\";\n\n const body = new Uint8Array(data.length);\n body.set(data);\n\n return new Response(body, {\n headers: {\n \"Content-Type\": contentType,\n \"Content-Disposition\": `inline; filename=\"${filename}\"`,\n \"Content-Length\": String(data.length),\n },\n });\n } catch (e: any) {\n return c.json({ error: e.message }, 500);\n }\n });\n\n // DELETE β€” delete a file\n app.delete(`${prefix}/*`, async (c) => {\n const upload = c.get(\"upload\");\n try {\n const filePath = c.req.path.replace(`${prefix}/`, \"\");\n const segments = filePath.split(\"/\");\n const filename = segments.pop() || \"\";\n const subfolder = segments.length > 0 ? segments.join(\"/\") : undefined;\n\n await upload.delete(filename, subfolder);\n return new Response(null, { status: 204 });\n } catch (e: any) {\n return c.json({ error: e.message }, 500);\n }\n });\n }\n}\n","import type { Feature } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport { httpInstrumentationMiddleware } from \"@hono/otel\";\n\nexport interface OtelTracingConfig {\n serviceName: string;\n serviceVersion?: string;\n captureRequestHeaders?: string[];\n captureResponseHeaders?: string[];\n tracerProvider?: any;\n meterProvider?: any;\n tracer?: any;\n spanNameFactory?: (c: any) => string;\n getTime?: () => number;\n}\n\nexport class OtelTracingFeature implements Feature {\n name = \"otel-tracing\";\n private config: OtelTracingConfig;\n\n constructor(config: OtelTracingConfig) {\n if (!config.serviceName) {\n throw new Error(\"serviceName is required for OtelTracingFeature\");\n }\n this.config = config;\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n\n const instrumentationConfig: any = {\n serviceName: this.config.serviceName,\n };\n\n if (this.config.serviceVersion) instrumentationConfig.serviceVersion = this.config.serviceVersion;\n if (this.config.captureRequestHeaders) instrumentationConfig.captureRequestHeaders = this.config.captureRequestHeaders;\n if (this.config.captureResponseHeaders) instrumentationConfig.captureResponseHeaders = this.config.captureResponseHeaders;\n if (this.config.tracerProvider) instrumentationConfig.tracerProvider = this.config.tracerProvider;\n if (this.config.meterProvider) instrumentationConfig.meterProvider = this.config.meterProvider;\n if (this.config.tracer) instrumentationConfig.tracer = this.config.tracer;\n if (this.config.spanNameFactory) instrumentationConfig.spanNameFactory = this.config.spanNameFactory;\n if (this.config.getTime) instrumentationConfig.getTime = this.config.getTime;\n\n // Register Otel middleware\n app.use(\"*\", httpInstrumentationMiddleware(instrumentationConfig));\n\n console.log(\"βœ… OpenTelemetry tracing feature initialized\");\n }\n}\n","import type { Feature } from \"../../types\";\nimport type { Kernel } from \"../../kernel\";\nimport type { Context, Next } from \"hono\";\n\nexport interface EmailConfig {\n provider: \"smtp\" | \"sendgrid\" | \"mock\" | \"mailgun\" | \"ses\";\n smtp?: {\n host: string;\n port: number;\n username: string;\n password: string;\n secure?: boolean;\n };\n apiKey?: string;\n apiSecret?: string;\n region?: string;\n domain?: string;\n baseUrl?: string;\n from?: { name?: string; email: string };\n templateDir?: string;\n}\n\nexport interface EmailMessage {\n to: string | string[];\n from?: { name?: string; email: string };\n subject: string;\n text?: string;\n html?: string;\n cc?: string | string[];\n bcc?: string | string[];\n replyTo?: string;\n attachments?: Array<{ filename: string; content: Uint8Array | string; contentType?: string }>;\n headers?: Record<string, string>;\n}\n\nexport interface TemplateData {\n [key: string]: unknown;\n}\n\nexport interface EmailAdapter {\n send(message: EmailMessage): Promise<{ messageId: string; success: boolean }>;\n sendTemplate(templateName: string, to: string | string[], data: TemplateData): Promise<{ messageId: string; success: boolean }>;\n}\n\nclass MockEmailAdapter implements EmailAdapter {\n async send(message: EmailMessage) {\n console.log(\"πŸ“§ [MOCK] Sent to\", message.to, \"Subject:\", message.subject);\n return { messageId: `mock-${Date.now()}`, success: true };\n }\n async sendTemplate(name: string, to: string | string[], data: TemplateData) {\n return this.send({ to, subject: `Template: ${name}`, html: `Template ${name} with data: ${JSON.stringify(data)}` });\n }\n}\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n email: EmailAdapter;\n }\n}\n\nexport class EmailFeature implements Feature {\n name = \"email\";\n private adapter?: EmailAdapter;\n\n constructor(private config: EmailConfig) { }\n\n async initialize(kernel: Kernel): Promise<void> {\n this.adapter = await this.createAdapter(this.config);\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n if (this.adapter) c.set(\"email\", this.adapter);\n await next();\n });\n console.log(`βœ… EmailFeature initialized (${this.config.provider})`);\n }\n\n private async createAdapter(config: EmailConfig): Promise<EmailAdapter> {\n switch (config.provider) {\n case \"mock\": return new MockEmailAdapter();\n case \"smtp\": {\n // Lazy load to avoid import issues if not installed/configured in all envs (though we added deps)\n const { SmtpEmailAdapter } = await import(\"./providers/smtp\");\n return new SmtpEmailAdapter(config);\n }\n case \"sendgrid\": {\n const { SendGridEmailAdapter } = await import(\"./providers/sendgrid\");\n return new SendGridEmailAdapter(config);\n }\n case \"mailgun\": {\n const { MailgunEmailAdapter } = await import(\"./providers/mailgun\");\n return new MailgunEmailAdapter(config);\n }\n default: throw new Error(`Provider ${config.provider} not implemented`);\n }\n }\n\n getAdapter(): EmailAdapter {\n if (!this.adapter) throw new Error(\"Email not initialized\");\n return this.adapter;\n }\n}\n\nexport { MockEmailAdapter };\n"],"mappings":"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","names":["HTTPException","IskraError","HTTPException","status","response","requestId","IskraError","HTTPException","HTTPException","pgTable","mysqlTable","sqliteTable","sqliteText","z","HTTPException","HTTPException","HTTPException","HTTPException","path","HTTPException","getCookie","setCookie","ErrorCodes","ErrorCodes","path","ErrorCodes","path","OpenAPIHono","createRoute","z","OpenAPIHono","ErrorCodes","createRoute"]}
1
+ {"version":3,"sources":["../src/kernel.ts","../src/driver.ts","../src/server.ts","../src/router.ts","../src/features/cors.ts","../src/features/error-handler.ts","../src/errors.ts","../src/features/health.ts","../src/features/logger.ts","../src/features/request-id.ts","../src/features/storage/index.ts","../src/features/db.ts","../src/features/cache.ts","../src/features/session.ts","../src/features/auth/index.ts","../src/features/rate-limit.ts","../src/features/permissions.ts","../src/features/api-key.ts","../src/features/csrf.ts","../src/responses.ts","../src/features/validation.ts","../src/features/json-schema-validation.ts","../src/features/openapi.ts","../src/features/upload/helper.ts","../src/features/upload/index.ts","../src/features/tracing.ts","../src/features/email/index.ts"],"sourcesContent":["import { Hono } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport type { Context, Next } from \"hono\";\nimport type { Feature, KernelConfig } from \"./types\";\n\n/**\n * Core microkernel orchestrator that manages features, dependencies, and application lifecycle.\n */\nexport class Kernel {\n private app: Hono;\n private config: KernelConfig;\n private features: Map<string, Feature> = new Map();\n private initialized = false;\n\n constructor(config: KernelConfig = {}) {\n this.config = {\n port: 8000,\n hostname: \"localhost\",\n ...config,\n };\n this.app = new Hono();\n\n // Add default error handler for HTTPException\n this.app.onError((err: Error, c: Context): Response | Promise<Response> => {\n if (err instanceof HTTPException) {\n return c.json(\n { message: err.message },\n err.status,\n );\n }\n\n console.error(\"Unhandled error:\", err);\n return c.json(\n { message: \"Internal Server Error\" },\n 500,\n );\n });\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n throw new Error(\"Kernel already initialized\");\n }\n\n console.log(\"πŸš€ Initializing Web-Kit Kernel...\");\n\n this.validateFeatureDependencies();\n await this.validatePeerDependencies();\n this.applySecurityHeaders();\n\n const orderedFeatures = this.sortFeaturesByDependencies();\n for (const feature of orderedFeatures) {\n await this.initializeFeature(feature);\n }\n\n this.initialized = true;\n console.log(\"βœ… Web-Kit Kernel initialized\");\n }\n\n private applySecurityHeaders(): void {\n if (!this.config.securityHeaders) {\n this.config.securityHeaders = {\n xFrameOptions: \"SAMEORIGIN\",\n xContentTypeOptions: true,\n xXssProtection: true,\n referrerPolicy: \"strict-origin-when-cross-origin\",\n };\n }\n\n const headers = this.config.securityHeaders;\n\n this.app.use(\"*\", async (c: Context, next: Next) => {\n await next();\n\n if (headers.xFrameOptions) {\n c.res.headers.set(\"X-Frame-Options\", headers.xFrameOptions);\n }\n if (headers.xContentTypeOptions) {\n c.res.headers.set(\"X-Content-Type-Options\", \"nosniff\");\n }\n if (headers.xXssProtection) {\n c.res.headers.set(\"X-XSS-Protection\", \"1; mode=block\");\n }\n if (headers.referrerPolicy) {\n c.res.headers.set(\"Referrer-Policy\", headers.referrerPolicy);\n }\n if (headers.strictTransportSecurity) {\n const hsts = headers.strictTransportSecurity;\n let hstsValue = `max-age=${hsts.maxAge || 31536000}`;\n if (hsts.includeSubDomains) hstsValue += \"; includeSubDomains\";\n if (hsts.preload) hstsValue += \"; preload\";\n c.res.headers.set(\"Strict-Transport-Security\", hstsValue);\n }\n if (headers.contentSecurityPolicy) {\n if (typeof headers.contentSecurityPolicy === \"string\") {\n c.res.headers.set(\n \"Content-Security-Policy\",\n headers.contentSecurityPolicy,\n );\n } else if (headers.contentSecurityPolicy.directives) {\n const directives = Object.entries(\n headers.contentSecurityPolicy.directives,\n )\n .map(([key, value]) => {\n const values = Array.isArray(value) ? value.join(\" \") : value;\n return `${key} ${values}`;\n })\n .join(\"; \");\n c.res.headers.set(\"Content-Security-Policy\", directives);\n }\n }\n if (headers.permissionsPolicy) {\n const policy = Object.entries(headers.permissionsPolicy)\n .map(([key, value]) => `${key}=(${value.join(\" \")})`)\n .join(\", \");\n c.res.headers.set(\"Permissions-Policy\", policy);\n }\n });\n }\n\n registerFeature(feature: Feature): void {\n if (this.initialized) {\n throw new Error(\"Cannot register features after initialization\");\n }\n\n if (feature.peerDependencies) {\n for (const dep of feature.peerDependencies) {\n try {\n import(dep);\n } catch {\n console.warn(\n `⚠️ Warning: Feature '${feature.name}' requires peer dependency: ${dep}`,\n );\n }\n }\n }\n\n this.features.set(feature.name, feature);\n console.log(`πŸ“¦ Registered feature: ${feature.name}`);\n }\n\n private validateFeatureDependencies(): void {\n for (const [name, feature] of this.features) {\n if (feature.dependencies) {\n for (const dep of feature.dependencies) {\n if (!this.features.has(dep)) {\n throw new Error(\n `Feature '${name}' requires feature '${dep}' which is not registered`,\n );\n }\n }\n }\n }\n }\n\n private async validatePeerDependencies(): Promise<void> {\n for (const [featureName, feature] of this.features) {\n if (feature.peerDependencies) {\n for (const dep of feature.peerDependencies) {\n // In Node/Bun dynamic import usually works for installed packages\n // We can skip hard failure here or make it safer\n }\n }\n }\n }\n\n private sortFeaturesByDependencies(): Feature[] {\n const sorted: Feature[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (name: string) => {\n if (visited.has(name)) return;\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected for feature: ${name}`);\n }\n\n visiting.add(name);\n const feature = this.features.get(name)!;\n\n if (feature.dependencies) {\n for (const dep of feature.dependencies) {\n visit(dep);\n }\n }\n\n visiting.delete(name);\n visited.add(name);\n sorted.push(feature);\n };\n\n for (const name of this.features.keys()) {\n visit(name);\n }\n\n return sorted;\n }\n\n private async initializeFeature(feature: Feature): Promise<void> {\n console.log(`βš™οΈ Initializing feature: ${feature.name}`);\n await feature.initialize(this);\n\n if (feature.routes) {\n feature.routes(this.app);\n }\n }\n\n getApp(): Hono {\n return this.app;\n }\n\n getFeature<T extends Feature>(name: string): T | undefined {\n return this.features.get(name) as T;\n }\n\n private server: any;\n\n async start(): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n // Iskra uses Bun, so we can use Bun.serve\n // Hono handles this automatically if using the right adapter or just passing app.fetch to Bun.serve\n // But let's assume standard Bun usage from the user\n console.log(\n `🌐 Server running at http://${this.config.hostname}:${this.config.port}`,\n );\n\n if (typeof Bun !== \"undefined\") {\n this.server = Bun.serve({\n port: this.config.port,\n hostname: this.config.hostname,\n fetch: this.app.fetch,\n });\n } else {\n console.warn(\"Not running in Bun, start() might strictly need an adapter.\");\n }\n }\n\n async shutdown(): Promise<void> {\n console.log(\"πŸ›‘ Shutting down...\");\n\n if (this.server) {\n this.server.stop();\n this.server = null;\n }\n\n const features = Array.from(this.features.values()).reverse();\n for (const feature of features) {\n if (feature.shutdown) {\n await feature.shutdown();\n }\n }\n console.log(\"πŸ‘‹ Server shut down gracefully\");\n }\n}\n","import type { App, Driver } from '@iskra-bun/core';\nimport { Hono } from 'hono';\nimport { Kernel } from './kernel';\nimport type { Feature, KernelConfig } from './types';\n\nexport interface WebPluginConfig extends KernelConfig {\n router?: Hono;\n features?: Feature[];\n}\n\nexport class WebPlugin implements Driver {\n name = 'WebPlugin';\n private app: App | null = null;\n private kernel: Kernel;\n private runningServer: any;\n private router?: Hono;\n\n constructor(config: WebPluginConfig = {}) {\n const { router, features, ...kernelConfig } = config;\n this.kernel = new Kernel(kernelConfig);\n this.router = router;\n\n if (features) {\n for (const feature of features) {\n this.kernel.registerFeature(feature);\n }\n }\n }\n\n async init(app: App) {\n this.app = app;\n await this.kernel.initialize();\n\n if (this.router) {\n this.kernel.getApp().route('/', this.router);\n }\n }\n\n getHonoApp(): Hono {\n return this.kernel.getApp();\n }\n\n async start() {\n this.app?.logger.info(`Starting WebPlugin...`);\n // We let the kernel start or we start it manually using Bun\n // Kernel.start() does Bun.serve.\n await this.kernel.start();\n this.runningServer = true; // Placeholder, Kernel.start() might block or not return server instance directly\n }\n\n async stop() {\n await this.kernel.shutdown();\n this.app?.logger.info('WebPlugin stopped');\n }\n}\n","import { OpenAPIHono, createRoute } from '@hono/zod-openapi';\nimport { z } from 'zod';\nimport type { Driver, App } from '@iskra-bun/core';\nimport type { RouteOptions } from './router';\n\nexport interface WebServerOptions {\n port?: number;\n routes?: RouteOptions[];\n debug?: boolean;\n openApi?: {\n path: string;\n title: string;\n version: string;\n };\n}\n\nexport class WebDriver implements Driver {\n name = 'WebDriver';\n private app: App | null = null;\n private server: OpenAPIHono;\n private options: WebServerOptions;\n private runningServer: any;\n\n constructor(options: WebServerOptions = {}) {\n this.options = options;\n this.server = new OpenAPIHono();\n }\n\n init(app: App) {\n this.app = app;\n this.setupSecurityHeaders();\n this.setupRoutes();\n this.setupOpenApi();\n }\n\n // Apply the same standard security headers as the Kernel HTTP stack\n // (web-kit/src/kernel.ts) so the standalone WebDriver server is at parity.\n private setupSecurityHeaders() {\n this.server.use('*', async (c, next) => {\n await next();\n c.res.headers.set('X-Frame-Options', 'SAMEORIGIN');\n c.res.headers.set('X-Content-Type-Options', 'nosniff');\n c.res.headers.set('X-XSS-Protection', '1; mode=block');\n c.res.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');\n });\n }\n\n private setupOpenApi() {\n if (this.options.openApi) {\n this.server.doc(this.options.openApi.path, {\n openapi: '3.0.0',\n info: {\n version: this.options.openApi.version,\n title: this.options.openApi.title,\n },\n });\n }\n }\n\n private setupRoutes() {\n if (!this.options.routes) return;\n\n for (const route of this.options.routes) {\n // Map simple RouteOptions to OpenAPI RouteConfig\n // We assume JSON for body\n\n const routeConfig: any = {\n method: route.method.toLowerCase(),\n path: route.path,\n tags: route.doc?.tags,\n summary: route.doc?.summary,\n description: route.doc?.description,\n request: {},\n responses: {\n 200: {\n description: 'Successful response',\n content: {\n 'application/json': {\n schema: z.any() // We don't enforce response schema yet\n }\n }\n },\n 500: {\n description: 'Internal Server Error'\n }\n }\n };\n\n if (route.schema?.body) {\n routeConfig.request.body = {\n content: {\n 'application/json': {\n schema: route.schema.body\n }\n }\n };\n }\n if (route.schema?.query) {\n routeConfig.request.query = route.schema.query;\n }\n if (route.schema?.params) {\n routeConfig.request.params = route.schema.params;\n }\n\n const openApiRoute = createRoute(routeConfig);\n\n this.server.openapi(openApiRoute, async (c) => {\n if (!this.app) throw new Error('App not initialized');\n\n const webCtx = {\n raw: c,\n // Hono/zod-openapi puts validated data in c.req.valid('json') etc similar to validator middleware\n body: route.schema?.body ? (c as any).req.valid('json') : undefined,\n query: route.schema?.query ? (c as any).req.valid('query') : undefined,\n params: c.req.param(),\n app: this.app\n };\n\n try {\n const result = await route.handler(webCtx);\n if (result instanceof Response) return result;\n return c.json(result);\n } catch (err: any) {\n // Log the detail server-side; never serialize the raw error\n // message (it may embed connection strings or other secrets)\n // to the client. Return only a generic body.\n this.app.logger.error(err);\n return c.json({ error: 'Internal Server Error' }, 500);\n }\n });\n }\n }\n\n start() {\n const port = this.options.port || 3000;\n this.app?.logger.info(`Starting WebServer on port ${port}...`);\n\n // Bun.serve works with OpenAPIHono just like Hono\n this.runningServer = Bun.serve({\n fetch: this.server.fetch,\n port\n });\n }\n\n stop() {\n if (this.runningServer) {\n this.runningServer.stop();\n }\n this.app?.logger.info('WebServer stopped');\n }\n}\n","import type { Hono, Context } from 'hono';\nimport { z } from 'zod';\nimport { zValidator } from '@hono/zod-validator';\nimport type { App } from '@iskra-bun/core';\nimport type { Driver } from '@iskra-bun/core';\n\nexport interface RouteOptions<B = any, Q = any> {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n schema?: {\n body?: z.ZodType<B>;\n query?: z.ZodType<Q>;\n params?: z.ZodType;\n };\n handler: (ctx: WebContext<B, Q>) => Promise<any> | any;\n doc?: {\n summary?: string;\n tags?: string[];\n description?: string;\n };\n}\n\nexport interface WebContext<B = any, Q = any> {\n raw: Context;\n body: B;\n query: Q;\n params: Record<string, string>;\n app: App;\n}\n\nexport const createRouter = (routes: RouteOptions[]) => routes;\n","import type { Feature, CorsConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport { cors } from \"hono/cors\";\n\nexport class CorsFeature implements Feature {\n name = \"cors\";\n\n constructor(private config: CorsConfig = {}) {\n if (!this.config.origin) {\n this.config.origin = \"*\";\n }\n if (this.config.credentials === undefined) {\n this.config.credentials = false;\n }\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n\n const honoConfig: any = { ...this.config };\n\n if (typeof this.config.origin === \"function\") {\n honoConfig.origin = (origin: string) => {\n // @ts-expect-error - origin is narrowed to a function above\n const result = this.config.origin(origin);\n return result ? origin : null;\n };\n }\n\n app.use(\"*\", cors(honoConfig));\n console.log(\"βœ… CORS feature initialized\");\n }\n}\n","import type { Feature, ErrorHandlerConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { IskraError } from '@iskra-bun/core';\nimport { HttpError } from '../errors';\n\nexport class ErrorHandlerFeature implements Feature {\n name = \"error-handler\";\n\n private config: ErrorHandlerConfig;\n\n constructor(config: ErrorHandlerConfig = {}) {\n this.config = {\n includeStack: config.includeStack !== undefined\n ? config.includeStack\n : process.env.NODE_ENV === \"development\",\n customHandlers: config.customHandlers,\n logger: config.logger,\n };\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n\n app.onError((err, c) => {\n return this.handleError(err, c);\n });\n\n console.log(\"βœ… Error handler feature initialized\");\n }\n\n private handleError(err: Error | HTTPException, c: Context): Response {\n if (this.config.logger) {\n this.config.logger(err as Error, c);\n } else {\n console.error(\"Error:\", err);\n }\n\n // Iskra HttpError β€” convertir a HTTPException para mantener compatibilidad con Hono\n if (err instanceof HttpError) {\n const status = err.status;\n if (this.config.customHandlers?.[status]) {\n return this.config.customHandlers[status](err, c);\n }\n\n const response: any = {\n error: err.message,\n status,\n code: err.code,\n };\n\n if (Object.keys(err.context).length > 0) {\n response.context = err.context;\n }\n\n if (this.config.includeStack && err.stack) {\n response.stack = err.stack;\n }\n\n const requestId = c.get(\"requestId\");\n if (requestId) response.requestId = requestId;\n\n return c.json(response, status as any);\n }\n\n // IskraError genΓ©rico (no-HTTP) β€” devolver como 500\n if (err instanceof IskraError) {\n const status = 500;\n if (this.config.customHandlers?.[status]) {\n return this.config.customHandlers[status](err, c);\n }\n\n const response: any = {\n error: this.config.includeStack ? err.message : \"Internal Server Error\",\n status,\n code: err.code,\n };\n\n if (this.config.includeStack && err.stack) {\n response.stack = err.stack;\n }\n\n const requestId = c.get(\"requestId\");\n if (requestId) response.requestId = requestId;\n\n return c.json(response, status);\n }\n\n // Hono HTTPException nativa\n if (err instanceof HTTPException) {\n const status = err.status;\n if (this.config.customHandlers?.[status]) {\n return this.config.customHandlers[status](err, c);\n }\n\n const response: any = {\n error: err.message || this.getStatusText(status),\n status,\n };\n\n if (this.config.includeStack && err.stack) {\n response.stack = err.stack;\n }\n\n return c.json(response, status);\n }\n\n // Error genΓ©rico\n const status = 500;\n if (this.config.customHandlers?.[status]) {\n return this.config.customHandlers[status](err, c);\n }\n\n const response: any = {\n error: this.config.includeStack ? err.message : \"Internal Server Error\",\n status,\n };\n\n if (this.config.includeStack && err.stack) {\n response.stack = err.stack;\n }\n\n const requestId = c.get(\"requestId\");\n if (requestId) {\n response.requestId = requestId;\n }\n\n return c.json(response, status);\n }\n\n private getStatusText(status: number): string {\n const statusTexts: Record<number, string> = {\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 500: \"Internal Server Error\",\n };\n return statusTexts[status] || \"Error\";\n }\n}\n\nexport function createHttpError(status: number, message: string): HTTPException {\n // @ts-expect-error - status is a number, HTTPException expects a ContentfulStatusCode\n return new HTTPException(status, { message });\n}\n","import { IskraError, ErrorCodes, type ErrorCode } from '@iskra-bun/core';\nimport { HTTPException } from 'hono/http-exception';\n\n// ─── HTTP Errors ─────────────────────────────────────────────────────────────\n\nexport class HttpError extends IskraError {\n public readonly status: number;\n\n constructor(status: number, message: string, options?: { code?: ErrorCode; cause?: Error; context?: Record<string, unknown> }) {\n super(message, { code: options?.code ?? ErrorCodes.INTERNAL_ERROR, cause: options?.cause, context: options?.context });\n this.name = 'HttpError';\n this.status = status;\n }\n\n toHTTPException(): HTTPException {\n return new HTTPException(this.status as any, { message: this.message, cause: this });\n }\n}\n\n// ─── Validation Error ────────────────────────────────────────────────────────\n\nexport class ValidationError extends HttpError {\n public readonly details: unknown;\n\n constructor(message: string, details?: unknown, options?: { cause?: Error; context?: Record<string, unknown> }) {\n super(400, message, { code: ErrorCodes.VALIDATION_ERROR, ...options });\n this.name = 'ValidationError';\n this.details = details;\n }\n}\n\n// ─── Auth Error ──────────────────────────────────────────────────────────────\n\nexport class AuthError extends HttpError {\n constructor(message: string = 'Unauthorized', options?: { cause?: Error; context?: Record<string, unknown> }) {\n super(401, message, { code: ErrorCodes.UNAUTHORIZED, ...options });\n this.name = 'AuthError';\n }\n}\n\n// ─── Forbidden Error ─────────────────────────────────────────────────────────\n\nexport class ForbiddenError extends HttpError {\n constructor(message: string = 'Forbidden', options?: { cause?: Error; context?: Record<string, unknown> }) {\n super(403, message, { code: ErrorCodes.FORBIDDEN, ...options });\n this.name = 'ForbiddenError';\n }\n}\n\n// ─── Not Found Error ─────────────────────────────────────────────────────────\n\nexport class NotFoundError extends HttpError {\n constructor(message: string = 'Not Found', options?: { cause?: Error; context?: Record<string, unknown> }) {\n super(404, message, { code: ErrorCodes.NOT_FOUND, ...options });\n this.name = 'NotFoundError';\n }\n}\n\n// ─── Conflict Error ──────────────────────────────────────────────────────────\n\nexport class ConflictError extends HttpError {\n constructor(message: string = 'Conflict', options?: { cause?: Error; context?: Record<string, unknown> }) {\n super(409, message, { code: ErrorCodes.CONFLICT, ...options });\n this.name = 'ConflictError';\n }\n}\n","import type { Feature, HealthCheckConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context } from \"hono\";\n\nexport class HealthCheckFeature implements Feature {\n name = \"health\";\n\n private kernel?: Kernel;\n private config: Required<Omit<HealthCheckConfig, \"checks\" | \"readinessChecks\">> & {\n checks?: HealthCheckConfig[\"checks\"];\n };\n private readinessChecks: Map<string, () => Promise<boolean>>;\n\n constructor(config: HealthCheckConfig = {}) {\n this.config = {\n path: config.path || \"/health\",\n readinessPath: config.readinessPath || \"/health/ready\",\n livenessPath: config.livenessPath || \"/health/live\",\n includeDetails: config.includeDetails !== undefined ? config.includeDetails : false,\n checks: config.checks,\n };\n const initial = config.readinessChecks ?? {};\n this.readinessChecks = new Map(Object.entries(initial));\n }\n\n addReadinessCheck(name: string, check: () => Promise<boolean>): void {\n this.readinessChecks = new Map([...this.readinessChecks, [name, check]]);\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n this.kernel = kernel;\n const app = kernel.getApp();\n\n app.get(this.config.path, async (c: Context) => await this.handleHealthCheck(c));\n app.get(this.config.readinessPath, async (c: Context) => await this.handleReadinessCheck(c));\n app.get(this.config.livenessPath, async (c: Context) => await this.handleLivenessCheck(c));\n\n console.log(\"βœ… Health check feature initialized\");\n }\n\n private async handleHealthCheck(c: Context) {\n const response: any = {\n status: \"ok\",\n timestamp: new Date().toISOString(),\n };\n\n if (this.config.includeDetails && this.kernel) {\n // @ts-expect-error - features is a private kernel field accessed for diagnostics\n response.features = Array.from(this.kernel.features.keys());\n const featureHealth: any = {};\n\n const dbFeature = this.kernel.getFeature(\"db\");\n if (dbFeature) await this.checkFeatureHealth(c, dbFeature, featureHealth, \"db\", \"query\", \"SELECT 1\");\n\n const cacheFeature = this.kernel.getFeature(\"cache\");\n if (cacheFeature) await this.checkFeatureHealth(c, cacheFeature, featureHealth, \"cache\", \"exists\", \"__health_check__\");\n\n if (Object.keys(featureHealth).length > 0) {\n response.checks = featureHealth;\n }\n\n if (this.config.checks) {\n const customChecks: any = {};\n for (const [name, check] of Object.entries(this.config.checks)) {\n try {\n customChecks[name] = await check(c);\n } catch (error) {\n // Log the detail server-side; never serialize the raw error\n // (it may embed connection strings or other secrets) to the client.\n console.error(`Health custom check \"${name}\" failed:`, error);\n customChecks[name] = { status: \"error\" };\n }\n }\n response.customChecks = customChecks;\n }\n }\n\n return c.json(response);\n }\n\n private async checkFeatureHealth(c: Context, feature: any, report: any, key: string, method: string, ...args: any[]) {\n try {\n // Abstracted check logic\n const instance = c.get(key as any);\n if (instance && typeof instance[method] === \"function\") {\n await instance[method](...args);\n report[key] = { status: \"ok\" };\n }\n } catch (e) {\n // Log server-side; return only a generic status so DB/cache error\n // strings (which can carry connection details) never reach the client.\n console.error(`Health feature check \"${key}\" failed:`, e);\n report[key] = { status: \"error\" };\n }\n }\n\n private async handleReadinessCheck(c: Context) {\n if (this.readinessChecks.size === 0) {\n return c.json({ status: \"ready\" });\n }\n\n const results: Record<string, boolean> = {};\n const failed: string[] = [];\n\n for (const [name, check] of this.readinessChecks) {\n try {\n const passed = await check();\n results[name] = passed;\n if (!passed) failed.push(name);\n } catch {\n results[name] = false;\n failed.push(name);\n }\n }\n\n if (failed.length > 0) {\n return c.json({ status: \"not ready\", checks: results, failed }, 503);\n }\n\n return c.json({ status: \"ready\", checks: results });\n }\n\n private async handleLivenessCheck(c: Context) {\n return c.json({\n status: \"alive\",\n timestamp: new Date().toISOString(),\n uptime: process.uptime()\n });\n }\n}\n","import type { Feature, LoggerConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n logger: any;\n }\n}\n\n// Simple Logger implementation to avoid heavy dependency unless necessary\nclass SimpleLogger {\n constructor(private config: LoggerConfig) { }\n\n info(message: string, ...args: any[]) {\n if (this.shouldLog(\"info\")) console.log(`[INFO] ${message}`, ...args);\n }\n error(message: string, ...args: any[]) {\n if (this.shouldLog(\"error\")) console.error(`[ERROR] ${message}`, ...args);\n }\n warn(message: string, ...args: any[]) {\n if (this.shouldLog(\"warn\")) console.warn(`[WARN] ${message}`, ...args);\n }\n debug(message: string, ...args: any[]) {\n if (this.shouldLog(\"debug\")) console.debug(`[DEBUG] ${message}`, ...args);\n }\n\n private shouldLog(level: string) {\n // Basic level check (can be improved)\n return true;\n }\n}\n\nexport class LoggerFeature implements Feature {\n name = \"logger\";\n\n private config: LoggerConfig;\n private logger: SimpleLogger;\n\n constructor(config: LoggerConfig = {}) {\n this.config = config;\n this.logger = new SimpleLogger(config);\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n\n app.use(\"*\", async (c: Context, next: Next) => {\n c.set(\"logger\", this.logger);\n await next();\n });\n\n if (this.config.logRequests) {\n app.use(\"*\", async (c: Context, next: Next) => {\n const start = Date.now();\n const requestId = c.get(\"requestId\");\n this.logger.info(`Incoming request ${c.req.method} ${c.req.path}`, { requestId });\n\n await next();\n\n const duration = Date.now() - start;\n if (this.config.logResponses) {\n this.logger.info(`Request completed ${c.res.status} ${duration}ms`, { requestId });\n }\n });\n }\n\n console.log(\"βœ… Logger feature initialized\");\n }\n}\n","import type { Feature, RequestIdConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\n\n// Extend Hono's context with requestId\ndeclare module \"hono\" {\n interface ContextVariableMap {\n requestId: string;\n }\n}\n\nexport class RequestIdFeature implements Feature {\n name = \"request-id\";\n\n private config: Required<RequestIdConfig>;\n\n constructor(config: RequestIdConfig = {}) {\n this.config = {\n headerName: config.headerName || \"X-Request-ID\",\n generator: config.generator || this.defaultGenerator,\n };\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n\n app.use(\"*\", async (c: Context, next: Next) => {\n let requestId = c.req.header(this.config.headerName);\n\n if (!requestId) {\n requestId = this.config.generator();\n }\n\n c.set(\"requestId\", requestId);\n await next();\n c.res.headers.set(this.config.headerName, requestId);\n });\n\n console.log(\"βœ… Request ID feature initialized\");\n }\n\n private defaultGenerator(): string {\n return crypto.randomUUID();\n }\n}\n","import type { Feature } from \"../../types\";\nimport type { Kernel } from \"../../kernel\";\nimport type { StorageConfig } from \"@iskra-bun/storage-kit\";\nimport { BaseStorageAdapter, createStorageAdapter } from \"@iskra-bun/storage-kit\";\nimport type { Context, Next } from \"hono\";\n\nexport { BaseStorageAdapter, LocalStorageAdapter } from \"@iskra-bun/storage-kit\";\nexport type { StorageConfig, StorageFile } from \"@iskra-bun/storage-kit\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n storage: BaseStorageAdapter;\n }\n}\n\nexport class StorageFeature implements Feature {\n name = \"storage\";\n private adapter?: BaseStorageAdapter;\n\n constructor(private config: StorageConfig) { }\n\n async initialize(kernel: Kernel): Promise<void> {\n this.adapter = await createStorageAdapter(this.config);\n await this.adapter.connect();\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n c.set(\"storage\", this.adapter!);\n await next();\n });\n\n console.log(`βœ… StorageFeature initialized - ${this.config.adapter}`);\n }\n\n async shutdown(): Promise<void> {\n if (this.adapter) {\n await this.adapter.disconnect();\n }\n }\n\n getAdapter(): BaseStorageAdapter | undefined {\n return this.adapter;\n }\n}\n","import type { Feature, DbConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { drizzle, type PostgresJsDatabase } from 'drizzle-orm/postgres-js';\nimport { drizzle as drizzleMysql, type MySql2Database } from 'drizzle-orm/mysql2';\nimport { drizzle as drizzleBunSqlite, type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite';\nimport postgres from 'postgres';\nimport mysql from 'mysql2/promise';\nimport { Database } from 'bun:sqlite';\n\n/**\n * The Drizzle database handle a {@link DbFeature} exposes, parameterized by the\n * caller's schema. A union of the supported dialect databases β€” all share the\n * same `TSchema extends Record<string, unknown> = Record<string, never>`\n * parameter, so passing a schema types `db.query.*` for opt-in callers while the\n * default `Record<string, never>` reproduces the historical untyped behavior.\n */\nexport type WebKitDrizzleDb<TSchema extends Record<string, unknown> = Record<string, never>> =\n | PostgresJsDatabase<TSchema>\n | MySql2Database<TSchema>\n | BunSQLiteDatabase<TSchema>;\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n db: WebKitDrizzleDb;\n }\n}\n\nexport class DbFeature<TSchema extends Record<string, unknown> = Record<string, never>> implements Feature {\n name = \"db\";\n private client: any;\n public db!: WebKitDrizzleDb<TSchema>;\n public readonly adapter: string;\n\n constructor(private config: DbConfig) {\n this.adapter = config.adapter;\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const config = this.config;\n console.log(`βš™οΈ Initializing DB driver: ${config.adapter}`);\n\n try {\n switch (config.adapter) {\n case 'postgres': {\n if (!config.connection) throw new Error(\"Missing connection info\");\n const pgConfig = config.connection.connectionString ? config.connection.connectionString : {\n host: config.connection.host || 'localhost',\n port: config.connection.port || 5432,\n database: config.connection.database!,\n user: config.connection.user!,\n password: config.connection.password!\n };\n this.client = postgres(pgConfig as any);\n this.db = drizzle<TSchema>(this.client);\n break;\n }\n case 'mysql': {\n if (!config.connection) throw new Error(\"Missing connection info\");\n const mysqlConfig = config.connection.connectionString ? config.connection.connectionString : {\n host: config.connection.host || 'localhost',\n port: config.connection.port || 3306,\n database: config.connection.database!,\n user: config.connection.user!,\n password: config.connection.password!\n };\n this.client = await mysql.createConnection(mysqlConfig as any);\n this.db = drizzleMysql<TSchema>(this.client);\n break;\n }\n case 'sqlite': {\n const url = config.connection?.database || ':memory:';\n this.client = new Database(url);\n this.db = drizzleBunSqlite<TSchema>(this.client);\n break;\n }\n default:\n throw new Error(`Unsupported DB adapter: ${config.adapter}`);\n }\n console.log('βœ… DB connected successfully.');\n } catch (error) {\n // Log only the message β€” the full error/config object can embed the\n // connection string (host, user, password) and must not be logged.\n const message = error instanceof Error ? error.message : String(error);\n console.error(`❌ Failed to connect to DB: ${message}`);\n throw error;\n }\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n c.set(\"db\", this.db as WebKitDrizzleDb);\n await next();\n });\n }\n\n async shutdown(): Promise<void> {\n if (this.client) {\n if (this.client.end) {\n await this.client.end();\n } else if (this.client.close) {\n this.client.close();\n }\n }\n }\n}\n","import type { Feature, CacheConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport Redis from \"ioredis\";\n\n// Standard Cache Interface\nexport interface CacheAdapter {\n get(key: string): Promise<any>;\n set(key: string, value: any, ttl?: number): Promise<void>;\n delete(key: string): Promise<void>;\n exists(key: string): Promise<boolean>;\n increment?(key: string): Promise<number>;\n disconnect?(): Promise<void>;\n}\n\n// Simple Memory Adapter\nclass MemoryAdapter implements CacheAdapter {\n private store = new Map<string, { value: any, expires: number | null }>();\n\n async get(key: string) {\n const item = this.store.get(key);\n if (!item) return null;\n if (item.expires && item.expires < Date.now()) {\n this.store.delete(key);\n return null;\n }\n return item.value;\n }\n\n async set(key: string, value: any, ttl?: number) {\n const expires = ttl ? Date.now() + ttl * 1000 : null;\n this.store.set(key, { value, expires });\n }\n\n async delete(key: string) {\n this.store.delete(key);\n }\n\n async exists(key: string) {\n return this.store.has(key);\n }\n\n async increment(key: string): Promise<number> {\n const item = this.store.get(key);\n if (!item || (item.expires && item.expires < Date.now())) {\n return 0;\n }\n const newVal = Number(item.value) + 1;\n item.value = newVal;\n return newVal;\n }\n}\n\n// Redis Adapter\nclass RedisAdapter implements CacheAdapter {\n private client: Redis;\n\n constructor(options: any) {\n this.client = new Redis(options);\n }\n\n async get(key: string) {\n const value = await this.client.get(key);\n try {\n return value ? JSON.parse(value) : null;\n } catch {\n return value;\n }\n }\n\n async set(key: string, value: any, ttl?: number) {\n const stringValue = typeof value === 'string' ? value : JSON.stringify(value);\n if (ttl) {\n await this.client.set(key, stringValue, 'EX', ttl);\n } else {\n await this.client.set(key, stringValue);\n }\n }\n\n async delete(key: string) {\n await this.client.del(key);\n }\n\n async exists(key: string) {\n const result = await this.client.exists(key);\n return result === 1;\n }\n\n async increment(key: string): Promise<number> {\n return await this.client.incr(key);\n }\n\n async disconnect() {\n await this.client.quit();\n }\n}\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n cache: CacheAdapter;\n }\n}\n\nexport class CacheFeature implements Feature {\n name = \"cache\";\n public client!: CacheAdapter;\n\n constructor(private config: CacheConfig = { adapter: \"memory\" }) { }\n\n async initialize(kernel: Kernel): Promise<void> {\n console.log(`βš™οΈ Initializing Cache: ${this.config.adapter}`);\n\n if (this.config.adapter === \"redis\") {\n const conn = this.config.connection || {};\n try {\n this.client = new RedisAdapter({\n host: conn.host || \"localhost\",\n port: conn.port || 6379,\n password: conn.password,\n db: conn.db || 0\n });\n } catch (err) {\n console.warn(\"⚠️ Redis connection failed, falling back to memory cache\");\n this.client = new MemoryAdapter();\n }\n } else {\n this.client = new MemoryAdapter();\n }\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n c.set(\"cache\", this.client);\n await next();\n });\n\n console.log('βœ… Cache initialized.');\n }\n\n async shutdown(): Promise<void> {\n if (this.client.disconnect) {\n await this.client.disconnect();\n }\n }\n}\n","import type { Feature, SessionConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { getCookie, setCookie, deleteCookie } from \"hono/cookie\";\nimport { createHmac } from \"crypto\";\nimport { sql, eq } from \"drizzle-orm\";\nimport { pgTable, text as pgText, bigint as pgBigint } from \"drizzle-orm/pg-core\";\nimport { mysqlTable, varchar as myVarchar, text as myText, bigint as myBigint } from \"drizzle-orm/mysql-core\";\nimport { sqliteTable, text as sqliteText, integer as sqliteInteger } from \"drizzle-orm/sqlite-core\";\n\n// ─── Session Store Interface ─────────────────────────────────────────────────\n\ninterface SessionStore {\n get(id: string): Promise<Record<string, any> | null>;\n set(id: string, data: Record<string, any>, ttl: number): Promise<void>;\n destroy(id: string): Promise<void>;\n}\n\n// ─── Memory Store ────────────────────────────────────────────────────────────\n\nclass MemorySessionStore implements SessionStore {\n private store = new Map<string, { data: Record<string, any>; expiresAt: number }>();\n private cleanupInterval: ReturnType<typeof setInterval>;\n\n constructor() {\n this.cleanupInterval = setInterval(() => this.cleanup(), 300_000);\n }\n\n async get(id: string) {\n const entry = this.store.get(id);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(id);\n return null;\n }\n return entry.data;\n }\n\n async set(id: string, data: Record<string, any>, ttl: number) {\n this.store.set(id, { data, expiresAt: Date.now() + ttl * 1000 });\n }\n\n async destroy(id: string) {\n this.store.delete(id);\n }\n\n private cleanup() {\n const now = Date.now();\n for (const [key, entry] of this.store.entries()) {\n if (now > entry.expiresAt) this.store.delete(key);\n }\n }\n\n dispose() {\n clearInterval(this.cleanupInterval);\n }\n}\n\n// ─── Cache Store ─────────────────────────────────────────────────────────────\n\nclass CacheSessionStore implements SessionStore {\n constructor(private cache: any) { }\n\n async get(id: string) {\n const data = await this.cache.get(`session:${id}`);\n return data || null;\n }\n\n async set(id: string, data: Record<string, any>, ttl: number) {\n await this.cache.set(`session:${id}`, data, ttl);\n }\n\n async destroy(id: string) {\n await this.cache.delete(`session:${id}`);\n }\n}\n\n// ─── DB Store ────────────────────────────────────────────────────────────────\n\ntype SessionDialect = \"postgres\" | \"mysql\" | \"sqlite\";\n\n// One table definition per dialect (column types differ). The Drizzle query\n// builder parameterizes every value, so user data in a session can never break\n// out of a SQL string.\nconst sessionTables = {\n postgres: pgTable(\"sessions\", {\n id: pgText(\"id\").primaryKey(),\n data: pgText(\"data\").notNull(),\n expiresAt: pgBigint(\"expires_at\", { mode: \"number\" }).notNull(),\n }),\n mysql: mysqlTable(\"sessions\", {\n id: myVarchar(\"id\", { length: 255 }).primaryKey(),\n data: myText(\"data\").notNull(),\n expiresAt: myBigint(\"expires_at\", { mode: \"number\" }).notNull(),\n }),\n sqlite: sqliteTable(\"sessions\", {\n id: sqliteText(\"id\").primaryKey(),\n data: sqliteText(\"data\").notNull(),\n expiresAt: sqliteInteger(\"expires_at\").notNull(),\n }),\n} as const;\n\nconst createTableDdl: Record<SessionDialect, string> = {\n postgres: \"CREATE TABLE IF NOT EXISTS sessions (id TEXT PRIMARY KEY, data TEXT NOT NULL, expires_at BIGINT NOT NULL)\",\n mysql: \"CREATE TABLE IF NOT EXISTS sessions (id VARCHAR(255) PRIMARY KEY, data TEXT NOT NULL, expires_at BIGINT NOT NULL)\",\n sqlite: \"CREATE TABLE IF NOT EXISTS sessions (id TEXT PRIMARY KEY, data TEXT NOT NULL, expires_at INTEGER NOT NULL)\",\n};\n\nclass DbSessionStore implements SessionStore {\n private initialized = false;\n private dialect: SessionDialect;\n private table: (typeof sessionTables)[SessionDialect];\n\n constructor(private db: any, dialect: SessionDialect = \"sqlite\") {\n this.dialect = sessionTables[dialect] ? dialect : \"sqlite\";\n this.table = sessionTables[this.dialect];\n }\n\n private async ensureTable() {\n if (this.initialized) return;\n try {\n const ddl = sql.raw(createTableDdl[this.dialect]);\n // sqlite drivers expose run(); postgres/mysql expose execute().\n if (this.dialect === \"sqlite\") {\n await this.db.run(ddl);\n } else {\n await this.db.execute(ddl);\n }\n } catch (err) {\n console.error(\"[session] Failed to ensure sessions table:\", err);\n }\n this.initialized = true;\n }\n\n async get(id: string) {\n await this.ensureTable();\n try {\n const rows = await this.db\n .select()\n .from(this.table)\n .where(eq(this.table.id, id))\n .limit(1);\n\n const row = rows?.[0];\n if (!row) return null;\n\n if (Date.now() > Number(row.expiresAt)) {\n await this.destroy(id);\n return null;\n }\n return JSON.parse(row.data);\n } catch (err) {\n console.error(\"[session] Failed to read session:\", err);\n return null;\n }\n }\n\n async set(id: string, data: Record<string, any>, ttl: number) {\n await this.ensureTable();\n const row = { id, data: JSON.stringify(data), expiresAt: Date.now() + ttl * 1000 };\n\n try {\n // Portable upsert: delete-then-insert works identically across all\n // three dialects without per-dialect ON CONFLICT / ON DUPLICATE syntax.\n await this.db.delete(this.table).where(eq(this.table.id, id));\n await this.db.insert(this.table).values(row);\n } catch (err) {\n console.error(\"[session] Failed to write session:\", err);\n }\n }\n\n async destroy(id: string) {\n try {\n await this.db.delete(this.table).where(eq(this.table.id, id));\n } catch (err) {\n console.error(\"[session] Failed to destroy session:\", err);\n }\n }\n}\n\n// ─── Cookie Signing ──────────────────────────────────────────────────────────\n\nfunction signValue(value: string, secret: string): string {\n const signature = createHmac(\"sha256\", secret).update(value).digest(\"base64url\");\n return `${value}.${signature}`;\n}\n\nfunction verifySignedValue(signed: string, secret: string): string | null {\n const lastDot = signed.lastIndexOf(\".\");\n if (lastDot === -1) return null;\n\n const value = signed.substring(0, lastDot);\n const signature = signed.substring(lastDot + 1);\n const expected = createHmac(\"sha256\", secret).update(value).digest(\"base64url\");\n\n if (signature !== expected) return null;\n return value;\n}\n\n// ─── Session Feature ─────────────────────────────────────────────────────────\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n session: Record<string, any>;\n sessionId: string;\n destroySession: () => Promise<void>;\n }\n}\n\nexport class SessionFeature implements Feature {\n name = \"session\";\n dependencies?: string[];\n\n private store?: SessionStore;\n private ttl: number;\n private cookieName: string;\n\n constructor(private config: SessionConfig) {\n this.ttl = config.ttl || 86400; // 24 hours default\n this.cookieName = config.cookieName || \"sid\";\n\n // Set dependencies based on store type\n if (config.store === \"cache\") {\n this.dependencies = [\"cache\"];\n } else if (config.store === \"db\") {\n this.dependencies = [\"db\"];\n }\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n console.log(`βš™οΈ Initializing Session: store=${this.config.store}`);\n\n switch (this.config.store) {\n case \"memory\":\n this.store = new MemorySessionStore();\n break;\n case \"cache\": {\n const cacheFeature = kernel.getFeature(\"cache\") as any;\n if (!cacheFeature?.client) {\n console.warn(\"⚠️ Cache feature not available, falling back to memory session store\");\n this.store = new MemorySessionStore();\n } else {\n this.store = new CacheSessionStore(cacheFeature.client);\n }\n break;\n }\n case \"db\": {\n const dbFeature = kernel.getFeature(\"db\") as any;\n if (!dbFeature?.db) {\n console.warn(\"⚠️ DB feature not available, falling back to memory session store\");\n this.store = new MemorySessionStore();\n } else {\n this.store = new DbSessionStore(dbFeature.db, dbFeature.adapter);\n }\n break;\n }\n }\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n const signedCookie = getCookie(c, this.cookieName);\n let sessionId: string | null = null;\n let session: Record<string, any> = {};\n\n if (signedCookie) {\n sessionId = verifySignedValue(signedCookie, this.config.secret);\n if (sessionId) {\n const data = await this.store!.get(sessionId);\n if (data) {\n session = data;\n } else {\n sessionId = null; // Session expired or not found\n }\n }\n }\n\n if (!sessionId) {\n sessionId = crypto.randomUUID();\n }\n\n let destroyed = false;\n\n c.set(\"session\", session);\n c.set(\"sessionId\", sessionId);\n c.set(\"destroySession\", async () => {\n destroyed = true;\n await this.store!.destroy(sessionId!);\n deleteCookie(c, this.cookieName);\n });\n\n await next();\n\n // A destroyed session must not be re-persisted (otherwise the save\n // block below would immediately recreate it and override deleteCookie).\n if (destroyed) return;\n\n // Save session after response\n const currentSession = c.get(\"session\");\n if (currentSession && Object.keys(currentSession).length > 0) {\n await this.store!.set(sessionId, currentSession, this.ttl);\n const signed = signValue(sessionId, this.config.secret);\n const opts = this.config.cookieOptions || {};\n setCookie(c, this.cookieName, signed, {\n httpOnly: true,\n sameSite: opts.sameSite || \"Lax\",\n secure: opts.secure ?? false,\n domain: opts.domain,\n path: opts.path || \"/\",\n maxAge: this.ttl,\n });\n }\n });\n\n console.log(\"βœ… Session initialized\");\n }\n\n async shutdown(): Promise<void> {\n if (this.store instanceof MemorySessionStore) {\n (this.store as any).dispose?.();\n }\n }\n}\n","import type { AuthConfig, Feature, Kernel } from \"../../types\";\nimport type { Context, Hono, Next } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { type Auth, createBetterAuth } from \"@iskra-bun/auth-kit\";\nimport { z } from \"@hono/zod-openapi\";\nimport type { DbFeature } from \"../db\";\nimport type { OpenAPIFeature } from \"../openapi\";\nimport type { User } from \"@iskra-bun/auth-kit\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n user: User | null;\n authUser: User | null;\n }\n}\n\n// ─── OpenAPI Schemas ─────────────────────────────────────────────────────────\n\nconst SignInSchema = z.object({\n email: z.string().email(),\n password: z.string().min(1),\n});\n\nconst SignUpSchema = z.object({\n email: z.string().email(),\n password: z.string().min(8),\n name: z.string().optional(),\n});\n\nconst AuthSuccessSchema = z.object({\n token: z.string().optional(),\n user: z.object({\n id: z.string(),\n email: z.string(),\n name: z.string().optional(),\n }).optional(),\n session: z.any().optional(),\n});\n\nconst SessionResponseSchema = z.object({\n session: z.any().nullable(),\n user: z.any().nullable(),\n});\n\n// ─── Auth Feature ────────────────────────────────────────────────────────────\n\nexport class AuthFeature implements Feature {\n name = \"auth\";\n dependencies = [\"db\"];\n\n private auth: Auth | undefined;\n private config: Required<Pick<AuthConfig, \"secret\" | \"basePath\">> & AuthConfig;\n private kernel?: Kernel;\n private authMode: \"oidc\" | \"email\";\n private createAuth: typeof createBetterAuth;\n\n // The second parameter is an internal seam: it defaults to the real\n // createBetterAuth and lets tests inject a fake without globally mocking the\n // @iskra-bun/auth-kit module (bun's mock.module is process-global and cannot\n // be restored, which would otherwise leak into auth-kit's own test suite).\n constructor(config: AuthConfig, createAuth: typeof createBetterAuth = createBetterAuth) {\n this.createAuth = createAuth;\n this.config = {\n ...config,\n basePath: config.basePath || \"/api/sso\",\n baseURL: config.baseURL || \"http://localhost:3000\",\n };\n\n if (config.authMode === \"oidc\" || config.authMode === \"email\") {\n this.authMode = config.authMode;\n } else {\n this.authMode = config.oidcConfig ? \"oidc\" : \"email\";\n }\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n this.kernel = kernel;\n const dbFeature = kernel.getFeature(\"db\") as unknown as DbFeature;\n if (!dbFeature) {\n throw new Error(\"AuthFeature requires DbFeature\");\n }\n\n const db = dbFeature.db;\n const adapterType = dbFeature.adapter as \"postgres\" | \"mysql\" | \"sqlite\";\n\n if (!adapterType) {\n throw new Error(\"DbFeature must expose 'adapter' type (postgres, mysql, sqlite)\");\n }\n\n // CSRF kill-switch is honored only outside production. Even if a config\n // ships with disableCSRFCheck enabled, it is neutralized in prod so CSRF\n // protection cannot be silently turned off in a deployed environment.\n const disableCSRFCheck = process.env.NODE_ENV !== \"production\"\n ? this.config.disableCSRFCheck === true\n : false;\n\n this.auth = this.createAuth({\n db,\n adapterType,\n secret: this.config.secret,\n baseURL: this.config.baseURL,\n basePath: this.config.basePath,\n trustedOrigins: this.config.trustedOrigins,\n enableEmailPassword: true,\n disableCSRFCheck,\n socialProviders: this.config.socialProviders,\n oidcConfig: this.config.oidcConfig,\n });\n\n const app = kernel.getApp();\n\n // Per-IP rate limiting on the auth routes by default, throttling\n // credential-stuffing / brute-force against sign-in and sign-up.\n app.use(`${this.config.basePath}/*`, this.authRateLimitMiddleware());\n\n app.use(\"*\", async (c: Context, next: Next) => {\n try {\n const session = await this.auth!.api.getSession({\n headers: c.req.raw.headers,\n });\n\n if (session && session.user) {\n c.set(\"user\", session.user);\n c.set(\"authUser\", session.user);\n }\n } catch (error) {\n // A failed getSession means \"not authenticated\" β€” expected for\n // anonymous requests. Surface unexpected detail at debug only;\n // never block the request on a session read.\n const logger = c.get(\"logger\");\n if (logger?.debug) logger.debug(\"Auth session read failed\", { error });\n }\n await next();\n });\n\n console.log(\"βœ… Auth feature initialized (better-auth)\");\n }\n\n // ─── Auth-route rate limiting ────────────────────────────────────────────\n private authRateLimitHits = new Map<string, { count: number; expiresAt: number }>();\n private readonly authRateLimitWindowMs = 15 * 60 * 1000;\n private readonly authRateLimitMax = 20;\n\n private authRateLimitMiddleware() {\n return async (c: Context, next: Next) => {\n const ip = c.req.header(\"x-forwarded-for\")\n || c.req.header(\"x-real-ip\")\n || \"unknown\";\n const now = Date.now();\n const entry = this.authRateLimitHits.get(ip);\n\n const next_entry = !entry || now > entry.expiresAt\n ? { count: 1, expiresAt: now + this.authRateLimitWindowMs }\n : { count: entry.count + 1, expiresAt: entry.expiresAt };\n this.authRateLimitHits.set(ip, next_entry);\n\n if (next_entry.count > this.authRateLimitMax) {\n throw new HTTPException(429, { message: \"Too many authentication attempts\" });\n }\n await next();\n };\n }\n\n routes(app: Hono): void {\n if (!this.auth) {\n throw new Error(\"Auth not initialized\");\n }\n\n const base = this.config.basePath!;\n const openapi = this.kernel?.getFeature(\"openapi\") as OpenAPIFeature | undefined;\n\n // Register explicit OpenAPI-documented routes\n if (openapi) {\n openapi.addRoute(\n {\n method: \"post\",\n path: `${base}/sign-in/email`,\n tags: [\"Auth\"],\n summary: \"Sign in with email and password\",\n request: {\n body: {\n content: { \"application/json\": { schema: SignInSchema } },\n },\n },\n responses: {\n 200: {\n description: \"Sign in successful\",\n content: { \"application/json\": { schema: AuthSuccessSchema } },\n },\n 401: { description: \"Invalid credentials\" },\n },\n },\n (c: any) => this.auth!.handler(c.req.raw),\n );\n\n openapi.addRoute(\n {\n method: \"post\",\n path: `${base}/sign-up/email`,\n tags: [\"Auth\"],\n summary: \"Create a new account\",\n request: {\n body: {\n content: { \"application/json\": { schema: SignUpSchema } },\n },\n },\n responses: {\n 200: {\n description: \"Account created\",\n content: { \"application/json\": { schema: AuthSuccessSchema } },\n },\n 400: { description: \"Validation error\" },\n },\n },\n (c: any) => this.auth!.handler(c.req.raw),\n );\n\n openapi.addRoute(\n {\n method: \"post\",\n path: `${base}/sign-out`,\n tags: [\"Auth\"],\n summary: \"Sign out\",\n responses: {\n 200: { description: \"Signed out\" },\n },\n },\n (c: any) => this.auth!.handler(c.req.raw),\n );\n\n openapi.addRoute(\n {\n method: \"get\",\n path: `${base}/get-session`,\n tags: [\"Auth\"],\n summary: \"Get current session\",\n responses: {\n 200: {\n description: \"Current session\",\n content: { \"application/json\": { schema: SessionResponseSchema } },\n },\n },\n },\n (c: any) => this.auth!.handler(c.req.raw),\n );\n }\n\n // Catch-all for all other auth routes (OAuth callbacks, etc.)\n app.on([\"POST\", \"GET\"], `${base}/*`, (c) => {\n return this.auth!.handler(c.req.raw);\n });\n }\n\n getAuth(): Auth | undefined {\n return this.auth;\n }\n}\n\nexport function requireAuth(kernel: Kernel) {\n return async (c: Context, next: Next) => {\n const authFeature = kernel.getFeature(\"auth\") as AuthFeature;\n if (!authFeature) throw new HTTPException(500, { message: \"Auth not initialized\" });\n\n const auth = authFeature.getAuth();\n if (!auth) throw new HTTPException(500, { message: \"Auth not ready\" });\n\n const session = await auth.api.getSession({ headers: c.req.raw.headers });\n if (!session || !session.user) {\n throw new HTTPException(401, { message: \"Unauthorized\" });\n }\n\n c.set(\"user\", session.user);\n c.set(\"authUser\", session.user);\n await next();\n };\n}\n","import type { Feature, RateLimitConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\n\ninterface RateLimitStore {\n get(key: string): Promise<number | null>;\n set(key: string, value: number, ttl: number): Promise<void>;\n increment(key: string, ttl: number): Promise<number>;\n}\n\nclass MemoryStore implements RateLimitStore {\n private store = new Map<string, { count: number; expiresAt: number }>();\n\n async get(key: string): Promise<number | null> {\n const entry = this.store.get(key);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return null;\n }\n return entry.count;\n }\n\n async set(key: string, value: number, ttl: number): Promise<void> {\n this.store.set(key, { count: value, expiresAt: Date.now() + ttl });\n }\n\n async increment(key: string, ttl: number): Promise<number> {\n const entry = this.store.get(key);\n if (!entry || Date.now() > entry.expiresAt) {\n this.store.set(key, { count: 1, expiresAt: Date.now() + ttl });\n return 1;\n }\n entry.count++;\n return entry.count;\n }\n\n cleanup(): void {\n const now = Date.now();\n for (const [key, entry] of this.store.entries()) {\n if (now > entry.expiresAt) this.store.delete(key);\n }\n }\n}\n\nclass CacheStoreWrapper implements RateLimitStore {\n constructor(private cache: any) { }\n\n async get(key: string): Promise<number | null> {\n return await this.cache.get(key);\n }\n\n async set(key: string, value: number, ttl: number): Promise<void> {\n await this.cache.set(key, value, ttl / 1000); // Cache feature expects seconds typically if using Redis, but check implementation\n }\n\n async increment(key: string, ttl: number): Promise<number> {\n const ttlSeconds = Math.ceil(ttl / 1000);\n const current = await this.cache.get(key);\n if (current === null) {\n await this.cache.set(key, 1, ttlSeconds);\n return 1;\n }\n // Use atomic increment if available (Redis INCR)\n if (this.cache.increment) return await this.cache.increment(key);\n\n // Fallback: increment and re-set with TTL\n const newVal = Number(current) + 1;\n await this.cache.set(key, newVal, ttlSeconds);\n return newVal;\n }\n}\n\nexport class RateLimitFeature implements Feature {\n name = \"rate-limit\";\n private config: Required<Omit<RateLimitConfig, \"keyGenerator\" | \"skip\" | \"handler\">> & {\n keyGenerator?: RateLimitConfig[\"keyGenerator\"];\n skip?: RateLimitConfig[\"skip\"];\n handler?: RateLimitConfig[\"handler\"];\n };\n private store?: RateLimitStore;\n private cleanupInterval?: ReturnType<typeof setInterval>;\n\n constructor(config: RateLimitConfig = {}) {\n this.config = {\n windowMs: config.windowMs || 15 * 60 * 1000,\n max: config.max || 100,\n standardHeaders: config.standardHeaders ?? true,\n store: config.store || \"memory\",\n keyGenerator: config.keyGenerator,\n skip: config.skip,\n handler: config.handler\n };\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n if (this.config.store === \"cache\") {\n const cacheFeature = kernel.getFeature(\"cache\") as any;\n if (cacheFeature?.client) {\n this.store = new CacheStoreWrapper(cacheFeature.client);\n } else {\n console.warn(\"⚠️ Cache feature not available for rate-limit, falling back to memory store\");\n const mem = new MemoryStore();\n this.store = mem;\n this.cleanupInterval = setInterval(() => mem.cleanup(), 300000);\n }\n }\n\n if (this.config.store === \"memory\") {\n const mem = new MemoryStore();\n this.store = mem;\n this.cleanupInterval = setInterval(() => mem.cleanup(), 300000);\n }\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n await this.middleware(c, next);\n });\n console.log(\"βœ… Rate limit feature initialized\");\n }\n\n private async middleware(c: Context, next: Next) {\n if (this.config.skip && this.config.skip(c)) {\n await next();\n return;\n }\n\n let store = this.store;\n if (!store && this.config.store === \"cache\") {\n const cache = c.get(\"cache\");\n if (cache) {\n store = new CacheStoreWrapper(cache);\n } else {\n if (!this.store) {\n this.store = new MemoryStore(); // Fallback\n this.cleanupInterval = setInterval(() => (this.store as MemoryStore).cleanup(), 300000);\n }\n store = this.store;\n }\n }\n\n if (!store) {\n await next();\n return;\n }\n\n const key = this.config.keyGenerator ? this.config.keyGenerator(c) : this.defaultKeyGenerator(c);\n const rlKey = `rate_limit:${key}`;\n const count = await store.increment(rlKey, this.config.windowMs);\n\n if (count > this.config.max) {\n if (this.config.handler) return this.config.handler(c);\n throw new HTTPException(429, { message: \"Too many requests\" });\n }\n\n if (this.config.standardHeaders) {\n c.header(\"X-RateLimit-Limit\", String(this.config.max));\n c.header(\"X-RateLimit-Remaining\", String(Math.max(0, this.config.max - count)));\n c.header(\"X-RateLimit-Reset\", String(Math.ceil((Date.now() + this.config.windowMs) / 1000)));\n }\n\n await next();\n }\n\n private defaultKeyGenerator(c: Context): string {\n return c.req.header(\"x-forwarded-for\") || c.req.header(\"x-real-ip\") || \"unknown\";\n }\n\n async shutdown() {\n if (this.cleanupInterval) clearInterval(this.cleanupInterval);\n }\n}\n","import type { Feature, PermissionsConfig, Role } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n userPermissions: string[];\n checkPermission: (permission: string) => boolean;\n hasRole: (role: string) => boolean;\n hasAnyRole: (...roles: string[]) => boolean;\n hasAllRoles: (...roles: string[]) => boolean;\n }\n}\n\nconst DEFAULT_ROLES: Record<string, Role> = {\n admin: { name: \"admin\", permissions: [\"*\"], description: \"Full access\" },\n user: { name: \"user\", permissions: [\"read:own\", \"write:own\"], description: \"User access\" },\n guest: { name: \"guest\", permissions: [\"read:public\"], description: \"Guest access\" }\n};\n\nexport class PermissionsFeature implements Feature {\n name = \"permissions\";\n dependencies = [\"auth\"];\n private config: Required<PermissionsConfig>;\n private roles: Map<string, Role> = new Map();\n\n constructor(config: PermissionsConfig = {}) {\n this.config = {\n loadPermissions: config.loadPermissions || (async () => [\"read:own\"]),\n loadRoles: config.loadRoles || (async () => [\"user\"]),\n anonymousPermissions: config.anonymousPermissions || [\"read:public\"],\n enableRBAC: config.enableRBAC ?? true,\n cachePermissions: config.cachePermissions ?? true,\n cacheTTL: config.cacheTTL || 3600\n };\n Object.values(DEFAULT_ROLES).forEach(r => this.roles.set(r.name, r));\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n await this.permissionsMiddleware(c, next, kernel);\n });\n console.log(\"βœ… Permissions feature initialized\");\n }\n\n private async permissionsMiddleware(c: Context, next: Next, _kernel: Kernel) {\n const user = c.get(\"user\") || (c.get(\"session\") as any)?.user;\n const userId = user?.id;\n\n let permissions: string[] = [];\n let roles: string[] = [];\n\n if (userId) {\n if (this.config.cachePermissions) {\n const cache = c.get(\"cache\");\n if (cache) {\n const cached = await cache.get(`permissions:${userId}`);\n if (cached) {\n permissions = cached.permissions || [];\n roles = cached.roles || [];\n }\n }\n }\n\n if (permissions.length === 0) {\n permissions = await this.config.loadPermissions(userId);\n if (this.config.enableRBAC) {\n roles = await this.config.loadRoles(userId);\n for (const rName of roles) {\n const r = this.roles.get(rName);\n if (r) permissions.push(...r.permissions);\n }\n }\n\n if (this.config.cachePermissions) {\n const cache = c.get(\"cache\");\n if (cache) {\n // Assume cache set exists and supports object storage (json stringify maybe required depending on cache impl)\n // Simple cache might require string\n await cache.set(`permissions:${userId}`, { permissions, roles }, this.config.cacheTTL);\n }\n }\n }\n } else {\n permissions = this.config.anonymousPermissions;\n }\n\n permissions = [...new Set(permissions)];\n\n c.set(\"userPermissions\", permissions);\n c.set(\"checkPermission\", (p: string) => this.checkPermission(permissions, p));\n c.set(\"hasRole\", (r: string) => roles.includes(r));\n c.set(\"hasAnyRole\", (...rs: string[]) => rs.some(r => roles.includes(r)));\n c.set(\"hasAllRoles\", (...rs: string[]) => rs.every(r => roles.includes(r)));\n\n await next();\n }\n\n private checkPermission(userPerms: string[], required: string): boolean {\n if (userPerms.includes(\"*\")) return true;\n if (userPerms.includes(required)) return true;\n\n const parts = required.split(\":\");\n for (let i = parts.length - 1; i > 0; i--) {\n const pattern = parts.slice(0, i).join(\":\") + \":*\";\n if (userPerms.includes(pattern)) return true;\n }\n return false;\n }\n}\n\nexport function requirePermission(permission: string) {\n return async (c: Context, next: Next) => {\n const check = c.get(\"checkPermission\");\n if (!check || !check(permission)) throw new HTTPException(403, { message: `Missing permission: ${permission}` });\n await next();\n };\n}\n\nexport function requireRole(role: string) {\n return async (c: Context, next: Next) => {\n const check = c.get(\"hasRole\");\n if (!check || !check(role)) throw new HTTPException(403, { message: `Missing role: ${role}` });\n await next();\n };\n}\n","import type { Feature, ApiKeyConfig, ApiKeyMetadata, ApiKeyValidationResult } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { createHash } from \"crypto\";\n\n// Resolved config: scalar/array fields are always populated by the constructor\n// defaults, while the genuinely optional callbacks stay optional. This replaces\n// the previous `as unknown as Required<ApiKeyConfig>` cast, which masked shape\n// drift by pretending the callbacks were always present.\ntype ResolvedApiKeyConfig =\n Required<Omit<ApiKeyConfig, \"vaultService\" | \"customExtractor\" | \"onError\" | \"onValidated\">>\n & Pick<ApiKeyConfig, \"vaultService\" | \"customExtractor\" | \"onError\" | \"onValidated\">;\n\n// --- ApiKeyStore ---\n\nexport class ApiKeyStore {\n private staticKeysMap: Map<string, ApiKeyMetadata> = new Map();\n private cache?: any;\n\n constructor(private config: ResolvedApiKeyConfig, private kernel: Kernel) {\n this.initializeStaticKeys();\n }\n\n private getCache() {\n if (!this.cache && this.config.enableCache) {\n const cacheFeature = this.kernel.getFeature<any>('cache');\n if (cacheFeature) {\n this.cache = cacheFeature.client;\n }\n }\n return this.cache;\n }\n\n private initializeStaticKeys(): void {\n if (!this.config.staticKeys || this.config.staticKeys.length === 0) {\n return;\n }\n\n for (const staticKey of this.config.staticKeys) {\n const metadata: ApiKeyMetadata = {\n id: this.generateId(staticKey.key),\n key: staticKey.key,\n name: staticKey.name,\n scopes: staticKey.scopes,\n rateLimit: staticKey.rateLimit,\n expiresAt: staticKey.expiresAt,\n createdAt: new Date(),\n metadata: staticKey.metadata,\n lastUsedAt: undefined // Explicitly undefined initially\n };\n\n this.staticKeysMap.set(staticKey.key, metadata);\n }\n console.log(`βœ… Loaded ${this.staticKeysMap.size} static API keys`);\n }\n\n private generateId(_key: string): string {\n // Derive the id independently of the secret key material so it can never\n // leak a usable prefix of the key. Lookup is keyed by the plaintext key\n // (staticKeysMap / cache), never by id, so a random id is sufficient.\n return crypto.randomUUID();\n }\n\n private compareKeys(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n }\n\n private isExpired(expiresAt?: Date): boolean {\n if (!expiresAt) return false;\n return new Date() > expiresAt;\n }\n\n private cacheKeyFor(key: string): string {\n // Hash the key before using it as a cache key so the plaintext secret is\n // never persisted (e.g. in Redis) where it could leak via cache dumps.\n const hash = createHash(\"sha256\").update(key).digest(\"hex\");\n return `apikey:${hash}`;\n }\n\n async validate(key: string): Promise<ApiKeyValidationResult> {\n if (!key) return { isValid: false, error: \"API key is required\" };\n\n const cache = this.getCache();\n const cacheKey = this.cacheKeyFor(key);\n\n if (cache) {\n try {\n const cached = await cache.get(cacheKey);\n if (cached) {\n const metadata = typeof cached === 'string' ? JSON.parse(cached) : cached;\n return { isValid: true, key: metadata };\n }\n } catch (err) {\n // Cache error, ignore\n }\n }\n\n // Check static keys\n for (const [staticKey, metadata] of this.staticKeysMap) {\n if (this.compareKeys(key, staticKey)) {\n if (this.isExpired(metadata.expiresAt)) {\n return { isValid: false, error: \"API key has expired\" };\n }\n // Build a derived object instead of mutating the metadata held in\n // staticKeysMap (immutability β€” the stored object must stay intact).\n const usedMetadata: ApiKeyMetadata = { ...metadata, lastUsedAt: new Date() };\n\n if (cache) {\n const ttl = this.config.cacheTtl ? Math.floor(this.config.cacheTtl / 1000) : 300;\n try {\n await cache.set(cacheKey, JSON.stringify(usedMetadata), ttl);\n } catch {\n // ignore cache write failures β€” validation already succeeded\n }\n }\n\n return { isValid: true, key: usedMetadata };\n }\n }\n\n return { isValid: false, error: \"Invalid API key\" };\n }\n\n hasScopes(key: ApiKeyMetadata, requiredScopes: string[]): boolean {\n if (!requiredScopes || requiredScopes.length === 0) return true;\n if (!key.scopes || key.scopes.length === 0) return false;\n\n for (const requiredScope of requiredScopes) {\n const hasScope = key.scopes.some((scope) => {\n if (scope.endsWith(\"*\")) {\n const prefix = scope.slice(0, -1);\n return requiredScope.startsWith(prefix);\n }\n return scope === requiredScope;\n });\n\n if (!hasScope) return false;\n }\n return true;\n }\n}\n\n// --- ApiKeyFeature ---\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n apiKey?: ApiKeyMetadata;\n apiKeyScopes?: string[];\n hasScope?: (scope: string) => boolean;\n hasAnyScope?: (...scopes: string[]) => boolean;\n hasAllScopes?: (...scopes: string[]) => boolean;\n }\n}\n\nexport class ApiKeyFeature implements Feature {\n name = \"apiKey\";\n private store?: ApiKeyStore;\n private config: ResolvedApiKeyConfig;\n\n constructor(config: ApiKeyConfig = {}) {\n // Explicit, fully-typed defaults object β€” every resolved field is assigned\n // a concrete value so shape drift surfaces at compile time instead of\n // being masked by an `as unknown as` cast.\n const defaults: ResolvedApiKeyConfig = {\n staticKeys: config.staticKeys || [],\n headerName: config.headerName || \"X-API-Key\",\n queryParamName: config.queryParamName || \"api_key\",\n extractStrategies: config.extractStrategies || [\"header\", \"bearer\"],\n vaultService: config.vaultService,\n customExtractor: config.customExtractor,\n enableCache: config.enableCache ?? true,\n cacheTtl: config.cacheTtl ?? 300000,\n requireScopes: config.requireScopes ?? false,\n skipPaths: config.skipPaths || [],\n onError: config.onError,\n onValidated: config.onValidated,\n };\n this.config = defaults;\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n this.store = new ApiKeyStore(this.config, kernel);\n const app = kernel.getApp();\n\n app.use(\"*\", async (c: Context, next: Next) => {\n if (this.shouldSkipPath(c.req.path)) {\n await next();\n return;\n }\n\n const apiKey = this.extractApiKey(c);\n if (!apiKey) {\n c.set(\"apiKey\", undefined);\n c.set(\"apiKeyScopes\", undefined);\n await next();\n return;\n }\n\n const result = await this.store!.validate(apiKey);\n if (!result.isValid) {\n throw new HTTPException(401, { message: result.error || \"Invalid API key\" });\n }\n\n // When requireScopes is enabled, a validated key that carries no scope\n // is treated as insufficiently privileged and rejected.\n if (this.config.requireScopes && !(result.key?.scopes && result.key.scopes.length > 0)) {\n throw new HTTPException(403, { message: \"API key has no scopes\" });\n }\n\n c.set(\"apiKey\", result.key);\n c.set(\"apiKeyScopes\", result.key?.scopes || []);\n\n c.set(\"hasScope\", (scope: string) => this.store!.hasScopes(result.key!, [scope]));\n c.set(\"hasAnyScope\", (...scopes: string[]) => scopes.some(s => this.store!.hasScopes(result.key!, [s])));\n c.set(\"hasAllScopes\", (...scopes: string[]) => this.store!.hasScopes(result.key!, scopes));\n\n await next();\n });\n\n console.log(\"βœ… API Key feature initialized\");\n }\n\n private shouldSkipPath(path: string): boolean {\n if (!this.config.skipPaths?.length) return false;\n return this.config.skipPaths.some(skip => {\n if (skip.endsWith(\"*\")) return path.startsWith(skip.slice(0, -1));\n return path === skip;\n });\n }\n\n private extractApiKey(c: Context): string | null {\n for (const strategy of (this.config.extractStrategies || [])) {\n let key: string | null = null;\n switch (strategy) {\n case \"header\":\n key = c.req.header(this.config.headerName) || null;\n break;\n case \"bearer\": {\n const auth = c.req.header(\"Authorization\");\n if (auth?.startsWith(\"Bearer \")) key = auth.substring(7);\n break;\n }\n case \"query\":\n key = c.req.query(this.config.queryParamName) || null;\n break;\n }\n if (key) return key;\n }\n return null;\n }\n}\n\nexport function requireApiKey() {\n return async (c: Context, next: Next) => {\n if (!c.get(\"apiKey\")) throw new HTTPException(401, { message: \"API key is required\" });\n await next();\n };\n}\n\nexport function requireScope(...scopes: string[]) {\n return async (c: Context, next: Next) => {\n const hasAll = c.get(\"hasAllScopes\");\n if (!c.get(\"apiKey\")) throw new HTTPException(401, { message: \"API key is required\" });\n if (!hasAll || !hasAll(...scopes)) throw new HTTPException(403, { message: \"Insufficient scopes\" });\n await next();\n };\n}\n","import type { Feature, CsrfConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { getCookie, setCookie } from \"hono/cookie\";\nimport { createHmac, timingSafeEqual, randomUUID } from \"crypto\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n csrfToken: string;\n }\n}\n\n// ─── Signed Double-Submit Token ──────────────────────────────────────────────\n//\n// A CSRF token is `<random>.<hmac>` where the HMAC signs the random nonce under\n// the configured secret (OWASP signed double-submit cookie). Forging a token\n// requires the secret, and an attacker can neither read nor set the victim's\n// cookie cross-origin. The nonce is intentionally NOT bound to the session id:\n// anonymous flows mint a throwaway session id per request, so binding would\n// reject the first POST of every logged-out flow.\n\nfunction constantTimeEqual(a: string, b: string): boolean {\n const aBuf = Buffer.from(a);\n const bBuf = Buffer.from(b);\n // timingSafeEqual throws on length mismatch; comparing lengths first keeps\n // the call safe. The length check is not constant-time, but token length is\n // not secret β€” the signature comparison below is what gates forgery.\n if (aBuf.length !== bBuf.length) return false;\n return timingSafeEqual(aBuf, bBuf);\n}\n\nfunction signCsrfToken(random: string, secret: string): string {\n const signature = createHmac(\"sha256\", secret)\n .update(random)\n .digest(\"base64url\");\n return `${random}.${signature}`;\n}\n\nfunction verifyCsrfToken(token: string, secret: string): boolean {\n const lastDot = token.lastIndexOf(\".\");\n if (lastDot === -1) return false;\n\n const random = token.substring(0, lastDot);\n const expected = signCsrfToken(random, secret);\n return constantTimeEqual(token, expected);\n}\n\nexport class CsrfFeature implements Feature {\n name = \"csrf\";\n private config: Required<CsrfConfig>;\n\n constructor(config: CsrfConfig) {\n if (!config.secret) throw new Error(\"CSRF secret is required\");\n this.config = {\n secret: config.secret,\n cookieName: config.cookieName || \"_csrf\",\n headerName: config.headerName || \"X-CSRF-Token\",\n ignoreMethods: config.ignoreMethods || [\"GET\", \"HEAD\", \"OPTIONS\"],\n cookieOptions: {\n httpOnly: true,\n secure: true,\n sameSite: \"Strict\",\n maxAge: 86400,\n ...config.cookieOptions\n }\n } as Required<CsrfConfig>;\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n await this.middleware(c, next);\n });\n console.log(\"βœ… CSRF feature initialized\");\n }\n\n private async middleware(c: Context, next: Next) {\n const method = c.req.method.toUpperCase();\n let token = getCookie(c, this.config.cookieName);\n\n if (!token) {\n token = signCsrfToken(randomUUID().replace(/-/g, \"\"), this.config.secret);\n setCookie(c, this.config.cookieName, token, {\n httpOnly: this.config.cookieOptions.httpOnly,\n secure: this.config.cookieOptions.secure,\n sameSite: this.config.cookieOptions.sameSite as any,\n maxAge: this.config.cookieOptions.maxAge,\n path: \"/\"\n });\n }\n\n c.set(\"csrfToken\", token);\n\n if (this.config.ignoreMethods.includes(method)) {\n await next();\n return;\n }\n\n const isValid = await this.validateToken(c, token);\n if (!isValid) {\n throw new HTTPException(403, { message: \"Invalid CSRF token\" });\n }\n\n await next();\n }\n\n private async validateToken(c: Context, expectedToken: string): Promise<boolean> {\n // The cookie token itself must carry a valid signature under the secret.\n // An unsigned or foreign token is rejected before any comparison, so a\n // token minted elsewhere cannot pass double-submit.\n if (!verifyCsrfToken(expectedToken, this.config.secret)) return false;\n\n const headerToken = c.req.header(this.config.headerName);\n if (headerToken && constantTimeEqual(headerToken, expectedToken)) return true;\n\n try {\n const contentType = c.req.header(\"content-type\");\n if (contentType?.includes(\"application/x-www-form-urlencoded\")) {\n const body = await c.req.parseBody();\n const bodyToken = body._csrf || body[this.config.cookieName];\n if (bodyToken && constantTimeEqual(String(bodyToken), expectedToken)) return true;\n }\n } catch (error) {\n // A malformed/unparseable body just means no valid body token is\n // present; fall through to rejection. Surface detail at debug only.\n const logger = c.get(\"logger\");\n if (logger?.debug) logger.debug(\"CSRF body token parse failed\", { error });\n }\n\n return false;\n }\n}\n\nexport function requireCsrf() {\n return async (c: Context, next: Next) => {\n if (!c.get(\"csrfToken\")) throw new HTTPException(403, { message: \"CSRF token required\" });\n await next();\n };\n}\n","export interface SuccessResponse<T = unknown> {\n success: true;\n data?: T;\n message?: string;\n}\n\nexport interface ErrorResponse {\n success: false;\n error: string;\n code?: string;\n details?: unknown;\n timestamp?: string;\n}\n\nexport type ApiResponse<T = unknown> = SuccessResponse<T> | ErrorResponse;\n\nexport function successResponse<T = unknown>(data?: T, message?: string): SuccessResponse<T> {\n const response: SuccessResponse<T> = { success: true };\n if (data !== undefined) response.data = data;\n if (message) response.message = message;\n return response;\n}\n\nexport function errorResponse(error: string | Error, code?: string, details?: unknown): ErrorResponse {\n const message = error instanceof Error ? error.message : error;\n const response: ErrorResponse = {\n success: false,\n error: message,\n timestamp: new Date().toISOString(),\n };\n if (code) response.code = code;\n if (details !== undefined) response.details = details;\n return response;\n}\n\n// Re-exportado desde @iskra-bun/core para compatibilidad\nexport { ErrorCodes, type ErrorCode } from '@iskra-bun/core';\n","import type { Feature } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next, Hono, Handler } from \"hono\";\nimport { z } from \"zod\";\nimport { ErrorCodes, errorResponse } from \"../responses\";\n\n// Extend Hono Context to include valid() method\ndeclare module \"hono\" {\n interface Context {\n valid<T = any>(): T;\n }\n}\n\n// Extend Hono to include *Validated methods if possible, \n// or simpler: just provide middleware factory.\n// Monkey patching Hono class is tricky in strict TS if types aren't augmented in global/module scope correctly.\n// But we can try to follow kollective's approach if we augment module \"hono\".\n\nexport interface ValidationSchema {\n params?: z.ZodSchema<any>;\n query?: z.ZodSchema<any>;\n body?: z.ZodSchema<any>;\n}\n\nexport interface ValidationOptions {\n logErrors?: boolean;\n status?: number;\n}\n\nfunction createValidationMiddleware(schema: ValidationSchema, options: ValidationOptions = {}) {\n const { logErrors = true, status = 400 } = options;\n\n return async (c: Context, next: Next) => {\n try {\n const validated: Record<string, any> = {};\n\n if (schema.params) {\n const parsed = schema.params.safeParse(c.req.param());\n if (!parsed.success) {\n return c.json(errorResponse(\"Invalid route params\", ErrorCodes.VALIDATION_ERROR, parsed.error.flatten()), status as any);\n }\n validated.params = parsed.data;\n }\n\n if (schema.query) {\n const parsed = schema.query.safeParse(c.req.query());\n if (!parsed.success) {\n return c.json(errorResponse(\"Invalid query params\", ErrorCodes.VALIDATION_ERROR, parsed.error.flatten()), status as any);\n }\n validated.query = parsed.data;\n }\n\n if (schema.body) {\n let data: unknown = {};\n const contentType = c.req.header(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n data = await c.req.json().catch(() => ({}));\n } else if (contentType.includes(\"application/x-www-form-urlencoded\") || contentType.includes(\"multipart/form-data\")) {\n data = await c.req.parseBody();\n }\n\n const parsed = schema.body.safeParse(data);\n if (!parsed.success) {\n return c.json(errorResponse(\"Invalid body\", ErrorCodes.VALIDATION_ERROR, parsed.error.flatten()), status as any);\n }\n validated.body = parsed.data;\n }\n\n // Attach to context\n (c as any).valid = () => validated;\n\n await next();\n } catch (err) {\n if (logErrors) console.error(\"Validation error:\", err);\n return c.json(errorResponse(\"Validation middleware failed\", ErrorCodes.INTERNAL_ERROR), 500);\n }\n };\n}\n\n// Helper to monkey patch Hono\nfunction extendHonoWithValidation(app: Hono) {\n const methods = [\"get\", \"post\", \"put\", \"delete\"] as const;\n for (const method of methods) {\n (app as any)[`${method}Validated`] = function (path: string, schema: ValidationSchema, handler: Handler, options?: ValidationOptions) {\n const middleware = createValidationMiddleware(schema, options);\n (this as any)[method](path, middleware, handler);\n return this;\n };\n }\n}\n\nexport class ValidationFeature implements Feature {\n name = \"validation\";\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n extendHonoWithValidation(app);\n\n // Add context helper if not already present via middleware factory logic\n // The middleware factory adds .valid() to the SPECIFIC request context\n console.log(\"βœ… Validation feature initialized\");\n }\n}\n\nexport { createValidationMiddleware };\n","import type { Feature } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Next, Hono, Handler } from \"hono\";\nimport Ajv from \"ajv\";\nimport addErrors from \"ajv-errors\";\nimport addFormats from \"ajv-formats\";\nimport type { ErrorObject } from \"ajv\";\nimport { ErrorCodes, errorResponse } from \"../responses\";\n\n// ─── Module Augmentation ────────────────────────────────────────────────────\n\ndeclare module \"hono\" {\n interface Hono {\n getJsonValidated(path: string, schema: JsonValidationSchema, handler: Handler, options?: JsonValidationOptions): Hono;\n postJsonValidated(path: string, schema: JsonValidationSchema, handler: Handler, options?: JsonValidationOptions): Hono;\n putJsonValidated(path: string, schema: JsonValidationSchema, handler: Handler, options?: JsonValidationOptions): Hono;\n deleteJsonValidated(path: string, schema: JsonValidationSchema, handler: Handler, options?: JsonValidationOptions): Hono;\n }\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface JsonValidationSchema {\n params?: Record<string, unknown>;\n query?: Record<string, unknown>;\n body?: Record<string, unknown>;\n}\n\nexport interface JsonValidationOptions {\n logErrors?: boolean;\n status?: number;\n allErrors?: boolean;\n coerceTypes?: boolean;\n}\n\nexport interface FormattedValidationErrors {\n fields: Record<string, string[]>;\n errors: string[];\n}\n\n// ─── Ajv Instance Factory ───────────────────────────────────────────────────\n\nfunction createAjvInstance(options: JsonValidationOptions = {}): Ajv {\n const ajv = new Ajv({\n allErrors: options.allErrors ?? true,\n coerceTypes: options.coerceTypes ?? true,\n verbose: true,\n $data: true,\n });\n addFormats(ajv);\n addErrors(ajv);\n return ajv;\n}\n\n// ─── Error Formatter ────────────────────────────────────────────────────────\n\nfunction formatAjvErrors(errors: ErrorObject[] | null | undefined): FormattedValidationErrors {\n const result: FormattedValidationErrors = { fields: {}, errors: [] };\n if (!errors) return result;\n\n for (const err of errors) {\n let fieldPath: string;\n\n if (err.instancePath) {\n fieldPath = err.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n } else if (err.params && \"missingProperty\" in err.params) {\n fieldPath = err.params.missingProperty as string;\n } else {\n fieldPath = \"_root\";\n }\n\n const message = err.message || \"Invalid value\";\n\n if (!result.fields[fieldPath]) {\n result.fields[fieldPath] = [];\n }\n\n if (!result.fields[fieldPath].includes(message)) {\n result.fields[fieldPath].push(message);\n }\n\n const formatted = fieldPath === \"_root\" ? message : `${fieldPath}: ${message}`;\n if (!result.errors.includes(formatted)) {\n result.errors.push(formatted);\n }\n }\n\n return result;\n}\n\n// ─── Validation Middleware ───────────────────────────────────────────────────\n\nexport function createJsonSchemaValidationMiddleware(\n schema: JsonValidationSchema,\n options: JsonValidationOptions = {},\n) {\n const { logErrors = true, status = 400 } = options;\n const ajv = createAjvInstance(options);\n\n const validators = {\n params: schema.params ? ajv.compile(schema.params) : null,\n query: schema.query ? ajv.compile(schema.query) : null,\n body: schema.body ? ajv.compile(schema.body) : null,\n };\n\n return async (c: Context, next: Next) => {\n try {\n const validated: Record<string, any> = {};\n\n if (validators.params) {\n const data = { ...c.req.param() };\n const valid = validators.params(data);\n if (!valid) {\n const details = formatAjvErrors(validators.params.errors);\n return c.json(errorResponse(\"Invalid route params\", ErrorCodes.VALIDATION_ERROR, details), status as any);\n }\n validated.params = data;\n }\n\n if (validators.query) {\n const data = { ...c.req.query() };\n const valid = validators.query(data);\n if (!valid) {\n const details = formatAjvErrors(validators.query.errors);\n return c.json(errorResponse(\"Invalid query params\", ErrorCodes.VALIDATION_ERROR, details), status as any);\n }\n validated.query = data;\n }\n\n if (validators.body) {\n let data: unknown = {};\n const contentType = c.req.header(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n data = await c.req.json().catch(() => ({}));\n } else if (contentType.includes(\"application/x-www-form-urlencoded\") || contentType.includes(\"multipart/form-data\")) {\n data = await c.req.parseBody();\n }\n\n const valid = validators.body(data);\n if (!valid) {\n const details = formatAjvErrors(validators.body.errors);\n return c.json(errorResponse(\"Invalid body\", ErrorCodes.VALIDATION_ERROR, details), status as any);\n }\n validated.body = data;\n }\n\n (c as any).valid = () => validated;\n await next();\n } catch (err) {\n if (logErrors) console.error(\"JSON Schema validation error:\", err);\n return c.json(errorResponse(\"Validation middleware failed\", ErrorCodes.INTERNAL_ERROR), 500);\n }\n };\n}\n\n// ─── Hono Extension ─────────────────────────────────────────────────────────\n\nfunction extendHonoWithJsonSchemaValidation(app: Hono) {\n const methods = [\"get\", \"post\", \"put\", \"delete\"] as const;\n for (const method of methods) {\n (app as any)[`${method}JsonValidated`] = function (\n path: string,\n schema: JsonValidationSchema,\n handler: Handler,\n options?: JsonValidationOptions,\n ) {\n const middleware = createJsonSchemaValidationMiddleware(schema, options);\n (this as any)[method](path, middleware, handler);\n return this;\n };\n }\n}\n\n// ─── Feature Class ──────────────────────────────────────────────────────────\n\nexport class JsonSchemaValidationFeature implements Feature {\n name = \"json-schema-validation\";\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n extendHonoWithJsonSchemaValidation(app);\n console.log(\"βœ… JSON Schema validation feature initialized\");\n }\n}\n\nexport { formatAjvErrors };\n","import type { Feature, OpenAPIConfig } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport type { Context, Handler, Hono } from \"hono\";\nimport { OpenAPIHono, createRoute, z } from \"@hono/zod-openapi\";\nimport { ErrorCodes, errorResponse } from \"../responses\";\n\nexport class OpenAPIFeature implements Feature {\n name = \"openapi\";\n private app?: OpenAPIHono;\n private config: OpenAPIConfig;\n private kernel?: Kernel;\n private autoGeneratedRoutes: Array<{ path: string; method: string; tags: string[]; summary: string }> = [];\n private queuedRoutes: Array<{ route: any; handler: Handler }> = [];\n\n constructor(config: OpenAPIConfig) {\n this.config = config;\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n this.kernel = kernel;\n this.app = new OpenAPIHono({\n defaultHook: (result: any, c: Context) => {\n if (!result.success) {\n return c.json(errorResponse(\"Validation Error\", ErrorCodes.VALIDATION_ERROR, result.error.flatten()), 400);\n }\n }\n });\n\n this.processQueuedRoutes();\n console.log(\"βœ… OpenAPIFeature initialized\");\n }\n\n addRoute(route: any, handler: Handler) {\n if (!this.app) {\n this.queuedRoutes.push({ route, handler });\n return;\n }\n this.app.openapi(createRoute(route), handler);\n this.autoGeneratedRoutes.push({\n path: route.path,\n method: route.method.toUpperCase(),\n tags: route.tags || [],\n summary: route.summary || \"\"\n });\n }\n\n private processQueuedRoutes() {\n if (!this.app) return;\n for (const { route, handler } of this.queuedRoutes) {\n this.addRoute(route, handler);\n }\n this.queuedRoutes = [];\n }\n\n routes(app: Hono) {\n if (this.app) {\n app.route(\"/\", this.app);\n }\n\n app.get(\"/openapi.json\", (c: Context) => {\n if (!this.app) return c.json({ error: \"OpenAPI not initialized\" }, 500);\n\n const spec = this.app.getOpenAPIDocument({\n openapi: \"3.1.0\",\n info: {\n title: this.config.title,\n version: this.config.version,\n description: this.config.description || \"API Documentation\",\n contact: this.config.contact,\n license: this.config.license\n },\n servers: this.config.servers || [{ url: \"http://localhost:8000\", description: \"Dev Server\" }],\n tags: this.config.tags || [],\n externalDocs: this.config.externalDocs,\n security: this.config.security\n });\n\n if (this.config.securitySchemes) {\n if (!spec.components) spec.components = {};\n spec.components.securitySchemes = this.config.securitySchemes;\n }\n\n return c.json(spec);\n });\n\n app.get(\"/docs\", (c) => c.html(this.generateScalarHTML()));\n }\n\n private generateScalarHTML(): string {\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>${this.config.title} - API Documentation</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>body { margin: 0; padding: 0; }</style>\n</head>\n<body>\n <script id=\"api-reference\" data-url=\"/openapi.json\" data-configuration='{\"theme\":\"purple\",\"layout\":\"modern\",\"showSidebar\":true}'></script>\n <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference@latest\"></script>\n</body>\n</html>`.trim();\n }\n}\n\nexport { createRoute, OpenAPIHono, z };\n","import type { StorageFeature } from \"../storage\";\nimport type { BaseStorageAdapter, PutOptions } from \"@iskra-bun/storage-kit\";\n\nexport interface UploadOptions {\n metadata?: Record<string, string>;\n contentType?: string;\n}\n\nexport interface UploadResult {\n path: string;\n filename: string;\n size: number;\n uploadedAt: Date;\n}\n\nexport class UploadHelper {\n private basePath: string;\n\n constructor(private storage: BaseStorageAdapter, private projectName: string) {\n this.basePath = `${projectName}/`;\n }\n\n getBasePath(): string {\n return this.basePath;\n }\n\n // Defense-in-depth: reduce an attacker-controlled filename to a safe basename\n // and strip it to an allowlisted charset so traversal segments (\"../\",\n // \"..\\\\\", absolute paths) can never escape the project base path. storage-kit's\n // sanitizePath remains the primary control; this is a second, independent gate.\n private safeBasename(filename: string): string {\n const base = filename.split(/[\\\\/]/).pop() || \"\";\n const cleaned = base.replace(/[^a-zA-Z0-9._-]/g, \"_\").replace(/^\\.+/, \"\");\n return cleaned.length > 0 ? cleaned : \"file\";\n }\n\n private buildPath(filename: string, subfolder?: string): string {\n if (subfolder) {\n const normalized = subfolder.replace(/^\\/+|\\/+$/g, \"\");\n return `${this.basePath}${normalized}/${filename}`;\n }\n return `${this.basePath}${filename}`;\n }\n\n async upload(filename: string, data: Uint8Array | string, subfolder?: string, options?: UploadOptions): Promise<UploadResult> {\n const fullPath = this.buildPath(filename, subfolder);\n const fileData = typeof data === \"string\" ? new TextEncoder().encode(data) : data;\n\n const putOptions: PutOptions | undefined = options ? {\n contentType: options.contentType,\n metadata: options.metadata\n } : undefined;\n\n await this.storage.put(fullPath, fileData, putOptions);\n\n return {\n path: fullPath,\n filename,\n size: fileData.length,\n uploadedAt: new Date()\n };\n }\n\n // uploadFromRequest: Not implementing raw request reading here to avoid Node/Bun specific request stream issues unless necessary\n // or implementing simplified Version\n async uploadFromRequest(request: Request, fieldName: string, subfolder?: string, options?: UploadOptions): Promise<UploadResult> {\n const formData = await request.formData();\n const file = formData.get(fieldName);\n if (!file || !(file instanceof File)) throw new Error(`No file found in field: ${fieldName}`);\n\n const data = new Uint8Array(await file.arrayBuffer());\n const opts = { ...options, contentType: options?.contentType || file.type };\n const safeName = this.safeBasename(file.name);\n return this.upload(safeName, data, subfolder, opts);\n }\n\n async list(subfolder?: string) {\n const prefix = subfolder ? `${this.basePath}${subfolder.replace(/^\\/+|\\/+$/g, \"\")}/` : this.basePath;\n return await this.storage.list(prefix);\n }\n\n async get(filename: string, subfolder?: string) {\n const fullPath = this.buildPath(filename, subfolder);\n return await this.storage.get(fullPath);\n }\n\n async delete(filename: string, subfolder?: string) {\n const fullPath = this.buildPath(filename, subfolder);\n await this.storage.delete(fullPath);\n }\n\n async getUrl(filename: string, subfolder?: string, expiresIn?: number) {\n const fullPath = this.buildPath(filename, subfolder);\n return await this.storage.url(fullPath, expiresIn);\n }\n}\n","import type { Feature, UploadConfig } from \"../../types\";\nimport type { Kernel } from \"../../kernel\";\nimport type { Hono, Context, Next } from \"hono\";\nimport { UploadHelper } from \"./helper\";\nimport type { StorageFeature } from \"../storage\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n upload: UploadHelper;\n }\n}\n\nexport class UploadFeature implements Feature {\n name = \"upload\";\n dependencies = [\"storage\"];\n private helper?: UploadHelper;\n private config: Required<UploadConfig>;\n\n constructor(config: UploadConfig) {\n this.config = {\n projectName: config.projectName,\n maxFileSize: config.maxFileSize || 10 * 1024 * 1024,\n allowedExtensions: config.allowedExtensions || [],\n exposeRoutes: config.exposeRoutes || false,\n routePrefix: config.routePrefix || \"/upload\"\n };\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const storageFeature = kernel.getFeature(\"storage\") as unknown as StorageFeature;\n if (!storageFeature) throw new Error(\"Upload feature requires storage feature\");\n const storage = storageFeature.getAdapter();\n if (!storage) throw new Error(\"Storage adapter not ready\");\n\n this.helper = new UploadHelper(storage, this.config.projectName);\n\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n c.set(\"upload\", this.helper!);\n await next();\n });\n\n console.log(`βœ… Upload feature initialized: ${this.config.projectName}`);\n }\n\n routes(app: Hono) {\n if (!this.config.exposeRoutes) return;\n\n const prefix = this.config.routePrefix;\n\n // POST β€” upload a file\n app.post(`${prefix}`, async (c) => {\n const upload = c.get(\"upload\");\n try {\n const subfolder = c.req.query(\"subfolder\");\n const formData = await c.req.formData();\n const file = formData.get(\"file\");\n if (!file || !(file instanceof File)) return c.json({ error: \"No file\" }, 400);\n\n if (file.size > this.config.maxFileSize) return c.json({ error: \"File too large\" }, 400);\n if (this.config.allowedExtensions.length > 0) {\n if (!this.config.allowedExtensions.some(e => file.name.toLowerCase().endsWith(e))) {\n return c.json({ error: \"Invalid extension\" }, 400);\n }\n }\n\n const data = new Uint8Array(await file.arrayBuffer());\n const result = await upload.upload(file.name, data, subfolder, { contentType: file.type });\n return c.json({ success: true, ...result });\n\n } catch (e: any) {\n return c.json({ error: e.message }, 500);\n }\n });\n\n // GET β€” list files\n app.get(`${prefix}`, async (c) => {\n const upload = c.get(\"upload\");\n try {\n const subfolder = c.req.query(\"subfolder\");\n const files = await upload.list(subfolder);\n return c.json({ success: true, files });\n } catch (e: any) {\n return c.json({ error: e.message }, 500);\n }\n });\n\n // GET β€” download a file\n app.get(`${prefix}/*`, async (c) => {\n const upload = c.get(\"upload\");\n try {\n const filePath = c.req.path.replace(`${prefix}/`, \"\");\n const segments = filePath.split(\"/\");\n const filename = segments.pop() || \"\";\n const subfolder = segments.length > 0 ? segments.join(\"/\") : undefined;\n\n const data = await upload.get(filename, subfolder);\n if (!data) {\n return c.json({ error: \"File not found\" }, 404);\n }\n\n const ext = filename.split(\".\").pop()?.toLowerCase() || \"\";\n const mimeTypes: Record<string, string> = {\n jpg: \"image/jpeg\", jpeg: \"image/jpeg\", png: \"image/png\", gif: \"image/gif\",\n pdf: \"application/pdf\", txt: \"text/plain\", json: \"application/json\", zip: \"application/zip\",\n };\n const contentType = mimeTypes[ext] || \"application/octet-stream\";\n\n const body = new Uint8Array(data.length);\n body.set(data);\n\n return new Response(body, {\n headers: {\n \"Content-Type\": contentType,\n \"Content-Disposition\": `inline; filename=\"${filename}\"`,\n \"Content-Length\": String(data.length),\n },\n });\n } catch (e: any) {\n return c.json({ error: e.message }, 500);\n }\n });\n\n // DELETE β€” delete a file\n app.delete(`${prefix}/*`, async (c) => {\n const upload = c.get(\"upload\");\n try {\n const filePath = c.req.path.replace(`${prefix}/`, \"\");\n const segments = filePath.split(\"/\");\n const filename = segments.pop() || \"\";\n const subfolder = segments.length > 0 ? segments.join(\"/\") : undefined;\n\n await upload.delete(filename, subfolder);\n return new Response(null, { status: 204 });\n } catch (e: any) {\n return c.json({ error: e.message }, 500);\n }\n });\n }\n}\n","import type { Feature } from \"../types\";\nimport type { Kernel } from \"../kernel\";\nimport { httpInstrumentationMiddleware } from \"@hono/otel\";\n\nexport interface OtelTracingConfig {\n serviceName: string;\n serviceVersion?: string;\n captureRequestHeaders?: string[];\n captureResponseHeaders?: string[];\n tracerProvider?: any;\n meterProvider?: any;\n tracer?: any;\n spanNameFactory?: (c: any) => string;\n getTime?: () => number;\n}\n\nexport class OtelTracingFeature implements Feature {\n name = \"otel-tracing\";\n private config: OtelTracingConfig;\n\n constructor(config: OtelTracingConfig) {\n if (!config.serviceName) {\n throw new Error(\"serviceName is required for OtelTracingFeature\");\n }\n this.config = config;\n }\n\n async initialize(kernel: Kernel): Promise<void> {\n const app = kernel.getApp();\n\n const instrumentationConfig: any = {\n serviceName: this.config.serviceName,\n };\n\n if (this.config.serviceVersion) instrumentationConfig.serviceVersion = this.config.serviceVersion;\n if (this.config.captureRequestHeaders) instrumentationConfig.captureRequestHeaders = this.config.captureRequestHeaders;\n if (this.config.captureResponseHeaders) instrumentationConfig.captureResponseHeaders = this.config.captureResponseHeaders;\n if (this.config.tracerProvider) instrumentationConfig.tracerProvider = this.config.tracerProvider;\n if (this.config.meterProvider) instrumentationConfig.meterProvider = this.config.meterProvider;\n if (this.config.tracer) instrumentationConfig.tracer = this.config.tracer;\n if (this.config.spanNameFactory) instrumentationConfig.spanNameFactory = this.config.spanNameFactory;\n if (this.config.getTime) instrumentationConfig.getTime = this.config.getTime;\n\n // Register Otel middleware\n app.use(\"*\", httpInstrumentationMiddleware(instrumentationConfig));\n\n console.log(\"βœ… OpenTelemetry tracing feature initialized\");\n }\n}\n","import type { Feature } from \"../../types\";\nimport type { Kernel } from \"../../kernel\";\nimport type { Context, Next } from \"hono\";\nimport { createEmailAdapter } from \"@iskra-bun/mailer-kit\";\n\nexport type { EmailConfig, EmailMessage, TemplateData, EmailAdapter } from \"@iskra-bun/mailer-kit\";\nexport { MockEmailAdapter } from \"@iskra-bun/mailer-kit\";\n\nimport type { EmailConfig, EmailAdapter, EmailMessage, TemplateData } from \"@iskra-bun/mailer-kit\";\n\ndeclare module \"hono\" {\n interface ContextVariableMap {\n email: EmailAdapter;\n }\n}\n\n// ─── Header-injection guards ─────────────────────────────────────────────────\n//\n// An attacker who controls a recipient address or a header value can inject CR\n// or LF to smuggle extra SMTP headers (e.g. a hidden Bcc). Reject any address or\n// header that carries a CR/LF before the message reaches the underlying adapter.\n\nconst CRLF = /[\\r\\n]/;\n\nfunction assertNoCrlf(value: string, label: string): void {\n if (CRLF.test(value)) {\n throw new Error(`Invalid ${label}: control characters (CR/LF) are not allowed`);\n }\n}\n\nfunction assertRecipients(to: string | string[] | undefined, label: string): void {\n if (to === undefined) return;\n const recipients = Array.isArray(to) ? to : [to];\n for (const recipient of recipients) assertNoCrlf(recipient, label);\n}\n\nfunction validateMessage(message: EmailMessage): void {\n assertRecipients(message.to, \"recipient\");\n assertRecipients(message.cc, \"cc recipient\");\n assertRecipients(message.bcc, \"bcc recipient\");\n if (message.replyTo !== undefined) assertNoCrlf(message.replyTo, \"replyTo\");\n assertNoCrlf(message.subject, \"subject\");\n if (message.headers) {\n for (const [name, value] of Object.entries(message.headers)) {\n assertNoCrlf(name, \"header name\");\n assertNoCrlf(value, \"header value\");\n }\n }\n}\n\n// Wrap an adapter so every send is validated centrally before delegation. The\n// wrapper is a new object β€” it never mutates the underlying adapter.\nfunction withValidation(adapter: EmailAdapter): EmailAdapter {\n return {\n send: (message: EmailMessage) => {\n validateMessage(message);\n return adapter.send(message);\n },\n sendTemplate: (templateName: string, to: string | string[], data: TemplateData) => {\n assertRecipients(to, \"recipient\");\n return adapter.sendTemplate(templateName, to, data);\n },\n };\n}\n\nexport class EmailFeature implements Feature {\n name = \"email\";\n private adapter?: EmailAdapter;\n\n constructor(private config: EmailConfig) { }\n\n async initialize(kernel: Kernel): Promise<void> {\n this.adapter = withValidation(await createEmailAdapter(this.config));\n const app = kernel.getApp();\n app.use(\"*\", async (c: Context, next: Next) => {\n if (this.adapter) c.set(\"email\", this.adapter);\n await next();\n });\n }\n\n getAdapter(): EmailAdapter {\n if (!this.adapter) throw new Error(\"Email not initialized\");\n return this.adapter;\n }\n}\n"],"mappings":"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","names":["HTTPException","IskraError","HTTPException","status","response","requestId","IskraError","HTTPException","BaseStorageAdapter","HTTPException","z","HTTPException","HTTPException","HTTPException","HTTPException","getCookie","setCookie","createHmac","ErrorCodes","ErrorCodes","ErrorCodes","OpenAPIHono","createRoute","z","OpenAPIHono","ErrorCodes","createRoute"]}