@coherent.js/api 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +91 -0
- package/dist/api/errors.d.ts +92 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +161 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/index.d.ts +61 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +41 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/middleware.d.ts +57 -0
- package/dist/api/middleware.d.ts.map +1 -0
- package/dist/api/middleware.js +244 -0
- package/dist/api/middleware.js.map +1 -0
- package/dist/api/openapi.d.ts +54 -0
- package/dist/api/openapi.d.ts.map +1 -0
- package/dist/api/openapi.js +144 -0
- package/dist/api/openapi.js.map +1 -0
- package/dist/api/router.d.ts +368 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +1508 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/security.d.ts +64 -0
- package/dist/api/security.d.ts.map +1 -0
- package/dist/api/security.js +239 -0
- package/dist/api/security.js.map +1 -0
- package/dist/api/serialization.d.ts +86 -0
- package/dist/api/serialization.d.ts.map +1 -0
- package/dist/api/serialization.js +151 -0
- package/dist/api/serialization.js.map +1 -0
- package/dist/api/validation.d.ts +34 -0
- package/dist/api/validation.d.ts.map +1 -0
- package/dist/api/validation.js +172 -0
- package/dist/api/validation.js.map +1 -0
- package/dist/index.cjs +1776 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.js +1722 -0
- package/dist/index.js.map +7 -0
- package/package.json +46 -0
- package/types/index.d.ts +720 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.js", "../src/router.js", "../src/errors.js", "../src/validation.js", "../src/serialization.js", "../src/security.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Coherent.js API Module\n * @fileoverview Core utilities for building APIs with Coherent.js\n */\n\nimport { createRouter } from './router.js';\nimport { ApiError, ValidationError, AuthenticationError, AuthorizationError, NotFoundError, ConflictError, withErrorHandling, createErrorHandler } from './errors.js';\nimport { validateAgainstSchema, validateField, withValidation, withQueryValidation, withParamsValidation } from './validation.js';\nimport { serializeDate, deserializeDate, serializeMap, deserializeMap, serializeSet, deserializeSet, withSerialization, serializeForJSON } from './serialization.js';\nimport { withAuth, withRole, hashPassword, verifyPassword, generateToken, withInputValidation } from './security.js';\n\nexport {\n createRouter,\n ApiError,\n ValidationError,\n AuthenticationError,\n AuthorizationError,\n NotFoundError,\n ConflictError,\n withErrorHandling,\n createErrorHandler,\n validateAgainstSchema,\n validateField,\n withValidation,\n withQueryValidation,\n withParamsValidation,\n serializeDate,\n deserializeDate,\n serializeMap,\n deserializeMap,\n serializeSet,\n deserializeSet,\n withSerialization,\n serializeForJSON,\n withAuth,\n withRole,\n hashPassword,\n verifyPassword,\n generateToken,\n withInputValidation\n};\n\nexport default {\n createRouter,\n ApiError,\n ValidationError,\n AuthenticationError,\n AuthorizationError,\n NotFoundError,\n ConflictError,\n withErrorHandling,\n createErrorHandler,\n validateAgainstSchema,\n validateField,\n withValidation,\n withQueryValidation,\n withParamsValidation,\n serializeDate,\n deserializeDate,\n serializeMap,\n deserializeMap,\n serializeSet,\n deserializeSet,\n withSerialization,\n serializeForJSON,\n withAuth,\n withRole,\n hashPassword,\n verifyPassword,\n generateToken,\n withInputValidation\n};\n", "/**\n * Object-based Router for Coherent.js API framework\n * Pure object-oriented approach to backend API routing\n * \n * @fileoverview Transforms nested JavaScript objects into API routes with\n * middleware, validation, and _error handling support.\n * \n * @author Coherent.js Team\n * @version 1.0.0\n */\n\nimport { createHash, randomBytes } from 'node:crypto';\n\nimport { withValidation } from './validation.js';\nimport { withErrorHandling } from './errors.js';\nimport { createServer } from 'node:http';\nimport { parse as parseUrl } from 'node:url';\n\n/**\n * HTTP methods supported by the object router\n * @private\n */\nconst HTTP_METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'];\n\n/**\n * Parse JSON request body with security limits\n * @private\n */\nfunction parseBody(req, maxSize = 1024 * 1024) { // 1MB limit\n return new Promise((resolve, reject) => {\n if (req.method === 'GET' || req.method === 'DELETE') {\n resolve({});\n return;\n }\n \n let body = '';\n let size = 0;\n \n req.on('data', chunk => {\n size += chunk.length;\n if (size > maxSize) {\n reject(new Error('Request body too large'));\n return;\n }\n body += chunk.toString();\n });\n \n req.on('end', () => {\n try {\n const contentType = req.headers['content-type'] || '';\n if (contentType.includes('application/json')) {\n const parsed = body ? JSON.parse(body) : {};\n // Basic input sanitization\n resolve(sanitizeInput(parsed));\n } else {\n resolve({});\n }\n } catch {\n reject(new Error('Invalid JSON body'));\n }\n });\n \n req.on('_error', reject);\n });\n}\n\n/**\n * Basic input sanitization\n * @private\n */\nfunction sanitizeInput(obj) {\n if (typeof obj !== 'object' || obj === null) return obj;\n \n const sanitized = {};\n for (const [key, value] of Object.entries(obj)) {\n // Remove potentially dangerous keys\n if (key.startsWith('__') || key.includes('prototype')) continue;\n \n if (typeof value === 'string') {\n // Basic XSS prevention\n sanitized[key] = value.replace(/<script[^>]*>.*?<\\/script>/gi, '')\n .replace(/javascript:/gi, '')\n .replace(/on\\w+=/gi, '');\n } else if (typeof value === 'object') {\n sanitized[key] = sanitizeInput(value);\n } else {\n sanitized[key] = value;\n }\n }\n return sanitized;\n}\n\n/**\n * Rate limiting store\n * @private\n */\nconst rateLimitStore = new Map();\n\n/**\n * Rate limiting middleware for API endpoints\n * @private\n * @param {string} ip - Client IP address\n * @param {number} [windowMs=60000] - Time window in milliseconds\n * @param {number} [maxRequests=100] - Maximum requests per window\n * @returns {boolean} True if request is allowed, false if rate limited\n */\nfunction checkRateLimit(ip, windowMs = 60000, maxRequests = 100) {\n const now = Date.now();\n const key = ip;\n \n if (!rateLimitStore.has(key)) {\n rateLimitStore.set(key, { count: 1, resetTime: now + windowMs });\n return true;\n }\n \n const record = rateLimitStore.get(key);\n \n if (now > record.resetTime) {\n record.count = 1;\n record.resetTime = now + windowMs;\n return true;\n }\n \n if (record.count >= maxRequests) {\n return false;\n }\n \n record.count++;\n return true;\n}\n\n/**\n * Add comprehensive security headers to HTTP response\n * @private\n * @param {Object} res - HTTP response object\n * @param {string|null} [corsOrigin=null] - CORS origin, defaults to localhost:3000\n */\nfunction addSecurityHeaders(res, corsOrigin = null) {\n // CORS headers - configurable origin\n const origin = corsOrigin || 'http://localhost:3000';\n res.setHeader('Access-Control-Allow-Origin', origin);\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n \n // Security headers\n res.setHeader('X-Content-Type-Options', 'nosniff');\n res.setHeader('X-Frame-Options', 'DENY');\n res.setHeader('X-XSS-Protection', '1; mode=block');\n res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');\n res.setHeader('Content-Security-Policy', \"default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'\");\n res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');\n}\n\n/**\n * Extract parameters from URL path with constraint support\n * @private\n * @param {string} pattern - URL pattern with parameters (e.g., '/users/:id(\\\\d+)')\n * @param {string} path - Actual URL path to match\n * @returns {Object|null} Extracted parameters object or null if no match\n * @example\n * extractParams('/users/:id(\\\\d+)', '/users/123') // { id: '123' }\n * extractParams('/users/:id?', '/users') // {}\n */\nfunction extractParams(pattern, path) {\n const patternParts = pattern.split('/');\n const pathParts = path.split('/');\n const params = {};\n \n // Handle wildcard patterns that can match different lengths\n const hasMultiWildcard = patternParts.includes('**');\n const hasSingleWildcard = patternParts.includes('*');\n \n if (!hasMultiWildcard && !hasSingleWildcard && patternParts.length !== pathParts.length) {\n return null;\n }\n \n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i];\n const pathPart = pathParts[i];\n \n if (patternPart.startsWith(':')) {\n // Parse parameter with optional constraint: :name(regex) or :name?\n const match = patternPart.match(/^:([^(]+)(\\(([^)]+)\\))?(\\?)?$/);\n if (match) {\n const [, paramName, , constraint, optional] = match;\n \n // Check if parameter is optional and path part is missing\n if (optional && !pathPart) {\n continue;\n }\n \n // Apply constraint if present\n if (constraint) {\n const regex = new RegExp(`^${constraint}$`);\n if (!regex.test(pathPart)) {\n return null; // Constraint failed\n }\n }\n \n params[paramName] = pathPart;\n } else {\n // Fallback to simple parameter\n params[patternPart.slice(1)] = pathPart;\n }\n } else if (patternPart === '*') {\n // Single wildcard - matches one segment\n params.splat = pathPart;\n } else if (patternPart === '**') {\n // Multi-segment wildcard - matches remaining path\n params.splat = pathParts.slice(i).join('/');\n return params; // ** consumes rest of path\n } else if (patternPart !== pathPart) {\n return null;\n }\n }\n \n return params;\n}\n\n\n/**\n * Transforms nested route objects into registered API routes\n * \n * @param {Object} routeObj - Route definition object\n * @param {Object} router - Router instance\n * @param {string} basePath - Current path prefix\n */\nfunction processRoutes(routeObj, router, basePath = '') {\n if (!routeObj || typeof routeObj !== 'object') return;\n\n Object.entries(routeObj).forEach(([key, config]) => {\n if (!config || typeof config !== 'object') return;\n\n // Check if this is a WebSocket route configuration\n if (config.ws && typeof config.ws === 'function') {\n // WebSocket route - register directly\n const cleanKey = key.startsWith('/') ? key.slice(1) : key;\n const wsPath = basePath ? `${basePath}/${cleanKey}` : `/${cleanKey}`;\n router.addWebSocketRoute(wsPath, config.ws);\n return;\n }\n\n if (HTTP_METHODS.includes(key.toUpperCase())) {\n // HTTP method route\n registerRoute(key.toUpperCase(), config, router, basePath);\n } else {\n // Nested path - handle leading slash correctly\n const cleanKey = key.startsWith('/') ? key.slice(1) : key;\n const path = basePath ? `${basePath}/${cleanKey}` : `/${cleanKey}`;\n processRoutes(config, router, path);\n }\n });\n}\n\n/**\n * Registers a single route with middleware chain\n * \n * @param {string} method - HTTP method\n * @param {Object} config - Route configuration\n * @param {Object} router - Router instance\n * @param {string} path - Route path\n */\nfunction registerRoute(method, config, router, path) {\n const {\n handler,\n handlers,\n validation,\n middleware,\n errorHandling = true,\n path: customPath,\n name\n } = config;\n\n const routePath = customPath || path || '/';\n const chain = [];\n\n // Add middleware\n if (middleware) {\n chain.push(...(Array.isArray(middleware) ? middleware : [middleware]));\n }\n\n // Add validation\n if (validation) {\n chain.push(withValidation(validation));\n }\n\n // Add handlers\n if (handlers) {\n chain.push(...handlers);\n } else if (handler) {\n chain.push(handler);\n } else {\n console.warn(`No handler for ${method} ${routePath}`);\n return;\n }\n\n // Apply _error handling\n if (errorHandling) {\n chain.forEach((fn, i) => {\n chain[i] = withErrorHandling(fn);\n });\n }\n\n // Register route with name option\n router.addRoute(method, routePath, async (req, res) => {\n try {\n // Execute middleware and handler chain\n let result = null;\n for (const fn of chain) {\n result = await fn(req, res);\n if (result && typeof result === 'object') {\n break;\n }\n }\n \n if (result && typeof result === 'object') {\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(result));\n } else {\n res.writeHead(204);\n res.end();\n }\n } catch (_error) {\n const statusCode = _error.statusCode || 500;\n res.writeHead(statusCode, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ _error: _error.message }));\n }\n }, { name });\n}\n\n/**\n * Simple router implementation for object-based routing with WebSocket support\n * \n * @class SimpleRouter\n * @description Provides HTTP and WebSocket routing with middleware support, caching,\n * versioning, content negotiation, and performance metrics.\n * \n * @param {Object} [options={}] - Router configuration options\n * @param {number} [options.maxCacheSize=1000] - Maximum cache size for route lookups\n * @param {boolean} [options.enableCompilation=true] - Enable route pattern compilation\n * @param {boolean} [options.enableVersioning=false] - Enable API versioning\n * @param {string} [options.defaultVersion='v1'] - Default API version\n * @param {string} [options.versionHeader='api-version'] - Header for version detection\n * @param {boolean} [options.enableContentNegotiation=true] - Enable content type negotiation\n * @param {string} [options.defaultContentType='application/json'] - Default response content type\n * @param {boolean} [options.enableWebSockets=false] - Enable WebSocket routing\n * @param {boolean} [options.enableMetrics=false] - Enable performance metrics collection\n * \n * @example\n * const router = new SimpleRouter({\n * enableWebSockets: true,\n * enableMetrics: true,\n * maxCacheSize: 2000\n * });\n */\nclass SimpleRouter {\n constructor(options = {}) {\n this.routes = [];\n this.routeCache = new Map();\n this.namedRoutes = new Map();\n this.maxCacheSize = options.maxCacheSize || 1000;\n this.routeGroups = [];\n this.globalMiddleware = [];\n \n // Route compilation options\n this.enableCompilation = options.enableCompilation !== false; // Default true\n this.compiledRoutes = new Map(); // Compiled regex patterns\n this.routeCompilationCache = new Map(); // Cache compiled patterns\n \n // Route versioning options\n this.enableVersioning = options.enableVersioning || false;\n this.defaultVersion = options.defaultVersion || 'v1';\n this.versionHeader = options.versionHeader || 'api-version';\n this.versionedRoutes = new Map(); // version -> routes mapping\n \n // Content negotiation options\n this.enableContentNegotiation = options.enableContentNegotiation !== false; // Default true\n this.defaultContentType = options.defaultContentType || 'application/json';\n \n // WebSocket routing options\n this.enableWebSockets = options.enableWebSockets || false;\n this.wsRoutes = [];\n this.wsConnections = new Map(); // Track active WebSocket connections\n \n // Performance metrics\n this.enableMetrics = options.enableMetrics || false;\n if (this.enableMetrics) {\n this.metrics = {\n requests: 0,\n cacheHits: 0,\n compilationHits: 0,\n routeMatches: new Map(),\n responseTime: [],\n errors: 0,\n versionRequests: new Map(), // Track requests per version\n contentTypeRequests: new Map(), // Track requests per content type\n wsConnections: 0, // Track WebSocket connections\n wsMessages: 0 // Track WebSocket messages\n };\n }\n }\n\n /**\n * Add an HTTP route to the router\n * \n * @param {string} method - HTTP method (GET, POST, PUT, DELETE, PATCH)\n * @param {string} path - Route path pattern (supports :param and wildcards)\n * @param {Function} handler - Route handler function\n * @param {Object} [options={}] - Route options\n * @param {Array} [options.middleware] - Route-specific middleware\n * @param {string} [options.name] - Named route for URL generation\n * @param {string} [options.version] - API version for this route\n * \n * @example\n * router.addRoute('GET', '/users/:id', (req, res) => {\n * return { user: { id: req.params.id } };\n * }, { name: 'getUser', version: 'v2' });\n */\n addRoute(method, path, handler, options = {}) {\n // Apply group prefix\n const prefix = this.getCurrentPrefix();\n const fullPath = prefix + (path.startsWith('/') ? path : `/${path}`);\n \n // Combine group middleware with route middleware\n const groupMiddleware = this.getCurrentGroupMiddleware();\n const routeMiddleware = options.middleware || [];\n const allMiddleware = [...this.globalMiddleware, ...groupMiddleware, ...routeMiddleware];\n \n const route = { \n method: method.toUpperCase(), \n path: fullPath, \n handler,\n middleware: allMiddleware,\n name: options.name,\n version: options.version || this.defaultVersion\n };\n \n // Compile route pattern if compilation is enabled\n if (this.enableCompilation) {\n route.compiled = this.compileRoute(fullPath);\n }\n \n this.routes.push(route);\n \n // Store versioned route if versioning is enabled\n if (this.enableVersioning) {\n if (!this.versionedRoutes.has(route.version)) {\n this.versionedRoutes.set(route.version, []);\n }\n this.versionedRoutes.get(route.version).push(route);\n }\n \n // Store named route for URL generation\n if (options.name) {\n this.namedRoutes.set(options.name, { method: route.method, path: fullPath, version: route.version });\n }\n }\n\n /**\n * Add a versioned route\n * @param {string} version - API version (e.g., 'v1', 'v2')\n * @param {string} method - HTTP method\n * @param {string} path - Route path\n * @param {Function} handler - Route handler\n * @param {Object} options - Route options\n */\n addVersionedRoute(version, method, path, handler, options = {}) {\n this.addRoute(method, path, handler, { ...options, version });\n }\n\n /**\n * Add route with content negotiation support\n * @param {string} method - HTTP method\n * @param {string} path - Route path\n * @param {Object} handlers - Content type handlers { 'application/json': handler, 'text/xml': handler }\n * @param {Object} options - Route options\n */\n addContentNegotiatedRoute(method, path, handlers, options = {}) {\n const negotiationHandler = async (req, res) => {\n const acceptedType = this.negotiateContentType(req, Object.keys(handlers));\n \n if (this.enableMetrics) {\n this.metrics.contentTypeRequests.set(acceptedType, (this.metrics.contentTypeRequests.get(acceptedType) || 0) + 1);\n }\n \n const handler = handlers[acceptedType];\n if (!handler) {\n res.writeHead(406, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ \n _error: 'Not Acceptable',\n supportedTypes: Object.keys(handlers)\n }));\n return;\n }\n \n const result = await handler(req, res);\n \n if (result && typeof result === 'object') {\n res.writeHead(200, { 'Content-Type': acceptedType });\n \n if (acceptedType === 'application/json') {\n res.end(JSON.stringify(result));\n } else if (acceptedType === 'text/xml' || acceptedType === 'application/xml') {\n res.end(this.objectToXml(result));\n } else if (acceptedType === 'text/html') {\n res.end(typeof result === 'string' ? result : `<pre>${JSON.stringify(result, null, 2)}</pre>`);\n } else if (acceptedType === 'text/plain') {\n res.end(typeof result === 'string' ? result : JSON.stringify(result));\n } else {\n res.end(JSON.stringify(result));\n }\n }\n };\n \n this.addRoute(method, path, negotiationHandler, options);\n }\n\n /**\n * Negotiate content type based on Accept header\n * @param {Object} req - Request object\n * @param {Array} supportedTypes - Array of supported content types\n * @returns {string} Best matching content type\n * @private\n */\n negotiateContentType(req, supportedTypes) {\n const acceptHeader = req.headers.accept || this.defaultContentType;\n \n // Parse Accept header and find best match\n const acceptedTypes = acceptHeader\n .split(',')\n .map(type => {\n const [mediaType, ...params] = type.trim().split(';');\n const qValue = params.find(p => p.trim().startsWith('q='));\n const quality = qValue ? parseFloat(qValue.split('=')[1]) : 1.0;\n return { type: mediaType.trim(), quality };\n })\n .sort((a, b) => b.quality - a.quality);\n \n // Find first supported type\n for (const accepted of acceptedTypes) {\n if (accepted.type === '*/*') {\n return supportedTypes[0] || this.defaultContentType;\n }\n \n const [mainType, subType] = accepted.type.split('/');\n for (const supported of supportedTypes) {\n const [supportedMain, supportedSub] = supported.split('/');\n \n if (accepted.type === supported ||\n (mainType === supportedMain && subType === '*') ||\n (mainType === '*' && subType === supportedSub)) {\n return supported;\n }\n }\n }\n \n return supportedTypes[0] || this.defaultContentType;\n }\n\n /**\n * Convert object to XML string\n * @param {Object} obj - Object to convert\n * @param {string} rootName - Root element name\n * @returns {string} XML string\n * @private\n */\n objectToXml(obj, rootName = 'root') {\n const xmlEscape = (str) => String(str)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n \n const toXml = (obj, name) => {\n if (obj === null || obj === undefined) {\n return `<${name}/>`;\n }\n \n if (typeof obj !== 'object') {\n return `<${name}>${xmlEscape(obj)}</${name}>`;\n }\n \n if (Array.isArray(obj)) {\n return obj.map(item => toXml(item, 'item')).join('');\n }\n \n const content = Object.entries(obj)\n .map(([key, value]) => toXml(value, key))\n .join('');\n \n return `<${name}>${content}</${name}>`;\n };\n \n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>${toXml(obj, rootName)}`;\n }\n\n /**\n * Add WebSocket route\n * @param {string} path - WebSocket path\n * @param {Function} handler - WebSocket handler function\n * @param {Object} options - Route options\n */\n addWebSocketRoute(path, handler, options = {}) {\n if (!this.enableWebSockets) {\n throw new Error('WebSocket routing is disabled. Enable with { enableWebSockets: true }');\n }\n\n const prefix = this.getCurrentPrefix();\n const fullPath = prefix + (path.startsWith('/') ? path : `/${path}`);\n \n const wsRoute = {\n path: fullPath,\n handler,\n name: options.name,\n version: options.version || this.defaultVersion,\n compiled: this.enableCompilation ? this.compileRoute(fullPath) : null\n };\n \n this.wsRoutes.push(wsRoute);\n \n if (options.name) {\n this.namedRoutes.set(options.name, { method: 'WS', path: fullPath, version: wsRoute.version });\n }\n }\n\n /**\n * Handle WebSocket upgrade request\n * @param {Object} request - HTTP request object\n * @param {Object} socket - Socket object\n * @param {Buffer} head - First packet of the upgraded stream\n */\n handleWebSocketUpgrade(request, socket, head) {\n if (!this.enableWebSockets) {\n socket.end('HTTP/1.1 501 Not Implemented\\r\\n\\r\\n');\n return;\n }\n\n const url = new URL(request.url, `http://${request.headers.host}`);\n const pathname = url.pathname;\n \n // Find matching WebSocket route\n let matchedRoute = null;\n for (const wsRoute of this.wsRoutes) {\n let params = null;\n \n if (this.enableCompilation && wsRoute.compiled) {\n params = this.matchCompiledRoute(wsRoute.compiled, pathname);\n } else {\n params = extractParams(wsRoute.path, pathname);\n }\n \n if (params !== null) {\n matchedRoute = { route: wsRoute, params };\n break;\n }\n }\n \n if (!matchedRoute) {\n socket.end('HTTP/1.1 404 Not Found\\r\\n\\r\\n');\n return;\n }\n \n // Create WebSocket connection\n this.createWebSocketConnection(request, socket, head, matchedRoute);\n }\n\n /**\n * Create WebSocket connection\n * @param {Object} request - HTTP request object\n * @param {Object} socket - Socket object\n * @param {Buffer} head - First packet of the upgraded stream\n * @param {Object} matchedRoute - Matched WebSocket route\n * @private\n */\n createWebSocketConnection(request, socket, head, matchedRoute) {\n \n // WebSocket handshake\n const key = request.headers['sec-websocket-key'];\n if (!key) {\n socket.end('HTTP/1.1 400 Bad Request\\r\\n\\r\\n');\n return;\n }\n \n const acceptKey = createHash('sha1')\n .update(`${key }258EAFA5-E914-47DA-95CA-C5AB0DC85B11`)\n .digest('base64');\n \n const responseHeaders = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${acceptKey}`,\n '', ''\n ].join('\\r\\n');\n \n socket.write(responseHeaders);\n \n // Create WebSocket wrapper\n const ws = this.createWebSocketWrapper(socket, matchedRoute);\n \n // Track connection\n const connectionId = randomBytes(16).toString('hex');\n this.wsConnections.set(connectionId, ws);\n \n if (this.enableMetrics) {\n this.metrics.wsConnections++;\n }\n \n // Add connection metadata\n ws.id = connectionId;\n ws.params = matchedRoute.params;\n ws.path = matchedRoute.route.path;\n \n // Handle connection cleanup\n socket.on('close', () => {\n // Call the route handler's close callback before cleanup\n if (matchedRoute.route.handler.onClose) {\n matchedRoute.route.handler.onClose(ws);\n }\n \n // Store connection info before deletion for potential use in handlers\n // const connectionInfo = { id: connectionId, path: ws.path };\n \n // Fire any custom close handlers set by the route handler\n if (ws.onclose) {\n try {\n ws.onclose();\n } catch (_error) {\n console.error('WebSocket onclose handler _error:', _error);\n }\n }\n \n this.wsConnections.delete(connectionId);\n if (this.enableMetrics) {\n this.metrics.wsConnections--;\n }\n });\n \n // Call route handler\n try {\n matchedRoute.route.handler(ws, request);\n } catch (err) {\n console.error('WebSocket upgrade _error:', err);\n socket.end('HTTP/1.1 500 Internal Server Error\\r\\n\\r\\n');\n }\n }\n\n /**\n * Create WebSocket wrapper with message handling\n * @param {Object} socket - Raw socket\n * @param {Object} matchedRoute - Matched route info\n * @returns {Object} WebSocket wrapper\n * @private\n */\n createWebSocketWrapper(socket) {\n const ws = {\n socket,\n readyState: 1, // OPEN\n \n send(data) {\n if (this.readyState !== 1) return;\n \n const message = typeof data === 'string' ? data : JSON.stringify(data);\n const frame = this.createFrame(message);\n socket.write(frame);\n \n if (ws.router && ws.router.enableMetrics) {\n ws.router.metrics.wsMessages++;\n }\n },\n \n close(code = 1000, reason = '') {\n if (this.readyState !== 1) return;\n \n this.readyState = 3; // CLOSED\n const frame = this.createCloseFrame(code, reason);\n socket.write(frame);\n socket.destroy(); // Force close the socket to trigger 'close' event\n },\n \n ping(data = Buffer.alloc(0)) {\n if (this.readyState !== 1) return;\n \n const frame = this.createPingFrame(data);\n socket.write(frame);\n },\n \n createFrame(data) {\n const payload = Buffer.from(data, 'utf8');\n const payloadLength = payload.length;\n \n let frame;\n if (payloadLength < 126) {\n frame = Buffer.allocUnsafe(2 + payloadLength);\n frame[0] = 0x81; // FIN + text frame\n frame[1] = payloadLength;\n payload.copy(frame, 2);\n } else if (payloadLength < 65536) {\n frame = Buffer.allocUnsafe(4 + payloadLength);\n frame[0] = 0x81;\n frame[1] = 126;\n frame.writeUInt16BE(payloadLength, 2);\n payload.copy(frame, 4);\n } else {\n frame = Buffer.allocUnsafe(10 + payloadLength);\n frame[0] = 0x81;\n frame[1] = 127;\n frame.writeUInt32BE(0, 2);\n frame.writeUInt32BE(payloadLength, 6);\n payload.copy(frame, 10);\n }\n \n return frame;\n },\n \n createCloseFrame(code, reason) {\n const reasonBuffer = Buffer.from(reason, 'utf8');\n const frame = Buffer.allocUnsafe(4 + reasonBuffer.length);\n frame[0] = 0x88; // FIN + close frame\n frame[1] = 2 + reasonBuffer.length;\n frame.writeUInt16BE(code, 2);\n reasonBuffer.copy(frame, 4);\n return frame;\n },\n \n createPingFrame(data) {\n const frame = Buffer.allocUnsafe(2 + data.length);\n frame[0] = 0x89; // FIN + ping frame\n frame[1] = data.length;\n data.copy(frame, 2);\n return frame;\n }\n };\n \n ws.router = this;\n \n // Handle incoming messages\n socket.on('data', (buffer) => {\n try {\n const message = this.parseWebSocketFrame(buffer);\n if (message && ws.onmessage) {\n ws.onmessage({ data: message });\n }\n } catch {\n }\n });\n \n // Handle socket errors\n socket.on('_error', (err) => {\n console.log('WebSocket socket _error (connection likely closed):', err.code);\n // Don't re-throw the _error, just log it\n });\n \n return ws;\n }\n\n /**\n * Parse WebSocket frame\n * @param {Buffer} buffer - Raw frame data\n * @returns {string|null} Parsed message\n * @private\n */\n parseWebSocketFrame(buffer) {\n if (buffer.length < 2) return null;\n \n const firstByte = buffer[0];\n const secondByte = buffer[1];\n \n const opcode = firstByte & 0x0f;\n const masked = (secondByte & 0x80) === 0x80;\n let payloadLength = secondByte & 0x7f;\n \n // Handle close frame (opcode 8)\n if (opcode === 8) {\n return null; // Close frame, don't process as message\n }\n \n // Only process text frames (opcode 1)\n if (opcode !== 1) {\n return null;\n }\n \n let offset = 2;\n \n if (payloadLength === 126) {\n if (buffer.length < offset + 2) return null;\n payloadLength = buffer.readUInt16BE(offset);\n offset += 2;\n } else if (payloadLength === 127) {\n if (buffer.length < offset + 8) return null;\n payloadLength = buffer.readUInt32BE(offset + 4); // Ignore high 32 bits\n offset += 8;\n }\n \n if (masked) {\n if (buffer.length < offset + 4 + payloadLength) return null;\n const maskKey = buffer.slice(offset, offset + 4);\n offset += 4;\n \n const payload = buffer.slice(offset, offset + payloadLength);\n for (let i = 0; i < payload.length; i++) {\n payload[i] ^= maskKey[i % 4];\n }\n \n return payload.toString('utf8');\n }\n \n if (buffer.length < offset + payloadLength) return null;\n return buffer.slice(offset, offset + payloadLength).toString('utf8');\n }\n\n /**\n * Broadcast message to all WebSocket connections on a path\n * @param {string} path - WebSocket path pattern\n * @param {*} message - Message to broadcast\n * @param {string} [excludeId=null] - Connection ID to exclude from broadcast\n */\n broadcast(path, message, excludeId = null) {\n for (const [id, ws] of this.wsConnections) {\n if (id === excludeId) continue;\n if (ws.path === path || (path === '*' && ws.path)) {\n try {\n ws.send(message);\n } catch {\n console.log('Failed to send message to connection:', id);\n }\n }\n }\n }\n\n /**\n * Get active WebSocket connections\n * @returns {Array} Array of connection info\n */\n getWebSocketConnections() {\n return Array.from(this.wsConnections.entries()).map(([id, ws]) => ({\n id,\n path: ws.path,\n params: ws.params,\n readyState: ws.readyState\n }));\n }\n\n /**\n * Get version from request\n * @param {Object} req - Request object\n * @returns {string} API version\n * @private\n */\n getRequestVersion(req) {\n // Check header first\n if (req.headers[this.versionHeader]) {\n return req.headers[this.versionHeader];\n }\n \n // Check URL path for version prefix (e.g., /v1/users)\n const pathMatch = req.url.match(/^\\/v(\\d+)/);\n if (pathMatch) {\n return `v${pathMatch[1]}`;\n }\n \n // Check query parameter\n if (req.query && req.query.version) {\n return req.query.version;\n }\n \n return this.defaultVersion;\n }\n\n /**\n * Generate URL for named route with parameter substitution\n * \n * @param {string} name - Route name (set during route registration)\n * @param {Object} [params={}] - Parameters to substitute in the URL pattern\n * @returns {string} Generated URL with parameters substituted\n * @throws {Error} If named route is not found\n * \n * @example\n * // Route registered as: router.addRoute('GET', '/users/:id', handler, { name: 'getUser' })\n * const url = router.url('getUser', { id: 123 }); // '/users/123'\n * \n * // With constrained parameters\n * const url = router.url('getUserPosts', { userId: 123, postId: 456 }); // '/users/123/posts/456'\n */\n generateUrl(name, params = {}) {\n const route = this.namedRoutes.get(name);\n if (!route) {\n throw new Error(`Named route '${name}' not found`);\n }\n\n let url = route.path;\n \n // Replace parameters in the URL\n for (const [key, value] of Object.entries(params)) {\n // Handle both simple params (:key) and constrained params (:key(regex))\n const paramPattern = new RegExp(`:${key}(\\\\([^)]+\\\\))?`, 'g');\n url = url.replace(paramPattern, encodeURIComponent(value));\n }\n \n return url;\n }\n\n /**\n * Add routes from configuration object\n * \n * @param {Object} routeConfig - Route configuration object with nested structure\n * @description Processes nested route objects and registers HTTP and WebSocket routes.\n * Supports declarative route definition with automatic method detection.\n * \n * @example\n * router.addRoutes({\n * 'api': {\n * 'users': {\n * GET: (req, res) => ({ users: [] }),\n * POST: (req, res) => ({ created: true })\n * }\n * }\n * });\n */\n addRoutes(routeConfig) {\n processRoutes(routeConfig, this);\n }\n\n /**\n * Add global middleware to the router\n * \n * @param {Function|Object} middleware - Middleware function or conditional middleware object\n * @description Adds middleware that runs before all route handlers. Supports both\n * simple functions and conditional middleware objects.\n * \n * @example\n * // Simple middleware\n * router.use((req, res) => {\n * console.log(`${req.method} ${req.url}`);\n * });\n * \n * // Conditional middleware\n * router.use({\n * condition: (req) => req.url.startsWith('/api'),\n * middleware: authMiddleware,\n * name: 'apiAuth'\n * });\n */\n use(middleware) {\n if (typeof middleware === 'function') {\n this.globalMiddleware.push(middleware);\n } else if (middleware && typeof middleware === 'object') {\n // Conditional middleware: { condition, middleware, name }\n this.globalMiddleware.push(this.createConditionalMiddleware(middleware));\n }\n }\n\n /**\n * Create conditional middleware wrapper\n * @param {Object} config - Conditional middleware configuration\n * @returns {Function} Wrapped middleware function\n * @private\n */\n createConditionalMiddleware(config) {\n const { condition, middleware } = config;\n \n return async (req, res) => {\n // Evaluate condition\n let shouldExecute = false;\n \n if (typeof condition === 'function') {\n shouldExecute = await condition(req, res);\n } else if (typeof condition === 'object') {\n // Object-based conditions\n shouldExecute = this.evaluateConditionObject(condition, req);\n } else {\n shouldExecute = !!condition;\n }\n \n if (shouldExecute) {\n return await middleware(req, res);\n }\n \n return null; // Skip middleware\n };\n }\n\n /**\n * Evaluate condition object\n * @param {Object} condition - Condition object\n * @param {Object} req - Request object\n * @param {Object} res - Response object\n * @returns {boolean} Whether condition is met\n * @private\n */\n evaluateConditionObject(condition, req) {\n const { method, path, header, query, body, user } = condition;\n \n // Method condition\n if (method && !this.matchCondition(req.method, method)) return false;\n \n // Path condition\n if (path && !this.matchCondition(req.url, path)) return false;\n \n // Header condition\n if (header) {\n for (const [key, value] of Object.entries(header)) {\n if (!this.matchCondition(req.headers[key.toLowerCase()], value)) return false;\n }\n }\n \n // Query condition\n if (query && req.query) {\n for (const [key, value] of Object.entries(query)) {\n if (!this.matchCondition(req.query[key], value)) return false;\n }\n }\n \n // Body condition\n if (body && req.body) {\n for (const [key, value] of Object.entries(body)) {\n if (!this.matchCondition(req.body[key], value)) return false;\n }\n }\n \n // User condition (for auth-based conditions)\n if (user && req.user) {\n for (const [key, value] of Object.entries(user)) {\n if (!this.matchCondition(req.user[key], value)) return false;\n }\n }\n \n return true;\n }\n\n /**\n * Match condition value\n * @param {*} actual - Actual value\n * @param {*} expected - Expected value or condition\n * @returns {boolean} Whether condition matches\n * @private\n */\n matchCondition(actual, expected) {\n if (expected instanceof RegExp) {\n return expected.test(String(actual || ''));\n }\n \n if (Array.isArray(expected)) {\n return expected.includes(actual);\n }\n \n if (typeof expected === 'function') {\n return expected(actual);\n }\n \n return actual === expected;\n }\n\n /**\n * Create a route group with shared middleware and prefix\n * @param {string} prefix - Path prefix for the group\n * @param {Function|Array} middleware - Shared middleware\n * @param {Function} callback - Function to define routes in the group\n */\n group(prefix, middleware, callback) {\n const group = {\n prefix: prefix.startsWith('/') ? prefix : `/${prefix}`,\n middleware: Array.isArray(middleware) ? middleware : [middleware]\n };\n \n this.routeGroups.push(group);\n callback(this);\n this.routeGroups.pop();\n \n return this;\n }\n\n /**\n * Get current route prefix from active groups\n * @private\n */\n getCurrentPrefix() {\n return this.routeGroups.map(g => g.prefix).join('');\n }\n\n /**\n * Get current group middleware\n * @private\n */\n getCurrentGroupMiddleware() {\n return this.routeGroups.flatMap(g => g.middleware);\n }\n\n /**\n * Compile route pattern into optimized regex\n * @param {string} pattern - Route pattern to compile\n * @returns {Object} Compiled route object with regex and parameter names\n * @private\n */\n compileRoute(pattern) {\n // Check compilation cache first\n if (this.routeCompilationCache.has(pattern)) {\n if (this.enableMetrics) this.metrics.compilationHits++;\n return this.routeCompilationCache.get(pattern);\n }\n\n const paramNames = [];\n let regexPattern = pattern;\n\n // Handle wildcards first\n if (pattern.includes('**')) {\n regexPattern = regexPattern.replace(/\\/\\*\\*/g, '/(.*)');\n paramNames.push('splat');\n } else if (pattern.includes('*')) {\n regexPattern = regexPattern.replace(/\\/\\*/g, '/([^/]+)');\n paramNames.push('splat');\n }\n\n // Handle parameters with constraints and optional parameters\n regexPattern = regexPattern.replace(/:([^(/]+)(\\([^)]+\\))?(\\?)?/g, (match, paramName, constraint, optional) => {\n paramNames.push(paramName);\n \n if (constraint) {\n // Use the constraint pattern directly\n const constraintPattern = constraint.slice(1, -1); // Remove parentheses\n return optional ? `(?:/(?:${constraintPattern}))?` : `/(${constraintPattern})`;\n } else {\n // Default parameter pattern\n return optional ? '(?:/([^/]+))?' : '/([^/]+)';\n }\n });\n\n // Escape special regex characters except those we want to keep\n regexPattern = regexPattern\n .replace(/[.+?^${}|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\\\\\(/g, '(')\n .replace(/\\\\\\)/g, ')')\n .replace(/\\\\\\?/g, '?');\n\n // Ensure exact match\n regexPattern = `^${regexPattern}$`;\n\n const compiled = {\n regex: new RegExp(regexPattern),\n paramNames,\n pattern\n };\n\n // Cache the compiled route\n if (this.routeCompilationCache.size < 1000) {\n this.routeCompilationCache.set(pattern, compiled);\n }\n\n return compiled;\n }\n\n /**\n * Match path using compiled route\n * @param {Object} compiledRoute - Compiled route object\n * @param {string} path - Path to match\n * @returns {Object|null} Parameters object or null if no match\n * @private\n */\n matchCompiledRoute(compiledRoute, path) {\n const match = compiledRoute.regex.exec(path);\n if (!match) return null;\n\n const params = {};\n for (let i = 0; i < compiledRoute.paramNames.length; i++) {\n const paramName = compiledRoute.paramNames[i];\n const value = match[i + 1];\n if (value !== undefined) {\n params[paramName] = value;\n }\n }\n\n return params;\n }\n\n /**\n * Get performance metrics\n * @returns {Object} Performance metrics object\n */\n getMetrics() {\n if (!this.enableMetrics) {\n throw new Error('Metrics collection is disabled. Enable with { enableMetrics: true }');\n }\n \n const avgResponseTime = this.metrics.responseTime.length > 0 \n ? this.metrics.responseTime.reduce((a, b) => a + b, 0) / this.metrics.responseTime.length \n : 0;\n \n return {\n ...this.metrics,\n averageResponseTime: Math.round(avgResponseTime * 100) / 100,\n cacheHitRate: this.metrics.requests > 0 ? `${(this.metrics.cacheHits / this.metrics.requests * 100).toFixed(2) }%` : '0%',\n compilationHitRate: this.metrics.requests > 0 ? `${(this.metrics.compilationHits / this.metrics.requests * 100).toFixed(2) }%` : '0%'\n };\n }\n\n /**\n * Get compilation statistics\n * @returns {Object} Compilation statistics\n */\n getCompilationStats() {\n const totalRoutes = this.routes.length;\n const compiledRoutes = this.routes.filter(r => r.compiled).length;\n const compilationCacheSize = this.routeCompilationCache.size;\n \n return {\n totalRoutes,\n compiledRoutes,\n compilationEnabled: this.enableCompilation,\n compilationCacheSize,\n compilationCacheHits: this.enableMetrics ? this.metrics.compilationHits : 'N/A (metrics disabled)'\n };\n }\n\n /**\n * Clear route cache (useful for development)\n */\n clearCache() {\n this.routeCache.clear();\n }\n\n /**\n * Clear compilation cache\n */\n clearCompilationCache() {\n this.routeCompilationCache.clear();\n }\n\n /**\n * Get all registered routes with detailed information\n * @returns {Array} Array of route information objects\n */\n getRoutes() {\n return this.routes.map(route => ({\n method: route.method,\n path: route.path,\n name: route.name || null,\n hasMiddleware: route.middleware && route.middleware.length > 0,\n middlewareCount: route.middleware ? route.middleware.length : 0,\n compiled: !!route.compiled,\n compiledPattern: route.compiled ? route.compiled.regex.source : null,\n paramNames: route.compiled ? route.compiled.paramNames : null\n }));\n }\n\n /**\n * Find routes matching a pattern or method\n * @param {Object} criteria - Search criteria\n * @returns {Array} Matching routes\n */\n findRoutes(criteria = {}) {\n const { method, path, name, hasMiddleware } = criteria;\n \n return this.routes.filter(route => {\n if (method && route.method !== method.toUpperCase()) return false;\n if (path && !route.path.includes(path)) return false;\n if (name && route.name !== name) return false;\n if (hasMiddleware !== undefined && !!route.middleware?.length !== hasMiddleware) return false;\n return true;\n }).map(route => ({\n method: route.method,\n path: route.path,\n name: route.name || null,\n middlewareCount: route.middleware ? route.middleware.length : 0\n }));\n }\n\n /**\n * Test route matching without executing handlers\n * @param {string} method - HTTP method\n * @param {string} path - Path to test\n * @returns {Object} Match result with route info and extracted parameters\n */\n testRoute(method, path) {\n const upperMethod = method.toUpperCase();\n \n for (const route of this.routes) {\n if (route.method === upperMethod) {\n let params = null;\n \n // Use compiled route if available\n if (this.enableCompilation && route.compiled) {\n params = this.matchCompiledRoute(route.compiled, path);\n } else {\n params = extractParams(route.path, path);\n }\n \n if (params !== null) {\n return {\n matched: true,\n route: {\n method: route.method,\n path: route.path,\n name: route.name || null,\n middlewareCount: route.middleware ? route.middleware.length : 0\n },\n params,\n compiledUsed: this.enableCompilation && !!route.compiled\n };\n }\n }\n }\n \n return { matched: false, route: null, params: null };\n }\n\n /**\n * Get router debug information\n * @returns {Object} Comprehensive debug information\n */\n getDebugInfo() {\n const routesByMethod = {};\n const namedRoutes = {};\n \n // Group routes by method\n this.routes.forEach(route => {\n if (!routesByMethod[route.method]) {\n routesByMethod[route.method] = [];\n }\n routesByMethod[route.method].push({\n path: route.path,\n name: route.name,\n middlewareCount: route.middleware ? route.middleware.length : 0,\n compiled: !!route.compiled\n });\n });\n \n // Get named routes\n this.namedRoutes.forEach((routeInfo, name) => {\n namedRoutes[name] = routeInfo;\n });\n \n return {\n totalRoutes: this.routes.length,\n routesByMethod,\n namedRoutes,\n globalMiddleware: this.globalMiddleware.length,\n activeGroups: this.routeGroups.length,\n cacheSize: this.routeCache.size,\n maxCacheSize: this.maxCacheSize,\n compilationEnabled: this.enableCompilation,\n compilationCacheSize: this.routeCompilationCache.size,\n metricsEnabled: this.enableMetrics\n };\n }\n\n async handle(req, res, options = {}) {\n const startTime = Date.now();\n \n // Metrics collection\n if (this.enableMetrics) {\n this.metrics.requests++;\n }\n \n const { corsOrigin, rateLimit = { windowMs: 60000, maxRequests: 100 } } = options;\n \n // Add security headers\n addSecurityHeaders(res, corsOrigin);\n \n // Handle preflight requests\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n \n // Rate limiting\n const clientIP = req.headers['x-forwarded-for'] || req.connection.remoteAddress || 'unknown';\n if (!checkRateLimit(clientIP, rateLimit.windowMs, rateLimit.maxRequests)) {\n res.writeHead(429, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ _error: 'Too Many Requests' }));\n return;\n }\n \n // Parse URL and query parameters\n const parsedUrl = parseUrl(req.url, true);\n const pathname = parsedUrl.pathname;\n req.query = parsedUrl.query || {};\n \n // Parse request body with size limits\n try {\n req.body = await parseBody(req, options.maxBodySize);\n } catch (_error) {\n if (this.enableMetrics) this.metrics.errors++;\n const statusCode = _error.message.includes('too large') ? 413 : 400;\n res.writeHead(statusCode, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ _error: _error.message }));\n return;\n }\n \n // Check route cache first\n const cacheKey = `${req.method}:${pathname}`;\n let matchedRoute = this.routeCache.get(cacheKey);\n \n if (matchedRoute && this.enableMetrics) {\n this.metrics.cacheHits++;\n }\n \n if (!matchedRoute) {\n // Get request version if versioning is enabled\n const requestVersion = this.enableVersioning ? this.getRequestVersion(req) : null;\n \n // Track version requests in metrics\n if (this.enableMetrics && requestVersion) {\n this.metrics.versionRequests.set(requestVersion, (this.metrics.versionRequests.get(requestVersion) || 0) + 1);\n }\n \n // Find matching route using compiled patterns or fallback to extractParams\n const routesToSearch = this.enableVersioning && this.versionedRoutes.has(requestVersion) \n ? this.versionedRoutes.get(requestVersion) \n : this.routes;\n \n for (const route of routesToSearch) {\n if (route.method === req.method) {\n // Skip route if versioning is enabled and versions don't match\n if (this.enableVersioning && route.version !== requestVersion) {\n continue;\n }\n \n let params = null;\n \n // Use compiled route if available\n if (this.enableCompilation && route.compiled) {\n params = this.matchCompiledRoute(route.compiled, pathname);\n } else {\n // Fallback to original parameter extraction\n params = extractParams(route.path, pathname);\n }\n \n if (params !== null) {\n matchedRoute = { route, params };\n \n // Cache the match if under size limit\n if (this.routeCache.size < this.maxCacheSize) {\n this.routeCache.set(cacheKey, matchedRoute);\n }\n break;\n }\n }\n }\n }\n \n if (matchedRoute) {\n req.params = matchedRoute.params;\n \n // Record route match metrics\n if (this.enableMetrics) {\n const routeKey = `${req.method}:${matchedRoute.route.path}`;\n this.metrics.routeMatches.set(routeKey, (this.metrics.routeMatches.get(routeKey) || 0) + 1);\n }\n \n // Log request\n console.log(`${new Date().toISOString()} ${req.method} ${pathname}`);\n \n try {\n // Execute middleware chain\n if (matchedRoute.route.middleware && matchedRoute.route.middleware.length > 0) {\n for (const middleware of matchedRoute.route.middleware) {\n const result = await middleware(req, res);\n if (result) break; // Middleware handled response\n }\n }\n \n // Execute handler\n const { route } = matchedRoute;\n const result = await route.handler(req, res);\n \n // Only write response if handler returned data and response hasn't been sent\n if (result && typeof result === 'object' && !res.headersSent) {\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(result));\n }\n \n // Record response time\n if (this.enableMetrics) {\n const responseTime = Date.now() - startTime;\n this.metrics.responseTime.push(responseTime);\n // Keep only last 1000 response times to prevent memory growth\n if (this.metrics.responseTime.length > 1000) {\n this.metrics.responseTime = this.metrics.responseTime.slice(-1000);\n }\n }\n return;\n } catch (_error) {\n if (this.enableMetrics) this.metrics.errors++;\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ _error: _error.message }));\n }\n return;\n }\n }\n \n // No route found\n if (this.enableMetrics) this.metrics.errors++;\n if (!res.headersSent) {\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ _error: 'Not Found' }));\n }\n }\n\n createServer(options = {}) {\n const mergedOptions = { ...this.defaultOptions, ...options };\n return createServer((req, res) => this.handle(req, res, mergedOptions));\n }\n\n // HTTP convenience methods\n get(path, handler, options = {}) {\n return this.addRoute('GET', path, handler, options);\n }\n\n post(path, handler, options = {}) {\n return this.addRoute('POST', path, handler, options);\n }\n\n put(path, handler, options = {}) {\n return this.addRoute('PUT', path, handler, options);\n }\n\n patch(path, handler, options = {}) {\n return this.addRoute('PATCH', path, handler, options);\n }\n\n delete(path, handler, options = {}) {\n return this.addRoute('DELETE', path, handler, options);\n }\n\n options(path, handler, options = {}) {\n return this.addRoute('OPTIONS', path, handler, options);\n }\n\n head(path, handler, options = {}) {\n return this.addRoute('HEAD', path, handler, options);\n }\n}\n\n/**\n * Creates an object-based router from nested route definitions\n * \n * @param {Object} routes - Nested route definition object\n * @param {Object} options - Router options (corsOrigin, rateLimit, maxBodySize)\n * @returns {Object} Configured router instance\n * \n * @example\n * const routes = {\n * api: {\n * users: {\n * get: { handler: () => ({ users: [] }) },\n * post: { \n * validation: userSchema,\n * handler: (req) => ({ user: req.body })\n * }\n * }\n * }\n * };\n * \n * const router = createRouter(routes, {\n * corsOrigin: 'https://myapp.com',\n * rateLimit: { windowMs: 60000, maxRequests: 50 }\n * });\n * const server = router.createServer();\n * server.listen(3000);\n */\n/**\n * Factory function to create a SimpleRouter instance\n * \n * @param {Object} options - Router options\n * @returns {SimpleRouter} Router instance\n */\nexport function createSimpleRouter(options = {}) {\n return new SimpleRouter(options);\n}\n\nexport function createRouter(routeConfig, options = {}) {\n const router = new SimpleRouter(options);\n router.defaultOptions = options; // Store default options\n\n if (routeConfig) {\n router.addRoutes(routeConfig);\n }\n \n return router;\n}\n\nexport { SimpleRouter };\nexport default createRouter;\n", "/**\n * API Error Handling for Coherent.js\n * @fileoverview Standardized _error classes and handling utilities\n */\n\n/**\n * Base API Error class\n * @extends Error\n */\nclass ApiError extends Error {\n /**\n * Create an API _error\n * @param {string} message - Error message\n * @param {number} statusCode - HTTP status code\n * @param {Object} details - Additional _error details\n */\n constructor(message, statusCode = 500, details = {}) {\n super(message);\n this.name = 'ApiError';\n this.statusCode = statusCode;\n this.details = details;\n \n // Ensure proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ApiError);\n }\n }\n \n /**\n * Convert _error to JSON-serializable object\n * @returns {Object} Error object\n */\n toJSON() {\n return {\n _error: this.name,\n message: this.message,\n statusCode: this.statusCode,\n details: this.details\n };\n }\n}\n\n/**\n * Validation Error class\n * @extends ApiError\n */\nclass ValidationError extends ApiError {\n /**\n * Create a validation _error\n * @param {Object} errors - Validation errors\n * @param {string} message - Error message\n */\n constructor(errors, message = 'Validation failed') {\n super(message, 400, { errors });\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Authentication Error class\n * @extends ApiError\n */\nclass AuthenticationError extends ApiError {\n /**\n * Create an authentication _error\n * @param {string} message - Error message\n */\n constructor(message = 'Authentication required') {\n super(message, 401);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Authorization Error class\n * @extends ApiError\n */\nclass AuthorizationError extends ApiError {\n /**\n * Create an authorization _error\n * @param {string} message - Error message\n */\n constructor(message = 'Access denied') {\n super(message, 403);\n this.name = 'AuthorizationError';\n }\n}\n\n/**\n * Not Found Error class\n * @extends ApiError\n */\nclass NotFoundError extends ApiError {\n /**\n * Create a not found _error\n * @param {string} message - Error message\n */\n constructor(message = 'Resource not found') {\n super(message, 404);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Conflict Error class\n * @extends ApiError\n */\nclass ConflictError extends ApiError {\n /**\n * Create a conflict _error\n * @param {string} message - Error message\n */\n constructor(message = 'Resource conflict') {\n super(message, 409);\n this.name = 'ConflictError';\n }\n}\n\n/**\n * Create _error handling middleware\n * @param {Function} handler - Error handler function\n * @returns {Function} Middleware function\n */\nfunction withErrorHandling(handler) {\n return async (req, res, next) => {\n try {\n return await handler(req, res, next);\n } catch (_error) {\n // If it's already an API _error, use it as-is\n if (_error instanceof ApiError) {\n throw _error;\n }\n \n // Otherwise, wrap it as a generic server _error\n throw new ApiError(_error.message || 'Internal server _error', 500);\n }\n };\n}\n\n/**\n * Global _error handler middleware\n * @returns {Function} Express _error handler middleware\n */\nfunction createErrorHandler() {\n return (_error, req, res, next) => {\n // Log _error for debugging\n console.error('API Error:', _error);\n \n // If headers are already sent, delegate to default _error handler\n if (res.headersSent) {\n return next(_error);\n }\n \n // Format _error response\n const response = {\n _error: _error.name || 'Error',\n message: _error.message || 'An _error occurred',\n statusCode: _error.statusCode || 500\n };\n \n // Add details if available\n if (_error.details) {\n response.details = _error.details;\n }\n \n // Add stack trace in development\n if (process.env.NODE_ENV === 'development') {\n response.stack = _error.stack;\n }\n \n res.status(response.statusCode).json(response);\n };\n}\n\n// Export all _error classes and utilities\nexport {\n ApiError,\n ValidationError,\n AuthenticationError,\n AuthorizationError,\n NotFoundError,\n ConflictError,\n withErrorHandling,\n createErrorHandler\n};\n", "/**\n * API Validation for Coherent.js\n * @fileoverview Schema-based validation utilities\n */\n\nimport { ValidationError } from './errors.js';\n\n/**\n * Validate data against a schema\n * @param {Object} schema - JSON Schema\n * @param {any} data - Data to validate\n * @returns {Object} Validation result\n */\nfunction validateAgainstSchema(schema, data) {\n const errors = [];\n \n // Simple validation implementation\n // In a real implementation, this would use a proper JSON Schema validator\n \n if (schema.type === 'object') {\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n errors.push({\n field: '',\n message: `Expected object, got ${typeof data}`\n });\n return { valid: false, errors };\n }\n \n // Check required fields\n if (schema.required && Array.isArray(schema.required)) {\n for (const field of schema.required) {\n if (!(field in data)) {\n errors.push({\n field,\n message: `Required field '${field}' is missing`\n });\n }\n }\n }\n \n // Validate properties\n if (schema.properties) {\n for (const [field, fieldSchema] of Object.entries(schema.properties)) {\n if (field in data) {\n const fieldValue = data[field];\n const fieldErrors = validateField(fieldSchema, fieldValue, field);\n errors.push(...fieldErrors);\n }\n }\n }\n }\n \n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * Validate a single field\n * @param {Object} schema - Field schema\n * @param {any} value - Field value\n * @param {string} fieldName - Field name\n * @returns {Array} Validation errors\n */\nfunction validateField(schema, value, fieldName) {\n const errors = [];\n \n // Type validation\n if (schema.type) {\n if (schema.type === 'string' && typeof value !== 'string') {\n errors.push({\n field: fieldName,\n message: `Expected string, got ${typeof value}`\n });\n } else if (schema.type === 'number' && typeof value !== 'number') {\n errors.push({\n field: fieldName,\n message: `Expected number, got ${typeof value}`\n });\n } else if (schema.type === 'boolean' && typeof value !== 'boolean') {\n errors.push({\n field: fieldName,\n message: `Expected boolean, got ${typeof value}`\n });\n } else if (schema.type === 'array' && !Array.isArray(value)) {\n errors.push({\n field: fieldName,\n message: `Expected array, got ${typeof value}`\n });\n }\n }\n \n // String-specific validations\n if (schema.type === 'string') {\n if (schema.minLength && value.length < schema.minLength) {\n errors.push({\n field: fieldName,\n message: `String must be at least ${schema.minLength} characters`\n });\n }\n \n if (schema.maxLength && value.length > schema.maxLength) {\n errors.push({\n field: fieldName,\n message: `String must be at most ${schema.maxLength} characters`\n });\n }\n \n if (schema.format === 'email' && !/^[^@]+@[^@]+\\.[^@]+$/.test(value)) {\n errors.push({\n field: fieldName,\n message: 'Invalid email format'\n });\n }\n }\n \n // Number-specific validations\n if (schema.type === 'number') {\n if (schema.minimum !== undefined && value < schema.minimum) {\n errors.push({\n field: fieldName,\n message: `Number must be at least ${schema.minimum}`\n });\n }\n \n if (schema.maximum !== undefined && value > schema.maximum) {\n errors.push({\n field: fieldName,\n message: `Number must be at most ${schema.maximum}`\n });\n }\n }\n \n return errors;\n}\n\n/**\n * Create validation middleware\n * @param {Object} schema - JSON Schema for validation\n * @returns {Function} Middleware function\n */\nfunction withValidation(schema) {\n return (req, res, next) => {\n const data = req.body || {};\n const result = validateAgainstSchema(schema, data);\n \n if (!result.valid) {\n throw new ValidationError(result.errors);\n }\n \n next();\n };\n}\n\n/**\n * Validate query parameters\n * @param {Object} schema - JSON Schema for query parameters\n * @returns {Function} Middleware function\n */\nfunction withQueryValidation(schema) {\n return (req, res, next) => {\n const data = req.query || {};\n const result = validateAgainstSchema(schema, data);\n \n if (!result.valid) {\n throw new ValidationError(result.errors);\n }\n \n next();\n };\n}\n\n/**\n * Validate path parameters\n * @param {Object} schema - JSON Schema for path parameters\n * @returns {Function} Middleware function\n */\nfunction withParamsValidation(schema) {\n return (req, res, next) => {\n const data = req.params || {};\n const result = validateAgainstSchema(schema, data);\n \n if (!result.valid) {\n throw new ValidationError(result.errors);\n }\n \n next();\n };\n}\n\n// Export validation utilities\nexport {\n validateAgainstSchema,\n validateField,\n withValidation,\n withQueryValidation,\n withParamsValidation\n};\n", "/**\n * API Serialization for Coherent.js\n * @fileoverview Utilities for serializing complex data types\n */\n\n/**\n * Serialize a Date object to ISO string\n * @param {Date} date - Date to serialize\n * @returns {string} ISO date string\n */\nfunction serializeDate(date) {\n if (!(date instanceof Date)) {\n throw new Error('Expected Date object');\n }\n return date.toISOString();\n}\n\n/**\n * Deserialize an ISO date string to Date object\n * @param {string} dateString - ISO date string\n * @returns {Date} Date object\n */\nfunction deserializeDate(dateString) {\n const date = new Date(dateString);\n if (isNaN(date.getTime())) {\n throw new Error('Invalid date string');\n }\n return date;\n}\n\n/**\n * Serialize a Map to plain object\n * @param {Map} map - Map to serialize\n * @returns {Object} Plain object\n */\nfunction serializeMap(map) {\n if (!(map instanceof Map)) {\n throw new Error('Expected Map object');\n }\n \n const obj = {};\n for (const [key, value] of map) {\n obj[key] = value;\n }\n return obj;\n}\n\n/**\n * Deserialize a plain object to Map\n * @param {Object} obj - Plain object\n * @returns {Map} Map object\n */\nfunction deserializeMap(obj) {\n if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {\n throw new Error('Expected plain object');\n }\n \n return new Map(Object.entries(obj));\n}\n\n/**\n * Serialize a Set to array\n * @param {Set} set - Set to serialize\n * @returns {Array} Array\n */\nfunction serializeSet(set) {\n if (!(set instanceof Set)) {\n throw new Error('Expected Set object');\n }\n \n return Array.from(set);\n}\n\n/**\n * Deserialize an array to Set\n * @param {Array} arr - Array\n * @returns {Set} Set object\n */\nfunction deserializeSet(arr) {\n if (!Array.isArray(arr)) {\n throw new Error('Expected array');\n }\n \n return new Set(arr);\n}\n\n/**\n * Create serialization middleware\n * @param {Object} options - Serialization options\n * @param {boolean} [options.enableDate=true] - Include Date helpers\n * @param {boolean} [options.enableMap=true] - Include Map helpers\n * @param {boolean} [options.enableSet=true] - Include Set helpers\n * @param {Object} [options.custom] - Custom serializer/deserializer overrides\n * @param {(d: Date) => any} [options.custom.serializeDate]\n * @param {(v: any) => Date} [options.custom.deserializeDate]\n * @param {(m: Map) => any} [options.custom.serializeMap]\n * @param {(v: any) => Map} [options.custom.deserializeMap]\n * @param {(s: Set) => any} [options.custom.serializeSet]\n * @param {(v: any) => Set} [options.custom.deserializeSet]\n * @returns {Function} Middleware function\n */\nfunction withSerialization(options = {}) {\n const {\n enableDate = true,\n enableMap = true,\n enableSet = true,\n custom = {}\n } = options;\n\n return (req, res, next) => {\n // Build serialization helpers, honoring options/custom overrides\n res.serialize = {};\n req.deserialize = {};\n\n if (enableDate) {\n res.serialize.date = custom.serializeDate || serializeDate;\n req.deserialize.date = custom.deserializeDate || deserializeDate;\n }\n if (enableMap) {\n res.serialize.map = custom.serializeMap || serializeMap;\n req.deserialize.map = custom.deserializeMap || deserializeMap;\n }\n if (enableSet) {\n res.serialize.set = custom.serializeSet || serializeSet;\n req.deserialize.set = custom.deserializeSet || deserializeSet;\n }\n\n next();\n };\n}\n\n/**\n * Serialize complex data for JSON\n * @param {any} data - Data to serialize\n * @returns {any} Serialized data\n */\nfunction serializeForJSON(data) {\n if (data instanceof Date) {\n return serializeDate(data);\n }\n \n if (data instanceof Map) {\n return serializeMap(data);\n }\n \n if (data instanceof Set) {\n return serializeSet(data);\n }\n \n if (Array.isArray(data)) {\n return data.map(item => serializeForJSON(item));\n }\n \n if (typeof data === 'object' && data !== null) {\n const serialized = {};\n for (const [key, value] of Object.entries(data)) {\n serialized[key] = serializeForJSON(value);\n }\n return serialized;\n }\n \n return data;\n}\n\n// Export serialization utilities\nexport {\n serializeDate,\n deserializeDate,\n serializeMap,\n deserializeMap,\n serializeSet,\n deserializeSet,\n withSerialization,\n serializeForJSON\n};\n\nexport default {\n serializeDate,\n deserializeDate,\n serializeMap,\n deserializeMap,\n serializeSet,\n deserializeSet,\n withSerialization,\n serializeForJSON\n};\n", "/**\n * Security Middleware for Coherent.js API Framework\n * @fileoverview Provides authentication, authorization, and security utilities\n */\n\nimport { createHmac, randomBytes, pbkdf2Sync } from 'crypto';\nimport { Buffer } from 'buffer';\n\n/**\n * Base64 URL encode\n * @param {string} str - String to encode\n * @returns {string} Base64 URL encoded string\n */\nfunction base64UrlEncode(str) {\n return Buffer.from(str)\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n}\n\n/**\n * Base64 URL decode\n * @param {string} str - Base64 URL encoded string\n * @returns {string} Decoded string\n */\nfunction base64UrlDecode(str) {\n // Add padding if needed\n str += '='.repeat((4 - str.length % 4) % 4);\n return Buffer.from(str.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString();\n}\n\n/**\n * Create HMAC signature for JWT\n * @param {string} data - Data to sign\n * @param {string} secret - Secret key\n * @returns {string} HMAC signature\n */\nfunction createSignature(data, secret) {\n return createHmac('sha256', secret).update(data).digest('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n}\n\n/**\n * Generate JWT token\n * @param {Object} payload - Token payload\n * @param {string} expiresIn - Expiration time (e.g., '1h', '30m', '7d')\n * @param {string} secret - Secret key\n * @returns {string} JWT token\n */\nexport function generateJWT(payload, expiresIn = '1h', secret = 'your-secret-key') {\n const header = {\n alg: 'HS256',\n typ: 'JWT'\n };\n\n // Calculate expiration time\n const now = Math.floor(Date.now() / 1000);\n let exp = now;\n \n if (expiresIn.endsWith('h')) {\n exp += parseInt(expiresIn) * 3600;\n } else if (expiresIn.endsWith('m')) {\n exp += parseInt(expiresIn) * 60;\n } else if (expiresIn.endsWith('d')) {\n exp += parseInt(expiresIn) * 86400;\n } else {\n exp += 3600; // Default 1 hour\n }\n\n const tokenPayload = {\n ...payload,\n iat: now,\n exp: exp\n };\n\n const encodedHeader = base64UrlEncode(JSON.stringify(header));\n const encodedPayload = base64UrlEncode(JSON.stringify(tokenPayload));\n const data = `${encodedHeader}.${encodedPayload}`;\n const signature = createSignature(data, secret);\n\n return `${data}.${signature}`;\n}\n\n/**\n * JWT token verification\n * @param {string} token - Bearer token or JWT token\n * @param {string} secret - Secret key\n * @returns {Object|null} Decoded payload or null if invalid\n */\nexport function verifyToken(token, secret = 'your-secret-key') {\n try {\n let jwtToken = token;\n \n // Handle Bearer token format\n if (token && token.startsWith('Bearer ')) {\n jwtToken = token.slice(7);\n }\n \n if (!jwtToken) {\n return null;\n }\n\n // Split JWT into parts\n const parts = jwtToken.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n const [encodedHeader, encodedPayload, signature] = parts;\n\n // Verify signature\n const data = `${encodedHeader}.${encodedPayload}`;\n const expectedSignature = createSignature(data, secret);\n \n if (signature !== expectedSignature) {\n return null;\n }\n\n // Decode and parse payload\n const payload = JSON.parse(base64UrlDecode(encodedPayload));\n\n // Check expiration\n const now = Math.floor(Date.now() / 1000);\n if (payload.exp && payload.exp < now) {\n return null; // Token expired\n }\n\n return payload;\n } catch {\n return null;\n }\n}\n\n/**\n * Authentication middleware\n * @param {Object} options - Auth options\n * @returns {Function} Middleware function\n */\nexport function withAuth(options = {}) {\n const { secret, required = true } = options;\n \n return (req, res) => {\n const authHeader = req.headers.authorization;\n const user = verifyToken(authHeader, secret);\n \n if (required && !user) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ _error: 'Unauthorized' }));\n return;\n }\n \n req.user = user;\n return null; // Continue to next middleware\n };\n}\n\n/**\n * Authorization middleware\n * @param {string|Array} roles - Required roles\n * @returns {Function} Middleware function\n */\nexport function withRole(roles) {\n const requiredRoles = Array.isArray(roles) ? roles : [roles];\n \n return (req, res) => {\n if (!req.user) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ _error: 'Unauthorized' }));\n return;\n }\n \n if (!requiredRoles.includes(req.user.role)) {\n res.writeHead(403, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ _error: 'Forbidden' }));\n return;\n }\n \n return null; // Continue to next middleware\n };\n}\n\n/**\n * Password hashing utility\n * @param {string} password - Plain text password\n * @returns {string} Hashed password\n */\nexport function hashPassword(password) {\n const salt = randomBytes(16).toString('hex');\n const hash = pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('hex');\n return `${salt}:${hash}`;\n}\n\n/**\n * Password verification utility\n * @param {string} password - Plain text password\n * @param {string} hashedPassword - Hashed password from database\n * @returns {boolean} True if password matches\n */\nexport function verifyPassword(password, hashedPassword) {\n try {\n const [salt, hash] = hashedPassword.split(':');\n const verifyHash = pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('hex');\n return hash === verifyHash;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate secure random token (for non-JWT use cases)\n * @param {number} length - Token length\n * @returns {string} Random token\n */\nexport function generateToken(length = 32) {\n return randomBytes(length).toString('hex');\n}\n\n/**\n * Input validation middleware\n * @param {Object} rules - Validation rules\n * @returns {Function} Middleware function\n */\nexport function withInputValidation(rules) {\n return (req, res) => {\n const errors = [];\n \n for (const [field, rule] of Object.entries(rules)) {\n const value = req.body[field];\n \n if (rule.required && (value === undefined || value === null || value === '')) {\n errors.push(`${field} is required`);\n continue;\n }\n \n if (value !== undefined && rule.type && typeof value !== rule.type) {\n errors.push(`${field} must be of type ${rule.type}`);\n }\n \n if (value && rule.minLength && value.length < rule.minLength) {\n errors.push(`${field} must be at least ${rule.minLength} characters`);\n }\n \n if (value && rule.maxLength && value.length > rule.maxLength) {\n errors.push(`${field} must be at most ${rule.maxLength} characters`);\n }\n \n if (value && rule.pattern && !rule.pattern.test(value)) {\n errors.push(`${field} format is invalid`);\n }\n }\n \n if (errors.length > 0) {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ _error: 'Validation failed', details: errors }));\n return;\n }\n \n return null; // Continue to next middleware\n };\n}\n\nexport default {\n verifyToken,\n generateJWT,\n withAuth,\n withRole,\n hashPassword,\n verifyPassword,\n generateToken,\n withInputValidation\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["obj", "parseUrl", "result"]
|
|
7
|
+
}
|