{"version":3,"file":"route-middleware.mjs","sources":["../../../../src/lib/routing/advanced/route-middleware.ts"],"sourcesContent":["/**\n * @file Per-Route Middleware Chain\n * @description Implements middleware chain patterns for route-level processing.\n * Enables authentication, logging, analytics, and other cross-cutting concerns.\n *\n * @module @/lib/routing/advanced/route-middleware\n *\n * This module provides:\n * - Middleware chain definitions\n * - Execution order control\n * - Async middleware support\n * - Error handling in chains\n * - Middleware composition\n *\n * @example\n * ```typescript\n * import { MiddlewareChain, createMiddleware } from '@/lib/routing/advanced/route-middleware';\n *\n * const chain = new MiddlewareChain()\n *   .use(loggingMiddleware)\n *   .use(authMiddleware)\n *   .use(analyticsMiddleware);\n *\n * await chain.execute(context);\n * ```\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Middleware function signature\n */\nexport type MiddlewareFunction<TContext = MiddlewareContext> = (\n  context: TContext,\n  next: NextFunction\n) => void | Promise<void>;\n\n/**\n * Next function to continue chain execution\n */\nexport type NextFunction = () => void | Promise<void>;\n\n/**\n * Middleware context\n */\nexport interface MiddlewareContext {\n  /** Current route path */\n  readonly path: string;\n  /** Route parameters */\n  readonly params: Record<string, string>;\n  /** Query parameters */\n  readonly query: Record<string, string>;\n  /** Request headers (if available) */\n  readonly headers?: Record<string, string>;\n  /** User context (if authenticated) */\n  readonly user?: MiddlewareUser;\n  /** Request timestamp */\n  readonly timestamp: number;\n  /** Unique request ID */\n  readonly requestId: string;\n  /** Custom data store */\n  data: Record<string, unknown>;\n  /** Response controls */\n  response: MiddlewareResponse;\n}\n\n/**\n * User context in middleware\n */\nexport interface MiddlewareUser {\n  /** User ID */\n  readonly id: string;\n  /** User roles */\n  readonly roles: readonly string[];\n  /** User permissions */\n  readonly permissions: readonly string[];\n  /** Session data */\n  readonly session?: Record<string, unknown>;\n}\n\n/**\n * Response controls in middleware\n */\nexport interface MiddlewareResponse {\n  /** Redirect to another path */\n  redirect: (path: string, options?: { status?: number }) => void;\n  /** Send error response */\n  error: (status: number, message: string) => void;\n  /** Set response header */\n  setHeader: (name: string, value: string) => void;\n  /** Whether response has been sent */\n  readonly sent: boolean;\n  /** Response status code */\n  readonly status: number | null;\n  /** Response headers */\n  readonly headers: Record<string, string>;\n  /** Redirect target (if redirected) */\n  readonly redirectTarget: string | null;\n  /** Error message (if error) */\n  readonly errorMessage: string | null;\n}\n\n/**\n * Middleware configuration\n */\nexport interface MiddlewareConfig {\n  /** Middleware name (for debugging) */\n  readonly name: string;\n  /** Middleware function */\n  readonly handler: MiddlewareFunction;\n  /** Priority (lower = runs first) */\n  readonly priority?: number;\n  /** Routes to apply to (glob patterns) */\n  readonly routes?: readonly string[];\n  /** Routes to exclude (glob patterns) */\n  readonly exclude?: readonly string[];\n  /** Whether middleware is enabled */\n  readonly enabled?: boolean;\n  /** Timeout in ms */\n  readonly timeout?: number;\n  /** Feature flag for this middleware */\n  readonly featureFlag?: string;\n}\n\n/**\n * Registered middleware\n */\nexport interface RegisteredMiddleware extends MiddlewareConfig {\n  /** Unique middleware ID */\n  readonly id: string;\n  /** Registration timestamp */\n  readonly registeredAt: number;\n}\n\n/**\n * Chain execution result\n */\nexport interface ChainExecutionResult {\n  /** Whether chain completed successfully */\n  readonly success: boolean;\n  /** Execution duration (ms) */\n  readonly durationMs: number;\n  /** Middleware that failed (if any) */\n  readonly failedMiddleware: string | null;\n  /** Error that occurred (if any) */\n  readonly error: Error | null;\n  /** Final response state */\n  readonly response: Pick<MiddlewareResponse, 'sent' | 'status' | 'redirectTarget' | 'errorMessage'>;\n  /** Middleware execution order */\n  readonly executionOrder: readonly string[];\n}\n\n/**\n * Chain execution options\n */\nexport interface ChainExecutionOptions {\n  /** Abort signal for cancellation */\n  readonly signal?: AbortSignal;\n  /** Skip specific middleware by name */\n  readonly skip?: readonly string[];\n  /** Only run specific middleware by name */\n  readonly only?: readonly string[];\n  /** Override timeout */\n  readonly timeout?: number;\n}\n\n// =============================================================================\n// Response Helper\n// =============================================================================\n\n/**\n * Create a middleware response object\n */\nfunction createMiddlewareResponse(): MiddlewareResponse {\n  let sent = false;\n  let status: number | null = null;\n  let redirectTarget: string | null = null;\n  let errorMessage: string | null = null;\n  const headers: Record<string, string> = {};\n\n  return {\n    redirect(path: string, options?: { status?: number }) {\n      if (!sent) {\n        sent = true;\n        status = options?.status ?? 302;\n        redirectTarget = path;\n      }\n    },\n    error(statusCode: number, message: string) {\n      if (!sent) {\n        sent = true;\n        status = statusCode;\n        errorMessage = message;\n      }\n    },\n    setHeader(name: string, value: string) {\n      if (!sent) {\n        headers[name] = value;\n      }\n    },\n    get sent() { return sent; },\n    get status() { return status; },\n    get headers() { return { ...headers }; },\n    get redirectTarget() { return redirectTarget; },\n    get errorMessage() { return errorMessage; },\n  };\n}\n\n/**\n * Create a middleware context\n */\nexport function createMiddlewareContext(\n  options: Partial<Omit<MiddlewareContext, 'response' | 'data'>> & {\n    path: string;\n  }\n): MiddlewareContext {\n  return {\n    path: options.path,\n    params: options.params ?? {},\n    query: options.query ?? {},\n    headers: options.headers,\n    user: options.user,\n    timestamp: options.timestamp ?? Date.now(),\n    requestId: options.requestId ?? generateRequestId(),\n    data: {},\n    response: createMiddlewareResponse(),\n  };\n}\n\n/**\n * Generate a 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// MiddlewareChain Class\n// =============================================================================\n\n/**\n * Manages a chain of middleware\n *\n * @example\n * ```typescript\n * const chain = new MiddlewareChain();\n *\n * chain\n *   .use(async (ctx, next) => {\n *     console.log('Before:', ctx.path);\n *     await next();\n *     console.log('After:', ctx.path);\n *   })\n *   .use(authMiddleware, { name: 'auth', priority: 1 });\n *\n * const result = await chain.execute(context);\n * ```\n */\nexport class MiddlewareChain {\n  private middleware: RegisteredMiddleware[] = [];\n  private idCounter = 0;\n  private defaultTimeout = 30000;\n\n  /**\n   * Add middleware to the chain\n   *\n   * @param handler - Middleware function or config\n   * @param options - Middleware options\n   * @returns Chain for fluent API\n   */\n  use(\n    handler: MiddlewareFunction | MiddlewareConfig,\n    options?: Partial<Omit<MiddlewareConfig, 'handler'>>\n  ): this {\n    const id = `mw_${++this.idCounter}`;\n    const config: MiddlewareConfig = typeof handler === 'function'\n      ? { name: options?.name ?? `middleware_${id}`, handler, ...options }\n      : handler;\n\n    const registered: RegisteredMiddleware = {\n      ...config,\n      id,\n      priority: config.priority ?? 100,\n      enabled: config.enabled ?? true,\n      registeredAt: Date.now(),\n    };\n\n    this.middleware.push(registered);\n\n    // Keep sorted by priority\n    this.middleware.sort((a, b) => (a.priority ?? 100) - (b.priority ?? 100));\n\n    return this;\n  }\n\n  /**\n   * Remove middleware from the chain\n   *\n   * @param nameOrId - Middleware name or ID\n   * @returns True if middleware was found and removed\n   */\n  remove(nameOrId: string): boolean {\n    const index = this.middleware.findIndex(m => m.name === nameOrId || m.id === nameOrId);\n    if (index !== -1) {\n      this.middleware.splice(index, 1);\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Execute the middleware chain\n   *\n   * @param context - Middleware context\n   * @param options - Execution options\n   * @returns Execution result\n   */\n  async execute(\n    context: MiddlewareContext,\n    options: ChainExecutionOptions = {}\n  ): Promise<ChainExecutionResult> {\n    const startTime = Date.now();\n    const executionOrder: string[] = [];\n    let failedMiddleware: string | null = null;\n    let error: Error | null = null;\n\n    // Filter middleware based on options and route matching\n    const applicableMiddleware = this.middleware.filter(mw => {\n      if (mw.enabled !== true) return false;\n      if (options.skip?.includes(mw.name) === true) return false;\n      if (options.only && !options.only.includes(mw.name)) return false;\n      return this.matchesRoute(mw, context.path);\n\n    });\n\n    // Build execution chain\n    let index = 0;\n\n    const executeNext = async (): Promise<void> => {\n      // Check if response was sent (short-circuit)\n      if (context.response.sent) {\n        return;\n      }\n\n      // Check abort signal\n      if (options.signal?.aborted === true) {\n        throw new Error('Middleware chain aborted');\n      }\n\n      if (index >= applicableMiddleware.length) {\n        return;\n      }\n\n      const current = applicableMiddleware[index++];\n      if (current === undefined) {\n        throw new Error('Unexpected undefined middleware in chain');\n      }\n      executionOrder.push(current.name);\n\n      const timeout = options.timeout ?? current.timeout ?? this.defaultTimeout;\n\n      try {\n        await this.executeWithTimeout(\n          async () => current.handler(context, executeNext),\n          timeout,\n          current.name\n        );\n      } catch (err) {\n        failedMiddleware = current.name;\n        throw err;\n      }\n    };\n\n    try {\n      await executeNext();\n    } catch (err) {\n      error = err as Error;\n    }\n\n    return {\n      success: error === null && context.response.errorMessage === null,\n      durationMs: Date.now() - startTime,\n      failedMiddleware,\n      error,\n      response: {\n        sent: context.response.sent,\n        status: context.response.status,\n        redirectTarget: context.response.redirectTarget,\n        errorMessage: context.response.errorMessage,\n      },\n      executionOrder: Object.freeze(executionOrder),\n    };\n  }\n\n  /**\n   * Get all registered middleware\n   */\n  getMiddleware(): readonly RegisteredMiddleware[] {\n    return [...this.middleware];\n  }\n\n  /**\n   * Get middleware by name\n   */\n  getByName(name: string): RegisteredMiddleware | undefined {\n    return this.middleware.find(m => m.name === name);\n  }\n\n  /**\n   * Set default timeout\n   */\n  setDefaultTimeout(timeout: number): this {\n    this.defaultTimeout = timeout;\n    return this;\n  }\n\n  /**\n   * Clear all middleware\n   */\n  clear(): this {\n    this.middleware = [];\n    return this;\n  }\n\n  /**\n   * Clone the chain\n   */\n  clone(): MiddlewareChain {\n    const chain = new MiddlewareChain();\n    chain.middleware = [...this.middleware];\n    chain.defaultTimeout = this.defaultTimeout;\n    return chain;\n  }\n\n  /**\n   * Execute a function with timeout\n   */\n  private async executeWithTimeout(\n    fn: () => void | Promise<void>,\n    timeout: number,\n    name: string\n  ): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const timer = setTimeout(() => {\n        reject(new Error(`Middleware \"${name}\" timed out after ${timeout}ms`));\n      }, timeout);\n\n      Promise.resolve(fn())\n        .then(() => {\n          clearTimeout(timer);\n          resolve();\n        })\n        .catch((err: unknown) => {\n          clearTimeout(timer);\n          reject(err instanceof Error ? err : new Error(String(err)));\n        });\n    });\n  }\n\n  /**\n   * Check if middleware should run for a route\n   */\n  private matchesRoute(middleware: RegisteredMiddleware, path: string): boolean {\n    // Check exclude patterns first\n    if (middleware.exclude) {\n      for (const pattern of middleware.exclude) {\n        if (this.globMatch(pattern, path)) {\n          return false;\n        }\n      }\n    }\n\n    // Check include patterns\n    if (middleware.routes && middleware.routes.length > 0) {\n      for (const pattern of middleware.routes) {\n        if (this.globMatch(pattern, path)) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Simple glob pattern matching\n   */\n  private globMatch(pattern: string, path: string): boolean {\n    const regexStr = pattern\n      .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n      .replace(/\\*\\*/g, '{{GLOBSTAR}}')\n      .replace(/\\*/g, '[^/]*')\n      .replace(/\\{\\{GLOBSTAR\\}\\}/g, '.*');\n\n    const regex = new RegExp(`^${regexStr}$`);\n    return regex.test(path);\n  }\n}\n\n// =============================================================================\n// Factory Functions\n// =============================================================================\n\n/**\n * Create a middleware configuration\n *\n * @param config - Middleware configuration\n * @returns Validated configuration\n */\nexport function createMiddleware(config: MiddlewareConfig): MiddlewareConfig {\n  return {\n    ...config,\n    priority: config.priority ?? 100,\n    enabled: config.enabled ?? true,\n    timeout: config.timeout ?? 30000,\n    routes: config.routes ?? [],\n    exclude: config.exclude ?? [],\n  };\n}\n\n/**\n * Create a new middleware chain\n *\n * @returns Empty MiddlewareChain\n */\nexport function createMiddlewareChain(): MiddlewareChain {\n  return new MiddlewareChain();\n}\n\n// =============================================================================\n// Built-in Middleware Factories\n// =============================================================================\n\n/**\n * Create a logging middleware\n *\n * @param options - Logging options\n * @returns Logging middleware\n */\nexport function createLoggingMiddleware(options: {\n  logger?: (message: string, data?: Record<string, unknown>) => void;\n  logRequest?: boolean;\n  logResponse?: boolean;\n} = {}): MiddlewareConfig {\n  const logger = options.logger ?? ((...args: unknown[]) => { console.info(...args); });\n\n  return createMiddleware({\n    name: 'logging',\n    priority: 0, // Run first\n    handler: async (ctx, next) => {\n      const start = Date.now();\n\n      if (options.logRequest !== false) {\n        logger(`[Request] ${ctx.path}`, {\n          requestId: ctx.requestId,\n          params: ctx.params,\n          query: ctx.query,\n        });\n      }\n\n      await next();\n\n      if (options.logResponse !== false) {\n        logger(`[Response] ${ctx.path}`, {\n          requestId: ctx.requestId,\n          duration: Date.now() - start,\n          status: ctx.response.status,\n          redirect: ctx.response.redirectTarget,\n        });\n      }\n    },\n  });\n}\n\n/**\n * Create an authentication check middleware\n *\n * @param options - Auth options\n * @returns Auth middleware\n */\nexport function createAuthMiddleware(options: {\n  loginPath?: string;\n  isPublic?: (path: string) => boolean;\n} = {}): MiddlewareConfig {\n  const loginPath = options.loginPath ?? '/login';\n  const isPublic = options.isPublic ?? (() => false);\n\n  return createMiddleware({\n    name: 'auth',\n    priority: 10,\n    handler: async (ctx, next) => {\n      if (isPublic(ctx.path)) {\n        await next();\n        return;\n      }\n\n      if (!ctx.user) {\n        ctx.response.redirect(loginPath, { status: 302 });\n        return;\n      }\n\n      await next();\n    },\n  });\n}\n\n/**\n * Create a role check middleware\n *\n * @param requiredRoles - Required roles\n * @returns Role middleware\n */\nexport function createRoleMiddleware(requiredRoles: readonly string[]): MiddlewareConfig {\n  return createMiddleware({\n    name: 'role-check',\n    priority: 20,\n    handler: async (ctx, next) => {\n      if (!ctx.user) {\n        ctx.response.error(401, 'Unauthorized');\n        return;\n      }\n\n      const hasRole = requiredRoles.some(role => ctx.user?.roles.includes(role) === true);\n      if (!hasRole) {\n        ctx.response.error(403, 'Forbidden');\n        return;\n      }\n\n      await next();\n    },\n  });\n}\n\n/**\n * Create a rate limiting middleware\n *\n * @param options - Rate limit options\n * @returns Rate limit middleware\n */\nexport function createRateLimitMiddleware(options: {\n  maxRequests: number;\n  windowMs: number;\n  keyFn?: (ctx: MiddlewareContext) => string;\n} = { maxRequests: 100, windowMs: 60000 }): MiddlewareConfig {\n  const requests = new Map<string, { count: number; resetAt: number }>();\n  const keyFn = options.keyFn ?? ((ctx) => ctx.user?.id ?? ctx.requestId);\n\n  return createMiddleware({\n    name: 'rate-limit',\n    priority: 5,\n    handler: async (ctx, next) => {\n      const key = keyFn(ctx);\n      const now = Date.now();\n\n      let record = requests.get(key);\n      if (!record || now > record.resetAt) {\n        record = { count: 0, resetAt: now + options.windowMs };\n        requests.set(key, record);\n      }\n\n      record.count++;\n\n      ctx.response.setHeader('X-RateLimit-Limit', String(options.maxRequests));\n      ctx.response.setHeader('X-RateLimit-Remaining', String(Math.max(0, options.maxRequests - record.count)));\n      ctx.response.setHeader('X-RateLimit-Reset', String(record.resetAt));\n\n      if (record.count > options.maxRequests) {\n        ctx.response.error(429, 'Too Many Requests');\n        return;\n      }\n\n      await next();\n    },\n  });\n}\n\n/**\n * Create an analytics middleware\n *\n * @param options - Analytics options\n * @returns Analytics middleware\n */\nexport function createAnalyticsMiddleware(options: {\n  trackFn: (event: { path: string; timestamp: number; userId?: string; data?: Record<string, unknown> }) => void;\n} = { trackFn: () => {} }): MiddlewareConfig {\n  return createMiddleware({\n    name: 'analytics',\n    priority: 999, // Run last\n    handler: async (ctx, next) => {\n      await next();\n\n      // Only track successful navigations\n      if (ctx.response.errorMessage === null || ctx.response.errorMessage === undefined) {\n        options.trackFn({\n          path: ctx.path,\n          timestamp: ctx.timestamp,\n          userId: ctx.user?.id,\n          data: ctx.data,\n        });\n      }\n    },\n  });\n}\n\n// =============================================================================\n// Singleton Instance\n// =============================================================================\n\nlet defaultChain: MiddlewareChain | null = null;\n\n/**\n * Get the default middleware chain\n */\nexport function getMiddlewareChain(): MiddlewareChain {\n  defaultChain ??= new MiddlewareChain();\n  return defaultChain;\n}\n\n/**\n * Reset the default middleware chain\n */\nexport function resetMiddlewareChain(): void {\n  defaultChain?.clear();\n  defaultChain = null;\n}\n\n// =============================================================================\n// Composition Utilities\n// =============================================================================\n\n/**\n * Compose multiple middleware into one\n *\n * @param middleware - Middleware functions to compose\n * @returns Composed middleware function\n */\nexport function compose(...middleware: MiddlewareFunction[]): MiddlewareFunction {\n  return async (ctx, next) => {\n    let index = 0;\n\n    const dispatch = async (): Promise<void> => {\n      if (index >= middleware.length) {\n        return next();\n      }\n\n      const mw = middleware[index++];\n      if (mw === undefined) {\n        throw new Error('Unexpected undefined middleware in compose');\n      }\n      await mw(ctx, dispatch);\n    };\n\n    await dispatch();\n  };\n}\n\n/**\n * Run middleware in parallel (all must complete before next)\n *\n * @param middleware - Middleware functions to run in parallel\n * @returns Parallel middleware function\n */\nexport function parallel(...middleware: MiddlewareFunction[]): MiddlewareFunction {\n  return async (ctx, next) => {\n    // Create shared next tracking\n    let nextCalled = false;\n    const sharedNext = async (): Promise<void> => {\n      if (!nextCalled) {\n        nextCalled = true;\n        await next();\n      }\n    };\n\n    // Run all middleware in parallel\n    await Promise.all(middleware.map(async mw => mw(ctx, sharedNext)));\n  };\n}\n\n/**\n * Conditionally run middleware\n *\n * @param condition - Condition function\n * @param middleware - Middleware to run if condition is true\n * @returns Conditional middleware\n */\nexport function conditional(\n  condition: (ctx: MiddlewareContext) => boolean,\n  middleware: MiddlewareFunction\n): MiddlewareFunction {\n  return async (ctx, next) => {\n    if (condition(ctx)) {\n      await middleware(ctx, next);\n    } else {\n      await next();\n    }\n  };\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Type guard for MiddlewareContext\n */\nexport function isMiddlewareContext(value: unknown): value is MiddlewareContext {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'path' in value &&\n    'params' in value &&\n    'response' in value &&\n    'requestId' in value\n  );\n}\n\n/**\n * Type guard for ChainExecutionResult\n */\nexport function isChainExecutionResult(value: unknown): value is ChainExecutionResult {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'success' in value &&\n    'durationMs' in value &&\n    'executionOrder' in value\n  );\n}\n"],"names":["MiddlewareChain","handler","options","id","config","registered","a","b","nameOrId","index","m","context","startTime","executionOrder","failedMiddleware","error","applicableMiddleware","mw","executeNext","current","timeout","err","name","chain","fn","resolve","reject","timer","middleware","path","pattern","regexStr","createMiddleware","createMiddlewareChain","defaultChain","getMiddlewareChain","resetMiddlewareChain","parallel","ctx","next","nextCalled","sharedNext"],"mappings":"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"}