nextjs-secure 0.5.0 → 0.7.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/README.md +736 -688
- package/dist/audit.cjs +1337 -0
- package/dist/audit.cjs.map +1 -0
- package/dist/audit.d.cts +679 -0
- package/dist/audit.d.ts +679 -0
- package/dist/audit.js +1300 -0
- package/dist/audit.js.map +1 -0
- package/dist/bot.cjs +1521 -0
- package/dist/bot.cjs.map +1 -0
- package/dist/bot.d.cts +567 -0
- package/dist/bot.d.ts +567 -0
- package/dist/bot.js +1484 -0
- package/dist/bot.js.map +1 -0
- package/dist/index.cjs +2850 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2784 -10
- package/dist/index.js.map +1 -1
- package/package.json +26 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/middleware/audit/stores/memory.ts","../src/middleware/audit/stores/console.ts","../src/middleware/audit/stores/external.ts","../src/middleware/audit/formatters.ts","../src/middleware/audit/redaction.ts","../src/middleware/audit/events.ts","../src/middleware/audit/middleware.ts"],"names":["first","last","hash","parts","generateId"],"mappings":"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","file":"audit.cjs","sourcesContent":["import type { LogStore, AuditLogEntry, LogQueryOptions, MemoryStoreOptions, SecurityEventType } from '../types'\n\n/**\n * In-memory log store with LRU eviction\n * Useful for development and testing\n */\nexport class MemoryStore implements LogStore {\n private entries: AuditLogEntry[] = []\n private readonly maxEntries: number\n private readonly ttl: number\n\n constructor(options: MemoryStoreOptions = {}) {\n this.maxEntries = options.maxEntries || 1000\n this.ttl = options.ttl || 0 // 0 = no TTL\n }\n\n async write(entry: AuditLogEntry): Promise<void> {\n // Add entry\n this.entries.push(entry)\n\n // Evict old entries if over limit\n if (this.entries.length > this.maxEntries) {\n this.entries = this.entries.slice(-this.maxEntries)\n }\n\n // Clean expired entries if TTL is set\n if (this.ttl > 0) {\n this.cleanExpired()\n }\n }\n\n async query(options: LogQueryOptions = {}): Promise<AuditLogEntry[]> {\n let result = [...this.entries]\n\n // Filter by level\n if (options.level) {\n const levels = Array.isArray(options.level) ? options.level : [options.level]\n result = result.filter(e => levels.includes(e.level))\n }\n\n // Filter by type\n if (options.type) {\n result = result.filter(e => e.type === options.type)\n }\n\n // Filter by event type (for security events)\n if (options.event) {\n const events = Array.isArray(options.event) ? options.event : [options.event]\n result = result.filter(e =>\n e.type === 'security' && events.includes((e as { event: SecurityEventType }).event)\n )\n }\n\n // Filter by time range\n if (options.startTime) {\n result = result.filter(e => e.timestamp >= options.startTime!)\n }\n if (options.endTime) {\n result = result.filter(e => e.timestamp <= options.endTime!)\n }\n\n // Filter by IP\n if (options.ip) {\n result = result.filter(e => {\n if (e.type === 'request') return e.request.ip === options.ip\n if (e.type === 'security') return e.source.ip === options.ip\n return false\n })\n }\n\n // Filter by user ID\n if (options.userId) {\n result = result.filter(e => {\n if (e.type === 'request') return e.user?.id === options.userId\n if (e.type === 'security') return e.source.userId === options.userId\n return false\n })\n }\n\n // Apply offset\n if (options.offset) {\n result = result.slice(options.offset)\n }\n\n // Apply limit\n if (options.limit) {\n result = result.slice(0, options.limit)\n }\n\n return result\n }\n\n async flush(): Promise<void> {\n // No-op for memory store\n }\n\n async close(): Promise<void> {\n this.entries = []\n }\n\n /**\n * Get all entries (for testing)\n */\n getEntries(): AuditLogEntry[] {\n return [...this.entries]\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.entries = []\n }\n\n /**\n * Get entry count\n */\n size(): number {\n return this.entries.length\n }\n\n /**\n * Clean expired entries\n */\n private cleanExpired(): void {\n if (this.ttl <= 0) return\n\n const now = Date.now()\n this.entries = this.entries.filter(e => {\n const age = now - e.timestamp.getTime()\n return age < this.ttl\n })\n }\n}\n\n/**\n * Create a memory store\n */\nexport function createMemoryStore(options?: MemoryStoreOptions): MemoryStore {\n return new MemoryStore(options)\n}\n","import type { LogStore, AuditLogEntry, ConsoleStoreOptions, LogLevel } from '../types'\n\n/**\n * ANSI color codes\n */\nconst COLORS = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n\n // Log levels\n debug: '\\x1b[36m', // Cyan\n info: '\\x1b[32m', // Green\n warn: '\\x1b[33m', // Yellow\n error: '\\x1b[31m', // Red\n critical: '\\x1b[35m', // Magenta\n\n // Security severity\n low: '\\x1b[36m', // Cyan\n medium: '\\x1b[33m', // Yellow\n high: '\\x1b[31m', // Red\n\n // Other\n timestamp: '\\x1b[90m', // Gray\n method: '\\x1b[34m', // Blue\n status2xx: '\\x1b[32m', // Green\n status3xx: '\\x1b[36m', // Cyan\n status4xx: '\\x1b[33m', // Yellow\n status5xx: '\\x1b[31m', // Red\n}\n\n/**\n * Log level priority\n */\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n critical: 4,\n}\n\n/**\n * Console log store\n * Outputs formatted logs to console\n */\nexport class ConsoleStore implements LogStore {\n private readonly colorize: boolean\n private readonly showTimestamp: boolean\n private readonly pretty: boolean\n private readonly minLevel: LogLevel\n\n constructor(options: ConsoleStoreOptions = {}) {\n this.colorize = options.colorize ?? (process.env.NODE_ENV !== 'production')\n this.showTimestamp = options.timestamp ?? true\n this.pretty = options.pretty ?? false\n this.minLevel = options.level || 'info'\n }\n\n async write(entry: AuditLogEntry): Promise<void> {\n // Check log level\n if (LEVEL_PRIORITY[entry.level] < LEVEL_PRIORITY[this.minLevel]) {\n return\n }\n\n const output = this.pretty\n ? this.formatPretty(entry)\n : this.formatCompact(entry)\n\n // Use appropriate console method\n switch (entry.level) {\n case 'debug':\n console.debug(output)\n break\n case 'info':\n console.info(output)\n break\n case 'warn':\n console.warn(output)\n break\n case 'error':\n case 'critical':\n console.error(output)\n break\n default:\n console.log(output)\n }\n }\n\n async flush(): Promise<void> {\n // No-op for console\n }\n\n async close(): Promise<void> {\n // No-op for console\n }\n\n /**\n * Format entry in compact single-line format\n */\n private formatCompact(entry: AuditLogEntry): string {\n const parts: string[] = []\n\n // Timestamp\n if (this.showTimestamp) {\n const ts = entry.timestamp.toISOString()\n parts.push(this.color(ts, 'timestamp'))\n }\n\n // Level\n parts.push(this.colorLevel(entry.level))\n\n if (entry.type === 'request') {\n // Request log\n const req = entry.request\n const res = entry.response\n\n // Method and path\n parts.push(this.color(req.method, 'method'))\n parts.push(req.path)\n\n // Status and duration\n if (res) {\n parts.push(this.colorStatus(res.status))\n parts.push(this.color(`${res.duration}ms`, 'dim'))\n }\n\n // IP\n if (req.ip) {\n parts.push(this.color(`[${req.ip}]`, 'dim'))\n }\n\n // User\n if (entry.user?.id) {\n parts.push(this.color(`user:${entry.user.id}`, 'dim'))\n }\n\n // Error\n if (entry.error) {\n parts.push(this.color(`ERROR: ${entry.error.message}`, 'error'))\n }\n } else if (entry.type === 'security') {\n // Security event\n parts.push(this.colorSeverity(entry.severity))\n parts.push(entry.event)\n\n if (entry.source.ip) {\n parts.push(this.color(`[${entry.source.ip}]`, 'dim'))\n }\n\n if (entry.source.userId) {\n parts.push(this.color(`user:${entry.source.userId}`, 'dim'))\n }\n\n parts.push(entry.message)\n }\n\n return parts.join(' ')\n }\n\n /**\n * Format entry in pretty multi-line format\n */\n private formatPretty(entry: AuditLogEntry): string {\n const lines: string[] = []\n\n // Header\n const header = [\n this.color(entry.timestamp.toISOString(), 'timestamp'),\n this.colorLevel(entry.level),\n `[${entry.type.toUpperCase()}]`,\n ].join(' ')\n\n lines.push(header)\n\n if (entry.type === 'request') {\n const req = entry.request\n const res = entry.response\n\n // Request line\n lines.push(` ${this.color(req.method, 'method')} ${req.url}`)\n\n // Request details\n if (req.ip) lines.push(` IP: ${req.ip}`)\n if (req.userAgent) lines.push(` UA: ${req.userAgent}`)\n\n // Response\n if (res) {\n lines.push(` Status: ${this.colorStatus(res.status)} (${res.duration}ms)`)\n }\n\n // User\n if (entry.user) {\n lines.push(` User: ${JSON.stringify(entry.user)}`)\n }\n\n // Error\n if (entry.error) {\n lines.push(` ${this.color('Error:', 'error')} ${entry.error.message}`)\n if (entry.error.stack) {\n lines.push(` ${this.color(entry.error.stack, 'dim')}`)\n }\n }\n } else if (entry.type === 'security') {\n lines.push(` Event: ${entry.event}`)\n lines.push(` Severity: ${this.colorSeverity(entry.severity)}`)\n lines.push(` Message: ${entry.message}`)\n\n if (entry.source.ip) lines.push(` Source IP: ${entry.source.ip}`)\n if (entry.source.userId) lines.push(` Source User: ${entry.source.userId}`)\n\n if (entry.target) {\n lines.push(` Target: ${JSON.stringify(entry.target)}`)\n }\n\n if (entry.details) {\n lines.push(` Details: ${JSON.stringify(entry.details)}`)\n }\n }\n\n // Metadata\n if (entry.metadata && Object.keys(entry.metadata).length > 0) {\n lines.push(` Metadata: ${JSON.stringify(entry.metadata)}`)\n }\n\n return lines.join('\\n')\n }\n\n /**\n * Apply color if enabled\n */\n private color(text: string, colorName: keyof typeof COLORS): string {\n if (!this.colorize) return text\n return `${COLORS[colorName]}${text}${COLORS.reset}`\n }\n\n /**\n * Color log level\n */\n private colorLevel(level: LogLevel): string {\n const text = level.toUpperCase().padEnd(8)\n if (!this.colorize) return `[${text}]`\n return `[${COLORS[level]}${text}${COLORS.reset}]`\n }\n\n /**\n * Color HTTP status\n */\n private colorStatus(status: number): string {\n const text = status.toString()\n if (!this.colorize) return text\n\n if (status >= 500) return `${COLORS.status5xx}${text}${COLORS.reset}`\n if (status >= 400) return `${COLORS.status4xx}${text}${COLORS.reset}`\n if (status >= 300) return `${COLORS.status3xx}${text}${COLORS.reset}`\n return `${COLORS.status2xx}${text}${COLORS.reset}`\n }\n\n /**\n * Color severity\n */\n private colorSeverity(severity: 'low' | 'medium' | 'high' | 'critical'): string {\n const text = `[${severity.toUpperCase()}]`\n if (!this.colorize) return text\n\n const colorKey = severity === 'critical' ? 'critical' : severity\n return `${COLORS[colorKey]}${text}${COLORS.reset}`\n }\n}\n\n/**\n * Create a console store\n */\nexport function createConsoleStore(options?: ConsoleStoreOptions): ConsoleStore {\n return new ConsoleStore(options)\n}\n","import type { LogStore, AuditLogEntry, ExternalStoreOptions } from '../types'\n\n/**\n * External HTTP log store\n * Sends logs to external services (Datadog, Sentry, custom endpoints)\n */\nexport class ExternalStore implements LogStore {\n private readonly endpoint: string\n private readonly headers: Record<string, string>\n private readonly batchSize: number\n private readonly flushInterval: number\n private readonly retryAttempts: number\n private readonly timeout: number\n\n private buffer: AuditLogEntry[] = []\n private flushTimer: ReturnType<typeof setInterval> | null = null\n private isFlushing = false\n\n constructor(options: ExternalStoreOptions) {\n this.endpoint = options.endpoint\n this.headers = {\n 'Content-Type': 'application/json',\n ...(options.apiKey ? { 'Authorization': `Bearer ${options.apiKey}` } : {}),\n ...options.headers,\n }\n this.batchSize = options.batchSize || 100\n this.flushInterval = options.flushInterval || 5000 // 5 seconds\n this.retryAttempts = options.retryAttempts || 3\n this.timeout = options.timeout || 10000 // 10 seconds\n\n // Start auto-flush timer\n if (this.flushInterval > 0) {\n this.flushTimer = setInterval(() => this.flush(), this.flushInterval)\n }\n }\n\n async write(entry: AuditLogEntry): Promise<void> {\n this.buffer.push(entry)\n\n // Flush if batch size reached\n if (this.buffer.length >= this.batchSize) {\n await this.flush()\n }\n }\n\n async flush(): Promise<void> {\n if (this.isFlushing || this.buffer.length === 0) return\n\n this.isFlushing = true\n const entries = [...this.buffer]\n this.buffer = []\n\n try {\n await this.send(entries)\n } catch (error) {\n // Put entries back in buffer on failure\n this.buffer = [...entries, ...this.buffer]\n console.error('[ExternalStore] Failed to flush logs:', error)\n } finally {\n this.isFlushing = false\n }\n }\n\n async close(): Promise<void> {\n // Clear timer\n if (this.flushTimer) {\n clearInterval(this.flushTimer)\n this.flushTimer = null\n }\n\n // Final flush\n await this.flush()\n }\n\n /**\n * Send entries to external endpoint\n */\n private async send(entries: AuditLogEntry[]): Promise<void> {\n let lastError: Error | null = null\n\n for (let attempt = 0; attempt < this.retryAttempts; attempt++) {\n try {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n const response = await fetch(this.endpoint, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify({\n logs: entries.map(e => this.serialize(e)),\n timestamp: new Date().toISOString(),\n count: entries.length,\n }),\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n return // Success\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n\n // Wait before retry (exponential backoff)\n if (attempt < this.retryAttempts - 1) {\n await this.sleep(Math.pow(2, attempt) * 1000)\n }\n }\n }\n\n throw lastError || new Error('Failed to send logs')\n }\n\n /**\n * Serialize entry for transmission\n */\n private serialize(entry: AuditLogEntry): Record<string, unknown> {\n return {\n ...entry,\n timestamp: entry.timestamp.toISOString(),\n }\n }\n\n /**\n * Sleep helper\n */\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n }\n\n /**\n * Get buffer size (for monitoring)\n */\n getBufferSize(): number {\n return this.buffer.length\n }\n}\n\n/**\n * Create an external store\n */\nexport function createExternalStore(options: ExternalStoreOptions): ExternalStore {\n return new ExternalStore(options)\n}\n\n/**\n * Create a Datadog store\n */\nexport function createDatadogStore(options: {\n apiKey: string\n site?: 'datadoghq.com' | 'datadoghq.eu' | 'us3.datadoghq.com' | 'us5.datadoghq.com'\n service?: string\n source?: string\n tags?: string[]\n batchSize?: number\n flushInterval?: number\n}): ExternalStore {\n const site = options.site || 'datadoghq.com'\n const endpoint = `https://http-intake.logs.${site}/api/v2/logs`\n\n return new ExternalStore({\n endpoint,\n headers: {\n 'DD-API-KEY': options.apiKey,\n 'Content-Type': 'application/json',\n },\n batchSize: options.batchSize || 100,\n flushInterval: options.flushInterval || 5000,\n })\n}\n\n/**\n * Create a multi-store that writes to multiple stores\n */\nexport class MultiStore implements LogStore {\n private stores: LogStore[]\n\n constructor(stores: LogStore[]) {\n this.stores = stores\n }\n\n async write(entry: AuditLogEntry): Promise<void> {\n await Promise.all(this.stores.map(store => store.write(entry)))\n }\n\n async query(options: Parameters<NonNullable<LogStore['query']>>[0]): Promise<AuditLogEntry[]> {\n // Query from first store that supports it\n for (const store of this.stores) {\n if (store.query) {\n return store.query(options)\n }\n }\n return []\n }\n\n async flush(): Promise<void> {\n await Promise.all(this.stores.map(store => store.flush?.()))\n }\n\n async close(): Promise<void> {\n await Promise.all(this.stores.map(store => store.close?.()))\n }\n}\n\n/**\n * Create a multi-store\n */\nexport function createMultiStore(stores: LogStore[]): MultiStore {\n return new MultiStore(stores)\n}\n","import type { LogFormatter, AuditLogEntry } from './types'\n\n/**\n * JSON formatter - outputs logs as JSON strings\n */\nexport class JSONFormatter implements LogFormatter {\n private readonly pretty: boolean\n private readonly includeTimestamp: boolean\n\n constructor(options: { pretty?: boolean; includeTimestamp?: boolean } = {}) {\n this.pretty = options.pretty ?? false\n this.includeTimestamp = options.includeTimestamp ?? true\n }\n\n format(entry: AuditLogEntry): string {\n const output = {\n ...entry,\n timestamp: this.includeTimestamp ? entry.timestamp.toISOString() : undefined,\n }\n\n return this.pretty\n ? JSON.stringify(output, null, 2)\n : JSON.stringify(output)\n }\n}\n\n/**\n * Text formatter - outputs logs as human-readable text\n */\nexport class TextFormatter implements LogFormatter {\n private readonly template: string\n private readonly dateFormat: 'iso' | 'utc' | 'local'\n\n constructor(options: {\n template?: string\n dateFormat?: 'iso' | 'utc' | 'local'\n } = {}) {\n this.template = options.template || '{timestamp} [{level}] {message}'\n this.dateFormat = options.dateFormat || 'iso'\n }\n\n format(entry: AuditLogEntry): string {\n let output = this.template\n\n // Replace placeholders\n output = output.replace('{timestamp}', this.formatDate(entry.timestamp))\n output = output.replace('{level}', entry.level.toUpperCase().padEnd(8))\n output = output.replace('{message}', entry.message)\n output = output.replace('{type}', entry.type)\n output = output.replace('{id}', entry.id)\n\n if (entry.category) {\n output = output.replace('{category}', entry.category)\n }\n\n // Request-specific\n if (entry.type === 'request') {\n output = output.replace('{method}', entry.request.method)\n output = output.replace('{path}', entry.request.path)\n output = output.replace('{url}', entry.request.url)\n output = output.replace('{ip}', entry.request.ip || '-')\n output = output.replace('{status}', entry.response?.status?.toString() || '-')\n output = output.replace('{duration}', entry.response?.duration?.toString() || '-')\n }\n\n // Security-specific\n if (entry.type === 'security') {\n output = output.replace('{event}', entry.event)\n output = output.replace('{severity}', entry.severity)\n }\n\n return output\n }\n\n private formatDate(date: Date): string {\n switch (this.dateFormat) {\n case 'utc':\n return date.toUTCString()\n case 'local':\n return date.toLocaleString()\n case 'iso':\n default:\n return date.toISOString()\n }\n }\n}\n\n/**\n * CLF (Common Log Format) formatter\n * Apache/Nginx style: host ident authuser date request status bytes\n */\nexport class CLFFormatter implements LogFormatter {\n format(entry: AuditLogEntry): string {\n if (entry.type !== 'request') {\n // Fall back to simple format for non-request entries\n return `[${entry.timestamp.toISOString()}] ${entry.level.toUpperCase()} ${entry.message}`\n }\n\n const req = entry.request\n const res = entry.response\n\n const host = req.ip || '-'\n const ident = '-'\n const authuser = entry.user?.id || '-'\n const date = this.formatCLFDate(entry.timestamp)\n const request = `${req.method} ${req.path} HTTP/1.1`\n const status = res?.status || 0\n const bytes = res?.contentLength || 0\n\n return `${host} ${ident} ${authuser} [${date}] \"${request}\" ${status} ${bytes}`\n }\n\n private formatCLFDate(date: Date): string {\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\n const day = date.getDate().toString().padStart(2, '0')\n const month = months[date.getMonth()]\n const year = date.getFullYear()\n const hours = date.getHours().toString().padStart(2, '0')\n const minutes = date.getMinutes().toString().padStart(2, '0')\n const seconds = date.getSeconds().toString().padStart(2, '0')\n\n const offset = -date.getTimezoneOffset()\n const offsetSign = offset >= 0 ? '+' : '-'\n const offsetHours = Math.floor(Math.abs(offset) / 60).toString().padStart(2, '0')\n const offsetMins = (Math.abs(offset) % 60).toString().padStart(2, '0')\n\n return `${day}/${month}/${year}:${hours}:${minutes}:${seconds} ${offsetSign}${offsetHours}${offsetMins}`\n }\n}\n\n/**\n * Structured formatter for ELK/Splunk\n * Outputs key=value pairs\n */\nexport class StructuredFormatter implements LogFormatter {\n private readonly delimiter: string\n private readonly kvSeparator: string\n\n constructor(options: { delimiter?: string; kvSeparator?: string } = {}) {\n this.delimiter = options.delimiter || ' '\n this.kvSeparator = options.kvSeparator || '='\n }\n\n format(entry: AuditLogEntry): string {\n const pairs: string[] = []\n\n pairs.push(this.pair('timestamp', entry.timestamp.toISOString()))\n pairs.push(this.pair('level', entry.level))\n pairs.push(this.pair('type', entry.type))\n pairs.push(this.pair('id', entry.id))\n pairs.push(this.pair('message', this.escape(entry.message)))\n\n if (entry.category) {\n pairs.push(this.pair('category', entry.category))\n }\n\n if (entry.type === 'request') {\n pairs.push(this.pair('method', entry.request.method))\n pairs.push(this.pair('path', entry.request.path))\n if (entry.request.ip) pairs.push(this.pair('ip', entry.request.ip))\n if (entry.response) {\n pairs.push(this.pair('status', entry.response.status.toString()))\n pairs.push(this.pair('duration_ms', entry.response.duration.toString()))\n }\n if (entry.user?.id) pairs.push(this.pair('user_id', entry.user.id))\n if (entry.error) {\n pairs.push(this.pair('error', this.escape(entry.error.message)))\n }\n }\n\n if (entry.type === 'security') {\n pairs.push(this.pair('event', entry.event))\n pairs.push(this.pair('severity', entry.severity))\n if (entry.source.ip) pairs.push(this.pair('source_ip', entry.source.ip))\n if (entry.source.userId) pairs.push(this.pair('source_user', entry.source.userId))\n }\n\n return pairs.join(this.delimiter)\n }\n\n private pair(key: string, value: string): string {\n return `${key}${this.kvSeparator}${value}`\n }\n\n private escape(value: string): string {\n // Escape quotes and wrap in quotes if contains spaces\n if (value.includes(' ') || value.includes('\"')) {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`\n }\n return value\n }\n}\n\n/**\n * Create a JSON formatter\n */\nexport function createJSONFormatter(options?: { pretty?: boolean }): JSONFormatter {\n return new JSONFormatter(options)\n}\n\n/**\n * Create a text formatter\n */\nexport function createTextFormatter(options?: {\n template?: string\n dateFormat?: 'iso' | 'utc' | 'local'\n}): TextFormatter {\n return new TextFormatter(options)\n}\n\n/**\n * Create a CLF formatter\n */\nexport function createCLFFormatter(): CLFFormatter {\n return new CLFFormatter()\n}\n\n/**\n * Create a structured formatter\n */\nexport function createStructuredFormatter(options?: {\n delimiter?: string\n kvSeparator?: string\n}): StructuredFormatter {\n return new StructuredFormatter(options)\n}\n","import type { PIIConfig } from './types'\n\n/**\n * Default PII fields to redact\n */\nexport const DEFAULT_PII_FIELDS = [\n // Authentication\n 'password',\n 'passwd',\n 'secret',\n 'token',\n 'api_key',\n 'apiKey',\n 'api-key',\n 'access_token',\n 'accessToken',\n 'refresh_token',\n 'refreshToken',\n 'authorization',\n 'auth',\n\n // Personal information\n 'ssn',\n 'social_security',\n 'socialSecurity',\n 'credit_card',\n 'creditCard',\n 'card_number',\n 'cardNumber',\n 'cvv',\n 'cvc',\n 'pin',\n\n // Contact\n 'email',\n 'phone',\n 'phone_number',\n 'phoneNumber',\n 'mobile',\n 'address',\n 'street',\n 'zip',\n 'zipcode',\n 'postal_code',\n 'postalCode',\n\n // Identity\n 'date_of_birth',\n 'dateOfBirth',\n 'dob',\n 'birth_date',\n 'birthDate',\n 'passport',\n 'license',\n 'national_id',\n 'nationalId',\n]\n\n/**\n * Mask a value with asterisks\n */\nexport function mask(\n value: string,\n options: {\n char?: string\n preserveLength?: boolean\n showFirst?: number\n showLast?: number\n } = {}\n): string {\n const {\n char = '*',\n preserveLength = false,\n showFirst = 0,\n showLast = 0,\n } = options\n\n if (!value) return value\n\n const len = value.length\n\n if (preserveLength) {\n const first = value.slice(0, showFirst)\n const last = value.slice(-showLast || len)\n const middle = char.repeat(Math.max(0, len - showFirst - showLast))\n return first + middle + (showLast > 0 ? last : '')\n }\n\n // Default: show first/last chars with fixed mask\n const maskLen = 8\n const first = showFirst > 0 ? value.slice(0, showFirst) : ''\n const last = showLast > 0 ? value.slice(-showLast) : ''\n\n return first + char.repeat(maskLen) + last\n}\n\n/**\n * Simple hash function for Edge Runtime compatibility\n * Uses a fast, deterministic string hash (not cryptographic)\n */\nexport function hash(value: string, salt = ''): string {\n const str = salt + value\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32bit integer\n }\n // Convert to hex and ensure positive, pad to 16 chars\n const hex = Math.abs(hash).toString(16).padStart(8, '0')\n return hex + hex.slice(0, 8) // Return 16 char string\n}\n\n/**\n * Redact a single value\n */\nexport function redactValue(\n value: unknown,\n field: string,\n config: PIIConfig\n): unknown {\n if (typeof value !== 'string') return value\n if (!value) return value\n\n // Check if field should be redacted\n const shouldRedact = config.fields.some(f => {\n const fieldLower = field.toLowerCase()\n const fLower = f.toLowerCase()\n return fieldLower === fLower ||\n fieldLower.endsWith('.' + fLower) ||\n fieldLower.includes('[' + fLower + ']')\n })\n\n if (!shouldRedact) return value\n\n // Apply custom redactor if provided\n if (config.customRedactor) {\n return config.customRedactor(value, field)\n }\n\n // Apply redaction based on mode\n switch (config.mode) {\n case 'mask':\n return mask(value, {\n char: config.maskChar || '*',\n preserveLength: config.preserveLength,\n showFirst: 2,\n showLast: 2,\n })\n\n case 'hash':\n return `[HASH:${hash(value)}]`\n\n case 'remove':\n return '[REDACTED]'\n\n default:\n return '[REDACTED]'\n }\n}\n\n/**\n * Redact PII from an object recursively\n */\nexport function redactObject<T>(obj: T, config: PIIConfig, path = ''): T {\n if (typeof obj === 'string') {\n return redactValue(obj, path, config) as T\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item, i) => redactObject(item, config, `${path}[${i}]`)) as T\n }\n\n if (typeof obj === 'object' && obj !== null) {\n const result: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(obj)) {\n const newPath = path ? `${path}.${key}` : key\n result[key] = redactObject(value, config, newPath)\n }\n\n return result as T\n }\n\n return obj\n}\n\n/**\n * Create a redactor function with preset config\n */\nexport function createRedactor(config: Partial<PIIConfig> = {}): <T>(obj: T) => T {\n const fullConfig: PIIConfig = {\n fields: config.fields || DEFAULT_PII_FIELDS,\n mode: config.mode || 'mask',\n maskChar: config.maskChar || '*',\n preserveLength: config.preserveLength || false,\n customRedactor: config.customRedactor,\n }\n\n return <T>(obj: T) => redactObject(obj, fullConfig)\n}\n\n/**\n * Redact sensitive headers\n */\nexport function redactHeaders(\n headers: Record<string, string>,\n sensitiveHeaders: string[] = ['authorization', 'cookie', 'x-api-key', 'x-auth-token']\n): Record<string, string> {\n const result: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(headers)) {\n const keyLower = key.toLowerCase()\n if (sensitiveHeaders.some(h => keyLower === h.toLowerCase())) {\n result[key] = '[REDACTED]'\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\n/**\n * Redact query parameters\n */\nexport function redactQuery(\n query: Record<string, string>,\n sensitiveParams: string[] = ['token', 'key', 'secret', 'password', 'auth']\n): Record<string, string> {\n const result: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(query)) {\n const keyLower = key.toLowerCase()\n if (sensitiveParams.some(p => keyLower.includes(p.toLowerCase()))) {\n result[key] = '[REDACTED]'\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\n/**\n * Redact email (show only domain)\n */\nexport function redactEmail(email: string): string {\n if (!email || !email.includes('@')) return mask(email)\n\n const [, domain] = email.split('@')\n return `****@${domain}`\n}\n\n/**\n * Redact credit card number (show last 4 digits)\n */\nexport function redactCreditCard(cardNumber: string): string {\n const cleaned = cardNumber.replace(/\\D/g, '')\n if (cleaned.length < 4) return mask(cardNumber)\n\n return '**** **** **** ' + cleaned.slice(-4)\n}\n\n/**\n * Redact phone number\n */\nexport function redactPhone(phone: string): string {\n const cleaned = phone.replace(/\\D/g, '')\n if (cleaned.length < 4) return mask(phone)\n\n return mask(phone, { preserveLength: true, showLast: 4 })\n}\n\n/**\n * Redact IP address (show only first two octets for IPv4)\n */\nexport function redactIP(ip: string): string {\n if (ip.includes(':')) {\n // IPv6 - show first segment\n const parts = ip.split(':')\n return parts[0] + ':****:****:****'\n }\n\n // IPv4 - show first two octets\n const parts = ip.split('.')\n if (parts.length !== 4) return mask(ip)\n\n return `${parts[0]}.${parts[1]}.*.*`\n}\n","import type {\n SecurityEventEntry,\n SecurityEventType,\n SecurityEventConfig,\n LogStore,\n LogLevel,\n} from './types'\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `evt_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`\n}\n\n/**\n * Map severity to log level\n */\nfunction severityToLevel(severity: 'low' | 'medium' | 'high' | 'critical'): LogLevel {\n switch (severity) {\n case 'low': return 'info'\n case 'medium': return 'warn'\n case 'high': return 'error'\n case 'critical': return 'critical'\n }\n}\n\n/**\n * Security event tracker\n */\nexport class SecurityEventTracker {\n private store: LogStore\n private defaultSeverity: 'low' | 'medium' | 'high' | 'critical'\n private onEvent?: (event: SecurityEventEntry) => void | Promise<void>\n\n constructor(config: SecurityEventConfig) {\n this.store = config.store\n this.defaultSeverity = config.defaultSeverity || 'medium'\n this.onEvent = config.onEvent\n }\n\n /**\n * Track a security event\n */\n async track(options: {\n event: SecurityEventType\n message: string\n severity?: 'low' | 'medium' | 'high' | 'critical'\n source?: {\n ip?: string\n userAgent?: string\n userId?: string\n }\n target?: {\n resource?: string\n action?: string\n userId?: string\n }\n details?: Record<string, unknown>\n mitigated?: boolean\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n const severity = options.severity || this.defaultSeverity\n\n const entry: SecurityEventEntry = {\n id: generateId(),\n timestamp: new Date(),\n type: 'security',\n level: severityToLevel(severity),\n message: options.message,\n event: options.event,\n severity,\n source: options.source || {},\n target: options.target,\n details: options.details,\n mitigated: options.mitigated,\n metadata: options.metadata,\n }\n\n // Write to store\n await this.store.write(entry)\n\n // Call event handler\n if (this.onEvent) {\n await this.onEvent(entry)\n }\n\n return entry\n }\n\n // Convenience methods for common events\n\n /**\n * Track failed authentication\n */\n async authFailed(options: {\n ip?: string\n userAgent?: string\n email?: string\n reason?: string\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n return this.track({\n event: 'auth.failed',\n message: options.reason || 'Authentication failed',\n severity: 'medium',\n source: {\n ip: options.ip,\n userAgent: options.userAgent,\n },\n details: {\n attemptedEmail: options.email,\n reason: options.reason,\n },\n metadata: options.metadata,\n })\n }\n\n /**\n * Track successful login\n */\n async authLogin(options: {\n userId: string\n ip?: string\n userAgent?: string\n method?: string\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n return this.track({\n event: 'auth.login',\n message: `User ${options.userId} logged in`,\n severity: 'low',\n source: {\n ip: options.ip,\n userAgent: options.userAgent,\n userId: options.userId,\n },\n details: {\n method: options.method || 'credentials',\n },\n metadata: options.metadata,\n })\n }\n\n /**\n * Track logout\n */\n async authLogout(options: {\n userId: string\n ip?: string\n reason?: 'user' | 'timeout' | 'forced'\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n return this.track({\n event: 'auth.logout',\n message: `User ${options.userId} logged out`,\n severity: 'low',\n source: {\n ip: options.ip,\n userId: options.userId,\n },\n details: {\n reason: options.reason || 'user',\n },\n metadata: options.metadata,\n })\n }\n\n /**\n * Track permission denied\n */\n async permissionDenied(options: {\n userId?: string\n ip?: string\n resource: string\n action: string\n requiredRole?: string\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n return this.track({\n event: 'auth.permission_denied',\n message: `Permission denied for ${options.action} on ${options.resource}`,\n severity: 'medium',\n source: {\n ip: options.ip,\n userId: options.userId,\n },\n target: {\n resource: options.resource,\n action: options.action,\n },\n details: {\n requiredRole: options.requiredRole,\n },\n metadata: options.metadata,\n })\n }\n\n /**\n * Track rate limit exceeded\n */\n async rateLimitExceeded(options: {\n ip?: string\n userId?: string\n endpoint: string\n limit: number\n window: string\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n return this.track({\n event: 'ratelimit.exceeded',\n message: `Rate limit exceeded for ${options.endpoint}`,\n severity: 'medium',\n source: {\n ip: options.ip,\n userId: options.userId,\n },\n target: {\n resource: options.endpoint,\n },\n details: {\n limit: options.limit,\n window: options.window,\n },\n metadata: options.metadata,\n })\n }\n\n /**\n * Track CSRF validation failure\n */\n async csrfInvalid(options: {\n ip?: string\n userId?: string\n endpoint: string\n reason?: string\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n return this.track({\n event: 'csrf.invalid',\n message: `CSRF validation failed for ${options.endpoint}`,\n severity: 'high',\n source: {\n ip: options.ip,\n userId: options.userId,\n },\n target: {\n resource: options.endpoint,\n },\n details: {\n reason: options.reason,\n },\n metadata: options.metadata,\n })\n }\n\n /**\n * Track XSS detection\n */\n async xssDetected(options: {\n ip?: string\n userId?: string\n field: string\n payload?: string\n endpoint: string\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n return this.track({\n event: 'xss.detected',\n message: `XSS payload detected in ${options.field}`,\n severity: 'high',\n source: {\n ip: options.ip,\n userId: options.userId,\n },\n target: {\n resource: options.endpoint,\n },\n details: {\n field: options.field,\n payload: options.payload?.slice(0, 100), // Truncate\n },\n mitigated: true,\n metadata: options.metadata,\n })\n }\n\n /**\n * Track SQL injection detection\n */\n async sqliDetected(options: {\n ip?: string\n userId?: string\n field: string\n pattern: string\n severity?: 'low' | 'medium' | 'high'\n endpoint: string\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n return this.track({\n event: 'sqli.detected',\n message: `SQL injection attempt detected in ${options.field}`,\n severity: options.severity || 'high',\n source: {\n ip: options.ip,\n userId: options.userId,\n },\n target: {\n resource: options.endpoint,\n },\n details: {\n field: options.field,\n pattern: options.pattern,\n },\n mitigated: true,\n metadata: options.metadata,\n })\n }\n\n /**\n * Track IP block\n */\n async ipBlocked(options: {\n ip: string\n reason: string\n duration?: number\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n return this.track({\n event: 'ip.blocked',\n message: `IP ${options.ip} blocked: ${options.reason}`,\n severity: 'high',\n source: {\n ip: options.ip,\n },\n details: {\n reason: options.reason,\n duration: options.duration,\n },\n metadata: options.metadata,\n })\n }\n\n /**\n * Track suspicious activity\n */\n async suspicious(options: {\n ip?: string\n userId?: string\n activity: string\n severity?: 'low' | 'medium' | 'high' | 'critical'\n details?: Record<string, unknown>\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n return this.track({\n event: 'ip.suspicious',\n message: options.activity,\n severity: options.severity || 'medium',\n source: {\n ip: options.ip,\n userId: options.userId,\n },\n details: options.details,\n metadata: options.metadata,\n })\n }\n\n /**\n * Track custom event\n */\n async custom(options: {\n message: string\n severity?: 'low' | 'medium' | 'high' | 'critical'\n source?: {\n ip?: string\n userAgent?: string\n userId?: string\n }\n target?: {\n resource?: string\n action?: string\n }\n details?: Record<string, unknown>\n metadata?: Record<string, unknown>\n }): Promise<SecurityEventEntry> {\n return this.track({\n event: 'custom',\n ...options,\n })\n }\n}\n\n/**\n * Create a security event tracker\n */\nexport function createSecurityTracker(config: SecurityEventConfig): SecurityEventTracker {\n return new SecurityEventTracker(config)\n}\n\n/**\n * Standalone function to track security events\n */\nexport async function trackSecurityEvent(\n store: LogStore,\n options: {\n event: SecurityEventType\n message: string\n severity?: 'low' | 'medium' | 'high' | 'critical'\n source?: {\n ip?: string\n userAgent?: string\n userId?: string\n }\n target?: {\n resource?: string\n action?: string\n userId?: string\n }\n details?: Record<string, unknown>\n metadata?: Record<string, unknown>\n }\n): Promise<SecurityEventEntry> {\n const tracker = new SecurityEventTracker({ store })\n return tracker.track(options)\n}\n","import type { NextRequest } from 'next/server'\nimport type {\n AuditConfig,\n RequestLogEntry,\n LogLevel,\n PIIConfig,\n} from './types'\nimport { redactObject, redactHeaders, redactQuery, DEFAULT_PII_FIELDS } from './redaction'\n\ntype RouteHandler = (req: NextRequest) => Response | Promise<Response>\n\n/**\n * Generate unique request ID\n */\nfunction generateRequestId(): string {\n return `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`\n}\n\n/**\n * Get client IP from request\n */\nfunction getClientIP(req: NextRequest): string | undefined {\n return (\n req.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||\n req.headers.get('x-real-ip') ||\n req.headers.get('cf-connecting-ip') ||\n undefined\n )\n}\n\n/**\n * Convert headers to record\n */\nfunction headersToRecord(headers: Headers, includeHeaders?: boolean | string[]): Record<string, string> {\n if (!includeHeaders) return {}\n\n const result: Record<string, string> = {}\n\n if (includeHeaders === true) {\n headers.forEach((value, key) => {\n result[key] = value\n })\n } else if (Array.isArray(includeHeaders)) {\n for (const key of includeHeaders) {\n const value = headers.get(key)\n if (value) result[key] = value\n }\n }\n\n return result\n}\n\n/**\n * Parse query parameters from URL\n */\nfunction parseQuery(url: string): Record<string, string> {\n const result: Record<string, string> = {}\n\n try {\n const urlObj = new URL(url)\n urlObj.searchParams.forEach((value, key) => {\n result[key] = value\n })\n } catch {\n // Invalid URL\n }\n\n return result\n}\n\n/**\n * Determine log level from status code\n */\nfunction statusToLevel(status: number): LogLevel {\n if (status >= 500) return 'error'\n if (status >= 400) return 'warn'\n return 'info'\n}\n\n/**\n * Should skip logging for this request\n */\nfunction shouldSkip(\n req: NextRequest,\n status: number,\n exclude?: AuditConfig['exclude']\n): boolean {\n if (!exclude) return false\n\n const url = new URL(req.url)\n\n // Check path\n if (exclude.paths?.length) {\n const matchesPath = exclude.paths.some(pattern => {\n if (pattern.includes('*')) {\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$')\n return regex.test(url.pathname)\n }\n return url.pathname === pattern || url.pathname.startsWith(pattern)\n })\n if (matchesPath) return true\n }\n\n // Check method\n if (exclude.methods?.includes(req.method)) {\n return true\n }\n\n // Check status code\n if (exclude.statusCodes?.includes(status)) {\n return true\n }\n\n return false\n}\n\n/**\n * Audit logging middleware\n */\nexport function withAuditLog(\n handler: RouteHandler,\n config: AuditConfig\n): RouteHandler {\n const {\n enabled = true,\n store,\n include = {},\n exclude,\n pii,\n getUser,\n requestIdHeader = 'x-request-id',\n generateRequestId: customGenerateId,\n onError,\n skip,\n } = config\n\n // Default include settings\n const includeSettings = {\n ip: include.ip ?? true,\n userAgent: include.userAgent ?? true,\n headers: include.headers ?? false,\n query: include.query ?? true,\n body: include.body ?? false,\n response: include.response ?? true,\n responseBody: include.responseBody ?? false,\n duration: include.duration ?? true,\n user: include.user ?? true,\n }\n\n // PII config\n const piiConfig: PIIConfig = pii || {\n fields: DEFAULT_PII_FIELDS,\n mode: 'mask',\n }\n\n return async (req: NextRequest): Promise<Response> => {\n // Check if logging is enabled\n if (!enabled) {\n return handler(req)\n }\n\n // Check skip condition\n if (skip && await skip(req)) {\n return handler(req)\n }\n\n const startTime = Date.now()\n const requestId = req.headers.get(requestIdHeader) ||\n (customGenerateId ? customGenerateId() : generateRequestId())\n\n const url = new URL(req.url)\n\n // Build request info\n let requestInfo: RequestLogEntry['request'] = {\n id: requestId,\n method: req.method,\n url: req.url,\n path: url.pathname,\n }\n\n if (includeSettings.ip) {\n requestInfo.ip = getClientIP(req)\n }\n\n if (includeSettings.userAgent) {\n requestInfo.userAgent = req.headers.get('user-agent') || undefined\n }\n\n if (includeSettings.headers) {\n let headers = headersToRecord(req.headers, includeSettings.headers)\n headers = redactHeaders(headers)\n requestInfo.headers = headers\n }\n\n if (includeSettings.query) {\n let query = parseQuery(req.url)\n query = redactQuery(query)\n requestInfo.query = query\n }\n\n requestInfo.contentType = req.headers.get('content-type') || undefined\n requestInfo.contentLength = parseInt(req.headers.get('content-length') || '0', 10) || undefined\n\n // Get user if configured\n let user: RequestLogEntry['user']\n if (includeSettings.user && getUser) {\n try {\n user = await getUser(req) || undefined\n } catch {\n // Ignore user extraction errors\n }\n }\n\n // Execute handler\n let response: Response\n let error: Error | undefined\n\n try {\n response = await handler(req)\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n // Re-throw to let error propagate\n throw err\n } finally {\n const duration = Date.now() - startTime\n const status = response!?.status || 500\n\n // Check if we should skip this request\n if (!shouldSkip(req, status, exclude)) {\n // Build log entry\n const entry: RequestLogEntry = {\n id: requestId,\n timestamp: new Date(),\n type: 'request',\n level: error ? 'error' : statusToLevel(status),\n message: `${req.method} ${url.pathname} ${status} ${duration}ms`,\n request: requestInfo,\n user,\n }\n\n // Add response info\n if (includeSettings.response && response!) {\n entry.response = {\n status: response.status,\n duration,\n }\n\n if (includeSettings.headers) {\n entry.response.headers = headersToRecord(response.headers, includeSettings.headers)\n }\n }\n\n // Add error info\n if (error) {\n entry.error = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n }\n }\n\n // Redact PII\n const redactedEntry = redactObject(entry, piiConfig)\n\n // Write to store\n try {\n await store.write(redactedEntry)\n } catch (writeError) {\n if (onError) {\n onError(writeError instanceof Error ? writeError : new Error(String(writeError)), entry)\n } else {\n console.error('[AuditLog] Failed to write log:', writeError)\n }\n }\n }\n }\n\n return response!\n }\n}\n\n/**\n * Create audit middleware with default console logging\n */\nexport function createAuditMiddleware(\n config: Partial<AuditConfig> & { store: AuditConfig['store'] }\n): (handler: RouteHandler) => RouteHandler {\n return (handler: RouteHandler) => withAuditLog(handler, config as AuditConfig)\n}\n\n/**\n * Request logger that adds request ID to response headers\n */\nexport function withRequestId(\n handler: RouteHandler,\n options: {\n headerName?: string\n generateId?: () => string\n } = {}\n): RouteHandler {\n const { headerName = 'x-request-id', generateId = generateRequestId } = options\n\n return async (req: NextRequest): Promise<Response> => {\n const requestId = req.headers.get(headerName) || generateId()\n\n const response = await handler(req)\n\n // Clone response to add header\n const newResponse = new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: new Headers(response.headers),\n })\n\n newResponse.headers.set(headerName, requestId)\n\n return newResponse\n }\n}\n\n/**\n * Simple request timing middleware\n */\nexport function withTiming(\n handler: RouteHandler,\n options: {\n headerName?: string\n log?: boolean\n } = {}\n): RouteHandler {\n const { headerName = 'x-response-time', log = false } = options\n\n return async (req: NextRequest): Promise<Response> => {\n const start = Date.now()\n\n const response = await handler(req)\n\n const duration = Date.now() - start\n\n // Clone response to add header\n const newResponse = new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: new Headers(response.headers),\n })\n\n newResponse.headers.set(headerName, `${duration}ms`)\n\n if (log) {\n const url = new URL(req.url)\n console.log(`${req.method} ${url.pathname} ${response.status} ${duration}ms`)\n }\n\n return newResponse\n }\n}\n"]}
|