{"version":3,"sources":["../src/core/AdapterRegistry.ts","../src/core/EventManager.ts","../src/utils/storageCategories.ts","../src/utils/pathGenerator.ts","../src/core/BucketRouter.ts","../src/templates/helpers/index.ts","../src/templates/TemplateEngine.ts","../src/templates/FileSystemTemplateService.ts","../src/renderers/core/RendererRegistry.ts","../src/renderers/base/BaseRendererAdapter.ts","../src/renderers/adapters/PDFKitRenderer.ts","../src/renderers/adapters/PuppeteerRenderer.ts","../src/renderers/adapters/PlaywrightRenderer.ts","../src/renderers/adapters/ExcelJSRenderer.ts","../src/renderers/adapters/DocxTemplaterRenderer.ts","../src/queue/InMemoryQueue.ts","../src/queue/QueueProcessor.ts","../src/compliance/ComplianceManager.ts","../src/plugins/registry/PluginRegistry.ts","../src/idempotency/adapters/InMemoryIdempotencyAdapter.ts","../src/idempotency/adapters/RedisIdempotencyAdapter.ts","../src/idempotency/IdempotencyStoreService.ts","../src/utils/retry.ts","../src/webhooks/WebhookManager.ts","../src/presets/PresetManager.ts","../src/utils/filePathGenerator.ts","../src/utils/fileValidator.ts","../src/core/StorageService.ts","../src/utils/fileUtils.ts","../src/adapters/base/BaseStorageAdapter.ts","../src/adapters/mock/MockStorageAdapter.ts","../src/adapters/cloudflare-r2/CloudflareR2Adapter.ts","../src/adapters/supabase/SupabaseStorageAdapter.ts","../src/utils/result.ts","../src/utils/signedUrlGenerator.ts","../src/core/logger.ts","../src/templates/LayoutEngine.ts","../src/plugins/base/BasePlugin.ts","../src/plugins/providers/virus-scan/base/BaseVirusScanProvider.ts","../src/plugins/providers/virus-scan/VirusScanPlugin.ts","../src/plugins/providers/virus-scan/providers/VirusTotalProvider.ts","../src/plugins/providers/virus-scan/providers/ClamAVProvider.ts","../src/plugins/providers/image-processing/SharpImagePlugin.ts","../src/utils/ffmpegWrapper.ts","../src/plugins/providers/video-processing/FFmpegVideoPlugin.ts","../src/plugins/providers/metadata-extraction/MetadataExtractionPlugin.ts","../src/plugins/providers/cdn/cloudflare/CloudflareCDNPlugin.ts","../src/plugins/providers/cdn/cloudfront/CloudFrontCDNPlugin.ts","../src/plugins/providers/cdn/fastly/FastlyCDNPlugin.ts","../src/webhooks/base/BaseWebhookAdapter.ts","../src/webhooks/adapters/MediaProcessingWebhook.ts","../src/webhooks/adapters/CloudflareR2Webhook.ts","../src/webhooks/adapters/SupabaseStorageWebhook.ts"],"names":["purpose","config","BUCKET_PURPOSE","Handlebars","parse","StoragePackageError","STORAGE_ERROR_CODES","ADAPTER_HEALTH_STATUS","OUTPUT_FORMAT","readFile","RETRY_STRATEGY","result","STORAGE_EVENT_TYPE","error","uploadPluginContext","FILE_ACCESS_LEVEL","UPLOAD_STATUS","expiresAt","signedUrl","STORAGE_ADAPTER_TYPE","ORGANIZATION_TIER","getStorageValidationRulesForPurpose","retry","responseTime","crypto3","join","html","access","createApiClient","setDefaultApiClient","MB_IN_BYTES","existsSync","SECONDS_PER_MINUTE","process","STORAGE_PLUGIN_TYPE","mkdir","writeFile","unlink","fileBuffer","MS_PER_SECOND","crypto","STORAGE_WEBHOOK_EVENT_TYPE","STORAGE_SIGNATURE_METHOD","STORAGE_OPERATION"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * AdapterRegistry - Manages storage adapters with health-based selection and failover\n *\n * Responsibilities:\n * - Register/unregister adapters with priority levels\n * - Select healthy adapters based on priority and health status\n * - Automatic failover to backup adapters on failure\n * - Health monitoring and status tracking\n * - Circuit breaker integration for failed adapters\n *\n * Selection Logic:\n * - Sort adapters by health status (healthy > degraded > unknown)\n * - Within same health tier, sort by priority (higher = preferred)\n * - Skip disabled or unhealthy adapters\n * - Throw error if no healthy adapters available\n *\n * @example\n * ```ts\n * const registry = new AdapterRegistry({ logger });\n * registry.register(cloudflareAdapter);\n * registry.register(supabaseAdapter);\n *\n * const primary = await registry.selectHealthyAdapter();\n * const fallback = await registry.getFallbackAdapter(primary.name);\n * ```\n */\n\nimport type { StorageAdapterRegistryConfig, AdapterHealthCheck } from '@plyaz/types/storage';\nimport type { LoggerInterface } from '@plyaz/types';\nimport type { BaseStorageAdapter } from '../adapters/base/BaseStorageAdapter';\nimport { ADAPTER_HEALTH_STATUS } from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../errors';\n\n/**\n * AdapterRegistry constants\n */\nconst ADAPTER_REGISTRY_CONSTANTS = {\n  MAX_CONSECUTIVE_FAILURES: 3,\n  DEFAULT_HEALTH_CHECK_INTERVAL_MS: 60000, // 1 minute\n  HEALTH_STATUS_PRIORITY: {\n    [ADAPTER_HEALTH_STATUS.HEALTHY]: 3,\n    [ADAPTER_HEALTH_STATUS.DEGRADED]: 2,\n    [ADAPTER_HEALTH_STATUS.UNHEALTHY]: 1,\n    [ADAPTER_HEALTH_STATUS.UNKNOWN]: 0,\n  },\n} as const;\n\n/**\n * Adapter health information\n */\ninterface AdapterHealthInfo {\n  status: ADAPTER_HEALTH_STATUS;\n  lastCheck: Date;\n  consecutiveFailures: number;\n  lastError?: string;\n}\n\n/**\n * AdapterRegistry - Manages storage adapters with health-based selection\n */\nexport class AdapterRegistry {\n  private readonly adapters: Map<string, BaseStorageAdapter> = new Map();\n  private readonly healthInfo: Map<string, AdapterHealthInfo> = new Map();\n  private readonly logger?: LoggerInterface;\n  private readonly healthCheckInterval: number;\n  private healthCheckTimer?: globalThis.NodeJS.Timeout;\n  private readonly enableAutoHealthCheck: boolean;\n\n  constructor(config: StorageAdapterRegistryConfig = {}) {\n    this.logger = config.logger;\n    this.healthCheckInterval =\n      config.healthCheckInterval ?? ADAPTER_REGISTRY_CONSTANTS.DEFAULT_HEALTH_CHECK_INTERVAL_MS;\n    this.enableAutoHealthCheck = config.enableAutoHealthCheck ?? true;\n\n    this.logger?.debug('AdapterRegistry initialized', {\n      healthCheckInterval: this.healthCheckInterval,\n      autoHealthCheck: this.enableAutoHealthCheck,\n    });\n\n    // Start automatic health checks if enabled\n    if (this.enableAutoHealthCheck) {\n      this.startHealthChecks();\n    }\n  }\n\n  /**\n   * Register a storage adapter\n   * Initializes health tracking and runs initial health check\n   */\n  register(adapter: BaseStorageAdapter): void {\n    if (this.adapters.has(adapter.name)) {\n      throw new StoragePackageError(\n        `Adapter with name \"${adapter.name}\" is already registered`,\n        STORAGE_ERROR_CODES.ADAPTER_ALREADY_REGISTERED,\n        {\n          context: { adapterName: adapter.name },\n        }\n      );\n    }\n\n    this.adapters.set(adapter.name, adapter);\n    this.healthInfo.set(adapter.name, {\n      status: ADAPTER_HEALTH_STATUS.UNKNOWN,\n      lastCheck: new Date(),\n      consecutiveFailures: 0,\n    });\n\n    this.logger?.info('Adapter registered', {\n      adapter: adapter.name,\n      type: adapter.type,\n      priority: adapter.priority,\n      enabled: adapter.enabled,\n    });\n\n    // Run initial health check\n    this.checkAdapterHealth(adapter.name).catch(error => {\n      this.logger?.warn('Initial health check failed', {\n        adapter: adapter.name,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    });\n  }\n\n  /**\n   * Unregister a storage adapter\n   */\n  unregister(adapterName: string): boolean {\n    const adapter = this.adapters.get(adapterName);\n    if (!adapter) {\n      return false;\n    }\n\n    this.adapters.delete(adapterName);\n    this.healthInfo.delete(adapterName);\n\n    this.logger?.info('Adapter unregistered', {\n      adapter: adapterName,\n    });\n\n    return true;\n  }\n\n  /**\n   * Get adapter by name\n   */\n  getAdapter(name: string): BaseStorageAdapter | undefined {\n    return this.adapters.get(name);\n  }\n\n  /**\n   * Get all registered adapters\n   */\n  getAllAdapters(): BaseStorageAdapter[] {\n    return Array.from(this.adapters.values());\n  }\n\n  /**\n   * Get adapter health information\n   */\n  getAdapterHealth(name: string): AdapterHealthInfo | undefined {\n    return this.healthInfo.get(name);\n  }\n\n  /**\n   * Select the best available adapter based on health and priority\n   * Returns the highest priority adapter that is healthy or degraded\n   *\n   * @throws StoragePackageError if no healthy adapters available\n   */\n  async selectHealthyAdapter(): Promise<BaseStorageAdapter> {\n    const availableAdapters = this.getSortedHealthyAdapters();\n\n    if (availableAdapters.length === 0) {\n      throw new StoragePackageError(\n        'No healthy storage adapters available',\n        STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS,\n        {\n          context: {\n            totalAdapters: this.adapters.size,\n            healthStatuses: Array.from(this.healthInfo.entries()).map(([name, info]) => ({\n              name,\n              status: info.status,\n            })),\n          },\n        }\n      );\n    }\n\n    const selected = availableAdapters[0];\n\n    this.logger?.debug('Selected adapter', {\n      adapter: selected.name,\n      priority: selected.priority,\n      healthStatus: this.healthInfo.get(selected.name)?.status,\n    });\n\n    return selected;\n  }\n\n  /**\n   * Get fallback adapter (next best after excluding specified adapter)\n   *\n   * @param excludeAdapterName - Adapter to exclude from selection\n   * @returns Fallback adapter or undefined if none available\n   */\n  async getFallbackAdapter(excludeAdapterName: string): Promise<BaseStorageAdapter | undefined> {\n    const availableAdapters = this.getSortedHealthyAdapters().filter(\n      adapter => adapter.name !== excludeAdapterName\n    );\n\n    if (availableAdapters.length === 0) {\n      this.logger?.warn('No fallback adapter available', {\n        excludedAdapter: excludeAdapterName,\n      });\n      return undefined;\n    }\n\n    const fallback = availableAdapters[0];\n\n    this.logger?.info('Selected fallback adapter', {\n      fallback: fallback.name,\n      priority: fallback.priority,\n      excludedAdapter: excludeAdapterName,\n    });\n\n    return fallback;\n  }\n\n  /**\n   * Check health of a specific adapter\n   */\n  private async checkAdapterHealth(adapterName: string): Promise<void> {\n    const adapter = this.adapters.get(adapterName);\n    if (!adapter) {\n      return;\n    }\n\n    const healthInfo = this.healthInfo.get(adapterName)!;\n\n    try {\n      const healthCheck: AdapterHealthCheck = await adapter.healthCheck();\n\n      healthInfo.status = healthCheck.status;\n      healthInfo.lastCheck = new Date();\n      healthInfo.consecutiveFailures = 0;\n      delete healthInfo.lastError;\n\n      this.logger?.debug('Health check completed', {\n        adapter: adapterName,\n        status: healthCheck.status,\n        responseTime: healthCheck.responseTime,\n        error: healthCheck.error,\n      });\n    } catch (error) {\n      healthInfo.consecutiveFailures++;\n      healthInfo.lastCheck = new Date();\n      healthInfo.lastError = error instanceof Error ? error.message : String(error);\n\n      // Mark as unhealthy after MAX_CONSECUTIVE_FAILURES\n      if (healthInfo.consecutiveFailures >= ADAPTER_REGISTRY_CONSTANTS.MAX_CONSECUTIVE_FAILURES) {\n        healthInfo.status = ADAPTER_HEALTH_STATUS.UNHEALTHY;\n      } else {\n        healthInfo.status = ADAPTER_HEALTH_STATUS.DEGRADED;\n      }\n\n      this.logger?.error('Health check failed', {\n        adapter: adapterName,\n        consecutiveFailures: healthInfo.consecutiveFailures,\n        status: healthInfo.status,\n        error: healthInfo.lastError,\n      });\n    }\n  }\n\n  /**\n   * Get sorted list of healthy adapters\n   * Sorted by: health status (healthy > degraded > unknown), then priority (higher first)\n   */\n  private getSortedHealthyAdapters(): BaseStorageAdapter[] {\n    return Array.from(this.adapters.values())\n      .filter(adapter => {\n        // Skip disabled adapters\n        if (!adapter.enabled) {\n          return false;\n        }\n\n        // Skip unavailable adapters\n        if (!adapter.isAvailable()) {\n          return false;\n        }\n\n        const health = this.healthInfo.get(adapter.name);\n        if (!health) {\n          return false;\n        }\n\n        // Skip unhealthy adapters\n        return health.status !== ADAPTER_HEALTH_STATUS.UNHEALTHY;\n      })\n      .sort((a, b) => {\n        const healthA = this.healthInfo.get(a.name)!;\n        const healthB = this.healthInfo.get(b.name)!;\n\n        // First, sort by health status (healthy > degraded > unknown)\n        const healthDiff =\n          ADAPTER_REGISTRY_CONSTANTS.HEALTH_STATUS_PRIORITY[healthB.status] -\n          ADAPTER_REGISTRY_CONSTANTS.HEALTH_STATUS_PRIORITY[healthA.status];\n\n        if (healthDiff !== 0) {\n          return healthDiff;\n        }\n\n        // If health is equal, sort by priority (higher first)\n        return b.priority - a.priority;\n      });\n  }\n\n  /**\n   * Start automatic health checks\n   */\n  private startHealthChecks(): void {\n    if (this.healthCheckTimer) {\n      return;\n    }\n\n    this.healthCheckTimer = setInterval(() => {\n      this.runHealthChecks().catch(error => {\n        this.logger?.error('Health check cycle failed', {\n          error: error instanceof Error ? error.message : String(error),\n        });\n      });\n    }, this.healthCheckInterval);\n\n    this.logger?.debug('Automatic health checks started', {\n      interval: this.healthCheckInterval,\n    });\n  }\n\n  /**\n   * Stop automatic health checks\n   */\n  private stopHealthChecks(): void {\n    if (this.healthCheckTimer) {\n      clearInterval(this.healthCheckTimer);\n      this.healthCheckTimer = undefined;\n\n      this.logger?.debug('Automatic health checks stopped');\n    }\n  }\n\n  /**\n   * Run health checks on all registered adapters\n   */\n  private async runHealthChecks(): Promise<void> {\n    const adapterNames = Array.from(this.adapters.keys());\n\n    await Promise.allSettled(adapterNames.map(name => this.checkAdapterHealth(name)));\n  }\n\n  /**\n   * Manually trigger health check for all adapters\n   */\n  async checkAllAdaptersHealth(): Promise<void> {\n    await this.runHealthChecks();\n  }\n\n  /**\n   * Manually trigger health check for specific adapter\n   */\n  async checkSpecificAdapterHealth(adapterName: string): Promise<void> {\n    await this.checkAdapterHealth(adapterName);\n  }\n\n  /**\n   * Get health summary for all adapters\n   */\n  getHealthSummary(): {\n    total: number;\n    healthy: number;\n    degraded: number;\n    unhealthy: number;\n    unknown: number;\n    adapters: Array<{\n      name: string;\n      type: string;\n      priority: number;\n      enabled: boolean;\n      status: ADAPTER_HEALTH_STATUS;\n      lastCheck: Date;\n      consecutiveFailures: number;\n      lastError?: string;\n    }>;\n  } {\n    const summary = {\n      total: this.adapters.size,\n      healthy: 0,\n      degraded: 0,\n      unhealthy: 0,\n      unknown: 0,\n      adapters: [] as Array<{\n        name: string;\n        type: string;\n        priority: number;\n        enabled: boolean;\n        status: ADAPTER_HEALTH_STATUS;\n        lastCheck: Date;\n        consecutiveFailures: number;\n        lastError?: string;\n      }>,\n    };\n\n    for (const [name, adapter] of this.adapters.entries()) {\n      const health = this.healthInfo.get(name)!;\n\n      // Count by status\n      switch (health.status) {\n        case ADAPTER_HEALTH_STATUS.HEALTHY:\n          summary.healthy++;\n          break;\n        case ADAPTER_HEALTH_STATUS.DEGRADED:\n          summary.degraded++;\n          break;\n        case ADAPTER_HEALTH_STATUS.UNHEALTHY:\n          summary.unhealthy++;\n          break;\n        case ADAPTER_HEALTH_STATUS.UNKNOWN:\n          summary.unknown++;\n          break;\n      }\n\n      summary.adapters.push({\n        name: adapter.name,\n        type: adapter.type,\n        priority: adapter.priority,\n        enabled: adapter.enabled,\n        status: health.status,\n        lastCheck: health.lastCheck,\n        consecutiveFailures: health.consecutiveFailures,\n        lastError: health.lastError,\n      });\n    }\n\n    return summary;\n  }\n\n  /**\n   * Cleanup resources\n   */\n  destroy(): void {\n    this.stopHealthChecks();\n    this.adapters.clear();\n    this.healthInfo.clear();\n\n    this.logger?.debug('AdapterRegistry destroyed');\n  }\n}\n","/**\n * EventManager - Internal event system for storage operations\n *\n * Manages event callbacks and emission for all storage operations.\n * This is an internal component - applications register callbacks via\n * StorageService config, which passes them to EventManager.\n *\n * Features:\n * - Register callbacks for storage events\n * - Emit events with rich payloads\n * - Async callback execution\n * - Error handling for callback failures (don't break main flow)\n * - Support for multiple callbacks per event type\n * - Event buffering for bulk operations\n *\n * @example\n * ```ts\n * const eventManager = new EventManager({ logger });\n *\n * // Register callbacks\n * eventManager.on(STORAGE_EVENT_TYPE.FileUploaded, async (payload) => {\n *   await saveToDatabase(payload.metadata);\n * });\n *\n * // Emit events\n * await eventManager.emit(STORAGE_EVENT_TYPE.FileUploaded, {\n *   type: STORAGE_EVENT_TYPE.FileUploaded,\n *   timestamp: new Date(),\n *   metadata: fileMetadata,\n * });\n * ```\n */\n\nimport type { LoggerInterface } from '@plyaz/types';\nimport type {\n  StorageEventManagerConfig,\n  StorageEventPayload,\n  STORAGE_EVENT_TYPE,\n  StorageEventCallback,\n} from '@plyaz/types/storage';\n\n/**\n * EventManager constants\n */\nconst EVENT_MANAGER_CONSTANTS = {\n  DEFAULT_BUFFER_FLUSH_INTERVAL_MS: 1000, // 1 second\n} as const;\n\n/**\n * EventManager - Internal event system for storage operations\n */\nexport class EventManager {\n  private readonly callbacks: Map<STORAGE_EVENT_TYPE, Set<StorageEventCallback>> = new Map();\n  private readonly logger?: LoggerInterface;\n  private readonly enableBuffering: boolean;\n  private readonly bufferFlushInterval: number;\n  private eventBuffer: StorageEventPayload[] = [];\n  private bufferTimer?: globalThis.NodeJS.Timeout;\n\n  constructor(config: StorageEventManagerConfig = {}) {\n    this.logger = config.logger;\n    this.enableBuffering = config.enableBuffering ?? false;\n    this.bufferFlushInterval =\n      config.bufferFlushInterval ?? EVENT_MANAGER_CONSTANTS.DEFAULT_BUFFER_FLUSH_INTERVAL_MS;\n\n    this.logger?.debug('EventManager initialized', {\n      bufferingEnabled: this.enableBuffering,\n      bufferFlushInterval: this.bufferFlushInterval,\n    });\n\n    if (this.enableBuffering) {\n      this.startBufferFlushing();\n    }\n  }\n\n  /**\n   * Register a callback for an event type\n   * Multiple callbacks can be registered for the same event\n   *\n   * @param eventType - The event type to listen for\n   * @param callback - The callback to execute\n   * @returns Unsubscribe function\n   */\n  on(eventType: STORAGE_EVENT_TYPE, callback: StorageEventCallback): () => void {\n    if (!this.callbacks.has(eventType)) {\n      this.callbacks.set(eventType, new Set());\n    }\n\n    this.callbacks.get(eventType)!.add(callback);\n\n    this.logger?.debug('Event callback registered', {\n      eventType,\n      totalCallbacks: this.callbacks.get(eventType)!.size,\n    });\n\n    // Return unsubscribe function\n    return () => {\n      this.off(eventType, callback);\n    };\n  }\n\n  /**\n   * Unregister a callback for an event type\n   *\n   * @param eventType - The event type\n   * @param callback - The callback to remove\n   */\n  off(eventType: STORAGE_EVENT_TYPE, callback: StorageEventCallback): void {\n    const callbacks = this.callbacks.get(eventType);\n    if (!callbacks) {\n      return;\n    }\n\n    callbacks.delete(callback);\n\n    if (callbacks.size === 0) {\n      this.callbacks.delete(eventType);\n    }\n\n    this.logger?.debug('Event callback unregistered', {\n      eventType,\n      remainingCallbacks: callbacks.size,\n    });\n  }\n\n  /**\n   * Emit an event and execute all registered callbacks\n   * Callbacks are executed asynchronously and errors are caught\n   *\n   * @param eventType - The event type to emit\n   * @param payload - The event payload\n   */\n  async emit(eventType: STORAGE_EVENT_TYPE, payload: StorageEventPayload): Promise<void> {\n    // Add to buffer if buffering is enabled\n    if (this.enableBuffering) {\n      this.eventBuffer.push(payload);\n      return;\n    }\n\n    await this.executeCallbacks(eventType, payload);\n  }\n\n  /**\n   * Emit multiple events at once (for bulk operations)\n   *\n   * @param payloads - Array of event payloads\n   */\n  async emitBatch(payloads: StorageEventPayload[]): Promise<void> {\n    if (this.enableBuffering) {\n      this.eventBuffer.push(...payloads);\n      return;\n    }\n\n    await Promise.allSettled(payloads.map(payload => this.executeCallbacks(payload.type, payload)));\n  }\n\n  /**\n   * Execute all callbacks for an event type\n   */\n  private async executeCallbacks(\n    eventType: STORAGE_EVENT_TYPE,\n    payload: StorageEventPayload\n  ): Promise<void> {\n    const callbacks = this.callbacks.get(eventType);\n    if (!callbacks || callbacks.size === 0) {\n      this.logger?.debug('No callbacks registered for event', { eventType });\n      return;\n    }\n\n    this.logger?.debug('Emitting event', {\n      eventType,\n      callbackCount: callbacks.size,\n      hasMetadata: !!payload.metadata,\n    });\n\n    // Execute all callbacks in parallel\n    const results = await Promise.allSettled(\n      Array.from(callbacks).map(callback => callback(payload))\n    );\n\n    // Log callback failures (but don't throw - callbacks shouldn't break main flow)\n    results.forEach((result, index) => {\n      if (result.status === 'rejected') {\n        this.logger?.error('Event callback failed', {\n          eventType,\n          callbackIndex: index,\n          error: result.reason instanceof Error ? result.reason.message : String(result.reason),\n        });\n      }\n    });\n  }\n\n  /**\n   * Get count of registered callbacks for an event type\n   */\n  getCallbackCount(eventType: STORAGE_EVENT_TYPE): number {\n    return this.callbacks.get(eventType)?.size ?? 0;\n  }\n\n  /**\n   * Get total number of registered callbacks across all event types\n   */\n  getTotalCallbackCount(): number {\n    let total = 0;\n    for (const callbacks of this.callbacks.values()) {\n      total += callbacks.size;\n    }\n    return total;\n  }\n\n  /**\n   * Check if any callbacks are registered for an event type\n   */\n  hasCallbacks(eventType: STORAGE_EVENT_TYPE): boolean {\n    return this.getCallbackCount(eventType) > 0;\n  }\n\n  /**\n   * Remove all callbacks for an event type\n   */\n  removeAllCallbacks(eventType: STORAGE_EVENT_TYPE): void {\n    this.callbacks.delete(eventType);\n\n    this.logger?.debug('All callbacks removed for event type', { eventType });\n  }\n\n  /**\n   * Remove all callbacks for all event types\n   */\n  removeAllEventCallbacks(): void {\n    this.callbacks.clear();\n\n    this.logger?.debug('All event callbacks removed');\n  }\n\n  /**\n   * Start buffer flushing timer\n   */\n  private startBufferFlushing(): void {\n    if (this.bufferTimer) {\n      return;\n    }\n\n    this.bufferTimer = setInterval(() => {\n      this.flushBuffer().catch(error => {\n        this.logger?.error('Buffer flush failed', {\n          error: error instanceof Error ? error.message : String(error),\n        });\n      });\n    }, this.bufferFlushInterval);\n\n    this.logger?.debug('Event buffer flushing started', {\n      interval: this.bufferFlushInterval,\n    });\n  }\n\n  /**\n   * Stop buffer flushing timer\n   */\n  private stopBufferFlushing(): void {\n    if (this.bufferTimer) {\n      clearInterval(this.bufferTimer);\n      this.bufferTimer = undefined;\n\n      this.logger?.debug('Event buffer flushing stopped');\n    }\n  }\n\n  /**\n   * Flush buffered events\n   */\n  private async flushBuffer(): Promise<void> {\n    if (this.eventBuffer.length === 0) {\n      return;\n    }\n\n    const eventsToFlush = [...this.eventBuffer];\n    this.eventBuffer = [];\n\n    this.logger?.debug('Flushing event buffer', {\n      eventCount: eventsToFlush.length,\n    });\n\n    // Group events by type for efficient processing\n    const eventsByType = new Map<STORAGE_EVENT_TYPE, StorageEventPayload[]>();\n    for (const payload of eventsToFlush) {\n      if (!eventsByType.has(payload.type)) {\n        eventsByType.set(payload.type, []);\n      }\n      eventsByType.get(payload.type)!.push(payload);\n    }\n\n    // Execute callbacks for each event type\n    await Promise.allSettled(\n      Array.from(eventsByType.entries()).map(([eventType, payloads]) =>\n        Promise.allSettled(payloads.map(payload => this.executeCallbacks(eventType, payload)))\n      )\n    );\n  }\n\n  /**\n   * Manually flush the event buffer\n   */\n  async flush(): Promise<void> {\n    await this.flushBuffer();\n  }\n\n  /**\n   * Get current buffer size\n   */\n  getBufferSize(): number {\n    return this.eventBuffer.length;\n  }\n\n  /**\n   * Get event statistics\n   */\n  getStatistics(): {\n    totalCallbacks: number;\n    eventTypes: number;\n    bufferSize: number;\n    callbacksByType: Record<string, number>;\n  } {\n    const callbacksByType: Record<string, number> = {};\n\n    for (const [eventType, callbacks] of this.callbacks.entries()) {\n      callbacksByType[eventType] = callbacks.size;\n    }\n\n    return {\n      totalCallbacks: this.getTotalCallbackCount(),\n      eventTypes: this.callbacks.size,\n      bufferSize: this.eventBuffer.length,\n      callbacksByType,\n    };\n  }\n\n  /**\n   * Cleanup resources and flush remaining events\n   */\n  async destroy(): Promise<void> {\n    this.stopBufferFlushing();\n\n    // Flush any remaining buffered events\n    if (this.eventBuffer.length > 0) {\n      await this.flushBuffer();\n    }\n\n    this.callbacks.clear();\n    this.eventBuffer = [];\n\n    this.logger?.debug('EventManager destroyed');\n  }\n}\n","/**\n * Storage Categories & Bucket Organization\n *\n * Provider-agnostic storage organization by PURPOSE and CONTENT TYPE.\n * Adapters internally translate these purposes to their naming conventions.\n *\n * Universal approach:\n * - Define buckets by PURPOSE (compliance, media-images, backups, etc.)\n * - Paths are universal across all providers\n * - Adapters handle their own naming rules internally\n *\n * @module @plyaz/storage/utils\n */\n\nimport type { UploadParams, BucketConfiguration, StorageCategory } from '@plyaz/types/storage';\nimport {\n  BUCKET_PURPOSE,\n  BUSINESS_MODEL,\n  FILE_CATEGORY,\n  ORGANIZATION_TIER,\n} from '@plyaz/types/storage';\nimport { STORAGE_CATEGORIES, STORAGE_RETENTION_DAYS, STORAGE_TTL_CONSTANTS } from '@plyaz/config';\n\n/**\n * Storage Category Classifier\n * Determines bucket purpose from upload parameters\n */\nexport class StorageCategoryClassifier {\n  /**\n   * Classify upload into bucket purpose\n   * Provider-agnostic classification by content type\n   */\n  static classify(params: UploadParams): BUCKET_PURPOSE {\n    // Compliance documents\n    if (params.documentType) {\n      return BUCKET_PURPOSE.COMPLIANCE;\n    }\n\n    // Media classification\n    if (params.mediaEntity || params.visibility !== undefined) {\n      return this.classifyMediaType(params);\n    }\n\n    // Temporary files\n    if (this.isTemporaryFile(params)) {\n      return BUCKET_PURPOSE.TEMPORARY;\n    }\n\n    // Archives\n    if (params.immutable || params.retentionPolicyId) {\n      return BUCKET_PURPOSE.ARCHIVES;\n    }\n\n    // Default: User uploads\n    return BUCKET_PURPOSE.UserUploads;\n  }\n\n  /**\n   * Classify media type from parameters\n   */\n  private static classifyMediaType(params: UploadParams): BUCKET_PURPOSE {\n    // Images - check for image-related categories\n    if (this.isImageCategory(params)) {\n      return BUCKET_PURPOSE.MediaImages;\n    }\n\n    // Videos - check for video-related categories\n    if (this.isVideoCategory(params)) {\n      return BUCKET_PURPOSE.MediaVideos;\n    }\n\n    // Static/other media\n    return BUCKET_PURPOSE.MediaStatic;\n  }\n\n  /**\n   * Check if params indicate an image\n   */\n  private static isImageCategory(params: UploadParams): boolean {\n    return (\n      params.category === FILE_CATEGORY.ProfileImage ||\n      params.category === FILE_CATEGORY.ProfileBanner ||\n      params.category === FILE_CATEGORY.PostImage ||\n      params.category === FILE_CATEGORY.GalleryImage ||\n      params.category === FILE_CATEGORY.ProductImage ||\n      params.category === FILE_CATEGORY.BrandLogo ||\n      params.mimeType?.startsWith('image/') === true\n    );\n  }\n\n  /**\n   * Check if params indicate a video\n   */\n  private static isVideoCategory(params: UploadParams): boolean {\n    return (\n      params.category === FILE_CATEGORY.PostVideo ||\n      params.category === FILE_CATEGORY.GalleryVideo ||\n      params.category === FILE_CATEGORY.HighlightVideo ||\n      params.category === FILE_CATEGORY.TrainingVideo ||\n      params.mimeType?.startsWith('video/') === true\n    );\n  }\n\n  /**\n   * Check if file is temporary (TTL less than 7 days)\n   */\n  private static isTemporaryFile(params: UploadParams): boolean {\n    if (params.ttl === undefined) {\n      return false;\n    }\n    const maxTempTtl =\n      STORAGE_TTL_CONSTANTS.SECONDS_PER_DAY * STORAGE_RETENTION_DAYS.TEMPORARY_DAYS;\n    return params.ttl < maxTempTtl;\n  }\n\n  /**\n   * Get category metadata\n   */\n  static getCategory(purpose: BUCKET_PURPOSE): StorageCategory {\n    return STORAGE_CATEGORIES[purpose];\n  }\n\n  /**\n   * Check if purpose requires compliance logging\n   */\n  static requiresCompliance(purpose: BUCKET_PURPOSE): boolean {\n    return STORAGE_CATEGORIES[purpose].requiresCompliance;\n  }\n\n  /**\n   * Check if purpose supports public access\n   */\n  static supportsPublicAccess(purpose: BUCKET_PURPOSE): boolean {\n    return STORAGE_CATEGORIES[purpose].supportsPublicAccess;\n  }\n\n  /**\n   * Get recommended retention period in days\n   */\n  static getRecommendedRetention(purpose: BUCKET_PURPOSE): number | undefined {\n    return STORAGE_CATEGORIES[purpose].recommendedRetention;\n  }\n\n  /**\n   * Generate bucket configuration from upload params\n   * Provider-agnostic configuration based on content\n   */\n  static generateConfig(params: UploadParams): BucketConfiguration {\n    const purpose = this.classify(params);\n\n    return {\n      purpose,\n      businessModel: params.businessModel,\n      tier: params.organizationTier,\n      organizationId: params.organizationId,\n      environment: params.environment,\n      region: params.region,\n    };\n  }\n}\n\n/**\n * Bucket identifier generator\n * Creates unique, human-readable bucket identifiers\n * NOT the final bucket name (adapters handle that)\n */\nexport class BucketIdentifier {\n  /**\n   * Generate unique bucket identifier\n   * This is NOT the provider-specific name, just an identifier\n   */\n  static generate(config: BucketConfiguration): string {\n    const parts: string[] = [];\n\n    // Base purpose\n    parts.push(config.purpose);\n\n    // Organization separation for enterprise\n    if (config.tier === ORGANIZATION_TIER.ENTERPRISE && config.organizationId) {\n      parts.push(config.tier, this.sanitize(config.organizationId));\n    }\n    // Business model separation\n    else if (config.businessModel) {\n      parts.push(config.businessModel);\n    }\n\n    // Environment for non-Supabase providers\n    if (config.environment && config.purpose === BUCKET_PURPOSE.COMPLIANCE) {\n      parts.push(config.environment);\n    }\n\n    return parts.join(':');\n  }\n\n  /**\n   * Parse bucket identifier back to configuration\n   */\n  static parse(identifier: string): Partial<BucketConfiguration> {\n    const parts = identifier.split(':');\n\n    return {\n      purpose: parts[0] as BUCKET_PURPOSE,\n      businessModel: parts.includes('b2b')\n        ? BUSINESS_MODEL.B2B\n        : parts.includes('b2c')\n          ? BUSINESS_MODEL.B2C\n          : undefined,\n      tier: parts.includes('enterprise') ? ORGANIZATION_TIER.ENTERPRISE : undefined,\n    };\n  }\n\n  private static sanitize(str: string): string {\n    return str.toLowerCase().replaceAll(/[^a-z0-9-]/g, '-');\n  }\n}\n\n/**\n * Example adapter bucket name translation:\n *\n * Identifier: \"compliance:enterprise:acme-corp:prod\"\n *\n * CloudflareR2Adapter translates to:\n * → plyaz-prod-weur-enterprise-acme-corp-records-vault\n *\n * SupabaseStorageAdapter translates to:\n * → compliance-acme-corp (projects handle env)\n *\n * S3Adapter translates to:\n * → plyaz-compliance-enterprise-acme-corp-prod-us-east-1\n *\n * All use the SAME paths internally!\n */\n","/**\n * Universal Path Generator\n *\n * Provider-agnostic path generation based on CONTENT TYPE, not provider.\n * Any adapter (R2, Supabase, S3, etc.) can use any path strategy.\n *\n * Path Strategies:\n * - COMPLIANCE: Financial/legal documents requiring audit trail\n * - MEDIA: Images/videos with optimization variants\n * - GENERAL: Other files with flexible organization\n *\n * Naming Conventions (provider-agnostic):\n * - Compliance: <tenant>/<doctype>/<yyyy>/<mm>/<dd>/<docId>_<slug>.<ext>\n * - Media: <visibility>/<entity>/<entityId>/<yyyy>/<mm>/<dd>/<variant>/<filename>\n * - General: <category>/<entityType>/<entityId>/<yyyy>/<mm>/<dd>/<filename>\n *\n * @module @plyaz/storage/utils\n */\n\nimport type {\n  UploadParams,\n  CompliancePathOptions,\n  MediaPathOptions,\n  GeneralPathOptions,\n} from '@plyaz/types/storage';\nimport { PATH_STRATEGY } from '@plyaz/types/storage';\n\n/**\n * Constants for path generation\n */\nconst PATH_CONSTANTS = {\n  MONTH_INDEX_OFFSET: 1, // JavaScript months are 0-indexed, so add 1 for 1-based months\n  PAD_START_LENGTH: 2,\n  PAD_START_CHAR: '0',\n  MAX_SLUG_LENGTH: 80,\n  UUID_SEGMENT_INDEX: 0,\n} as const;\n\n/**\n * Universal Path Generator\n * Provider-agnostic path generation based on content type\n */\nexport class PathGenerator {\n  /**\n   * Generate compliance document path\n   * Works on ANY provider (R2, S3, Supabase, Azure, GCS, etc.)\n   *\n   * Pattern: <tenant>/<doctype>/<yyyy>/<mm>/<dd>/<docId>_<slug>.<ext>\n   * Optional: <businessModel>/<tenant>/... for B2B/B2C separation\n   *\n   * Examples (same path works on R2, S3, Supabase):\n   * - club-fc-bern/invoice/2025/11/05/inv_92f3a7_order-5843.pdf\n   * - b2b/vendor-xyz/tax/2025/11/05/tax_2025_q4_summary.pdf\n   */\n  static generateCompliancePath(options: CompliancePathOptions): string {\n    const {\n      tenant,\n      documentType,\n      documentId,\n      slug,\n      extension,\n      date = new Date(),\n      businessModel,\n      organizationId,\n    } = options;\n\n    // Sanitize tenant\n    const safeTenant = this.sanitizeTenant(tenant);\n\n    // Date folders: yyyy/mm/dd\n    const { year, month, day } = this.getDateParts(date);\n\n    // Filename: <docId>_<slug>.<ext>\n    const filename = slug\n      ? `${documentId}_${this.sanitizeSlug(slug)}${extension}`\n      : `${documentId}${extension}`;\n\n    // Build path with optional business model prefix\n    const parts: string[] = [];\n\n    if (businessModel) {\n      parts.push(businessModel);\n    }\n\n    if (organizationId) {\n      parts.push(this.sanitizeTenant(organizationId));\n    }\n\n    parts.push(safeTenant, documentType, year, month, day, filename);\n\n    return parts.join('/');\n  }\n\n  /**\n   * Generate media path\n   * Works on ANY provider (R2, S3, Supabase, Azure, GCS, etc.)\n   *\n   * Pattern: <visibility>/<entity>/<entityId>/<yyyy>/<mm>/<dd>/<variant>/<filename>\n   * Optional: <businessModel>/<visibility>/... for B2B/B2C separation\n   *\n   * Examples (same path works on R2, S3, Supabase):\n   * - public/club/42/2025/11/05/banner/lg.webp\n   * - b2b/private/user/903/2025/11/05/avatar/original.png\n   */\n  static generateMediaPath(options: MediaPathOptions): string {\n    const {\n      visibility,\n      entity,\n      entityId,\n      variant,\n      filename,\n      date = new Date(),\n      businessModel,\n    } = options;\n\n    // Date folders: yyyy/mm/dd\n    const { year, month, day } = this.getDateParts(date);\n\n    // Sanitize filename\n    const safeFilename = this.sanitizeFilename(filename);\n\n    // Build path with optional business model prefix\n    const parts: string[] = [];\n\n    if (businessModel) {\n      parts.push(businessModel);\n    }\n\n    parts.push(visibility, entity, entityId, year, month, day, variant, safeFilename);\n\n    return parts.join('/');\n  }\n\n  /**\n   * Generate general file path\n   * Works on ANY provider\n   *\n   * Pattern: <category>/<entityType>/<entityId>/<yyyy>/<mm>/<dd>/<filename>\n   *\n   * Examples:\n   * - documents/user/123/2025/11/05/report-abc.pdf\n   * - attachments/order/456/2025/11/05/uuid-file.txt\n   */\n  static generateGeneralPath(options: GeneralPathOptions): string {\n    const {\n      category,\n      entityType,\n      entityId,\n      filename,\n      date = new Date(),\n      includeUuid = true,\n    } = options;\n\n    // Date folders: yyyy/mm/dd\n    const { year, month, day } = this.getDateParts(date);\n\n    // Sanitize filename\n    let safeFilename = this.sanitizeFilename(filename);\n\n    // Add UUID if requested\n    if (includeUuid) {\n      const uuid = this.generateShortUuid();\n      const ext = this.getExtension(safeFilename);\n      const name = safeFilename.replace(ext, '');\n      safeFilename = `${uuid}-${name}${ext}`;\n    }\n\n    const parts = [\n      category.toLowerCase(),\n      entityType.toLowerCase(),\n      entityId,\n      year,\n      month,\n      day,\n      safeFilename,\n    ];\n\n    return parts.join('/');\n  }\n\n  /**\n   * Auto-detect strategy and generate path from UploadParams\n   * Returns null if params don't match any pattern\n   */\n  static detectAndGenerate(params: UploadParams): { path: string; strategy: PATH_STRATEGY } | null {\n    // Strategy 1: Compliance documents\n    const complianceResult = this.tryGenerateCompliancePath(params);\n    if (complianceResult) {\n      return complianceResult;\n    }\n\n    // Strategy 2: Media files\n    const mediaResult = this.tryGenerateMediaPath(params);\n    if (mediaResult) {\n      return mediaResult;\n    }\n\n    // Strategy 3: General files (fallback)\n    const generalResult = this.tryGenerateGeneralPath(params);\n    if (generalResult) {\n      return generalResult;\n    }\n\n    return null;\n  }\n\n  /**\n   * Try to generate compliance path from params\n   */\n  private static tryGenerateCompliancePath(\n    params: UploadParams\n  ): { path: string; strategy: PATH_STRATEGY } | null {\n    if (!params.documentType || !params.tenant) {\n      return null;\n    }\n\n    const extension = this.getExtension(params.filename ?? '');\n    const documentId = params.documentId ?? `doc-${Date.now()}`;\n\n    const path = this.generateCompliancePath({\n      tenant: params.tenant,\n      documentType: params.documentType,\n      documentId,\n      slug: params.documentSlug,\n      extension,\n      businessModel: params.businessModel,\n      organizationId: params.organizationId,\n    });\n\n    return { path, strategy: PATH_STRATEGY.COMPLIANCE };\n  }\n\n  /**\n   * Try to generate media path from params\n   */\n  private static tryGenerateMediaPath(\n    params: UploadParams\n  ): { path: string; strategy: PATH_STRATEGY } | null {\n    if (!params.mediaEntity || !params.visibility) {\n      return null;\n    }\n\n    const variant = params.variantName ?? 'original';\n\n    const path = this.generateMediaPath({\n      visibility: params.visibility,\n      entity: params.mediaEntity,\n      entityId: params.entityId,\n      variant,\n      filename: params.filename ?? 'unnamed',\n      businessModel: params.businessModel,\n    });\n\n    return { path, strategy: PATH_STRATEGY.MEDIA };\n  }\n\n  /**\n   * Try to generate general path from params\n   */\n  private static tryGenerateGeneralPath(\n    params: UploadParams\n  ): { path: string; strategy: PATH_STRATEGY } | null {\n    if (!params.category || !params.entityType || !params.entityId || !params.filename) {\n      return null;\n    }\n\n    const path = this.generateGeneralPath({\n      category: params.category,\n      entityType: params.entityType,\n      entityId: params.entityId,\n      filename: params.filename,\n    });\n\n    return { path, strategy: PATH_STRATEGY.GENERAL };\n  }\n\n  /**\n   * Validate path against naming conventions\n   */\n  static validatePath(path: string, strategy: PATH_STRATEGY): boolean {\n    switch (strategy) {\n      case PATH_STRATEGY.COMPLIANCE:\n        return this.validateCompliancePath(path);\n      case PATH_STRATEGY.MEDIA:\n        return this.validateMediaPath(path);\n      case PATH_STRATEGY.GENERAL:\n        return this.validateGeneralPath(path);\n      default:\n        return false;\n    }\n  }\n\n  /**\n   * Validate compliance path\n   */\n  private static validateCompliancePath(path: string): boolean {\n    // Pattern: optional(businessModel)/optional(orgId)/tenant/doctype/yyyy/mm/dd/docId_slug.ext\n    const pattern =\n      /^(?:[a-z0-9-]+\\/)?(?:[a-z0-9-]+\\/)?(invoice|receipt|tax|compliance|certificate|contract|report)\\/\\d{4}\\/\\d{2}\\/\\d{2}\\/[a-z0-9_-]+\\.[a-z0-9]+$/;\n    return pattern.test(path);\n  }\n\n  /**\n   * Validate media path\n   */\n  private static validateMediaPath(path: string): boolean {\n    // Pattern: optional(businessModel)/(public|private)/entity/entityId/yyyy/mm/dd/variant/filename\n    const pattern =\n      /^(?:[a-z0-9-]+\\/)?(public|private)\\/(team|club|athlete|match|league|post|campaign|product|brand|user)\\/[a-z0-9-]+\\/\\d{4}\\/\\d{2}\\/\\d{2}\\/(original|thumb|sm|md|lg|1080p|4k|webp|poster|banner|avatar)\\/[a-z0-9._-]+\\.[a-z0-9]+$/;\n    return pattern.test(path);\n  }\n\n  /**\n   * Validate general path\n   */\n  private static validateGeneralPath(path: string): boolean {\n    // Pattern: category/entityType/entityId/yyyy/mm/dd/filename\n    const pattern =\n      /^[a-z0-9-]+\\/[a-z0-9-]+\\/[a-z0-9-]+\\/\\d{4}\\/\\d{2}\\/\\d{2}\\/[a-z0-9._-]+\\.[a-z0-9]+$/;\n    return pattern.test(path);\n  }\n\n  /**\n   * Get date parts for path\n   */\n  private static getDateParts(date: Date): { year: string; month: string; day: string } {\n    return {\n      year: date.getFullYear().toString(),\n      month: String(date.getMonth() + PATH_CONSTANTS.MONTH_INDEX_OFFSET).padStart(\n        PATH_CONSTANTS.PAD_START_LENGTH,\n        PATH_CONSTANTS.PAD_START_CHAR\n      ),\n      day: String(date.getDate()).padStart(\n        PATH_CONSTANTS.PAD_START_LENGTH,\n        PATH_CONSTANTS.PAD_START_CHAR\n      ),\n    };\n  }\n\n  /**\n   * Sanitize tenant slug (lowercase, ASCII, kebab-case, no PII)\n   */\n  private static sanitizeTenant(tenant: string): string {\n    return tenant\n      .toLowerCase()\n      .normalize('NFD')\n      .replace(/[\\u0300-\\u036f]/g, '') // Remove accents\n      .replace(/[^a-z0-9-]/g, '-')\n      .replace(/-+/g, '-')\n      .replace(/^-|-$/g, '');\n  }\n\n  /**\n   * Sanitize slug (lowercase, ASCII, kebab-case, max 80 chars)\n   */\n  private static sanitizeSlug(slug: string): string {\n    const sanitized = slug\n      .toLowerCase()\n      .normalize('NFD')\n      .replace(/[\\u0300-\\u036f]/g, '')\n      .replace(/[^a-z0-9-._]/g, '-')\n      .replace(/-+/g, '-')\n      .replace(/^-|-$/g, '');\n\n    return sanitized.substring(0, PATH_CONSTANTS.MAX_SLUG_LENGTH);\n  }\n\n  /**\n   * Sanitize filename (lowercase, ASCII, correct extension)\n   */\n  private static sanitizeFilename(filename: string): string {\n    const parts = filename.split('.');\n    const ext = parts.pop()?.toLowerCase() ?? '';\n    const name = parts.join('.');\n\n    const safeName = name\n      .toLowerCase()\n      .normalize('NFD')\n      .replace(/[\\u0300-\\u036f]/g, '')\n      .replace(/[^a-z0-9._-]/g, '-')\n      .replace(/-+/g, '-')\n      .replace(/^-|-$/g, '');\n\n    return ext ? `${safeName}.${ext}` : safeName;\n  }\n\n  /**\n   * Extract file extension from filename\n   */\n  private static getExtension(filename: string): string {\n    const parts = filename.split('.');\n    return parts.length > 1 ? `.${parts[parts.length - 1].toLowerCase()}` : '';\n  }\n\n  /**\n   * Generate short UUID (first segment only)\n   * Note: crypto.randomUUID() is available in Node.js 19.0.0+ as stable API\n   */\n  private static generateShortUuid(): string {\n    // eslint-disable-next-line n/no-unsupported-features/node-builtins -- crypto.randomUUID() is stable in Node 19+\n    return crypto.randomUUID().split('-')[PATH_CONSTANTS.UUID_SEGMENT_INDEX];\n  }\n}\n\n/**\n * NOTE: Bucket naming is handled by individual adapters.\n * Each adapter translates bucket PURPOSE to their naming convention:\n *\n * - CloudflareR2Adapter: plyaz-{env}-{region}-{purpose}\n * - SupabaseStorageAdapter: {purpose}-{type}\n * - S3Adapter: plyaz-{purpose}-{env}-{region}\n * - AzureAdapter: {purpose}{hash}\n *\n * Use StorageCategoryClassifier to determine bucket purpose,\n * then let adapters handle naming internally.\n */\n","/**\n * Bucket Router\n *\n * Provider-agnostic routing by CONTENT PURPOSE, not provider type.\n * Routes to REGISTERED adapters from StorageService, no hardcoding.\n *\n * Architecture:\n * 1. Classify upload by purpose (compliance, media-images, etc.)\n * 2. Check user's adapter preference for that purpose\n * 3. Route to available adapter that can handle it\n * 4. Adapter translates purpose to its bucket naming\n * 5. Universal paths work across all adapters\n *\n * @module @plyaz/storage/core\n */\n\nimport type {\n  UploadParams,\n  BucketRouterConfig,\n  RoutingDecision,\n  RoutingRule,\n} from '@plyaz/types/storage';\nimport { BUCKET_PURPOSE } from '@plyaz/types/storage';\nimport { StorageCategoryClassifier } from '../utils/storageCategories';\nimport { PathGenerator } from '../utils/pathGenerator';\nimport type { LoggerInterface } from '@plyaz/types';\n\n/**\n * BucketRouter constants\n */\nconst BUCKET_ROUTER_CONSTANTS = {\n  DEFAULT_RULE_PRIORITY: 100,\n  BYTES_PER_KB: 1024,\n  KB_PER_MB: 1024,\n  LARGE_FILE_THRESHOLD_MB: 100,\n} as const;\n\n// Calculated constant\nconst LARGE_FILE_THRESHOLD_BYTES =\n  BUCKET_ROUTER_CONSTANTS.LARGE_FILE_THRESHOLD_MB *\n  BUCKET_ROUTER_CONSTANTS.KB_PER_MB *\n  BUCKET_ROUTER_CONSTANTS.BYTES_PER_KB;\n\n/**\n * Bucket Router\n * Routes storage operations by content purpose to available adapters\n */\nexport class BucketRouter {\n  private rules: RoutingRule[] = [];\n  private readonly config: BucketRouterConfig;\n  private readonly logger?: LoggerInterface;\n\n  // User-configured preferences for which adapter handles which purpose\n  private readonly adapterPreferences: Partial<Record<BUCKET_PURPOSE, string>>;\n\n  // Available adapters (set by StorageService)\n  private availableAdapters: Set<string> = new Set();\n\n  constructor(config: BucketRouterConfig = {}) {\n    this.config = config;\n    this.logger = config.logger;\n\n    // User's adapter preferences\n    this.adapterPreferences = config.adapterPreferences ?? {};\n\n    // Available adapters from StorageService\n    if (config.availableAdapters) {\n      this.availableAdapters = new Set(config.availableAdapters);\n    }\n\n    // Add default rules if enabled\n    if (config.enableDefaultRules !== false) {\n      this.addDefaultRules();\n    }\n\n    // Add custom rules\n    if (config.customRules) {\n      config.customRules.forEach(rule => this.addRule(rule));\n    }\n\n    // Sort rules by priority\n    this.sortRules();\n\n    this.logger?.info('[BucketRouter] Initialized', {\n      rulesCount: this.rules.length,\n      availableAdapters: Array.from(this.availableAdapters),\n      adapterPreferences: this.adapterPreferences,\n    });\n  }\n\n  /**\n   * Set available adapters (called by StorageService)\n   */\n  setAvailableAdapters(adapters: string[]): void {\n    this.availableAdapters = new Set(adapters);\n    this.logger?.debug('[BucketRouter] Available adapters updated', {\n      adapters,\n    });\n  }\n\n  /**\n   * Add routing rule\n   */\n  addRule(rule: RoutingRule): void {\n    this.rules.push(rule);\n    this.sortRules();\n\n    this.logger?.debug('[BucketRouter] Rule added', {\n      name: rule.name,\n      priority: rule.priority ?? 0,\n    });\n  }\n\n  /**\n   * Route upload to appropriate adapter/bucket purpose\n   */\n  // eslint-disable-next-line complexity\n  route(params: UploadParams): RoutingDecision | null {\n    // Check for explicit adapter override first\n    if (params.adapterOverride) {\n      // Validate adapter exists\n      if (this.availableAdapters.has(params.adapterOverride)) {\n        const purpose = StorageCategoryClassifier.classify(params);\n        const config = StorageCategoryClassifier.generateConfig(params);\n\n        const decision: RoutingDecision = {\n          adapterName: params.adapterOverride,\n          bucketPurpose: purpose,\n          bucketConfig: config,\n          reason: 'Explicit adapter override in params',\n        };\n\n        this.logger?.debug('[BucketRouter] Explicit adapter override', decision);\n        return decision;\n      } else {\n        this.logger?.warn('[BucketRouter] Adapter override not available', {\n          requested: params.adapterOverride,\n          available: Array.from(this.availableAdapters),\n        });\n        // Fall through to normal routing\n      }\n    }\n\n    // Classify upload by purpose\n    const purpose: BUCKET_PURPOSE = StorageCategoryClassifier.classify(params);\n    const config = StorageCategoryClassifier.generateConfig(params);\n\n    // Try custom routing rules first\n    for (const rule of this.rules) {\n      if (rule.condition(params, purpose)) {\n        // Validate adapter exists\n        if (!this.availableAdapters.has(rule.adapterName)) {\n          this.logger?.debug('[BucketRouter] Rule adapter not available, skipping', {\n            rule: rule.name,\n            adapter: rule.adapterName,\n          });\n          continue;\n        }\n\n        const decision: RoutingDecision = {\n          adapterName: rule.adapterName,\n          bucketPurpose: purpose,\n          bucketConfig: config,\n          reason: `Matched rule: ${rule.name}`,\n        };\n\n        // Generate path if enabled\n        if (rule.generatePath) {\n          this.applyPathGeneration(decision, params);\n        }\n\n        this.logger?.debug('[BucketRouter] Rule matched', decision);\n        return decision;\n      }\n    }\n\n    // Check user's adapter preference for this purpose\n    const preferredAdapter = this.adapterPreferences[purpose];\n    if (preferredAdapter && this.availableAdapters.has(preferredAdapter)) {\n      const decision: RoutingDecision = {\n        adapterName: preferredAdapter,\n        bucketPurpose: purpose,\n        bucketConfig: config,\n        reason: `User preference for purpose: ${purpose}`,\n      };\n\n      // Auto-generate path\n      const pathResult = PathGenerator.detectAndGenerate(params);\n      if (pathResult) {\n        decision.path = pathResult.path;\n        decision.pathStrategy = pathResult.strategy;\n      }\n\n      this.logger?.debug('[BucketRouter] User preference routing', decision);\n      return decision;\n    }\n\n    // No specific routing needed - let StorageService use default adapter selection\n    this.logger?.debug('[BucketRouter] No specific routing, use default adapter selection', {\n      purpose,\n      availableAdapters: Array.from(this.availableAdapters),\n    });\n\n    return null;\n  }\n\n  /**\n   * Add default routing rules\n   * These are suggestions, not hard requirements\n   */\n  private addDefaultRules(): void {\n    // Rule 1: Enterprise tier → Route to first available adapter\n    this.addRule({\n      name: 'enterprise-tier',\n      priority: BUCKET_ROUTER_CONSTANTS.DEFAULT_RULE_PRIORITY,\n      condition: p => p.organizationTier === 'enterprise',\n      adapterName: '', // Will be set to first available\n      generatePath: true,\n    });\n\n    // Rule 2: Compliance documents → Route to adapter with 'r2' or 's3' in name\n    this.addRule({\n      name: 'compliance-documents',\n      priority: 90,\n      condition: (_, purpose) => purpose === BUCKET_PURPOSE.COMPLIANCE,\n      adapterName: '', // Will be determined at runtime\n      generatePath: true,\n    });\n\n    // Rule 3: Large files (>100MB) → Route to adapter with 'r2' or 's3' in name\n    this.addRule({\n      name: 'large-files',\n      priority: 70,\n      condition: p => (p.file as Buffer)?.length > LARGE_FILE_THRESHOLD_BYTES,\n      adapterName: '', // Will be determined at runtime\n      generatePath: true,\n    });\n  }\n\n  /**\n   * Get suggested adapter for a purpose\n   * Returns first available adapter from preferences or any available adapter\n   */\n  getAdapterForPurpose(purpose: BUCKET_PURPOSE): string | null {\n    // Check preference\n    const preferred = this.adapterPreferences[purpose];\n    if (preferred && this.availableAdapters.has(preferred)) {\n      return preferred;\n    }\n\n    // Return any available adapter\n    const adapters = Array.from(this.availableAdapters);\n    return adapters.length > 0 ? adapters[0] : null;\n  }\n\n  /**\n   * Set adapter preference for a purpose\n   */\n  setAdapterPreference(purpose: BUCKET_PURPOSE, adapterName: string): void {\n    this.adapterPreferences[purpose] = adapterName;\n    this.logger?.info('[BucketRouter] Adapter preference set', {\n      purpose,\n      adapterName,\n    });\n  }\n\n  /**\n   * Sort rules by priority (highest first)\n   */\n  private sortRules(): void {\n    this.rules.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n  }\n\n  /**\n   * Get all routing rules (for debugging)\n   */\n  getRules(): RoutingRule[] {\n    return [...this.rules];\n  }\n\n  /**\n   * Get available adapters\n   */\n  getAvailableAdapters(): string[] {\n    return Array.from(this.availableAdapters);\n  }\n\n  /**\n   * Clear all custom rules\n   */\n  clearRules(): void {\n    this.rules = [];\n    this.logger?.info('[BucketRouter] All rules cleared');\n  }\n\n  /**\n   * Reset to default rules only\n   */\n  resetToDefaultRules(): void {\n    this.clearRules();\n    this.addDefaultRules();\n    this.logger?.info('[BucketRouter] Reset to default rules');\n  }\n\n  /**\n   * Helper: Apply path generation to routing decision\n   */\n  private applyPathGeneration(decision: RoutingDecision, params: UploadParams): void {\n    const pathResult = PathGenerator.detectAndGenerate(params);\n    if (pathResult) {\n      decision.path = pathResult.path;\n      decision.pathStrategy = pathResult.strategy;\n    }\n  }\n}\n\n/**\n * Example Usage:\n *\n * // In StorageService initialization:\n * const router = new BucketRouter({\n *   enableDefaultRules: true,\n *   adapterPreferences: {\n *     [BUCKET_PURPOSE.COMPLIANCE]: 'cloudflare-r2', // User wants compliance on R2\n *     [BUCKET_PURPOSE.MediaImages]: 'supabase',    // User wants media on Supabase\n *   },\n *   availableAdapters: ['cloudflare-r2', 'supabase'], // From registered adapters\n * });\n *\n * // Or let user configure at runtime:\n * router.setAdapterPreference(BUCKET_PURPOSE.COMPLIANCE, 'my-custom-s3');\n *\n * // Routing decision:\n * const decision = router.route(uploadParams);\n * if (decision) {\n *   // Use the suggested adapter\n *   adapter = adapterRegistry.getAdapter(decision.adapterName);\n * } else {\n *   // Use default adapter selection from registry\n *   adapter = adapterRegistry.selectHealthyAdapter();\n * }\n */\n","/**\n * Custom Handlebars Helpers for Template Rendering\n *\n * Provides helpers for:\n * - Currency formatting\n * - Date formatting\n * - Number formatting\n * - Percentage formatting\n * - Conditional logic\n * - Mathematical operations\n * - String manipulation\n * - Invoice calculations\n */\n\nimport type Handlebars from 'handlebars';\nimport type {\n  StorageTemplateInvoiceLineItem,\n  StorageTemplateInvoiceTotalOptions,\n  StorageTemplateInvoiceTotalArgs,\n} from '@plyaz/types/storage';\n\n/**\n * Format a number as currency\n *\n * @example\n * {{formatCurrency 1234.56}} -> $1,234.56\n * {{formatCurrency 1000 'EUR' 'de-DE'}} -> 1.000,00 €\n */\nexport function formatCurrency(\n  value: number,\n  currency?: string | Handlebars.HelperOptions,\n  locale?: string | Handlebars.HelperOptions\n): string {\n  if (typeof value !== 'number' || isNaN(value)) {\n    return value?.toString() ?? '';\n  }\n\n  // Handle Handlebars options object\n  const currencyCode = typeof currency === 'string' ? currency : 'USD';\n  const localeCode = typeof locale === 'string' ? locale : 'en-US';\n\n  return new Intl.NumberFormat(localeCode, {\n    style: 'currency',\n    currency: currencyCode,\n  }).format(value);\n}\n\n/**\n * Format a date\n *\n * @example\n * {{formatDate myDate}} -> January 1, 2025\n * {{formatDate myDate 'short'}} -> 1/1/2025\n * {{formatDate myDate 'long' 'es-ES'}} -> 1 de enero de 2025\n */\nexport function formatDate(\n  value: Date | string | number,\n  style?: 'full' | 'long' | 'medium' | 'short' | Handlebars.HelperOptions,\n  locale?: string | Handlebars.HelperOptions\n): string {\n  if (!value) return '';\n\n  const date = value instanceof Date ? value : new Date(value);\n\n  if (isNaN(date.getTime())) {\n    return value?.toString() ?? '';\n  }\n\n  // Handle Handlebars options object\n  const dateStyle = typeof style === 'string' ? style : 'medium';\n  const localeCode = typeof locale === 'string' ? locale : 'en-US';\n\n  return new Intl.DateTimeFormat(localeCode, {\n    dateStyle,\n  }).format(date);\n}\n\n/**\n * Format a number with thousands separators\n *\n * @example\n * {{formatNumber 1234567}} -> 1,234,567\n * {{formatNumber 1234.5 2}} -> 1,234.50\n */\nexport function formatNumber(\n  value: number,\n  decimals?: number | Handlebars.HelperOptions,\n  locale?: string | Handlebars.HelperOptions\n): string {\n  if (typeof value !== 'number' || isNaN(value)) {\n    return value?.toString() ?? '';\n  }\n\n  // Handle Handlebars options object\n  const decimalPlaces = typeof decimals === 'number' ? decimals : 0;\n  const localeCode = typeof locale === 'string' ? locale : 'en-US';\n\n  return new Intl.NumberFormat(localeCode, {\n    minimumFractionDigits: decimalPlaces,\n    maximumFractionDigits: decimalPlaces,\n  }).format(value);\n}\n\n/**\n * Format a number as percentage\n *\n * @example\n * {{formatPercentage 0.15}} -> 15%\n * {{formatPercentage 0.1234 2}} -> 12.34%\n */\nexport function formatPercentage(\n  value: number,\n  decimals?: number | Handlebars.HelperOptions,\n  locale?: string | Handlebars.HelperOptions\n): string {\n  if (typeof value !== 'number' || isNaN(value)) {\n    return value?.toString() ?? '';\n  }\n\n  // Handle Handlebars options object\n  const decimalPlaces = typeof decimals === 'number' ? decimals : 0;\n  const localeCode = typeof locale === 'string' ? locale : 'en-US';\n\n  return new Intl.NumberFormat(localeCode, {\n    style: 'percent',\n    minimumFractionDigits: decimalPlaces,\n    maximumFractionDigits: decimalPlaces,\n  }).format(value);\n}\n\n/**\n * Add two numbers\n *\n * @example\n * {{add 5 3}} -> 8\n */\nexport function add(a: number, b: number): number {\n  return (a || 0) + (b || 0);\n}\n\n/**\n * Subtract two numbers\n *\n * @example\n * {{subtract 10 3}} -> 7\n */\nexport function subtract(a: number, b: number): number {\n  return (a || 0) - (b || 0);\n}\n\n/**\n * Multiply two numbers\n *\n * @example\n * {{multiply 5 3}} -> 15\n */\nexport function multiply(a: number, b: number): number {\n  return (a || 0) * (b || 0);\n}\n\n/**\n * Divide two numbers\n *\n * @example\n * {{divide 10 2}} -> 5\n */\nexport function divide(a: number, b: number): number {\n  if (b === 0) return 0;\n  return (a || 0) / (b || 1);\n}\n\n/**\n * Check if value equals another value\n *\n * @example\n * {{#eq status 'paid'}}Payment received{{/eq}}\n */\nexport function eq(\n  this: unknown,\n  a: unknown,\n  b: unknown,\n  options: Handlebars.HelperOptions\n): string {\n  return a === b ? options.fn(this) : options.inverse(this);\n}\n\n/**\n * Check if value does not equal another value\n *\n * @example\n * {{#neq status 'paid'}}Payment pending{{/neq}}\n */\nexport function neq(\n  this: unknown,\n  a: unknown,\n  b: unknown,\n  options: Handlebars.HelperOptions\n): string {\n  return a !== b ? options.fn(this) : options.inverse(this);\n}\n\n/**\n * Check if value is greater than another value\n *\n * @example\n * {{#gt total 1000}}Large order{{/gt}}\n */\nexport function gt(this: unknown, a: number, b: number, options: Handlebars.HelperOptions): string {\n  return a > b ? options.fn(this) : options.inverse(this);\n}\n\n/**\n * Check if value is less than another value\n *\n * @example\n * {{#lt total 100}}Small order{{/lt}}\n */\nexport function lt(this: unknown, a: number, b: number, options: Handlebars.HelperOptions): string {\n  return a < b ? options.fn(this) : options.inverse(this);\n}\n\n/**\n * Check if value is greater than or equal to another value\n *\n * @example\n * {{#gte total 1000}}Eligible for discount{{/gte}}\n */\nexport function gte(\n  this: unknown,\n  a: number,\n  b: number,\n  options: Handlebars.HelperOptions\n): string {\n  return a >= b ? options.fn(this) : options.inverse(this);\n}\n\n/**\n * Check if value is less than or equal to another value\n *\n * @example\n * {{#lte items.length 5}}Few items{{/lte}}\n */\nexport function lte(\n  this: unknown,\n  a: number,\n  b: number,\n  options: Handlebars.HelperOptions\n): string {\n  return a <= b ? options.fn(this) : options.inverse(this);\n}\n\n/**\n * Logical AND\n *\n * @example\n * {{#and isPaid isShipped}}Order complete{{/and}}\n */\nexport function and(\n  this: unknown,\n  a: unknown,\n  b: unknown,\n  options: Handlebars.HelperOptions\n): string {\n  return a && b ? options.fn(this) : options.inverse(this);\n}\n\n/**\n * Logical OR\n *\n * @example\n * {{#or isPending isFailed}}Needs attention{{/or}}\n */\nexport function or(\n  this: unknown,\n  a: unknown,\n  b: unknown,\n  options: Handlebars.HelperOptions\n): string {\n  return a || b ? options.fn(this) : options.inverse(this);\n}\n\n/**\n * Uppercase a string\n *\n * @example\n * {{uppercase 'hello'}} -> HELLO\n */\nexport function uppercase(value: string): string {\n  return value?.toString().toUpperCase() ?? '';\n}\n\n/**\n * Lowercase a string\n *\n * @example\n * {{lowercase 'HELLO'}} -> hello\n */\nexport function lowercase(value: string): string {\n  return value?.toString().toLowerCase() ?? '';\n}\n\n/**\n * Capitalize first letter\n *\n * @example\n * {{capitalize 'hello world'}} -> Hello world\n */\nexport function capitalize(value: string): string {\n  const str = value?.toString() ?? '';\n  return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\n/**\n * Constants for string helpers\n */\nconst STRING_HELPER_CONSTANTS = {\n  DEFAULT_TRUNCATE_LENGTH: 50,\n} as const;\n\n/** Percentage divisor constant */\nconst PERCENTAGE_DIVISOR = 100;\n\n/**\n * Calculate invoice total based on options object\n *\n * @param options - Invoice calculation options\n * @returns Calculated amount based on calcType\n * @internal\n */\nfunction calculateInvoiceTotal(options: StorageTemplateInvoiceTotalOptions): number {\n  const { items, taxRate = 0, discountPercent = 0, shippingCost = 0, calcType = 'total' } = options;\n\n  const subtotal = items.reduce(\n    (sum, item) => sum + (item.quantity || 0) * (item.unitPrice || 0),\n    0\n  );\n  const discountAmount = subtotal * (discountPercent / PERCENTAGE_DIVISOR);\n  const taxableAmount = subtotal - discountAmount;\n  const taxAmount = taxableAmount * (taxRate / PERCENTAGE_DIVISOR);\n\n  switch (calcType) {\n    case 'subtotal':\n      return subtotal;\n    case 'discount':\n      return discountAmount;\n    case 'tax':\n      return taxAmount;\n    default:\n      return taxableAmount + taxAmount + shippingCost;\n  }\n}\n\n/**\n * Calculate invoice totals (subtotal, discount, tax, or total)\n *\n * This helper is designed for Handlebars templates and accepts positional arguments.\n *\n * @example\n * {{invoiceTotal items taxRate discountPercent shippingCost \"subtotal\"}}\n * {{invoiceTotal items taxRate discountPercent shippingCost \"discount\"}}\n * {{invoiceTotal items taxRate discountPercent shippingCost \"tax\"}}\n * {{invoiceTotal items taxRate discountPercent shippingCost \"total\"}}\n */\nexport function invoiceTotal(...args: StorageTemplateInvoiceTotalArgs): number {\n  const [items, taxRate, discountPercent, shippingCost, calcType] = args;\n\n  // Handle case where items is actually the Handlebars options object (no args passed)\n  if (!Array.isArray(items)) return 0;\n\n  return calculateInvoiceTotal({\n    items: items as StorageTemplateInvoiceLineItem[],\n    taxRate: typeof taxRate === 'number' ? taxRate : 0,\n    discountPercent: typeof discountPercent === 'number' ? discountPercent : 0,\n    shippingCost: typeof shippingCost === 'number' ? shippingCost : 0,\n    calcType: (typeof calcType === 'string'\n      ? calcType\n      : 'total') as StorageTemplateInvoiceTotalOptions['calcType'],\n  });\n}\n\n/**\n * Truncate string to length\n *\n * @example\n * {{truncate description 50}} -> Truncates to 50 characters...\n */\nexport function truncate(value: string, length?: number | Handlebars.HelperOptions): string {\n  const str = value?.toString() ?? '';\n  const maxLength =\n    typeof length === 'number' ? length : STRING_HELPER_CONSTANTS.DEFAULT_TRUNCATE_LENGTH;\n  if (str.length <= maxLength) return str;\n  return str.substring(0, maxLength) + '...';\n}\n\n/**\n * Get default helpers map\n *\n * @returns Map of helper name to function\n */\nexport function getDefaultHelpers(): Record<string, Handlebars.HelperDelegate> {\n  return {\n    formatCurrency,\n    formatDate,\n    formatNumber,\n    formatPercentage,\n    add,\n    subtract,\n    multiply,\n    divide,\n    eq,\n    neq,\n    gt,\n    lt,\n    gte,\n    lte,\n    and,\n    or,\n    uppercase,\n    lowercase,\n    capitalize,\n    truncate,\n    invoiceTotal,\n  };\n}\n","/**\n * TemplateEngine\n *\n * Core template rendering engine for PDF generation.\n * Handles:\n * - Frontmatter parsing (YAML metadata)\n * - Handlebars template compilation\n * - Markdown to HTML conversion\n * - Layout system integration\n * - Template caching\n * - Multi-language support with fallback\n *\n * Pattern matches @plyaz/notifications/templates/TemplateEngine\n */\n\nimport Handlebars, { type TemplateDelegate } from 'handlebars';\nimport { marked } from 'marked';\nimport matter from 'gray-matter';\nimport type {\n  TemplateService,\n  StorageTranslationService as StorageTranslationServiceInterface,\n  StorageTemplateFrontmatter,\n  StorageTemplateRenderResult,\n  StorageTemplateCacheEntry,\n  OUTPUT_FORMAT,\n  PDFRenderOptions,\n  TemplateVariableDefinition,\n  TemplateVariableValidationResult,\n  TemplateValidationOptions,\n  StorageTemplateRenderResultWithValidation,\n  StorageTemplateValidationDataResult,\n  StorageTemplateRenderToHtmlOptions,\n  StorageTemplateTypeCoercionResult,\n} from '@plyaz/types/storage';\nimport { TEMPLATE_VARIABLE_TYPE } from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../errors';\nimport type { LoggerInterface } from '@plyaz/types';\nimport type { StorageTemplateEngineConfig } from '@plyaz/types/storage';\nimport type { RendererRegistry } from '../renderers/core/RendererRegistry';\nimport type { LayoutEngine } from './LayoutEngine';\nimport { getDefaultHelpers } from './helpers';\n\n/**\n * Template Engine constants\n */\nconst TEMPLATE_ENGINE_CONSTANTS = {\n  DEFAULT_CACHE_TTL_MS: 300000, // 5 minutes\n} as const;\n\n/**\n * TemplateEngine\n *\n * Renders markdown templates with Handlebars variables and frontmatter.\n * Supports layouts, custom helpers, and multi-language templates.\n *\n * @example\n * ```typescript\n * const engine = new TemplateEngine({\n *   templateService: new FileSystemTemplateService(),\n *   defaultLocale: 'en',\n *   cacheEnabled: true\n * });\n *\n * const result = await engine.render('invoices/standard-invoice', {\n *   invoiceNumber: 'INV-001',\n *   amount: 1000\n * }, 'en');\n * ```\n */\nexport class TemplateEngine {\n  private readonly handlebars: typeof Handlebars;\n  private readonly templateService: TemplateService;\n  private readonly translationService?: StorageTranslationServiceInterface;\n  private readonly rendererRegistry?: RendererRegistry;\n  private readonly layoutEngine?: LayoutEngine;\n  private readonly logger?: LoggerInterface;\n\n  // Template cache: key format \"locale:category/templateId\"\n  private readonly templateCache: Map<string, StorageTemplateCacheEntry> = new Map();\n\n  // Compiled Handlebars cache: key format \"locale:category/templateId\"\n  private readonly compiledCache: Map<string, TemplateDelegate> = new Map();\n\n  private defaultLocale: string;\n  private cacheEnabled: boolean;\n  private cacheTTL: number;\n\n  constructor(\n    config: StorageTemplateEngineConfig<\n      TemplateService,\n      StorageTranslationServiceInterface,\n      RendererRegistry,\n      LayoutEngine\n    >\n  ) {\n    if (!config.templateService) {\n      throw new StoragePackageError(\n        'templateService is required',\n        STORAGE_ERROR_CODES.INVALID_OPERATION,\n        { context: { config } }\n      );\n    }\n    this.templateService = config.templateService;\n    this.translationService = config.translationService;\n    this.rendererRegistry = config.rendererRegistry;\n    this.layoutEngine = config.layoutEngine;\n    this.logger = config.logger;\n    this.defaultLocale = config.defaultLocale ?? 'en';\n    this.cacheEnabled = config.cacheEnabled ?? true;\n    this.cacheTTL = config.cacheTTL ?? TEMPLATE_ENGINE_CONSTANTS.DEFAULT_CACHE_TTL_MS; // 5 minutes\n\n    // Create new Handlebars instance\n    this.handlebars = Handlebars.create();\n\n    // Register helpers (default if not provided, or custom)\n    const helpers = config.helpers ?? getDefaultHelpers();\n    Object.entries(helpers).forEach(([name, helper]) => {\n      this.handlebars.registerHelper(name, helper as Handlebars.HelperDelegate);\n    });\n\n    // Configure marked for GitHub Flavored Markdown\n    marked.use({\n      gfm: true,\n      breaks: false,\n    });\n\n    this.logger?.info('[TemplateEngine] Initialized', {\n      defaultLocale: this.defaultLocale,\n      cacheEnabled: this.cacheEnabled,\n      cacheTTL: this.cacheTTL,\n      helpersCount: Object.keys(helpers).length,\n      helpersSource: config.helpers ? 'custom' : 'default',\n      translationServiceEnabled: !!this.translationService,\n      rendererRegistryEnabled: !!this.rendererRegistry,\n      layoutEngineEnabled: !!this.layoutEngine,\n    });\n  }\n\n  /**\n   * Render template with data\n   *\n   * @param templateId - Template identifier (category/templateName)\n   * @param data - Template data (variables)\n   * @param locale - Locale (default: defaultLocale)\n   * @returns Rendered HTML with frontmatter\n   *\n   * @example\n   * ```typescript\n   * const result = await engine.render('invoices/standard-invoice', {\n   *   invoiceNumber: 'INV-001',\n   *   customer: { name: 'John Doe' },\n   *   items: [{ name: 'Product A', price: 100 }],\n   *   total: 100\n   * }, 'en');\n   *\n   * // With validation\n   * const result = await engine.render('invoices/standard-invoice', data, 'en', {\n   *   validation: {\n   *     strict: true, // throws if validation fails\n   *     schema: zodSchema, // optional custom Zod schema\n   *   }\n   * });\n   * ```\n   */\n  async render(\n    templateId: string,\n    data: Record<string, unknown>,\n    locale?: string,\n    options?: { validation?: TemplateValidationOptions }\n  ): Promise<StorageTemplateRenderResultWithValidation> {\n    const resolvedLocale = locale ?? this.defaultLocale;\n    const cacheKey = `${resolvedLocale}:${templateId}`;\n\n    this.logger?.debug('[TemplateEngine] Rendering template', {\n      templateId,\n      locale: resolvedLocale,\n      cacheKey,\n      validationEnabled: options?.validation?.enabled !== false,\n    });\n\n    try {\n      const templateEntry = await this.loadTemplate(templateId, resolvedLocale);\n      const { renderData, validationResult } = this.validateTemplateData(\n        templateId,\n        data,\n        templateEntry,\n        options\n      );\n\n      const html = await this.renderTemplateToHtml({\n        cacheKey,\n        templateEntry,\n        renderData,\n        originalData: data,\n        locale: resolvedLocale,\n      });\n\n      this.logger?.debug('[TemplateEngine] Template rendered successfully', {\n        templateId,\n        locale: resolvedLocale,\n        htmlLength: html.length,\n        validationPerformed: !!validationResult,\n        validationPassed: validationResult?.valid,\n      });\n\n      return {\n        html,\n        frontmatter: templateEntry.frontmatter,\n        css: templateEntry.frontmatter.css,\n        validationResult,\n      };\n    } catch (error) {\n      return this.handleRenderError(error, templateId, resolvedLocale);\n    }\n  }\n\n  /**\n   * Validate template data and return coerced values\n   *\n   * @param templateId - Template identifier for error context\n   * @param data - Raw template data\n   * @param templateEntry - Loaded template with frontmatter\n   * @param options - Validation options\n   * @returns Validated data result with render data and optional validation result\n   * @internal\n   */\n  private validateTemplateData(\n    templateId: string,\n    data: Record<string, unknown>,\n    templateEntry: StorageTemplateCacheEntry,\n    options?: { validation?: TemplateValidationOptions }\n  ): StorageTemplateValidationDataResult {\n    if (!this.shouldValidateData(templateEntry, options)) return { renderData: data };\n\n    const validationResult = this.performValidation(\n      data,\n      templateEntry.frontmatter.variables,\n      options?.validation\n    );\n    this.handleValidationResult(templateId, validationResult, options?.validation?.strict);\n\n    return {\n      renderData: (validationResult.coercedValues as Record<string, unknown>) ?? data,\n      validationResult,\n    };\n  }\n\n  /**\n   * Check if data validation should be performed\n   *\n   * @param templateEntry - Loaded template entry\n   * @param options - Validation options\n   * @returns True if validation should be performed\n   * @internal\n   */\n  // eslint-disable-next-line complexity\n  private shouldValidateData(\n    templateEntry: StorageTemplateCacheEntry,\n    options?: { validation?: TemplateValidationOptions }\n  ): boolean {\n    if (options?.validation?.enabled === false) return false;\n    const hasSchema = options?.validation?.schema ?? options?.validation?.additionalVariables;\n    const hasFrontmatterVars =\n      templateEntry.frontmatter.variables && templateEntry.frontmatter.variables.length > 0;\n    return !!(hasSchema ?? hasFrontmatterVars);\n  }\n\n  /**\n   * Handle validation result - throw if strict mode or log warnings\n   *\n   * @param templateId - Template ID for logging\n   * @param result - Validation result\n   * @param strict - Whether to throw on validation failure\n   * @throws StoragePackageError if strict mode and validation failed\n   * @internal\n   */\n  private handleValidationResult(\n    templateId: string,\n    result: TemplateVariableValidationResult,\n    strict?: boolean\n  ): void {\n    if (!result.valid && strict) {\n      throw new StoragePackageError(\n        'Template data validation failed',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        {\n          context: { templateId, validationErrors: result.errors },\n        }\n      );\n    }\n    if (!result.valid) {\n      this.logger?.warn('[TemplateEngine] Validation warnings', {\n        templateId,\n        errors: result.errors,\n        warnings: result.warnings,\n      });\n    }\n  }\n\n  /**\n   * Render template entry to HTML with layout application\n   *\n   * @param options - Render options including cache key, template entry, and data\n   * @returns Rendered HTML string\n   * @internal\n   */\n  private async renderTemplateToHtml(options: StorageTemplateRenderToHtmlOptions): Promise<string> {\n    const { cacheKey, templateEntry, renderData, originalData, locale } = options;\n    let compiledTemplate = this.compiledCache.get(cacheKey);\n    if (!compiledTemplate) {\n      compiledTemplate = this.handlebars.compile(templateEntry.body);\n      if (this.cacheEnabled) this.compiledCache.set(cacheKey, compiledTemplate);\n    }\n\n    const renderedMarkdown = compiledTemplate(renderData);\n    const normalizedMarkdown = this.normalizeHtmlIndentation(renderedMarkdown);\n    let html = await marked(normalizedMarkdown);\n\n    html = await this.applyLayoutIfConfigured(html, templateEntry, originalData, locale);\n    return html;\n  }\n\n  /**\n   * Apply layout components if configured in frontmatter\n   */\n  private async applyLayoutIfConfigured(\n    html: string,\n    templateEntry: StorageTemplateCacheEntry,\n    data: Record<string, unknown>,\n    locale: string\n  ): Promise<string> {\n    const fm = templateEntry.frontmatter;\n    const hasLayoutComponents = fm.layout ?? fm.header ?? fm.footer ?? fm.wrapper;\n\n    if (!hasLayoutComponents) return html;\n\n    if (!this.layoutEngine) {\n      this.logger?.warn(\n        '[TemplateEngine] Layout components specified but LayoutEngine not configured',\n        {\n          frontmatter: fm,\n        }\n      );\n      return html;\n    }\n\n    const layoutResult = await this.layoutEngine.applyLayoutFromFrontmatter(html, fm, data, locale);\n    this.logger?.debug('[TemplateEngine] Layout applied', {\n      layoutName: layoutResult.layoutName,\n      locale: layoutResult.locale,\n      htmlLength: layoutResult.html.length,\n    });\n    return layoutResult.html;\n  }\n\n  /**\n   * Handle render errors uniformly\n   */\n  private handleRenderError(error: unknown, templateId: string, locale: string): never {\n    this.logger?.error('[TemplateEngine] Template rendering failed', { templateId, locale, error });\n    if (error instanceof StoragePackageError) throw error;\n    throw new StoragePackageError(\n      `Failed to render template: ${templateId}`,\n      STORAGE_ERROR_CODES.TEMPLATE_RENDER_FAILED,\n      {\n        cause: error instanceof Error ? error : undefined,\n        context: { templateId, locale },\n      }\n    );\n  }\n\n  /**\n   * Load template from service with caching and fallback\n   *\n   * @param templateId - Template identifier\n   * @param locale - Locale\n   * @returns Template cache entry\n   */\n  private async loadTemplate(\n    templateId: string,\n    locale: string\n  ): Promise<StorageTemplateCacheEntry> {\n    const cacheKey = `${locale}:${templateId}`;\n\n    // Check cache\n    if (this.cacheEnabled) {\n      const cached = this.templateCache.get(cacheKey);\n      if (cached && Date.now() - cached.cachedAt < cached.ttl) {\n        this.logger?.debug('[TemplateEngine] Template loaded from cache', { cacheKey });\n        return cached;\n      }\n    }\n\n    // Try to load template with locale fallback\n    const templatePath = await this.resolveTemplatePath(templateId, locale);\n\n    this.logger?.debug('[TemplateEngine] Loading template from filesystem', {\n      templateId,\n      locale,\n      path: templatePath,\n    });\n\n    // Load template content\n    const content = await this.templateService.getTemplate(templatePath);\n\n    // Parse frontmatter and body\n    const parsed = matter(content);\n    const frontmatter = parsed.data as StorageTemplateFrontmatter;\n    const body = parsed.content;\n\n    // Create cache entry\n    const entry: StorageTemplateCacheEntry = {\n      content,\n      frontmatter,\n      body,\n      cachedAt: Date.now(),\n      ttl: this.cacheTTL,\n    };\n\n    // Cache it\n    if (this.cacheEnabled) {\n      this.templateCache.set(cacheKey, entry);\n      this.logger?.debug('[TemplateEngine] Template cached', { cacheKey });\n    }\n\n    return entry;\n  }\n\n  /**\n   * Resolve template path with locale fallback\n   *\n   * Tries in order:\n   * 1. {locale}/{templateId}.md (e.g., en-US/invoices/standard.md)\n   * 2. {baseLocale}/{templateId}.md (e.g., en/invoices/standard.md)\n   * 3. {defaultLocale}/{templateId}.md (e.g., en/invoices/standard.md)\n   *\n   * @param templateId - Template identifier\n   * @param locale - Requested locale\n   * @returns Resolved template path\n   */\n  // eslint-disable-next-line complexity\n  private async resolveTemplatePath(templateId: string, locale: string): Promise<string> {\n    const templateFile = `${templateId}.md`;\n    const triedLocales: string[] = [];\n\n    // 1. Try exact locale (e.g., en-US)\n    triedLocales.push(locale);\n    const exactPath = `${locale}/${templateFile}`;\n    if (await this.templateService.hasTemplate(exactPath)) {\n      return exactPath;\n    }\n\n    // 2. Try base locale (e.g., en from en-US)\n    const baseLocale = locale.split('-')[0];\n    if (baseLocale !== locale) {\n      triedLocales.push(baseLocale);\n      const basePath = `${baseLocale}/${templateFile}`;\n      if (await this.templateService.hasTemplate(basePath)) {\n        this.logger?.debug('[TemplateEngine] Falling back to base locale', {\n          requestedLocale: locale,\n          baseLocale,\n        });\n        return basePath;\n      }\n    }\n\n    // 3. Try default locale\n    if (locale !== this.defaultLocale && baseLocale !== this.defaultLocale) {\n      triedLocales.push(this.defaultLocale);\n      const defaultPath = `${this.defaultLocale}/${templateFile}`;\n      if (await this.templateService.hasTemplate(defaultPath)) {\n        this.logger?.warn('[TemplateEngine] Falling back to default locale', {\n          requestedLocale: locale,\n          defaultLocale: this.defaultLocale,\n        });\n        return defaultPath;\n      }\n    }\n\n    // Template not found - show only unique locales that were tried\n    const uniqueTriedLocales = [...new Set(triedLocales)].join(', ');\n    throw new StoragePackageError(\n      `Template not found: ${templateId} (tried locales: ${uniqueTriedLocales})`,\n      STORAGE_ERROR_CODES.TEMPLATE_NOT_FOUND,\n      {\n        context: {\n          templateId,\n          locale,\n          baseLocale,\n          defaultLocale: this.defaultLocale,\n          triedLocales,\n        },\n      }\n    );\n  }\n\n  /**\n   * Register a custom Handlebars helper\n   *\n   * @param name - Helper name\n   * @param helper - Helper function\n   *\n   * @example\n   * ```typescript\n   * engine.registerHelper('uppercase', (str: string) => str.toUpperCase());\n   * ```\n   */\n  registerHelper(name: string, helper: Handlebars.HelperDelegate): void {\n    this.handlebars.registerHelper(name, helper);\n    this.logger?.debug('[TemplateEngine] Helper registered', { name });\n  }\n\n  /**\n   * Register multiple Handlebars helpers\n   *\n   * @param helpers - Map of helper name to function\n   */\n  registerHelpers(helpers: Record<string, Handlebars.HelperDelegate>): void {\n    Object.entries(helpers).forEach(([name, helper]) => {\n      this.registerHelper(name, helper);\n    });\n  }\n\n  /**\n   * Clear template cache\n   */\n  clearCache(): void {\n    this.templateCache.clear();\n    this.compiledCache.clear();\n    this.logger?.info('[TemplateEngine] Cache cleared');\n  }\n\n  /**\n   * Clear specific template from cache\n   *\n   * @param templateId - Template identifier\n   * @param locale - Locale (optional, clears all locales if not provided)\n   */\n  clearTemplateCache(templateId: string, locale?: string): void {\n    if (locale) {\n      const cacheKey = `${locale}:${templateId}`;\n      this.templateCache.delete(cacheKey);\n      this.compiledCache.delete(cacheKey);\n      this.logger?.debug('[TemplateEngine] Template cache cleared', { cacheKey });\n    } else {\n      // Clear all locales for this template\n      const keys = Array.from(this.templateCache.keys()).filter(key =>\n        key.endsWith(`:${templateId}`)\n      );\n      keys.forEach(key => {\n        this.templateCache.delete(key);\n        this.compiledCache.delete(key);\n      });\n      this.logger?.debug('[TemplateEngine] Template cache cleared for all locales', {\n        templateId,\n        clearedCount: keys.length,\n      });\n    }\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getCacheStats(): {\n    templateCacheSize: number;\n    compiledCacheSize: number;\n    cacheEnabled: boolean;\n    cacheTTL: number;\n  } {\n    return {\n      templateCacheSize: this.templateCache.size,\n      compiledCacheSize: this.compiledCache.size,\n      cacheEnabled: this.cacheEnabled,\n      cacheTTL: this.cacheTTL,\n    };\n  }\n\n  /**\n   * Set default locale for template rendering\n   *\n   * @param locale - Locale code (e.g., 'en', 'es', 'fr')\n   *\n   * @example\n   * ```typescript\n   * engine.setDefaultLocale('es'); // Set Spanish as default\n   * ```\n   */\n  setDefaultLocale(locale: string): void {\n    this.defaultLocale = locale;\n    this.logger?.info('[TemplateEngine] Default locale updated', {\n      previousLocale: this.defaultLocale,\n      newLocale: locale,\n    });\n  }\n\n  /**\n   * Get current default locale\n   *\n   * @returns Current default locale code\n   */\n  getDefaultLocale(): string {\n    return this.defaultLocale;\n  }\n\n  /**\n   * Enable or disable template caching\n   *\n   * @param enabled - Whether to enable caching\n   */\n  setCacheEnabled(enabled: boolean): void {\n    this.cacheEnabled = enabled;\n    this.logger?.info('[TemplateEngine] Cache enabled status updated', { enabled });\n  }\n\n  /**\n   * Set cache TTL\n   *\n   * @param ttl - Time to live in milliseconds\n   */\n  setCacheTTL(ttl: number): void {\n    this.cacheTTL = ttl;\n    this.logger?.info('[TemplateEngine] Cache TTL updated', { ttl });\n  }\n\n  /**\n   * Get translation string content (requires translationService)\n   *\n   * @param path - Translation file path (e.g., 'en/storage.json')\n   * @returns Translation JSON string\n   * @throws StoragePackageError if translation service not configured or file not found\n   *\n   * @example\n   * ```typescript\n   * const translations = await engine.getTranslation('en/storage.json');\n   * const data = JSON.parse(translations);\n   * ```\n   */\n  async getTranslation(path: string): Promise<string> {\n    if (!this.translationService) {\n      throw new StoragePackageError(\n        'Translation service not configured',\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n        { context: { path } }\n      );\n    }\n\n    return await this.translationService.getTranslation(path);\n  }\n\n  /**\n   * Check if translation exists (requires translationService)\n   *\n   * @param path - Translation file path\n   * @returns true if translation exists\n   */\n  async hasTranslation(path: string): Promise<boolean> {\n    if (!this.translationService) {\n      return false;\n    }\n\n    return await this.translationService.hasTranslation(path);\n  }\n\n  /**\n   * Get translation service instance\n   *\n   * @returns Translation service or undefined if not configured\n   */\n  getTranslationService(): StorageTranslationServiceInterface | undefined {\n    return this.translationService;\n  }\n\n  /**\n   * Render template to PDF (convenience method)\n   *\n   * Complete flow: Template (markdown) → HTML → PDF\n   *\n   * @param options - PDF render options\n   * @param options.templateId - Template identifier\n   * @param options.data - Template data\n   * @param options.locale - Locale (optional, defaults to defaultLocale)\n   * @param options.pdfOptions - PDF-specific options (optional)\n   * @param options.validation - Validation options (optional)\n   * @returns PDF as Buffer\n   * @throws StoragePackageError if renderer registry not configured\n   *\n   * @example\n   * ```typescript\n   * const pdf = await engine.renderToPDF({\n   *   templateId: 'invoices/standard-invoice',\n   *   data: { invoiceNumber: 'INV-12345', customer: { name: 'John Doe' }, total: 1000 },\n   *   locale: 'en',\n   *   pdfOptions: { pageSize: 'A4', orientation: 'portrait' }\n   * });\n   * ```\n   */\n  async renderToPDF(options: {\n    templateId: string;\n    data: Record<string, unknown>;\n    locale?: string;\n    pdfOptions?: PDFRenderOptions;\n    validation?: TemplateValidationOptions;\n  }): Promise<Buffer> {\n    return await this.renderToFormat({\n      templateId: options.templateId,\n      data: options.data,\n      format: 'pdf' as OUTPUT_FORMAT,\n      locale: options.locale,\n      pdfOptions: options.pdfOptions,\n      validation: options.validation,\n    });\n  }\n\n  /**\n   * Render template to specific output format\n   *\n   * Complete flow: Template (markdown) → HTML → Renderer → Output format\n   *\n   * @param templateId - Template identifier\n   * @param data - Template data\n   * @param format - Output format (pdf, png, jpeg, etc.)\n   * @param locale - Locale (optional, defaults to defaultLocale)\n   * @param pdfOptions - PDF-specific options (optional, only used for PDF format)\n   * @returns Rendered content as Buffer\n   * @throws StoragePackageError if renderer registry not configured or format not supported\n   *\n   * @example\n   * ```typescript\n   * // Render to PDF\n   * const pdf = await engine.renderToFormat('invoices/standard', data, OUTPUT_FORMAT.PDF, 'en');\n   *\n   * // Render to PNG (screenshot of template)\n   * const png = await engine.renderToFormat('certificates/award', data, OUTPUT_FORMAT.PNG, 'en');\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async renderToFormat(options: {\n    templateId: string;\n    data: Record<string, unknown>;\n    format: OUTPUT_FORMAT;\n    locale?: string;\n    pdfOptions?: PDFRenderOptions;\n    validation?: TemplateValidationOptions;\n  }): Promise<Buffer> {\n    const { templateId, data, format, locale, pdfOptions, validation } = options;\n    if (!this.rendererRegistry) {\n      throw new StoragePackageError(\n        'Renderer registry not configured - cannot render to output formats',\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n        {\n          context: {\n            templateId,\n            format,\n            message: 'Add rendererRegistry to TemplateEngine config',\n          },\n        }\n      );\n    }\n\n    this.logger?.debug('[TemplateEngine] Rendering template to format', {\n      templateId,\n      format,\n      locale: locale ?? this.defaultLocale,\n    });\n\n    const startTime = Date.now();\n\n    try {\n      // Get appropriate renderer for format\n      const renderer = this.rendererRegistry.getRenderer(format);\n\n      this.logger?.debug('[TemplateEngine] Using renderer', {\n        renderer: renderer.name,\n        format,\n      });\n\n      let renderData: Record<string, unknown> | { html: string };\n\n      // For Excel/Word: Use raw data directly (these formats need structured data, not HTML)\n      if (format === 'excel' || format === 'word') {\n        this.logger?.debug('[TemplateEngine] Using raw data for structured format', {\n          format,\n        });\n        renderData = data as Record<string, unknown>;\n      } else {\n        // For PDF/HTML/PNG/JPEG: Render template to HTML first\n        const templateResult = await this.render(templateId, data, locale, { validation });\n        renderData = {\n          html: templateResult.html,\n        };\n      }\n\n      // Render to output format using renderer\n      const renderResult = await renderer.render({\n        format,\n        data: renderData as Record<string, unknown>,\n        locale: locale ?? this.defaultLocale,\n        pdfOptions: format === 'pdf' ? pdfOptions : undefined,\n      });\n\n      this.logger?.info('[TemplateEngine] Template rendered to format successfully', {\n        templateId,\n        format,\n        size: renderResult.size,\n        renderer: renderer.name,\n        duration: Date.now() - startTime,\n      });\n\n      return renderResult.content;\n    } catch (error) {\n      this.logger?.error('[TemplateEngine] Failed to render template to format', {\n        templateId,\n        format,\n        error,\n        duration: Date.now() - startTime,\n      });\n\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n\n      throw new StoragePackageError(\n        `Failed to render template to ${format}: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.TEMPLATE_RENDER_FAILED,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: { templateId, format, locale: locale ?? this.defaultLocale },\n        }\n      );\n    }\n  }\n\n  /**\n   * Get renderer registry instance\n   *\n   * @returns Renderer registry or undefined if not configured\n   */\n  getRendererRegistry(): RendererRegistry | undefined {\n    return this.rendererRegistry;\n  }\n\n  /**\n   * Normalize HTML indentation in markdown to prevent code block issues\n   *\n   * Markdown treats 4+ spaces as code blocks. This is problematic for templates\n   * with indented HTML after Handlebars conditionals. This method removes leading\n   * spaces from lines that start with HTML tags, EXCEPT when inside fenced code blocks.\n   *\n   * For actual code examples in templates, use fenced code blocks (triple backticks)\n   * instead of indentation:\n   *\n   * ```html\n   * <p>This will be preserved as code</p>\n   * ```\n   *\n   * @param markdown - Markdown content with potential indented HTML\n   * @returns Normalized markdown with HTML indentation removed outside of fenced blocks\n   */\n  private normalizeHtmlIndentation(markdown: string): string {\n    const lines = markdown.split('\\n');\n    const result: string[] = [];\n    let inFencedBlock = false;\n\n    for (const line of lines) {\n      // Check for fenced code block start/end (``` or ~~~)\n      if (/^(`{3,}|~{3,})/.test(line.trim())) {\n        inFencedBlock = !inFencedBlock;\n        result.push(line);\n        continue;\n      }\n\n      // If inside a fenced block, preserve as-is\n      if (inFencedBlock) {\n        result.push(line);\n        continue;\n      }\n\n      // Outside fenced blocks: strip leading spaces from HTML tag lines\n      // This handles lines like \"    <p class=\"total\">...\" which would become code blocks\n      const stripped = line.replace(/^( {2,})(<[a-zA-Z!/])/, '$2');\n      result.push(stripped);\n    }\n\n    return result.join('\\n');\n  }\n\n  /**\n   * Perform validation using custom schema or frontmatter variables\n   */\n  // eslint-disable-next-line complexity\n  private performValidation(\n    data: Record<string, unknown>,\n    frontmatterVariables: TemplateVariableDefinition[] | undefined,\n    options?: TemplateValidationOptions\n  ): TemplateVariableValidationResult {\n    const skipFields = new Set(options?.skipFields ?? []);\n\n    // Priority 1: Custom schema with validate() method\n    if (options?.schema?.validate) {\n      return this.validateWithCustomValidator(data, options.schema.validate, skipFields);\n    }\n\n    // Priority 2: Zod-like schema with safeParse()\n    if (options?.schema?.safeParse) {\n      return this.validateWithSafeParse(data, options.schema.safeParse, skipFields);\n    }\n\n    // Priority 3: Zod-like schema with parse() - wrap in try/catch\n    if (options?.schema?.parse) {\n      return this.validateWithParse(data, options.schema.parse, skipFields);\n    }\n\n    // Priority 4: Use frontmatter variables + additional variables\n    const variables = this.mergeVariableDefinitions(\n      frontmatterVariables,\n      options?.additionalVariables,\n      skipFields\n    );\n    if (variables.length === 0) {\n      return { valid: true, errors: {}, coercedValues: data };\n    }\n\n    return this.validateDataAgainstSchema(data, variables);\n  }\n\n  /** Validate using custom validate() function */\n  private validateWithCustomValidator(\n    data: Record<string, unknown>,\n    validate: (data: Record<string, unknown>) => TemplateVariableValidationResult,\n    skipFields: Set<string>\n  ): TemplateVariableValidationResult {\n    const result = validate(data);\n    if (skipFields.size > 0) {\n      for (const field of skipFields) delete result.errors[field];\n      result.valid = Object.keys(result.errors).length === 0;\n    }\n    return result;\n  }\n\n  /** Validate using Zod safeParse() */\n  private validateWithSafeParse(\n    data: Record<string, unknown>,\n    safeParse: (data: unknown) => {\n      success: boolean;\n      data?: unknown;\n      error?: { issues?: Array<{ path: (string | number)[]; message: string }> };\n    },\n    skipFields: Set<string>\n  ): TemplateVariableValidationResult {\n    const zodResult = safeParse(data);\n    if (zodResult.success) {\n      return {\n        valid: true,\n        errors: {},\n        coercedValues: (zodResult.data as Record<string, unknown>) || data,\n      };\n    }\n    const errors = this.convertZodIssuesToErrors(zodResult.error?.issues, skipFields);\n    return { valid: Object.keys(errors).length === 0, errors, coercedValues: data };\n  }\n\n  /** Validate using Zod parse() with try/catch */\n  private validateWithParse(\n    data: Record<string, unknown>,\n    parse: (data: unknown) => unknown,\n    skipFields: Set<string>\n  ): TemplateVariableValidationResult {\n    try {\n      const parsedData = parse(data);\n      return {\n        valid: true,\n        errors: {},\n        coercedValues: (parsedData as Record<string, unknown>) || data,\n      };\n    } catch (err: unknown) {\n      const error = err as { issues?: Array<{ path: (string | number)[]; message: string }> };\n      if (error.issues) {\n        const errors = this.convertZodIssuesToErrors(error.issues, skipFields);\n        return { valid: false, errors, coercedValues: data };\n      }\n      return {\n        valid: false,\n        errors: { _schema: [(err as Error).message || 'Validation failed'] },\n        coercedValues: data,\n      };\n    }\n  }\n\n  /** Convert Zod issues to error record */\n  private convertZodIssuesToErrors(\n    issues: Array<{ path: (string | number)[]; message: string }> | undefined,\n    skipFields: Set<string>\n  ): Record<string, string[]> {\n    const errors: Record<string, string[]> = {};\n    if (!issues) return errors;\n    for (const issue of issues) {\n      const fieldName = issue.path.join('.');\n      if (skipFields.has(fieldName)) continue;\n      if (!errors[fieldName]) errors[fieldName] = [];\n      errors[fieldName].push(issue.message);\n    }\n    return errors;\n  }\n\n  /** Merge frontmatter and additional variables */\n  private mergeVariableDefinitions(\n    frontmatterVariables: TemplateVariableDefinition[] | undefined,\n    additionalVariables: TemplateVariableDefinition[] | undefined,\n    skipFields: Set<string>\n  ): TemplateVariableDefinition[] {\n    let variables: TemplateVariableDefinition[] = frontmatterVariables\n      ? [...frontmatterVariables]\n      : [];\n\n    if (additionalVariables && additionalVariables.length > 0) {\n      const existingNames = new Set(variables.map(v => v.name));\n      for (const addVar of additionalVariables) {\n        const idx = existingNames.has(addVar.name)\n          ? variables.findIndex(v => v.name === addVar.name)\n          : -1;\n        if (idx >= 0) variables[idx] = addVar;\n        else variables.push(addVar);\n      }\n    }\n\n    if (skipFields.size > 0) {\n      variables = variables.filter(v => !skipFields.has(v.name));\n    }\n    return variables;\n  }\n\n  /**\n   * Validate template data against variable schema defined in frontmatter\n   *\n   * @param templateId - Template identifier\n   * @param data - Data to validate\n   * @param locale - Locale (optional)\n   * @returns Validation result with errors and coerced values\n   *\n   * @example\n   * ```typescript\n   * const result = await engine.validateData('invoices/standard-invoice', {\n   *   invoiceNumber: 'INV-001',\n   *   taxRate: '10', // will be coerced to number\n   * });\n   *\n   * if (!result.valid) {\n   *   console.log('Errors:', result.errors);\n   * }\n   * ```\n   */\n  async validateData(\n    templateId: string,\n    data: Record<string, unknown>,\n    locale?: string\n  ): Promise<TemplateVariableValidationResult> {\n    const resolvedLocale = locale ?? this.defaultLocale;\n\n    // Load template to get variable schema from frontmatter\n    const templateEntry = await this.loadTemplate(templateId, resolvedLocale);\n    const variables = templateEntry.frontmatter.variables;\n\n    // If no schema defined, validation passes (schema is optional)\n    if (!variables || variables.length === 0) {\n      return { valid: true, errors: {}, coercedValues: data };\n    }\n\n    return this.validateDataAgainstSchema(data, variables);\n  }\n\n  /**\n   * Validate data against a variable schema\n   *\n   * @param data - Data to validate\n   * @param variables - Variable definitions\n   * @returns Validation result\n   */\n  // eslint-disable-next-line complexity\n  validateDataAgainstSchema(\n    data: Record<string, unknown>,\n    variables: TemplateVariableDefinition[]\n  ): TemplateVariableValidationResult {\n    const errors: Record<string, string[]> = {};\n    const warnings: Record<string, string[]> = {};\n    const coercedValues: Record<string, unknown> = { ...data };\n\n    for (const varDef of variables) {\n      const value = data[varDef.name];\n      const varErrors: string[] = [];\n      const varWarnings: string[] = [];\n\n      // Check required\n      if (varDef.validation?.required && (value === undefined || value === null || value === '')) {\n        varErrors.push(`${varDef.label ?? varDef.name} is required`);\n      }\n\n      // Skip further validation if value is empty and not required\n      if (value === undefined || value === null || value === '') {\n        if (varErrors.length > 0) errors[varDef.name] = varErrors;\n        continue;\n      }\n\n      // Type-specific validation and coercion\n      const { coercedValue, typeErrors, typeWarnings } = this.validateAndCoerceType(varDef, value);\n\n      varErrors.push(...typeErrors);\n      varWarnings.push(...typeWarnings);\n\n      // Store coerced value\n      coercedValues[varDef.name] = coercedValue;\n\n      // Apply validation rules\n      if (varDef.validation) {\n        const validationErrors = this.applyValidationRules(varDef, coercedValue);\n        varErrors.push(...validationErrors);\n      }\n\n      if (varErrors.length > 0) errors[varDef.name] = varErrors;\n      if (varWarnings.length > 0) warnings[varDef.name] = varWarnings;\n    }\n\n    return {\n      valid: Object.keys(errors).length === 0,\n      errors,\n      warnings: Object.keys(warnings).length > 0 ? warnings : undefined,\n      coercedValues,\n    };\n  }\n\n  /**\n   * Validate and coerce value to expected type based on variable definition\n   *\n   * @param varDef - Variable definition with type and validation rules\n   * @param value - Value to validate and coerce\n   * @returns Coercion result with coerced value, errors, and warnings\n   * @internal\n   */\n  private validateAndCoerceType(\n    varDef: TemplateVariableDefinition,\n    value: unknown\n  ): StorageTemplateTypeCoercionResult {\n    const label = varDef.label ?? varDef.name;\n    const typeCoercers: Record<string, () => StorageTemplateTypeCoercionResult> = {\n      [TEMPLATE_VARIABLE_TYPE.STRING]: () => this.coerceString(value),\n      [TEMPLATE_VARIABLE_TYPE.RICHTEXT]: () => this.coerceString(value),\n      [TEMPLATE_VARIABLE_TYPE.NUMBER]: () => this.coerceNumber(value, label),\n      [TEMPLATE_VARIABLE_TYPE.CURRENCY]: () => this.coerceNumber(value, label),\n      [TEMPLATE_VARIABLE_TYPE.PERCENTAGE]: () => this.coerceNumber(value, label),\n      [TEMPLATE_VARIABLE_TYPE.BOOLEAN]: () => this.coerceBoolean(value, label),\n      [TEMPLATE_VARIABLE_TYPE.DATE]: () => this.coerceDate(value, label),\n      [TEMPLATE_VARIABLE_TYPE.EMAIL]: () => this.coerceEmail(value, label),\n      [TEMPLATE_VARIABLE_TYPE.PHONE]: () => this.coercePhone(value, label),\n      [TEMPLATE_VARIABLE_TYPE.URL]: () => this.coerceUrl(value, label),\n      [TEMPLATE_VARIABLE_TYPE.ARRAY]: () => this.coerceArray(value, label),\n      [TEMPLATE_VARIABLE_TYPE.OBJECT]: () => this.coerceObject(value, label),\n      [TEMPLATE_VARIABLE_TYPE.SELECT]: () =>\n        this.coerceSelect(value, label, varDef.validation?.enum),\n      [TEMPLATE_VARIABLE_TYPE.MULTISELECT]: () =>\n        this.coerceMultiselect(value, label, varDef.validation?.enum),\n      [TEMPLATE_VARIABLE_TYPE.IMAGE]: () => this.coerceImage(value, label),\n    };\n\n    const coercer = typeCoercers[varDef.type];\n    if (coercer) return coercer();\n\n    return {\n      coercedValue: value,\n      typeErrors: [],\n      typeWarnings: [`Unknown type \"${varDef.type}\" for ${label}`],\n    };\n  }\n\n  /** @internal Coerce value to string */\n  private coerceString(value: unknown): StorageTemplateTypeCoercionResult {\n    return { coercedValue: String(value), typeErrors: [], typeWarnings: [] };\n  }\n\n  /** @internal Coerce value to number */\n  private coerceNumber(value: unknown, label: string): StorageTemplateTypeCoercionResult {\n    if (typeof value === 'string') {\n      const parsed = Number.parseFloat(value);\n      if (Number.isNaN(parsed))\n        return {\n          coercedValue: value,\n          typeErrors: [`${label} must be a valid number`],\n          typeWarnings: [],\n        };\n      return { coercedValue: parsed, typeErrors: [], typeWarnings: [] };\n    }\n    if (typeof value !== 'number')\n      return { coercedValue: value, typeErrors: [`${label} must be a number`], typeWarnings: [] };\n    return { coercedValue: value, typeErrors: [], typeWarnings: [] };\n  }\n\n  /** @internal Coerce value to boolean */\n  private coerceBoolean(value: unknown, label: string): StorageTemplateTypeCoercionResult {\n    if (typeof value === 'string')\n      return {\n        coercedValue: value.toLowerCase() === 'true' || value === '1',\n        typeErrors: [],\n        typeWarnings: [],\n      };\n    if (typeof value !== 'boolean')\n      return { coercedValue: value, typeErrors: [`${label} must be a boolean`], typeWarnings: [] };\n    return { coercedValue: value, typeErrors: [], typeWarnings: [] };\n  }\n\n  /** @internal Coerce value to Date */\n  private coerceDate(value: unknown, label: string): StorageTemplateTypeCoercionResult {\n    if (typeof value === 'string') {\n      const date = new Date(value);\n      if (Number.isNaN(date.getTime()))\n        return {\n          coercedValue: value,\n          typeErrors: [`${label} must be a valid date`],\n          typeWarnings: [],\n        };\n      return { coercedValue: date, typeErrors: [], typeWarnings: [] };\n    }\n    if (!(value instanceof Date))\n      return { coercedValue: value, typeErrors: [`${label} must be a date`], typeWarnings: [] };\n    return { coercedValue: value, typeErrors: [], typeWarnings: [] };\n  }\n\n  /** @internal Validate email format */\n  private coerceEmail(value: unknown, label: string): StorageTemplateTypeCoercionResult {\n    const str = String(value);\n    if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(str))\n      return {\n        coercedValue: str,\n        typeErrors: [`${label} must be a valid email address`],\n        typeWarnings: [],\n      };\n    return { coercedValue: str, typeErrors: [], typeWarnings: [] };\n  }\n\n  /** @internal Validate phone format */\n  private coercePhone(value: unknown, label: string): StorageTemplateTypeCoercionResult {\n    const str = String(value);\n    const valid = /^[+]?[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/.test(str);\n    return {\n      coercedValue: str,\n      typeErrors: [],\n      typeWarnings: valid ? [] : [`${label} may not be a valid phone number`],\n    };\n  }\n\n  /** @internal Validate URL format */\n  private coerceUrl(value: unknown, label: string): StorageTemplateTypeCoercionResult {\n    const str = String(value);\n    try {\n      new URL(str);\n      return { coercedValue: str, typeErrors: [], typeWarnings: [] };\n    } catch {\n      return { coercedValue: str, typeErrors: [`${label} must be a valid URL`], typeWarnings: [] };\n    }\n  }\n\n  /** @internal Validate array type */\n  private coerceArray(value: unknown, label: string): StorageTemplateTypeCoercionResult {\n    if (!Array.isArray(value))\n      return { coercedValue: value, typeErrors: [`${label} must be an array`], typeWarnings: [] };\n    return { coercedValue: value, typeErrors: [], typeWarnings: [] };\n  }\n\n  /** @internal Validate object type */\n  private coerceObject(value: unknown, label: string): StorageTemplateTypeCoercionResult {\n    if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n      return { coercedValue: value, typeErrors: [`${label} must be an object`], typeWarnings: [] };\n    }\n    return { coercedValue: value, typeErrors: [], typeWarnings: [] };\n  }\n\n  /** @internal Validate select value against enum */\n  private coerceSelect(\n    value: unknown,\n    label: string,\n    enumValues?: string[]\n  ): StorageTemplateTypeCoercionResult {\n    const str = String(value);\n    if (enumValues && !enumValues.includes(str)) {\n      return {\n        coercedValue: str,\n        typeErrors: [`${label} must be one of: ${enumValues.join(', ')}`],\n        typeWarnings: [],\n      };\n    }\n    return { coercedValue: str, typeErrors: [], typeWarnings: [] };\n  }\n\n  /** @internal Validate multiselect values against enum */\n  private coerceMultiselect(\n    value: unknown,\n    label: string,\n    enumValues?: string[]\n  ): StorageTemplateTypeCoercionResult {\n    if (!Array.isArray(value))\n      return {\n        coercedValue: value,\n        typeErrors: [`${label} must be an array of selections`],\n        typeWarnings: [],\n      };\n    if (enumValues) {\n      const invalid = (value as unknown[]).filter(v => !enumValues.includes(String(v)));\n      if (invalid.length > 0)\n        return {\n          coercedValue: value,\n          typeErrors: [`${label} contains invalid values: ${invalid.join(', ')}`],\n          typeWarnings: [],\n        };\n    }\n    return { coercedValue: value, typeErrors: [], typeWarnings: [] };\n  }\n\n  /** @internal Validate image URL or base64 */\n  private coerceImage(value: unknown, label: string): StorageTemplateTypeCoercionResult {\n    const str = String(value);\n    const valid = str.startsWith('http') || str.startsWith('data:image/');\n    return {\n      coercedValue: str,\n      typeErrors: [],\n      typeWarnings: valid ? [] : [`${label} should be a URL or base64 encoded image`],\n    };\n  }\n\n  /**\n   * Apply validation rules to a value\n   */\n  private applyValidationRules(varDef: TemplateVariableDefinition, value: unknown): string[] {\n    if (!varDef.validation) return [];\n    const label = varDef.label ?? varDef.name;\n    const errors: string[] = [];\n\n    if (typeof value === 'string')\n      errors.push(...this.validateString(value, varDef.validation, label));\n    if (typeof value === 'number')\n      errors.push(...this.validateNumber(value, varDef.validation, label));\n    if (value instanceof Date) errors.push(...this.validateDate(value, varDef.validation, label));\n    if (Array.isArray(value)) errors.push(...this.validateArray(value, varDef.validation, label));\n\n    return errors;\n  }\n\n  private validateString(\n    value: string,\n    validation: NonNullable<TemplateVariableDefinition['validation']>,\n    label: string\n  ): string[] {\n    const errors: string[] = [];\n    if (validation.minLength !== undefined && value.length < validation.minLength) {\n      errors.push(`${label} must be at least ${validation.minLength} characters`);\n    }\n    if (validation.maxLength !== undefined && value.length > validation.maxLength) {\n      errors.push(`${label} must be at most ${validation.maxLength} characters`);\n    }\n    if (validation.pattern && !new RegExp(validation.pattern).test(value)) {\n      errors.push(validation.patternMessage ?? `${label} format is invalid`);\n    }\n    return errors;\n  }\n\n  private validateNumber(\n    value: number,\n    validation: NonNullable<TemplateVariableDefinition['validation']>,\n    label: string\n  ): string[] {\n    const errors: string[] = [];\n    if (validation.min !== undefined && value < validation.min)\n      errors.push(`${label} must be at least ${validation.min}`);\n    if (validation.max !== undefined && value > validation.max)\n      errors.push(`${label} must be at most ${validation.max}`);\n    return errors;\n  }\n\n  private validateDate(\n    value: Date,\n    validation: NonNullable<TemplateVariableDefinition['validation']>,\n    label: string\n  ): string[] {\n    const errors: string[] = [];\n    if (validation.minDate && value < new Date(validation.minDate))\n      errors.push(`${label} must be on or after ${validation.minDate}`);\n    if (validation.maxDate && value > new Date(validation.maxDate))\n      errors.push(`${label} must be on or before ${validation.maxDate}`);\n    return errors;\n  }\n\n  private validateArray(\n    value: unknown[],\n    validation: NonNullable<TemplateVariableDefinition['validation']>,\n    label: string\n  ): string[] {\n    const errors: string[] = [];\n    if (validation.min !== undefined && value.length < validation.min)\n      errors.push(`${label} must have at least ${validation.min} items`);\n    if (validation.max !== undefined && value.length > validation.max)\n      errors.push(`${label} must have at most ${validation.max} items`);\n    return errors;\n  }\n\n  /**\n   * Render with validation - validates data before rendering\n   *\n   * @param templateId - Template identifier\n   * @param data - Template data\n   * @param locale - Locale\n   * @param options - Options including strict mode\n   * @returns Rendered result\n   * @throws StoragePackageError if validation fails in strict mode\n   *\n   * @example\n   * ```typescript\n   * // Strict mode - throws if validation fails\n   * const result = await engine.renderWithValidation(\n   *   'invoices/standard-invoice',\n   *   data,\n   *   'en',\n   *   { strict: true }\n   * );\n   *\n   * // Non-strict mode - renders with warnings but uses coerced values\n   * const result = await engine.renderWithValidation(\n   *   'invoices/standard-invoice',\n   *   data,\n   *   'en',\n   *   { strict: false }\n   * );\n   * ```\n   */\n  async renderWithValidation(\n    templateId: string,\n    data: Record<string, unknown>,\n    locale?: string,\n    options?: { strict?: boolean }\n  ): Promise<\n    StorageTemplateRenderResult & { validationResult?: TemplateVariableValidationResult }\n  > {\n    const validationResult = await this.validateData(templateId, data, locale);\n\n    if (!validationResult.valid && options?.strict) {\n      throw new StoragePackageError(\n        'Template data validation failed',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        {\n          context: {\n            templateId,\n            validationErrors: validationResult.errors,\n          },\n        }\n      );\n    }\n\n    // Use coerced values for rendering (with proper type conversions applied)\n    const renderData = validationResult.coercedValues ?? data;\n    const renderResult = await this.render(templateId, renderData, locale);\n\n    return {\n      ...renderResult,\n      validationResult,\n    };\n  }\n}\n","/**\n * FileSystemTemplateService\n *\n * Loads template files from the filesystem.\n * Matches the pattern from @plyaz/notifications/templates/FileSystemTranslationService\n *\n * Template Path Format: {locale}/{category}/{templateId}.md\n * Example: en/invoices/standard-invoice.md\n */\n\nimport { readFile, access } from 'fs/promises';\nimport { join } from 'path';\nimport type { TemplateService } from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../errors';\nimport type { LoggerInterface, StorageFileSystemTemplateServiceConfig } from '@plyaz/types';\n\n/**\n * FileSystemTemplateService\n *\n * Loads markdown templates from filesystem with frontmatter\n * Used for PDF generation (invoices, tax documents, receipts, etc.)\n *\n * @example\n * ```typescript\n * const templateService = new FileSystemTemplateService({\n *   basePath: join(__dirname, '../templates'),\n *   logger: myLogger\n * });\n *\n * const template = await templateService.getTemplate('en/invoices/standard-invoice.md');\n * ```\n */\nexport class FileSystemTemplateService implements TemplateService {\n  private readonly basePath: string;\n  private readonly logger?: LoggerInterface;\n\n  constructor(config?: StorageFileSystemTemplateServiceConfig) {\n    // Default to templates directory within current working directory\n    this.basePath = config?.basePath ?? join(process.cwd(), 'templates');\n    this.logger = config?.logger;\n\n    this.logger?.info('[FileSystemTemplateService] Initialized', {\n      basePath: this.basePath,\n    });\n  }\n\n  /**\n   * Get template content by path\n   *\n   * @param path - Template path (locale/category/templateId.md)\n   * @returns Template content (markdown with frontmatter)\n   * @throws StoragePackageError if template not found\n   *\n   * @example\n   * ```typescript\n   * const content = await service.getTemplate('en/invoices/standard-invoice.md');\n   * ```\n   */\n  async getTemplate(path: string): Promise<string> {\n    // Construct full path: basePath + locale/category/template.md\n    const fullPath = join(this.basePath, path);\n\n    this.logger?.debug('[FileSystemTemplateService] Loading template', {\n      path,\n      fullPath,\n    });\n\n    try {\n      const content = await readFile(fullPath, 'utf-8');\n\n      this.logger?.debug('[FileSystemTemplateService] Template loaded successfully', {\n        path,\n        size: content.length,\n      });\n\n      return content; // Returns raw markdown with frontmatter\n    } catch (error) {\n      this.logger?.error('[FileSystemTemplateService] Template not found', {\n        path,\n        fullPath,\n        error,\n      });\n\n      throw new StoragePackageError(\n        `Template not found: ${path}`,\n        STORAGE_ERROR_CODES.TEMPLATE_NOT_FOUND,\n        { cause: error instanceof Error ? error : undefined, context: { path, fullPath } }\n      );\n    }\n  }\n\n  /**\n   * Check if template exists\n   *\n   * @param path - Template path\n   * @returns true if template exists\n   *\n   * @example\n   * ```typescript\n   * const exists = await service.hasTemplate('en/invoices/standard-invoice.md');\n   * ```\n   */\n  async hasTemplate(path: string): Promise<boolean> {\n    // Check if template exists without throwing error\n    try {\n      const fullPath = join(this.basePath, path);\n      await access(fullPath);\n\n      this.logger?.debug('[FileSystemTemplateService] Template exists', { path });\n      return true;\n    } catch {\n      this.logger?.debug('[FileSystemTemplateService] Template does not exist', { path });\n      return false;\n    }\n  }\n\n  /**\n   * Get base path for templates\n   */\n  getBasePath(): string {\n    return this.basePath;\n  }\n}\n","/**\n * RendererRegistry\n *\n * Manages renderer adapters (similar to AdapterRegistry for storage).\n * Config-driven system for registering and selecting renderers.\n *\n * Features:\n * - Register multiple renderers\n * - Select renderer by format and priority\n * - Health checks\n * - Failover support\n * - Enable/disable renderers dynamically\n */\n\nimport type {\n  OUTPUT_FORMAT,\n  ADAPTER_HEALTH_STATUS,\n  StorageRendererRegistryConfig,\n} from '@plyaz/types/storage';\nimport type { LoggerInterface } from '@plyaz/types';\nimport type { BaseRendererAdapter } from '../base/BaseRendererAdapter';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types';\nimport { StoragePackageError } from '@plyaz/errors';\n\n/**\n * RendererRegistry constants\n */\nconst RENDERER_REGISTRY_CONSTANTS = {\n  HEALTH_STATUS_PRIORITY: {\n    healthy: 4,\n    degraded: 3,\n    unhealthy: 2,\n    unknown: 1,\n  },\n} as const;\n\n/**\n * RendererRegistry\n *\n * Central registry for managing renderer adapters.\n *\n * @example\n * ```typescript\n * const registry = new RendererRegistry({ logger: myLogger });\n *\n * // Register renderers\n * registry.register(puppeteerRenderer);\n * registry.register(pdfkitRenderer);\n *\n * // Get renderer for PDF format\n * const renderer = registry.getRenderer(OUTPUT_FORMAT.PDF);\n *\n * // Render\n * const result = await renderer.render(options);\n * ```\n */\nexport class RendererRegistry {\n  private readonly renderers: Map<string, BaseRendererAdapter> = new Map();\n  private readonly logger?: LoggerInterface;\n  private healthCheckInterval?: globalThis.NodeJS.Timeout;\n\n  constructor(config?: StorageRendererRegistryConfig) {\n    this.logger = config?.logger;\n\n    // Setup auto health checks\n    if (config?.healthCheckInterval && config.healthCheckInterval > 0) {\n      this.setupHealthChecks(config.healthCheckInterval);\n    }\n\n    this.logger?.info('[RendererRegistry] Initialized', {\n      healthCheckInterval: config?.healthCheckInterval,\n    });\n  }\n\n  /**\n   * Register a renderer adapter\n   *\n   * @param renderer - Renderer adapter to register\n   */\n  register(renderer: BaseRendererAdapter): void {\n    if (this.renderers.has(renderer.name)) {\n      this.logger?.warn(`[RendererRegistry] Renderer already registered: ${renderer.name}`);\n      return;\n    }\n\n    this.renderers.set(renderer.name, renderer);\n\n    this.logger?.info(`[RendererRegistry] Renderer registered`, {\n      name: renderer.name,\n      type: renderer.type,\n      priority: renderer.priority,\n      supportedFormats: renderer.supportedFormats,\n    });\n  }\n\n  /**\n   * Unregister a renderer\n   *\n   * @param name - Renderer name\n   */\n  unregister(name: string): void {\n    const renderer = this.renderers.get(name);\n\n    if (renderer) {\n      this.renderers.delete(name);\n      this.logger?.info(`[RendererRegistry] Renderer unregistered: ${name}`);\n    }\n  }\n\n  /**\n   * Get renderer by name\n   *\n   * @param name - Renderer name\n   * @returns Renderer adapter\n   * @throws StoragePackageError if not found\n   */\n  getRendererByName(name: string): BaseRendererAdapter {\n    const renderer = this.renderers.get(name);\n\n    if (!renderer) {\n      throw new StoragePackageError(\n        `Renderer not found: ${name}`,\n        STORAGE_ERROR_CODES.ADAPTER_NOT_FOUND,\n        { context: { rendererName: name } }\n      );\n    }\n\n    return renderer;\n  }\n\n  /**\n   * Get best renderer for output format\n   *\n   * Selects based on:\n   * 1. Format support\n   * 2. Enabled status\n   * 3. Priority (highest first)\n   * 4. Health status (prefer healthy)\n   *\n   * @param format - Desired output format\n   * @returns Renderer adapter\n   * @throws StoragePackageError if no suitable renderer found\n   */\n  getRenderer(format: OUTPUT_FORMAT): BaseRendererAdapter {\n    // Get all renderers that support this format\n    const candidates = Array.from(this.renderers.values()).filter(\n      renderer => renderer.enabled && renderer.supportsFormat(format)\n    );\n\n    if (candidates.length === 0) {\n      throw new StoragePackageError(\n        `No renderer available for format: ${format}`,\n        STORAGE_ERROR_CODES.ADAPTER_NOT_FOUND,\n        {\n          context: {\n            format,\n            registeredRenderers: Array.from(this.renderers.keys()),\n          },\n        }\n      );\n    }\n\n    // Sort by priority (highest first), then by health status\n    candidates.sort((a, b) => {\n      // Priority first\n      if (a.priority !== b.priority) {\n        return b.priority - a.priority;\n      }\n\n      // Health status second (healthy > degraded > unhealthy > unknown)\n      const aHealth = RENDERER_REGISTRY_CONSTANTS.HEALTH_STATUS_PRIORITY[a.getHealthStatus()] ?? 0;\n      const bHealth = RENDERER_REGISTRY_CONSTANTS.HEALTH_STATUS_PRIORITY[b.getHealthStatus()] ?? 0;\n\n      return bHealth - aHealth;\n    });\n\n    const selectedRenderer = candidates[0];\n\n    this.logger?.debug(`[RendererRegistry] Selected renderer`, {\n      name: selectedRenderer.name,\n      format,\n      priority: selectedRenderer.priority,\n      healthStatus: selectedRenderer.getHealthStatus(),\n    });\n\n    return selectedRenderer;\n  }\n\n  /**\n   * Get fallback renderer (skip specific renderer)\n   *\n   * @param format - Output format\n   * @param skipRendererName - Renderer to skip\n   * @returns Fallback renderer\n   * @throws StoragePackageError if no fallback found\n   */\n  getFallbackRenderer(format: OUTPUT_FORMAT, skipRendererName: string): BaseRendererAdapter {\n    const candidates = Array.from(this.renderers.values()).filter(\n      renderer =>\n        renderer.enabled && renderer.supportsFormat(format) && renderer.name !== skipRendererName\n    );\n\n    if (candidates.length === 0) {\n      throw new StoragePackageError(\n        `No fallback renderer available for format: ${format}`,\n        STORAGE_ERROR_CODES.ALL_ADAPTERS_FAILED,\n        {\n          context: {\n            format,\n            skippedRenderer: skipRendererName,\n          },\n        }\n      );\n    }\n\n    // Sort by priority\n    candidates.sort((a, b) => b.priority - a.priority);\n\n    const fallback = candidates[0];\n\n    this.logger?.info(`[RendererRegistry] Using fallback renderer`, {\n      name: fallback.name,\n      format,\n      skipped: skipRendererName,\n    });\n\n    return fallback;\n  }\n\n  /**\n   * Get all registered renderers\n   */\n  getAllRenderers(): BaseRendererAdapter[] {\n    return Array.from(this.renderers.values());\n  }\n\n  /**\n   * Get renderers by format\n   *\n   * @param format - Output format\n   * @returns Array of renderers supporting this format\n   */\n  getRenderersByFormat(format: OUTPUT_FORMAT): BaseRendererAdapter[] {\n    return Array.from(this.renderers.values()).filter(\n      renderer => renderer.enabled && renderer.supportsFormat(format)\n    );\n  }\n\n  /**\n   * Check health of all renderers\n   */\n  async checkAllRenderersHealth(): Promise<void> {\n    this.logger?.debug('[RendererRegistry] Running health checks for all renderers');\n\n    const healthChecks = Array.from(this.renderers.values()).map(async renderer => {\n      try {\n        await renderer.checkHealth();\n      } catch (error) {\n        this.logger?.error(`[RendererRegistry] Health check failed for ${renderer.name}`, {\n          error,\n        });\n      }\n    });\n\n    await Promise.all(healthChecks);\n  }\n\n  /**\n   * Get health summary for all renderers\n   */\n  getHealthSummary(): {\n    totalRenderers: number;\n    healthy: number;\n    degraded: number;\n    unhealthy: number;\n    unknown: number;\n    renderers: Array<{\n      name: string;\n      type: string;\n      status: ADAPTER_HEALTH_STATUS;\n      lastCheck?: Date;\n    }>;\n  } {\n    const renderers = Array.from(this.renderers.values());\n\n    const summary = {\n      totalRenderers: renderers.length,\n      healthy: 0,\n      degraded: 0,\n      unhealthy: 0,\n      unknown: 0,\n      renderers: renderers.map(renderer => {\n        const status = renderer.getHealthStatus();\n\n        // Count by status\n        if (status === 'healthy') this.logger && summary.healthy++;\n        else if (status === 'degraded') this.logger && summary.degraded++;\n        else if (status === 'unhealthy') this.logger && summary.unhealthy++;\n        else this.logger && summary.unknown++;\n\n        return {\n          name: renderer.name,\n          type: renderer.type,\n          status,\n          lastCheck: renderer.getLastHealthCheck(),\n        };\n      }),\n    };\n\n    // Recalculate counts properly\n    summary.healthy = renderers.filter(r => r.getHealthStatus() === 'healthy').length;\n    summary.degraded = renderers.filter(r => r.getHealthStatus() === 'degraded').length;\n    summary.unhealthy = renderers.filter(r => r.getHealthStatus() === 'unhealthy').length;\n    summary.unknown = renderers.filter(r => r.getHealthStatus() === 'unknown').length;\n\n    return summary;\n  }\n\n  /**\n   * Setup automatic health checks\n   * @private\n   */\n  private setupHealthChecks(interval: number): void {\n    this.healthCheckInterval = setInterval(() => {\n      void this.checkAllRenderersHealth();\n    }, interval);\n\n    this.logger?.debug('[RendererRegistry] Health check interval setup', { interval });\n  }\n\n  /**\n   * Cleanup resources\n   */\n  async destroy(): Promise<void> {\n    // Clear health check interval\n    if (this.healthCheckInterval) {\n      clearInterval(this.healthCheckInterval);\n      this.healthCheckInterval = undefined;\n    }\n\n    // Destroy all renderers\n    const destroyPromises = Array.from(this.renderers.values()).map(renderer => renderer.destroy());\n\n    await Promise.all(destroyPromises);\n\n    this.renderers.clear();\n\n    this.logger?.info('[RendererRegistry] Destroyed');\n  }\n}\n","/**\n * BaseRendererAdapter\n *\n * Abstract base class for all renderer adapters.\n * Similar to BaseStorageAdapter but for document/template rendering.\n *\n * Each renderer adapter converts templates/content to various output formats:\n * - HTML → PDF (Puppeteer, Playwright)\n * - HTML → Image (Puppeteer, Playwright)\n * - Data → Excel (ExcelJS)\n * - Data → Word (DocxTemplater)\n * - Direct PDF generation (PDFKit)\n *\n * Config-driven design: All behavior controlled via configuration.\n */\n\nimport type {\n  StorageRendererAdapterConfig,\n  StorageRenderOptions,\n  StorageRenderResult,\n  StorageRendererHealthCheck,\n  STORAGE_RENDERER_TYPE,\n  OUTPUT_FORMAT,\n  ADAPTER_HEALTH_STATUS,\n} from '@plyaz/types/storage';\nimport type { StorageLogger } from '../../core/logger';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types';\nimport { StoragePackageError } from '@plyaz/errors';\n\n/**\n * Constants for renderer adapter\n */\nconst RENDERER_CONSTANTS = {\n  DEFAULT_PRIORITY: 100,\n} as const;\n\n/**\n * BaseRendererAdapter\n *\n * Abstract base class that all renderer adapters must extend.\n *\n * @example\n * ```typescript\n * class PuppeteerRenderer extends BaseRendererAdapter {\n *   constructor(config: StorageRendererAdapterConfig) {\n *     super(config);\n *   }\n *\n *   async render(options: StorageRenderOptions): Promise<StorageRenderResult> {\n *     // Puppeteer-specific rendering logic\n *   }\n *\n *   async checkHealth(): Promise<StorageRendererHealthCheck> {\n *     // Health check logic\n *   }\n * }\n * ```\n */\nexport abstract class BaseRendererAdapter {\n  /** Renderer name (unique identifier) */\n  public readonly name: string;\n\n  /** Renderer type */\n  public readonly type: STORAGE_RENDERER_TYPE;\n\n  /** Whether this renderer is enabled */\n  public readonly enabled: boolean;\n\n  /** Priority (higher = preferred) */\n  public readonly priority: number;\n\n  /** Supported output formats */\n  public readonly supportedFormats: OUTPUT_FORMAT[];\n\n  /** Logger instance */\n  protected readonly logger?: StorageLogger;\n\n  /** Custom configuration */\n  protected readonly config: Record<string, unknown>;\n\n  /** Health status cache */\n  private healthStatus: ADAPTER_HEALTH_STATUS = 'unknown' as ADAPTER_HEALTH_STATUS;\n  private lastHealthCheck?: Date;\n\n  constructor(config: StorageRendererAdapterConfig) {\n    this.name = config.name;\n    this.type = config.type as STORAGE_RENDERER_TYPE;\n    this.enabled = config.enabled ?? true;\n    this.priority = config.priority ?? RENDERER_CONSTANTS.DEFAULT_PRIORITY;\n    this.supportedFormats = (config.supportedFormats ?? []) as OUTPUT_FORMAT[];\n    this.logger = config.logger as StorageLogger | undefined;\n    this.config = config.config ?? {};\n\n    this.logger?.info(`[${this.name}] Renderer adapter initialized`, {\n      type: this.type,\n      enabled: this.enabled,\n      priority: this.priority,\n      supportedFormats: this.supportedFormats,\n    });\n  }\n\n  /**\n   * Render content to specified output format\n   *\n   * @param options - Render options\n   * @returns Rendered result with Buffer\n   *\n   * **Must be implemented by subclasses**\n   */\n  abstract render(options: StorageRenderOptions): Promise<StorageRenderResult>;\n\n  /**\n   * Check renderer health\n   *\n   * @returns Health check result\n   *\n   * **Must be implemented by subclasses**\n   */\n  abstract checkHealth(): Promise<StorageRendererHealthCheck>;\n\n  /**\n   * Cleanup resources (close browser, cleanup temp files, etc.)\n   *\n   * Optional - implement if renderer needs cleanup\n   */\n  async destroy(): Promise<void> {\n    this.logger?.debug(`[${this.name}] Destroying renderer`);\n  }\n\n  /**\n   * Check if renderer supports a specific output format\n   *\n   * @param format - Output format to check\n   * @returns true if supported\n   */\n  supportsFormat(format: OUTPUT_FORMAT): boolean {\n    return this.supportedFormats.includes(format);\n  }\n\n  /**\n   * Validate render options before processing\n   *\n   * @param options - Render options\n   * @throws StoragePackageError if validation fails\n   */\n  protected validateOptions(options: StorageRenderOptions): void {\n    // Check if format is supported\n    if (!this.supportsFormat(options.format as OUTPUT_FORMAT)) {\n      throw new StoragePackageError(\n        `Renderer ${this.name} does not support format: ${options.format}`,\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n        {\n          context: {\n            renderer: this.name,\n            requestedFormat: options.format,\n            supportedFormats: this.supportedFormats,\n          },\n        }\n      );\n    }\n\n    // Check if renderer is enabled\n    if (!this.enabled) {\n      throw new StoragePackageError(\n        `Renderer ${this.name} is disabled`,\n        STORAGE_ERROR_CODES.ADAPTER_UNAVAILABLE,\n        {\n          context: { renderer: this.name },\n        }\n      );\n    }\n  }\n\n  /**\n   * Get cached health status\n   */\n  getHealthStatus(): ADAPTER_HEALTH_STATUS {\n    return this.healthStatus;\n  }\n\n  /**\n   * Get last health check time\n   */\n  getLastHealthCheck(): Date | undefined {\n    return this.lastHealthCheck;\n  }\n\n  /**\n   * Update health status cache\n   *\n   * @protected\n   */\n  protected updateHealthStatus(status: ADAPTER_HEALTH_STATUS): void {\n    this.healthStatus = status;\n    this.lastHealthCheck = new Date();\n  }\n\n  /**\n   * Get renderer info for debugging\n   */\n  getInfo(): {\n    name: string;\n    type: STORAGE_RENDERER_TYPE;\n    enabled: boolean;\n    priority: number;\n    supportedFormats: OUTPUT_FORMAT[];\n    healthStatus: ADAPTER_HEALTH_STATUS;\n    lastHealthCheck?: Date;\n  } {\n    return {\n      name: this.name,\n      type: this.type,\n      enabled: this.enabled,\n      priority: this.priority,\n      supportedFormats: this.supportedFormats,\n      healthStatus: this.healthStatus,\n      lastHealthCheck: this.lastHealthCheck,\n    };\n  }\n\n  /**\n   * Get MIME type for output format\n   *\n   * @param format - Output format\n   * @returns MIME type\n   */\n  protected getMimeType(format: OUTPUT_FORMAT): string {\n    const mimeTypes: Record<OUTPUT_FORMAT, string> = {\n      pdf: 'application/pdf',\n      html: 'text/html',\n      png: 'image/png',\n      jpeg: 'image/jpeg',\n      excel: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n      word: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n      csv: 'text/csv',\n      json: 'application/json',\n    };\n\n    return mimeTypes[format] ?? 'application/octet-stream';\n  }\n}\n","/**\n * PDFKitRenderer\n *\n * Lightweight PDF renderer using PDFKit.\n * Direct PDF generation without HTML/CSS - programmatic API.\n *\n * **Supported Formats**: PDF only\n *\n * **Pros**:\n * - Very lightweight (~few MB vs ~200MB for Puppeteer)\n * - Fast\n * - No browser dependency\n * - Pure Node.js\n * - Good for programmatic PDFs\n *\n * **Cons**:\n * - No HTML/CSS support\n * - Manual layout required\n * - Limited text rendering\n * - Not suitable for complex documents\n *\n * **Best For**:\n * - Simple receipts\n * - Certificates\n * - Basic invoices\n * - Programmatically generated PDFs\n * - Server environments without browser\n */\n\nimport PDFDocument from 'pdfkit';\nimport {\n  type StorageRenderOptions,\n  type StorageRenderResult,\n  type StorageRendererHealthCheck,\n  type PDFRenderOptions,\n  ADAPTER_HEALTH_STATUS,\n  OUTPUT_FORMAT,\n} from '@plyaz/types/storage';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types';\nimport { BaseRendererAdapter } from '../base/BaseRendererAdapter';\nimport { StoragePackageError } from '@plyaz/errors';\n\nimport type { StoragePDFKitRendererConfig, StoragePDFKitDocumentData } from '@plyaz/types/storage';\n\n/**\n * PDFKit constants\n */\nconst PDFKIT_CONSTANTS = {\n  DEFAULT_MARGIN: 50,\n  DEFAULT_HEADING_FONT_SIZE: 18,\n  DEFAULT_TEXT_FONT_SIZE: 12,\n  DEFAULT_FOOTER_FONT_SIZE: 10,\n  SEPARATOR_START_X: 50,\n  SEPARATOR_END_X: 550,\n  MOVE_DOWN_HALF: 0.5,\n  MM_TO_POINTS: 2.834645,\n  INCHES_TO_POINTS: 72,\n} as const;\n\n/**\n * PDFKitRenderer Adapter\n *\n * Lightweight PDF generation without browser dependency.\n *\n * @example\n * ```typescript\n * const renderer = new PDFKitRenderer({\n *   name: 'pdfkit-main',\n *   type: STORAGE_RENDERER_TYPE.PDFKIT,\n *   enabled: true,\n *   priority: 50,\n *   supportedFormats: [OUTPUT_FORMAT.PDF],\n * });\n *\n * const result = await renderer.render({\n *   format: OUTPUT_FORMAT.PDF,\n *   data: {\n *     title: 'Invoice',\n *     content: [\n *       { type: 'heading', data: 'Invoice #12345', options: { fontSize: 24 } },\n *       { type: 'text', data: 'Amount: $100.00', options: {} }\n *     ]\n *   }\n * });\n * ```\n */\nexport class PDFKitRenderer extends BaseRendererAdapter {\n  private readonly defaultOptions: Record<string, unknown>;\n\n  constructor(config: StoragePDFKitRendererConfig) {\n    super(config);\n\n    this.defaultOptions = config.config?.defaultOptions ?? {\n      size: 'A4',\n      margin: PDFKIT_CONSTANTS.DEFAULT_MARGIN,\n      bufferPages: true,\n    };\n  }\n\n  /**\n   * Render content\n   */\n  async render(options: StorageRenderOptions): Promise<StorageRenderResult> {\n    this.validateOptions(options);\n\n    const startTime = Date.now();\n\n    this.logger?.debug(`[${this.name}] Starting PDF generation`);\n\n    try {\n      const documentData = this.getDocumentData(options);\n      const pdfOptions = this.getPDFOptions(options.pdfOptions);\n\n      const content = await this.generatePDF(documentData, pdfOptions);\n\n      const result: StorageRenderResult = {\n        content,\n        format: options.format,\n        mimeType: this.getMimeType(OUTPUT_FORMAT.PDF),\n        size: content.length,\n        metadata: {\n          renderer: this.name,\n          duration: Date.now() - startTime,\n        },\n      };\n\n      this.logger?.info(`[${this.name}] PDF generated`, {\n        size: content.length,\n        duration: Date.now() - startTime,\n      });\n\n      return result;\n    } catch (error) {\n      this.logger?.error(`[${this.name}] PDF generation failed`, { error });\n\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n\n      throw new StoragePackageError(\n        `PDFKit render failed: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PDF_GENERATION_FAILED,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: { renderer: this.name },\n        }\n      );\n    }\n  }\n\n  /**\n   * Generate PDF using PDFKit\n   * @private\n   */\n  private async generatePDF(\n    documentData: StoragePDFKitDocumentData,\n    pdfOptions: Record<string, unknown>\n  ): Promise<Buffer> {\n    return new Promise((resolve, reject) => {\n      try {\n        const doc = new PDFDocument(pdfOptions);\n        const buffers: Buffer[] = [];\n\n        // Collect PDF chunks\n        doc.on('data', (chunk: Buffer) => buffers.push(chunk));\n        doc.on('end', () => resolve(Buffer.concat(buffers)));\n        doc.on('error', reject);\n\n        // Set metadata\n        if (documentData.metadata) {\n          if (documentData.metadata.author) {\n            doc.info.Author = documentData.metadata.author;\n          }\n          if (documentData.metadata.subject) {\n            doc.info.Subject = documentData.metadata.subject;\n          }\n          if (documentData.metadata.keywords) {\n            doc.info.Keywords = documentData.metadata.keywords;\n          }\n        }\n\n        // Add title\n        if (documentData.title) {\n          doc.info.Title = documentData.title;\n        }\n\n        // Render content\n        for (const section of documentData.content) {\n          this.renderSection(doc, section);\n        }\n\n        // Finalize PDF\n        doc.end();\n      } catch (error) {\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Render a section of the document\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private renderSection(\n    doc: typeof PDFDocument,\n    section: StoragePDFKitDocumentData['content'][0]\n  ): void {\n    const options = section.options ?? {};\n\n    switch (section.type) {\n      case 'heading':\n        doc.fontSize((options.fontSize as number) ?? PDFKIT_CONSTANTS.DEFAULT_HEADING_FONT_SIZE);\n        doc.font('Helvetica-Bold');\n        doc.text(String(section.data), options);\n        doc.moveDown();\n        break;\n\n      case 'text':\n        doc.fontSize((options.fontSize as number) ?? PDFKIT_CONSTANTS.DEFAULT_TEXT_FONT_SIZE);\n        doc.font('Helvetica');\n        doc.text(String(section.data), options);\n        doc.moveDown(PDFKIT_CONSTANTS.MOVE_DOWN_HALF);\n        break;\n\n      case 'line':\n        doc.moveTo(PDFKIT_CONSTANTS.SEPARATOR_START_X, doc.y);\n        doc.lineTo(PDFKIT_CONSTANTS.SEPARATOR_END_X, doc.y);\n        doc.stroke();\n        doc.moveDown();\n        break;\n\n      case 'image':\n        if (typeof section.data === 'string') {\n          doc.image(section.data, options);\n          doc.moveDown();\n        }\n        break;\n\n      case 'table':\n        // Simple table rendering (can be enhanced)\n        if (Array.isArray(section.data)) {\n          const table = section.data as Array<Record<string, unknown>>;\n          doc.fontSize(PDFKIT_CONSTANTS.DEFAULT_FOOTER_FONT_SIZE);\n\n          for (const row of table) {\n            const text = Object.values(row).join(' | ');\n            doc.text(text);\n          }\n\n          doc.moveDown();\n        }\n        break;\n\n      default:\n        this.logger?.warn(`[${this.name}] Unknown section type: ${section.type}`);\n    }\n  }\n\n  /**\n   * Get document data from options\n   * @private\n   */\n  private getDocumentData(options: StorageRenderOptions): StoragePDFKitDocumentData {\n    if (!options.data) {\n      throw new StoragePackageError(\n        'Missing document data in render options',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { renderer: this.name } }\n      );\n    }\n\n    // Validate structure\n    const data = options.data as unknown as StoragePDFKitDocumentData;\n\n    if (!data.content || !Array.isArray(data.content)) {\n      throw new StoragePackageError(\n        'Invalid document data: missing content array',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { renderer: this.name } }\n      );\n    }\n\n    return data;\n  }\n\n  /**\n   * Get PDF options\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private getPDFOptions(renderOptions?: PDFRenderOptions): Record<string, unknown> {\n    const options = { ...this.defaultOptions };\n\n    if (renderOptions) {\n      const pageSize = renderOptions.pageSize ?? renderOptions.format;\n      if (pageSize) {\n        options.size = pageSize;\n      }\n\n      if (renderOptions.margins || renderOptions.margin) {\n        const margins = renderOptions.margins ?? renderOptions.margin;\n        options.margins = {\n          top: this.parseMargin(margins?.top),\n          bottom: this.parseMargin(margins?.bottom),\n          left: this.parseMargin(margins?.left),\n          right: this.parseMargin(margins?.right),\n        };\n      }\n    }\n\n    return options;\n  }\n\n  /**\n   * Parse margin string to number (e.g., \"20mm\" → 56.69)\n   * @private\n   */\n  private parseMargin(margin?: string): number {\n    if (!margin) return PDFKIT_CONSTANTS.DEFAULT_MARGIN;\n\n    // Convert mm to points (1mm = 2.834645 points)\n    if (margin.endsWith('mm')) {\n      return Number.parseFloat(margin) * PDFKIT_CONSTANTS.MM_TO_POINTS;\n    }\n\n    // Convert inches to points (1in = 72 points)\n    if (margin.endsWith('in')) {\n      return Number.parseFloat(margin) * PDFKIT_CONSTANTS.INCHES_TO_POINTS;\n    }\n\n    // Assume points\n    return Number.parseFloat(margin) || PDFKIT_CONSTANTS.DEFAULT_MARGIN;\n  }\n\n  /**\n   * Check renderer health\n   */\n  async checkHealth(): Promise<StorageRendererHealthCheck> {\n    const startTime = Date.now();\n\n    try {\n      // Try to create a simple PDF\n      const testDoc = new PDFDocument();\n      const buffers: Buffer[] = [];\n\n      await new Promise<void>((resolve, reject) => {\n        testDoc.on('data', (chunk: Buffer) => buffers.push(chunk));\n        testDoc.on('end', () => resolve());\n        testDoc.on('error', reject);\n\n        testDoc.text('Health check');\n        testDoc.end();\n      });\n\n      const responseTime = Date.now() - startTime;\n\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.HEALTHY);\n\n      return {\n        name: this.name,\n        status: 'healthy',\n        lastCheck: new Date(),\n        responseTime,\n        metadata: {\n          type: this.type,\n        },\n      };\n    } catch (error) {\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.UNHEALTHY);\n\n      return {\n        name: this.name,\n        status: ADAPTER_HEALTH_STATUS.UNHEALTHY,\n        lastCheck: new Date(),\n        error: error instanceof Error ? error.message : String(error),\n        metadata: {\n          type: this.type,\n        },\n      };\n    }\n  }\n}\n","/**\n * PuppeteerRenderer\n *\n * Renderer adapter using Puppeteer (Headless Chrome).\n * Extends BaseRendererAdapter.\n *\n * **Supported Formats**: PDF, PNG, JPEG, HTML\n *\n * **Pros**:\n * - Best HTML/CSS support (real Chrome engine)\n * - Handles complex layouts, flexbox, grid\n * - Supports modern CSS features\n * - Can capture screenshots\n *\n * **Cons**:\n * - Heavy dependency (~200MB with Chromium)\n * - Slower than lightweight alternatives\n * - Memory intensive\n *\n * **Best For**:\n * - Complex invoices with styling\n * - Documents with charts/graphs\n * - Professional-looking PDFs\n */\n\nimport puppeteer, { type Browser, type PDFOptions, type ScreenshotOptions } from 'puppeteer';\nimport { existsSync } from 'node:fs';\nimport {\n  type StorageRenderOptions,\n  type StorageRenderResult,\n  type StorageRendererHealthCheck,\n  type PDFRenderOptions,\n  type OUTPUT_FORMAT,\n  ADAPTER_HEALTH_STATUS,\n} from '@plyaz/types/storage';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types';\nimport { BaseRendererAdapter } from '../base/BaseRendererAdapter';\nimport { StoragePackageError } from '@plyaz/errors';\n\nimport type { StoragePuppeteerRendererConfig } from '@plyaz/types/storage';\n\n/**\n * Constants for Puppeteer renderer\n */\nconst PUPPETEER_CONSTANTS = {\n  DEFAULT_TIMEOUT_MS: 30000,\n} as const;\n\n/**\n * PuppeteerRenderer Adapter\n *\n * Config-driven renderer using Puppeteer.\n *\n * @example\n * ```typescript\n * const renderer = new PuppeteerRenderer({\n *   name: 'puppeteer-main',\n *   type: STORAGE_RENDERER_TYPE.PUPPETEER,\n *   enabled: true,\n *   priority: 100,\n *   supportedFormats: [OUTPUT_FORMAT.PDF, OUTPUT_FORMAT.PNG],\n *   logger: myLogger,\n *   config: {\n *     keepAlive: true,\n *     launchOptions: { headless: true, args: ['--no-sandbox'] }\n *   }\n * });\n *\n * const result = await renderer.render({\n *   format: OUTPUT_FORMAT.PDF,\n *   data: { html: '<html>...</html>' },\n *   pdfOptions: { pageSize: 'A4', orientation: 'portrait' }\n * });\n * ```\n */\nexport class PuppeteerRenderer extends BaseRendererAdapter {\n  private browser?: Browser;\n  private readonly launchOptions: Parameters<typeof puppeteer.launch>[0];\n  private readonly keepAlive: boolean;\n  private readonly timeout: number;\n\n  // eslint-disable-next-line complexity\n  constructor(config: StoragePuppeteerRendererConfig) {\n    super(config);\n\n    // Try to use system Chrome if executablePath not provided\n    const defaultLaunchOptions: Parameters<typeof puppeteer.launch>[0] = {\n      headless: true,\n      args: ['--no-sandbox', '--disable-setuid-sandbox'],\n    };\n\n    // If no executablePath specified, try to find system Chrome\n    if (!config.config?.launchOptions?.executablePath) {\n      const chromePaths = [\n        'C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n        'C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n        '/usr/bin/google-chrome',\n        '/usr/bin/chromium-browser',\n        '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n      ];\n\n      // Find the first Chrome installation that exists\n      const foundChrome = chromePaths.find(path => {\n        try {\n          return existsSync(path);\n        } catch {\n          return false;\n        }\n      });\n\n      if (foundChrome) {\n        defaultLaunchOptions.executablePath = foundChrome;\n        this.logger?.debug(`[${config.name}] Found system Chrome at: ${foundChrome}`);\n      } else {\n        this.logger?.warn(\n          `[${config.name}] No system Chrome found. Puppeteer will try to use bundled Chromium. ` +\n            'Install Chrome or run: npx puppeteer browsers install chrome'\n        );\n      }\n    }\n\n    this.launchOptions = {\n      ...defaultLaunchOptions,\n      ...config.config?.launchOptions,\n    };\n    this.keepAlive = config.config?.keepAlive ?? false;\n    this.timeout = config.config?.timeout ?? PUPPETEER_CONSTANTS.DEFAULT_TIMEOUT_MS; // 30 seconds\n  }\n\n  /**\n   * Render content\n   */\n  // eslint-disable-next-line complexity\n  async render(options: StorageRenderOptions): Promise<StorageRenderResult> {\n    this.validateOptions(options);\n\n    const startTime = Date.now();\n\n    this.logger?.debug(`[${this.name}] Starting render`, {\n      format: options.format,\n      hasData: !!options.data,\n      locale: options.locale,\n    });\n\n    try {\n      const format = options.format as OUTPUT_FORMAT;\n\n      // Get HTML content\n      const html = this.getHtmlContent(options);\n\n      // Render based on format\n      let content: Buffer;\n      if (format === 'pdf') {\n        content = await this.renderPDF(html, options.pdfOptions);\n      } else if (format === 'png' || format === 'jpeg') {\n        content = await this.renderImage(html, format);\n      } else if (format === 'html') {\n        content = Buffer.from(html, 'utf-8');\n      } else {\n        throw new StoragePackageError(\n          `Unsupported format: ${format}`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { format } }\n        );\n      }\n\n      const result: StorageRenderResult = {\n        content,\n        format: options.format,\n        mimeType: this.getMimeType(format),\n        size: content.length,\n        metadata: {\n          renderer: this.name,\n          duration: Date.now() - startTime,\n        },\n      };\n\n      this.logger?.info(`[${this.name}] Render completed`, {\n        format: options.format,\n        size: content.length,\n        duration: Date.now() - startTime,\n      });\n\n      return result;\n    } catch (error) {\n      this.logger?.error(`[${this.name}] Render failed`, {\n        error,\n        duration: Date.now() - startTime,\n      });\n\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n\n      throw new StoragePackageError(\n        `Puppeteer render failed: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PDF_GENERATION_FAILED,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: { renderer: this.name, format: options.format },\n        }\n      );\n    }\n  }\n\n  /**\n   * Render HTML to PDF\n   * @private\n   */\n  private async renderPDF(html: string, pdfOptions?: PDFRenderOptions): Promise<Buffer> {\n    const browser = await this.getBrowser();\n    const page = await browser.newPage();\n\n    try {\n      await page.setContent(html, {\n        waitUntil: 'networkidle0',\n        timeout: this.timeout,\n      });\n\n      const options = this.convertPDFOptions(pdfOptions ?? {});\n      const pdf = await page.pdf(options);\n\n      return Buffer.from(pdf);\n    } finally {\n      await page.close();\n\n      if (!this.keepAlive && this.browser) {\n        await this.browser.close();\n        this.browser = undefined;\n      }\n    }\n  }\n\n  /**\n   * Render HTML to image (PNG/JPEG)\n   * @private\n   */\n  private async renderImage(html: string, format: 'png' | 'jpeg'): Promise<Buffer> {\n    const browser = await this.getBrowser();\n    const page = await browser.newPage();\n\n    try {\n      await page.setContent(html, {\n        waitUntil: 'networkidle0',\n        timeout: this.timeout,\n      });\n\n      const options: ScreenshotOptions = {\n        type: format,\n        fullPage: true,\n      };\n\n      const screenshot = await page.screenshot(options);\n      return Buffer.from(screenshot);\n    } finally {\n      await page.close();\n\n      if (!this.keepAlive && this.browser) {\n        await this.browser.close();\n        this.browser = undefined;\n      }\n    }\n  }\n\n  /**\n   * Get or create browser instance\n   * @private\n   */\n  private async getBrowser(): Promise<Browser> {\n    if (this.keepAlive && this.browser) {\n      return this.browser;\n    }\n\n    this.logger?.debug(`[${this.name}] Launching browser`);\n\n    try {\n      this.browser = await puppeteer.launch(this.launchOptions);\n      return this.browser;\n    } catch (error) {\n      throw new StoragePackageError(\n        'Failed to launch Puppeteer browser',\n        STORAGE_ERROR_CODES.PDF_GENERATION_FAILED,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: { renderer: this.name },\n        }\n      );\n    }\n  }\n\n  /**\n   * Convert storage PDF options to Puppeteer format\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private convertPDFOptions(options: PDFRenderOptions): PDFOptions {\n    const pageSize = options.pageSize ?? options.format ?? 'A4';\n    const margins = options.margins ?? options.margin;\n\n    const pdfOptions: PDFOptions = {\n      format:\n        pageSize === 'A4' || pageSize === 'Letter' || pageSize === 'Legal' ? pageSize : undefined,\n      landscape: options.orientation === 'landscape',\n      printBackground: options.printBackground ?? true,\n      preferCSSPageSize: options.preferCSSPageSize ?? false,\n      displayHeaderFooter: options.displayHeaderFooter ?? false,\n    };\n\n    if (margins) {\n      pdfOptions.margin = {\n        top: margins.top,\n        right: margins.right,\n        bottom: margins.bottom,\n        left: margins.left,\n      };\n    }\n\n    if (options.headerTemplate) {\n      pdfOptions.headerTemplate = options.headerTemplate;\n    }\n\n    if (options.footerTemplate) {\n      pdfOptions.footerTemplate = options.footerTemplate;\n    }\n\n    if (options.scale) {\n      pdfOptions.scale = options.scale;\n    }\n\n    return pdfOptions;\n  }\n\n  /**\n   * Get HTML content from options\n   * @private\n   */\n  private getHtmlContent(options: StorageRenderOptions): string {\n    if (options.data && typeof options.data.html === 'string') {\n      return options.data.html;\n    }\n\n    throw new StoragePackageError(\n      'Missing HTML content in render options',\n      STORAGE_ERROR_CODES.VALIDATION_FAILED,\n      { context: { renderer: this.name } }\n    );\n  }\n\n  /**\n   * Check renderer health\n   */\n  async checkHealth(): Promise<StorageRendererHealthCheck> {\n    const startTime = Date.now();\n\n    try {\n      // Try to launch and close browser\n      const browser = await puppeteer.launch(this.launchOptions);\n      await browser.close();\n\n      const responseTime = Date.now() - startTime;\n\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.HEALTHY);\n\n      return {\n        name: this.name,\n        status: 'healthy',\n        lastCheck: new Date(),\n        responseTime,\n        metadata: {\n          type: this.type,\n          keepAlive: this.keepAlive,\n        },\n      };\n    } catch (error) {\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.UNHEALTHY);\n\n      return {\n        name: this.name,\n        status: 'unhealthy',\n        lastCheck: new Date(),\n        error: error instanceof Error ? error.message : String(error),\n        metadata: {\n          type: this.type,\n        },\n      };\n    }\n  }\n\n  /**\n   * Cleanup resources\n   */\n  async destroy(): Promise<void> {\n    await super.destroy();\n\n    if (this.browser) {\n      this.logger?.debug(`[${this.name}] Closing browser`);\n\n      try {\n        await this.browser.close();\n        this.browser = undefined;\n      } catch (error) {\n        this.logger?.error(`[${this.name}] Failed to close browser`, { error });\n      }\n    }\n  }\n}\n","/**\n * PlaywrightRenderer\n *\n * Renderer adapter using Playwright.\n * Alternative to Puppeteer with better cross-browser support.\n *\n * **Supported Formats**: PDF, PNG, JPEG, HTML\n *\n * **Pros**:\n * - Cross-browser support (Chromium, Firefox, WebKit)\n * - Better API than Puppeteer\n * - Auto-wait for elements\n * - Better debugging\n *\n * **Cons**:\n * - Similar size to Puppeteer\n * - Requires browser binaries\n *\n * **Best For**:\n * - Cross-browser PDF testing\n * - Complex web apps\n * - Better developer experience than Puppeteer\n */\n\nimport type { Browser, Page, BrowserContext } from 'playwright';\nimport {\n  type StoragePlaywrightRendererConfig,\n  type StorageRenderOptions,\n  type StorageRenderResult,\n  type StorageRendererHealthCheck,\n  type PDFRenderOptions,\n  type OUTPUT_FORMAT,\n  ADAPTER_HEALTH_STATUS,\n} from '@plyaz/types/storage';\nimport { BaseRendererAdapter } from '../base/BaseRendererAdapter';\nimport { StoragePackageError } from '@plyaz/errors';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types/errors';\n\n/**\n * Playwright Renderer constants\n */\nconst PLAYWRIGHT_CONSTANTS = {\n  DEFAULT_TIMEOUT_MS: 30000,\n} as const;\n\n/**\n * PlaywrightRenderer Adapter\n *\n * Config-driven renderer using Playwright.\n *\n * @example\n * ```typescript\n * const renderer = new PlaywrightRenderer({\n *   name: 'playwright-main',\n *   type: STORAGE_RENDERER_TYPE.PLAYWRIGHT,\n *   enabled: true,\n *   priority: 90,\n *   supportedFormats: [OUTPUT_FORMAT.PDF, OUTPUT_FORMAT.PNG],\n *   config: {\n *     browserType: 'chromium',\n *     keepAlive: true\n *   }\n * });\n * ```\n */\nexport class PlaywrightRenderer extends BaseRendererAdapter {\n  private browser?: Browser;\n  private readonly browserType: 'chromium' | 'firefox' | 'webkit';\n  private readonly launchOptions: Record<string, unknown>;\n  private readonly keepAlive: boolean;\n  private readonly timeout: number;\n\n  // eslint-disable-next-line complexity\n  constructor(config: StoragePlaywrightRendererConfig) {\n    super(config);\n\n    this.browserType = config.config?.browserType ?? 'chromium';\n    this.launchOptions = config.config?.launchOptions ?? {\n      headless: true,\n    };\n    this.keepAlive = config.config?.keepAlive ?? false;\n    this.timeout = config.config?.timeout ?? PLAYWRIGHT_CONSTANTS.DEFAULT_TIMEOUT_MS;\n  }\n\n  /**\n   * Render content\n   */\n  // eslint-disable-next-line complexity\n  async render(options: StorageRenderOptions): Promise<StorageRenderResult> {\n    this.validateOptions(options);\n\n    const startTime = Date.now();\n\n    this.logger?.debug(`[${this.name}] Starting render`, {\n      format: options.format,\n      browserType: this.browserType,\n    });\n\n    try {\n      const format = options.format as OUTPUT_FORMAT;\n      const html = this.getHtmlContent(options);\n\n      let content: Buffer;\n      if (format === 'pdf') {\n        content = await this.renderPDF(html, options.pdfOptions);\n      } else if (format === 'png' || format === 'jpeg') {\n        content = await this.renderImage(html, format);\n      } else if (format === 'html') {\n        content = Buffer.from(html, 'utf-8');\n      } else {\n        throw new StoragePackageError(\n          `Unsupported format: ${format}`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { format } }\n        );\n      }\n\n      const result: StorageRenderResult = {\n        content,\n        format: options.format,\n        mimeType: this.getMimeType(format),\n        size: content.length,\n        metadata: {\n          renderer: this.name,\n          browserType: this.browserType,\n          duration: Date.now() - startTime,\n        },\n      };\n\n      this.logger?.info(`[${this.name}] Render completed`, {\n        format,\n        size: content.length,\n        duration: Date.now() - startTime,\n      });\n\n      return result;\n    } catch (error) {\n      this.logger?.error(`[${this.name}] Render failed`, { error });\n\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n\n      throw new StoragePackageError(\n        `Playwright render failed: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PDF_GENERATION_FAILED,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: { renderer: this.name },\n        }\n      );\n    }\n  }\n\n  /**\n   * Render HTML to PDF\n   * @private\n   */\n  private async renderPDF(html: string, pdfOptions?: PDFRenderOptions): Promise<Buffer> {\n    const { page, context } = await this.getPage();\n\n    try {\n      await page.setContent(html, {\n        waitUntil: 'networkidle',\n        timeout: this.timeout,\n      });\n\n      const options = this.convertPDFOptions(pdfOptions ?? {});\n      const pdf = await page.pdf(options);\n\n      return Buffer.from(pdf);\n    } finally {\n      await page.close();\n      await context.close();\n\n      if (!this.keepAlive && this.browser) {\n        await this.browser.close();\n        this.browser = undefined;\n      }\n    }\n  }\n\n  /**\n   * Render HTML to image\n   * @private\n   */\n  private async renderImage(html: string, format: 'png' | 'jpeg'): Promise<Buffer> {\n    const { page, context } = await this.getPage();\n\n    try {\n      await page.setContent(html, {\n        waitUntil: 'networkidle',\n        timeout: this.timeout,\n      });\n\n      const screenshot = await page.screenshot({\n        type: format,\n        fullPage: true,\n      });\n\n      return Buffer.from(screenshot);\n    } finally {\n      await page.close();\n      await context.close();\n\n      if (!this.keepAlive && this.browser) {\n        await this.browser.close();\n        this.browser = undefined;\n      }\n    }\n  }\n\n  /**\n   * Get or create page\n   * @private\n   */\n  private async getPage(): Promise<{ page: Page; context: BrowserContext }> {\n    const browser = await this.getBrowser();\n    const context = await browser.newContext();\n    const page = await context.newPage();\n\n    return { page, context };\n  }\n\n  /**\n   * Get or create browser instance\n   * @private\n   */\n  private async getBrowser(): Promise<Browser> {\n    if (this.keepAlive && this.browser) {\n      return this.browser;\n    }\n\n    this.logger?.debug(`[${this.name}] Launching ${this.browserType} browser`);\n\n    try {\n      // Dynamic import of playwright to avoid bundling all browsers\n      const { chromium, firefox, webkit } = await import('playwright');\n\n      const browserTypes = { chromium, firefox, webkit };\n      const browserLauncher = browserTypes[this.browserType];\n\n      this.browser = await browserLauncher.launch(this.launchOptions);\n      return this.browser;\n    } catch (error) {\n      throw new StoragePackageError(\n        `Failed to launch Playwright ${this.browserType} browser`,\n        STORAGE_ERROR_CODES.PDF_GENERATION_FAILED,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: { renderer: this.name, browserType: this.browserType },\n        }\n      );\n    }\n  }\n\n  /**\n   * Convert storage PDF options to Playwright format\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private convertPDFOptions(options: PDFRenderOptions): Record<string, unknown> {\n    const pageSize = options.pageSize ?? options.format ?? 'A4';\n    const margins = options.margins ?? options.margin;\n\n    const pdfOptions: Record<string, unknown> = {\n      format: pageSize,\n      landscape: options.orientation === 'landscape',\n      printBackground: options.printBackground ?? true,\n      preferCSSPageSize: options.preferCSSPageSize ?? false,\n      displayHeaderFooter: options.displayHeaderFooter ?? false,\n    };\n\n    if (margins) {\n      pdfOptions.margin = {\n        top: margins.top,\n        right: margins.right,\n        bottom: margins.bottom,\n        left: margins.left,\n      };\n    }\n\n    if (options.headerTemplate) {\n      pdfOptions.headerTemplate = options.headerTemplate;\n    }\n\n    if (options.footerTemplate) {\n      pdfOptions.footerTemplate = options.footerTemplate;\n    }\n\n    if (options.scale) {\n      pdfOptions.scale = options.scale;\n    }\n\n    return pdfOptions;\n  }\n\n  /**\n   * Get HTML content from options\n   * @private\n   */\n  private getHtmlContent(options: StorageRenderOptions): string {\n    if (options.data && typeof options.data.html === 'string') {\n      return options.data.html;\n    }\n\n    throw new StoragePackageError(\n      'Missing HTML content in render options',\n      STORAGE_ERROR_CODES.VALIDATION_FAILED,\n      { context: { renderer: this.name } }\n    );\n  }\n\n  /**\n   * Check renderer health\n   */\n  async checkHealth(): Promise<StorageRendererHealthCheck> {\n    const startTime = Date.now();\n\n    try {\n      const { chromium, firefox, webkit } = await import('playwright');\n      const browserTypes = { chromium, firefox, webkit };\n      const browserLauncher = browserTypes[this.browserType];\n\n      const browser = await browserLauncher.launch(this.launchOptions);\n      await browser.close();\n\n      const responseTime = Date.now() - startTime;\n\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.HEALTHY);\n\n      return {\n        name: this.name,\n        status: 'healthy',\n        lastCheck: new Date(),\n        responseTime,\n        metadata: {\n          type: this.type,\n          browserType: this.browserType,\n        },\n      };\n    } catch (error) {\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.UNHEALTHY);\n\n      return {\n        name: this.name,\n        status: 'unhealthy',\n        lastCheck: new Date(),\n        error: error instanceof Error ? error.message : String(error),\n        metadata: {\n          type: this.type,\n          browserType: this.browserType,\n        },\n      };\n    }\n  }\n\n  /**\n   * Cleanup resources\n   */\n  async destroy(): Promise<void> {\n    await super.destroy();\n\n    if (this.browser) {\n      this.logger?.debug(`[${this.name}] Closing browser`);\n\n      try {\n        await this.browser.close();\n        this.browser = undefined;\n      } catch (error) {\n        this.logger?.error(`[${this.name}] Failed to close browser`, { error });\n      }\n    }\n  }\n}\n","/**\n * ExcelJSRenderer\n *\n * Renderer adapter for Excel (.xlsx) generation using ExcelJS.\n * Extends BaseRendererAdapter.\n *\n * **Supported Formats**: EXCEL (.xlsx)\n *\n * **Pros**:\n * - Native Excel generation\n * - Full Excel features (formulas, charts, styles)\n * - No HTML/browser required\n * - Fast and lightweight\n *\n * **Use Cases**:\n * - Transaction reports\n * - Invoice lists\n * - Financial statements\n * - Data exports\n * - Analytics dashboards\n */\n\nimport ExcelJS from 'exceljs';\nimport {\n  type StorageRenderOptions,\n  type StorageRenderResult,\n  type StorageRendererHealthCheck,\n  type StorageExcelRenderOptions,\n  type StorageExcelJSRendererConfig,\n  type StorageExcelData,\n  ADAPTER_HEALTH_STATUS,\n  OUTPUT_FORMAT,\n} from '@plyaz/types/storage';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types';\nimport { BaseRendererAdapter } from '../base/BaseRendererAdapter';\nimport { StoragePackageError } from '@plyaz/errors';\n\n/**\n * ExcelJS constants\n */\nconst EXCELJS_CONSTANTS = {\n  DEFAULT_COLUMN_WIDTH: 15,\n} as const;\n\n/**\n * ExcelJSRenderer Adapter\n *\n * Generates Excel files from structured data.\n *\n * @example\n * ```typescript\n * const renderer = new ExcelJSRenderer({\n *   name: 'exceljs-main',\n *   type: STORAGE_RENDERER_TYPE.EXCELJS,\n *   enabled: true,\n *   priority: 100,\n *   supportedFormats: [OUTPUT_FORMAT.EXCEL]\n * });\n *\n * const result = await renderer.render({\n *   format: OUTPUT_FORMAT.EXCEL,\n *   data: {\n *     sheets: [{\n *       name: 'Transactions',\n *       data: [\n *         { date: '2025-01-01', amount: 1000, description: 'Payment' },\n *         { date: '2025-01-02', amount: 500, description: 'Refund' }\n *       ]\n *     }]\n *   },\n *   excelOptions: {\n *     sheetName: 'Report',\n *     freezeHeader: true,\n *     autoFilter: true\n *   }\n * });\n * ```\n */\nexport class ExcelJSRenderer extends BaseRendererAdapter {\n  private readonly defaultOptions: Partial<StorageExcelRenderOptions>;\n\n  constructor(config: StorageExcelJSRendererConfig) {\n    super(config);\n\n    this.defaultOptions = config.config?.defaultOptions ?? {\n      sheetName: 'Sheet1',\n      freezeHeader: true,\n      autoFilter: true,\n      columnWidths: 'auto',\n    };\n  }\n\n  /**\n   * Render content\n   */\n  async render(options: StorageRenderOptions): Promise<StorageRenderResult> {\n    this.validateOptions(options);\n\n    const startTime = Date.now();\n\n    this.logger?.debug(`[${this.name}] Starting Excel generation`);\n\n    try {\n      const excelData = this.getExcelData(options);\n      const excelOptions = { ...this.defaultOptions, ...options.excelOptions };\n\n      const content = await this.generateExcel(excelData, excelOptions);\n\n      const result: StorageRenderResult = {\n        content,\n        format: options.format,\n        mimeType: this.getMimeType(OUTPUT_FORMAT.EXCEL),\n        size: content.length,\n        metadata: {\n          renderer: this.name,\n          duration: Date.now() - startTime,\n          sheets: excelData.sheets.length,\n        },\n      };\n\n      this.logger?.info(`[${this.name}] Excel generated`, {\n        size: content.length,\n        duration: Date.now() - startTime,\n        sheets: excelData.sheets.length,\n      });\n\n      return result;\n    } catch (error) {\n      this.logger?.error(`[${this.name}] Excel generation failed`, { error });\n\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n\n      throw new StoragePackageError(\n        `ExcelJS render failed: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PDF_GENERATION_FAILED, // Reuse PDF error for now\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: { renderer: this.name },\n        }\n      );\n    }\n  }\n\n  /**\n   * Generate Excel file using ExcelJS\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private async generateExcel(\n    data: StorageExcelData,\n    options: Partial<StorageExcelRenderOptions>\n  ): Promise<Buffer> {\n    const workbook = new ExcelJS.Workbook();\n\n    // Set metadata\n    if (data.metadata) {\n      workbook.creator = data.metadata.creator ?? 'Storage Package';\n      workbook.lastModifiedBy =\n        data.metadata.lastModifiedBy ?? options.lastModifiedBy ?? 'Storage Package';\n      workbook.created = data.metadata.created ?? new Date();\n      workbook.modified = data.metadata.modified ?? new Date();\n    }\n\n    // Create sheets\n    for (const sheetData of data.sheets) {\n      const worksheet = workbook.addWorksheet(sheetData.name || options.sheetName);\n\n      // Configure columns\n      if (sheetData.columns) {\n        worksheet.columns = sheetData.columns;\n      } else {\n        // Auto-detect columns from first data row\n        const firstRow = sheetData.data[0];\n        if (firstRow) {\n          worksheet.columns = Object.keys(firstRow).map(key => ({\n            header: key,\n            key,\n            width:\n              options.columnWidths === 'auto' ? EXCELJS_CONSTANTS.DEFAULT_COLUMN_WIDTH : undefined,\n          }));\n        }\n      }\n\n      // Add data rows\n      worksheet.addRows(sheetData.data);\n\n      // Apply styles to header row\n      const headerRow = worksheet.getRow(1);\n      headerRow.font = { bold: true };\n      headerRow.fill = {\n        type: 'pattern',\n        pattern: 'solid',\n        fgColor: { argb: 'FFD3D3D3' },\n      };\n\n      // Freeze header\n      if (options.freezeHeader) {\n        worksheet.views = [{ state: 'frozen', ySplit: 1 }];\n      }\n\n      // Add auto-filter\n      if (options.autoFilter) {\n        worksheet.autoFilter = {\n          from: { row: 1, column: 1 },\n          to: { row: 1, column: worksheet.columns?.length || 1 },\n        };\n      }\n\n      // Apply column widths\n      if (Array.isArray(options.columnWidths)) {\n        worksheet.columns?.forEach((col, index) => {\n          if (options.columnWidths && Array.isArray(options.columnWidths)) {\n            col.width = options.columnWidths[index] || EXCELJS_CONSTANTS.DEFAULT_COLUMN_WIDTH;\n          }\n        });\n      }\n\n      // Protect worksheet\n      if (options.protection?.password) {\n        await worksheet.protect(options.protection.password, options.protection.options ?? {});\n      }\n    }\n\n    // Write to buffer\n    const buffer = await workbook.xlsx.writeBuffer();\n    return Buffer.from(buffer);\n  }\n\n  /**\n   * Get Excel data from options\n   * @private\n   */\n  private getExcelData(options: StorageRenderOptions): StorageExcelData {\n    if (!options.data) {\n      throw new StoragePackageError(\n        'Missing Excel data in render options',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { renderer: this.name } }\n      );\n    }\n\n    const data = options.data as unknown as StorageExcelData;\n\n    if (!data.sheets || !Array.isArray(data.sheets)) {\n      throw new StoragePackageError(\n        'Invalid Excel data: missing sheets array',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { renderer: this.name } }\n      );\n    }\n\n    return data;\n  }\n\n  /**\n   * Check renderer health\n   */\n  async checkHealth(): Promise<StorageRendererHealthCheck> {\n    const startTime = Date.now();\n\n    try {\n      // Try to create a simple Excel file\n      const workbook = new ExcelJS.Workbook();\n      const worksheet = workbook.addWorksheet('Test');\n      worksheet.addRow(['Health', 'Check']);\n      await workbook.xlsx.writeBuffer();\n\n      const responseTime = Date.now() - startTime;\n\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.HEALTHY);\n\n      return {\n        name: this.name,\n        status: 'healthy',\n        lastCheck: new Date(),\n        responseTime,\n        metadata: {\n          type: this.type,\n        },\n      };\n    } catch (error) {\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.UNHEALTHY);\n\n      return {\n        name: this.name,\n        status: 'unhealthy',\n        lastCheck: new Date(),\n        error: error instanceof Error ? error.message : String(error),\n        metadata: {\n          type: this.type,\n        },\n      };\n    }\n  }\n}\n","/**\n * DocxTemplaterRenderer\n *\n * Renderer adapter for Word documents (.docx) using docxtemplater.\n * Extends BaseRendererAdapter.\n *\n * **Supported Formats**: WORD (.docx)\n *\n * **Pros**:\n * - Native Word document generation\n * - Template-based (use .docx templates with placeholders)\n * - Full Word features (styles, headers, footers)\n * - No HTML/browser required\n *\n * **Use Cases**:\n * - Contracts with placeholders\n * - Certificates\n * - Reports with complex formatting\n * - Legal documents\n */\n\nimport Docxtemplater from 'docxtemplater';\nimport PizZip from 'pizzip';\nimport { readFile } from 'fs/promises';\nimport {\n  type StorageRenderOptions,\n  type StorageRenderResult,\n  type StorageRendererHealthCheck,\n  type StorageWordRenderOptions,\n  ADAPTER_HEALTH_STATUS,\n  OUTPUT_FORMAT,\n} from '@plyaz/types/storage';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types';\nimport { BaseRendererAdapter } from '../base/BaseRendererAdapter';\nimport { StoragePackageError } from '@plyaz/errors';\n\nimport type {\n  StorageDocxTemplaterRendererConfig,\n  StorageWordDocumentData,\n} from '@plyaz/types/storage';\n\n/**\n * DocxTemplaterRenderer Adapter\n *\n * Generates Word documents from .docx templates with placeholders.\n *\n * @example\n * ```typescript\n * const renderer = new DocxTemplaterRenderer({\n *   name: 'docx-main',\n *   type: STORAGE_RENDERER_TYPE.DOCXTEMPLATER,\n *   enabled: true,\n *   priority: 100,\n *   supportedFormats: [OUTPUT_FORMAT.WORD],\n *   config: {\n *     templateBasePath: './templates/word'\n *   }\n * });\n *\n * // Contract template with {customerName}, {amount}, etc. placeholders\n * const result = await renderer.render({\n *   format: OUTPUT_FORMAT.WORD,\n *   data: {\n *     templatePath: 'contracts/service-agreement.docx',\n *     data: {\n *       customerName: 'John Doe',\n *       amount: '$1,000',\n *       startDate: '2025-01-01',\n *       endDate: '2025-12-31'\n *     }\n *   },\n *   wordOptions: {\n *     creator: 'My Company',\n *     title: 'Service Agreement'\n *   }\n * });\n * ```\n */\nexport class DocxTemplaterRenderer extends BaseRendererAdapter {\n  private readonly templateBasePath: string;\n  private readonly defaultOptions: Partial<StorageWordRenderOptions>;\n\n  constructor(config: StorageDocxTemplaterRendererConfig) {\n    super(config);\n\n    this.templateBasePath = config.config?.templateBasePath ?? './templates/word';\n    this.defaultOptions = config.config?.defaultOptions ?? {\n      creator: 'Storage Package',\n    };\n  }\n\n  /**\n   * Render content\n   */\n  async render(options: StorageRenderOptions): Promise<StorageRenderResult> {\n    this.validateOptions(options);\n\n    const startTime = Date.now();\n\n    this.logger?.debug(`[${this.name}] Starting Word document generation`);\n\n    try {\n      const docData = this.getDocumentData(options);\n      const wordOptions = { ...this.defaultOptions, ...options.wordOptions };\n\n      const content = await this.generateWord(docData, wordOptions);\n\n      const result: StorageRenderResult = {\n        content,\n        format: options.format,\n        mimeType: this.getMimeType(OUTPUT_FORMAT.WORD),\n        size: content.length,\n        metadata: {\n          renderer: this.name,\n          duration: Date.now() - startTime,\n          template: docData.templatePath,\n        },\n      };\n\n      this.logger?.info(`[${this.name}] Word document generated`, {\n        size: content.length,\n        duration: Date.now() - startTime,\n        template: docData.templatePath,\n      });\n\n      return result;\n    } catch (error) {\n      this.logger?.error(`[${this.name}] Word generation failed`, { error });\n\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n\n      throw new StoragePackageError(\n        `DocxTemplater render failed: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PDF_GENERATION_FAILED, // Reuse PDF error for now\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: { renderer: this.name },\n        }\n      );\n    }\n  }\n\n  /**\n   * Generate Word document using docxtemplater\n   * @private\n   */\n  private async generateWord(\n    docData: StorageWordDocumentData,\n    _options: Partial<StorageWordRenderOptions> // eslint-disable-line no-unused-vars\n  ): Promise<Buffer> {\n    // Load template file\n    if (!docData.templatePath) {\n      throw new StoragePackageError(\n        'Template path required for Word document generation',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { renderer: this.name } }\n      );\n    }\n\n    const templatePath = docData.templatePath.startsWith('/')\n      ? docData.templatePath\n      : `${this.templateBasePath}/${docData.templatePath}`;\n\n    this.logger?.debug(`[${this.name}] Loading template`, { templatePath });\n\n    try {\n      const templateContent = await readFile(templatePath);\n\n      // Load template with PizZip\n      const zip = new PizZip(templateContent);\n\n      // Create docxtemplater instance\n      const doc = new Docxtemplater(zip, {\n        paragraphLoop: true,\n        linebreaks: true,\n        // Additional options can be added here\n      });\n\n      // Set template data\n      doc.render(docData.data);\n\n      // Generate document buffer\n      const buffer = doc.getZip().generate({\n        type: 'nodebuffer',\n        compression: 'DEFLATE',\n      });\n\n      return buffer;\n    } catch (error) {\n      if (error instanceof Error && 'properties' in error) {\n        // Docxtemplater error with details\n        const docxError = error as Error & { properties?: Record<string, unknown> };\n\n        throw new StoragePackageError(\n          `Docxtemplater error: ${error.message}`,\n          STORAGE_ERROR_CODES.TEMPLATE_RENDER_FAILED,\n          {\n            cause: error,\n            context: {\n              renderer: this.name,\n              templatePath,\n              errorDetails: docxError.properties,\n            },\n          }\n        );\n      }\n\n      throw error;\n    }\n  }\n\n  /**\n   * Get document data from options\n   * @private\n   */\n  private getDocumentData(options: StorageRenderOptions): StorageWordDocumentData {\n    if (!options.data) {\n      throw new StoragePackageError(\n        'Missing Word document data in render options',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { renderer: this.name } }\n      );\n    }\n\n    const data = options.data as unknown as StorageWordDocumentData;\n\n    if (!data.data) {\n      throw new StoragePackageError(\n        'Invalid Word document data: missing data field',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { renderer: this.name } }\n      );\n    }\n\n    return data;\n  }\n\n  /**\n   * Check renderer health\n   */\n  async checkHealth(): Promise<StorageRendererHealthCheck> {\n    const startTime = Date.now();\n\n    try {\n      // Try to create a simple document from empty template\n      const zip = new PizZip();\n      new Docxtemplater(zip);\n\n      const responseTime = Date.now() - startTime;\n\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.HEALTHY);\n\n      return {\n        name: this.name,\n        status: 'healthy',\n        lastCheck: new Date(),\n        responseTime,\n        metadata: {\n          type: this.type,\n          templateBasePath: this.templateBasePath,\n        },\n      };\n    } catch (error) {\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.UNHEALTHY);\n\n      return {\n        name: this.name,\n        status: 'unhealthy',\n        lastCheck: new Date(),\n        error: error instanceof Error ? error.message : String(error),\n        metadata: {\n          type: this.type,\n        },\n      };\n    }\n  }\n}\n","/**\n * InMemoryQueue\n *\n * In-memory queue for file operations with priority-based processing.\n *\n * Features:\n * - Priority-based queue (high, normal, low)\n * - FIFO ordering within same priority\n * - Statistics tracking (queued, processed, failed)\n * - Processing state management\n *\n * @module @plyaz/storage/queue\n */\n\nimport type {\n  StorageQueuedOperation,\n  StorageQueueStatistics,\n  STORAGE_QUEUE_PRIORITY,\n} from '@plyaz/types/storage';\nimport type { LoggerInterface } from '@plyaz/types';\n\n/**\n * In-memory queue for file operations\n *\n * @example\n * ```typescript\n * const queue = new InMemoryQueue({ logger });\n *\n * await queue.enqueue({\n *   id: '123',\n *   type: 'upload',\n *   uploadParams: { ... },\n *   priority: 'high',\n *   retryCount: 0,\n *   maxRetries: 3,\n *   createdAt: new Date(),\n * });\n *\n * const operation = await queue.dequeue();\n * ```\n */\nexport class InMemoryQueue {\n  private queue: StorageQueuedOperation[] = [];\n  private processing = false;\n  private totalQueued = 0;\n  private processedCount = 0;\n  private failedCount = 0;\n  private readonly logger?: LoggerInterface;\n\n  constructor(config?: { logger?: LoggerInterface }) {\n    this.logger = config?.logger;\n  }\n\n  /**\n   * Add operation to queue\n   * High priority operations are inserted at the front\n   * Normal and low priority are added to the back\n   */\n  async enqueue(operation: StorageQueuedOperation): Promise<void> {\n    // High priority goes to front, others to back\n    if (operation.priority === ('high' as STORAGE_QUEUE_PRIORITY)) {\n      this.queue.unshift(operation);\n      this.logger?.debug('[InMemoryQueue] High priority operation enqueued', {\n        operationId: operation.id,\n        type: operation.type,\n        queueSize: this.queue.length,\n      });\n    } else {\n      this.queue.push(operation);\n      this.logger?.debug('[InMemoryQueue] Operation enqueued', {\n        operationId: operation.id,\n        type: operation.type,\n        priority: operation.priority,\n        queueSize: this.queue.length,\n      });\n    }\n\n    this.totalQueued++;\n  }\n\n  /**\n   * Remove and return next operation from queue\n   * Returns null if queue is empty\n   */\n  async dequeue(): Promise<StorageQueuedOperation | null> {\n    const operation = this.queue.shift() ?? null;\n\n    if (operation) {\n      this.logger?.debug('[InMemoryQueue] Operation dequeued', {\n        operationId: operation.id,\n        type: operation.type,\n        remainingInQueue: this.queue.length,\n      });\n    }\n\n    return operation;\n  }\n\n  /**\n   * Get current queue size\n   */\n  size(): number {\n    return this.queue.length;\n  }\n\n  /**\n   * Check if queue is empty\n   */\n  isEmpty(): boolean {\n    return this.queue.length === 0;\n  }\n\n  /**\n   * Set processing state\n   */\n  setProcessing(processing: boolean): void {\n    this.processing = processing;\n    this.logger?.debug('[InMemoryQueue] Processing state changed', { processing });\n  }\n\n  /**\n   * Check if queue is currently being processed\n   */\n  isProcessing(): boolean {\n    return this.processing;\n  }\n\n  /**\n   * Increment processed count\n   */\n  incrementProcessed(): void {\n    this.processedCount++;\n  }\n\n  /**\n   * Increment failed count\n   */\n  incrementFailed(): void {\n    this.failedCount++;\n  }\n\n  /**\n   * Get queue statistics\n   */\n  getStatistics(): StorageQueueStatistics {\n    return {\n      totalQueued: this.totalQueued,\n      currentSize: this.queue.length,\n      processedCount: this.processedCount,\n      failedCount: this.failedCount,\n      isProcessing: this.processing,\n    };\n  }\n\n  /**\n   * Clear all operations from queue\n   * Useful for testing or emergency shutdown\n   */\n  clear(): void {\n    const previousSize = this.queue.length;\n    this.queue = [];\n    this.logger?.info('[InMemoryQueue] Queue cleared', { previousSize });\n  }\n\n  /**\n   * Get all operations in queue (for debugging/monitoring)\n   * Returns a copy to prevent external modification\n   */\n  getAll(): StorageQueuedOperation[] {\n    return [...this.queue];\n  }\n\n  /**\n   * Peek at next operation without removing it\n   */\n  peek(): StorageQueuedOperation | null {\n    return this.queue[0] ?? null;\n  }\n\n  /**\n   * Remove specific operation by ID\n   * Returns true if operation was found and removed\n   */\n  remove(operationId: string): boolean {\n    const initialLength = this.queue.length;\n    this.queue = this.queue.filter(op => op.id !== operationId);\n    const removed = this.queue.length < initialLength;\n\n    if (removed) {\n      this.logger?.debug('[InMemoryQueue] Operation removed', { operationId });\n    }\n\n    return removed;\n  }\n\n  /**\n   * Find operation by ID\n   */\n  find(operationId: string): StorageQueuedOperation | undefined {\n    return this.queue.find(op => op.id === operationId);\n  }\n\n  /**\n   * Get operations by type\n   */\n  getByType(type: StorageQueuedOperation['type']): StorageQueuedOperation[] {\n    return this.queue.filter(op => op.type === type);\n  }\n\n  /**\n   * Get operations by priority\n   */\n  getByPriority(priority: STORAGE_QUEUE_PRIORITY): StorageQueuedOperation[] {\n    return this.queue.filter(op => op.priority === priority);\n  }\n}\n","/**\n * QueueProcessor\n *\n * Processes queued file operations with concurrency control and retry logic.\n *\n * Features:\n * - Concurrent worker management (configurable concurrency)\n * - Automatic retry with exponential backoff\n * - Event emission for operation lifecycle\n * - Graceful start/stop\n * - Error handling and logging\n *\n * @module @plyaz/storage/queue\n */\n\nimport type {\n  StorageQueuedOperation,\n  StorageQueueProcessFunction,\n  StorageQueueProcessorConfig,\n} from '@plyaz/types/storage';\nimport type { LoggerInterface } from '@plyaz/types';\nimport { STORAGE_EVENT_TYPE } from '@plyaz/types/storage';\nimport type { EventManager } from '../core/EventManager';\nimport type { InMemoryQueue } from './InMemoryQueue';\n\n/**\n * Queue Processor constants\n */\nconst QUEUE_PROCESSOR_CONSTANTS = {\n  DEFAULT_POLL_INTERVAL_MS: 100,\n  DEFAULT_MAX_RETRIES: 3,\n  RETRY_BASE_DELAY_MS: 1000,\n  RETRY_EXPONENT_BASE: 2,\n  MAX_RETRY_DELAY_MS: 30000,\n} as const;\n\n/**\n * Queue processor for concurrent job processing\n *\n * @example\n * ```typescript\n * const queue = new InMemoryQueue({ logger });\n * const processor = new QueueProcessor(\n *   queue,\n *   async (operation) => {\n *     // Process the operation\n *     await storageService.uploadFile(operation.uploadParams);\n *   },\n *   {\n *     concurrency: 5,\n *     maxRetries: 3,\n *     eventManager,\n *     logger,\n *   }\n * );\n *\n * processor.start();\n *\n * // Later...\n * await processor.stop();\n * ```\n */\nexport class QueueProcessor {\n  private running = false;\n  private workers: Promise<void>[] = [];\n  private intervalHandle?: globalThis.NodeJS.Timeout;\n  private readonly queue: InMemoryQueue;\n  private readonly processFunction: StorageQueueProcessFunction;\n  private readonly eventManager?: EventManager;\n  private readonly logger?: LoggerInterface;\n  private readonly config: {\n    concurrency: number;\n    interval: number;\n    maxRetries: number;\n  };\n\n  // eslint-disable-next-line complexity\n  constructor(\n    queue: InMemoryQueue,\n    processFunction: StorageQueueProcessFunction,\n    config?: StorageQueueProcessorConfig<EventManager>\n  ) {\n    this.queue = queue;\n    this.processFunction = processFunction;\n    this.eventManager = config?.eventManager;\n    this.logger = config?.logger;\n    this.config = {\n      concurrency: config?.concurrency ?? 1,\n      interval: config?.interval ?? QUEUE_PROCESSOR_CONSTANTS.DEFAULT_POLL_INTERVAL_MS,\n      maxRetries: config?.maxRetries ?? QUEUE_PROCESSOR_CONSTANTS.DEFAULT_MAX_RETRIES,\n    };\n\n    this.logger?.info('[QueueProcessor] Initialized', {\n      concurrency: this.config.concurrency,\n      interval: this.config.interval,\n      maxRetries: this.config.maxRetries,\n    });\n  }\n\n  /**\n   * Start the queue processor\n   * Begins polling the queue and processing operations\n   */\n  start(): void {\n    if (this.running) {\n      this.logger?.warn('[QueueProcessor] Already running, ignoring start()');\n      return;\n    }\n\n    this.running = true;\n    this.queue.setProcessing(true);\n\n    this.logger?.info('[QueueProcessor] Starting', {\n      concurrency: this.config.concurrency,\n      interval: this.config.interval,\n    });\n\n    // Start polling\n    this.intervalHandle = setInterval(() => {\n      void this.tick();\n    }, this.config.interval);\n\n    // Emit started event\n    void this.eventManager?.emit(STORAGE_EVENT_TYPE.QueueStarted, {\n      type: STORAGE_EVENT_TYPE.QueueStarted,\n      timestamp: new Date(),\n      data: {\n        concurrency: this.config.concurrency,\n      },\n    });\n  }\n\n  /**\n   * Stop the queue processor\n   * Waits for all active workers to complete\n   */\n  async stop(): Promise<void> {\n    if (!this.running) {\n      this.logger?.warn('[QueueProcessor] Not running, ignoring stop()');\n      return;\n    }\n\n    this.logger?.info('[QueueProcessor] Stopping', {\n      activeWorkers: this.workers.length,\n      queueSize: this.queue.size(),\n    });\n\n    this.running = false;\n\n    // Stop polling\n    if (this.intervalHandle) {\n      clearInterval(this.intervalHandle);\n      this.intervalHandle = undefined;\n    }\n\n    // Wait for all active workers to complete\n    await Promise.allSettled(this.workers);\n    this.workers = [];\n\n    this.queue.setProcessing(false);\n\n    this.logger?.info('[QueueProcessor] Stopped');\n\n    // Emit stopped event\n    void this.eventManager?.emit(STORAGE_EVENT_TYPE.QueueStopped, {\n      type: STORAGE_EVENT_TYPE.QueueStopped,\n      timestamp: new Date(),\n      data: {\n        statistics: this.queue.getStatistics(),\n      },\n    });\n  }\n\n  /**\n   * Check if processor is running\n   */\n  isRunning(): boolean {\n    return this.running;\n  }\n\n  /**\n   * Get number of active workers\n   */\n  getActiveWorkerCount(): number {\n    return this.workers.length;\n  }\n\n  /**\n   * Tick function - spawns workers up to concurrency limit\n   */\n  private async tick(): Promise<void> {\n    if (!this.running) return;\n\n    // Spawn workers up to concurrency limit\n    while (this.workers.length < this.config.concurrency && !this.queue.isEmpty()) {\n      const worker = this.processNext();\n      this.workers.push(worker);\n\n      // Remove worker from list when done\n      void worker.finally(() => {\n        this.workers = this.workers.filter(w => w !== worker);\n      });\n    }\n  }\n\n  /**\n   * Process next operation from queue\n   */\n  private async processNext(): Promise<void> {\n    const operation = await this.queue.dequeue();\n    if (!operation) return;\n\n    this.logger?.debug('[QueueProcessor] Processing operation', {\n      operationId: operation.id,\n      type: operation.type,\n      priority: operation.priority,\n      retryCount: operation.retryCount,\n    });\n\n    try {\n      // Emit processing event\n      await this.eventManager?.emit(STORAGE_EVENT_TYPE.OperationProcessing, {\n        type: STORAGE_EVENT_TYPE.OperationProcessing,\n        timestamp: new Date(),\n        data: {\n          operationId: operation.id,\n          operationType: operation.type,\n          fileId: operation.fileId,\n          priority: operation.priority,\n          retryCount: operation.retryCount,\n        },\n      });\n\n      // Process operation\n      await this.processFunction(operation);\n\n      // Increment processed count\n      this.queue.incrementProcessed();\n\n      this.logger?.info('[QueueProcessor] Operation completed', {\n        operationId: operation.id,\n        type: operation.type,\n        retryCount: operation.retryCount,\n      });\n\n      // Emit success event\n      await this.eventManager?.emit(STORAGE_EVENT_TYPE.OperationCompleted, {\n        type: STORAGE_EVENT_TYPE.OperationCompleted,\n        timestamp: new Date(),\n        data: {\n          operationId: operation.id,\n          operationType: operation.type,\n          fileId: operation.fileId,\n          priority: operation.priority,\n          retryCount: operation.retryCount,\n        },\n      });\n    } catch (error) {\n      await this.handleProcessingError(operation, error);\n    }\n  }\n\n  /**\n   * Handle processing error with retry logic\n   */\n  private async handleProcessingError(\n    operation: StorageQueuedOperation,\n    error: unknown\n  ): Promise<void> {\n    const shouldRetry = operation.retryCount < this.config.maxRetries;\n\n    this.logger?.error('[QueueProcessor] Operation failed', {\n      operationId: operation.id,\n      type: operation.type,\n      error: error instanceof Error ? error.message : String(error),\n      retryCount: operation.retryCount,\n      maxRetries: this.config.maxRetries,\n      willRetry: shouldRetry,\n    });\n\n    if (shouldRetry) {\n      // Increment retry count and re-queue\n      operation.retryCount++;\n\n      // Calculate exponential backoff delay\n      const delay = Math.min(\n        QUEUE_PROCESSOR_CONSTANTS.RETRY_BASE_DELAY_MS *\n          Math.pow(QUEUE_PROCESSOR_CONSTANTS.RETRY_EXPONENT_BASE, operation.retryCount),\n        QUEUE_PROCESSOR_CONSTANTS.MAX_RETRY_DELAY_MS\n      ); // Max 30 seconds\n\n      // Schedule retry\n      operation.scheduledAt = new Date(Date.now() + delay);\n\n      await this.queue.enqueue(operation);\n\n      this.logger?.debug('[QueueProcessor] Operation re-queued for retry', {\n        operationId: operation.id,\n        retryCount: operation.retryCount,\n        scheduledAt: operation.scheduledAt,\n        delay,\n      });\n\n      // Emit retry event\n      await this.eventManager?.emit(STORAGE_EVENT_TYPE.OperationRetry, {\n        type: STORAGE_EVENT_TYPE.OperationRetry,\n        timestamp: new Date(),\n        data: {\n          operationId: operation.id,\n          operationType: operation.type,\n          fileId: operation.fileId,\n          error,\n          retryCount: operation.retryCount,\n          maxRetries: this.config.maxRetries,\n          scheduledAt: operation.scheduledAt,\n        },\n      });\n    } else {\n      // Max retries reached, mark as failed\n      this.queue.incrementFailed();\n\n      this.logger?.error('[QueueProcessor] Operation failed permanently', {\n        operationId: operation.id,\n        type: operation.type,\n        retryCount: operation.retryCount,\n      });\n\n      // Emit failed event\n      await this.eventManager?.emit(STORAGE_EVENT_TYPE.OperationFailed, {\n        type: STORAGE_EVENT_TYPE.OperationFailed,\n        timestamp: new Date(),\n        data: {\n          operationId: operation.id,\n          operationType: operation.type,\n          fileId: operation.fileId,\n          error,\n          retryCount: operation.retryCount,\n          maxRetries: this.config.maxRetries,\n        },\n      });\n    }\n  }\n\n  /**\n   * Get processor statistics\n   */\n  getStatistics(): {\n    running: boolean;\n    activeWorkers: number;\n    queueStatistics: ReturnType<InMemoryQueue['getStatistics']>;\n  } {\n    return {\n      running: this.running,\n      activeWorkers: this.workers.length,\n      queueStatistics: this.queue.getStatistics(),\n    };\n  }\n}\n","/**\n * ComplianceManager\n *\n * **Adapter-Agnostic Compliance Engine**\n *\n * Handles all compliance checks independent of storage adapter:\n * - Works with Cloudflare R2, Supabase, custom adapters, etc.\n * - Enforces retention policies\n * - Manages immutability rules\n * - Handles soft delete and grace periods\n * - Provides compliance audit trail\n *\n * Compliance is enforced at the SERVICE level, not adapter level.\n * This ensures consistent compliance regardless of which adapter is used.\n *\n * @module @plyaz/storage/compliance\n */\n\nimport type {\n  StorageComplianceConfig,\n  StorageComplianceCheckResult,\n  StorageRetentionPolicy,\n  FileMetadata,\n  FILE_CATEGORY,\n  StorageDeleteComplianceOptions,\n  StorageSoftDeleteMetadata,\n  StorageJurisdictionContext,\n} from '@plyaz/types/storage';\nimport type { STORAGE_JURISDICTION, STORAGE_REGULATORY_FRAMEWORK } from '@plyaz/types/storage';\nimport type { StorageComplianceManagerConfig } from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../errors';\nimport type { LoggerInterface } from '@plyaz/types';\n\n/**\n * ComplianceManager\n *\n * Provides adapter-agnostic compliance enforcement\n */\nexport class ComplianceManager {\n  private readonly config: StorageComplianceConfig;\n  private readonly logger?: LoggerInterface;\n\n  constructor(config: StorageComplianceManagerConfig) {\n    this.config = config.compliance;\n    this.logger = config.logger;\n\n    // Validate config - default policy required only if enabled\n    if (this.config.enabled !== false && !this.config.defaultRetentionPolicy) {\n      throw new StoragePackageError(\n        'Default retention policy is required when compliance is enabled',\n        STORAGE_ERROR_CODES.COMPLIANCE_POLICY_NOT_FOUND,\n        { context: { config: this.config } }\n      );\n    }\n\n    this.logger?.info('[ComplianceManager] Initialized', {\n      enabled: this.config.enabled ?? true,\n      strictMode: this.config.strictMode ?? false,\n      hasDefaultPolicy: !!this.config.defaultRetentionPolicy,\n      categoryPolicies: Object.keys(this.config.retentionPolicies ?? {}).length,\n      immutablePatterns: (this.config.immutablePatterns ?? []).length,\n    });\n  }\n\n  /**\n   * Check if a file can be deleted based on compliance rules\n   *\n   * @param metadata - File metadata\n   * @param options - Delete compliance options\n   * @returns Compliance check result\n   */\n  // eslint-disable-next-line complexity\n  canDeleteFile(\n    metadata: FileMetadata,\n    options?: StorageDeleteComplianceOptions\n  ): StorageComplianceCheckResult {\n    // Bypass if compliance disabled\n    if (this.config.enabled === false) {\n      return { allowed: true };\n    }\n\n    // Force delete bypasses all checks\n    if (options?.force) {\n      this.logger?.warn('[ComplianceManager] Force delete requested', {\n        fileId: metadata.fileId,\n        filename: metadata.filename,\n      });\n      return { allowed: true, reason: 'Force delete requested' };\n    }\n\n    // Get applicable retention policy\n    const policy = this.getRetentionPolicy(metadata.category, options?.retentionOverride);\n\n    // Check immutability\n    const immutabilityCheck = this.checkImmutability(metadata, policy, options);\n    if (!immutabilityCheck.allowed) {\n      return immutabilityCheck;\n    }\n\n    // Check retention period\n    const retentionCheck = this.checkRetentionPeriod(metadata, policy, options);\n    if (!retentionCheck.allowed) {\n      return retentionCheck;\n    }\n\n    // All checks passed\n    return {\n      allowed: true,\n      policy,\n      shouldSoftDelete: policy.softDelete,\n      gracePeriodUntil: policy.gracePeriodDays\n        ? this.calculateGracePeriodEnd(new Date(), policy.gracePeriodDays)\n        : undefined,\n    };\n  }\n\n  /**\n   * Check if file is immutable\n   *\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private checkImmutability(\n    metadata: FileMetadata,\n    policy: StorageRetentionPolicy,\n    options?: StorageDeleteComplianceOptions\n  ): StorageComplianceCheckResult {\n    // Check policy-based immutability\n    if (policy.immutable) {\n      // Check if retention period has expired\n      const retentionEnd = this.calculateRetentionEnd(metadata.uploadedAt, policy.retentionYears);\n      const now = new Date();\n\n      if (now < retentionEnd) {\n        return {\n          allowed: false,\n          reason: 'File is immutable and under retention period',\n          policy,\n          isImmutable: true,\n          underRetention: true,\n          retentionUntil: retentionEnd,\n        };\n      }\n\n      // Retention expired, but still immutable\n      if (!options?.ignoreRetention) {\n        return {\n          allowed: false,\n          reason: 'File is immutable',\n          policy,\n          isImmutable: true,\n          underRetention: false,\n        };\n      }\n    }\n\n    // Check pattern-based immutability\n    if (this.config.immutablePatterns && metadata.path) {\n      for (const pattern of this.config.immutablePatterns) {\n        if (pattern.test(metadata.path)) {\n          return {\n            allowed: false,\n            reason: `File path matches immutable pattern: ${pattern}`,\n            policy,\n            isImmutable: true,\n            matchedPattern: pattern,\n          };\n        }\n      }\n    }\n\n    return { allowed: true };\n  }\n\n  /**\n   * Check retention period\n   *\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private checkRetentionPeriod(\n    metadata: FileMetadata,\n    policy: StorageRetentionPolicy,\n    options?: StorageDeleteComplianceOptions\n  ): StorageComplianceCheckResult {\n    // Skip retention check if explicitly ignored\n    if (options?.ignoreRetention) {\n      this.logger?.warn('[ComplianceManager] Retention check bypassed', {\n        fileId: metadata.fileId,\n      });\n      return { allowed: true };\n    }\n\n    // Calculate retention end date\n    const retentionEnd = this.calculateRetentionEnd(metadata.uploadedAt, policy.retentionYears);\n    const now = new Date();\n\n    // Check if under retention\n    if (now < retentionEnd) {\n      const shouldDefer = options?.retentionStrategy === 'defer';\n      const shouldSoftDelete = options?.retentionStrategy === 'soft-delete' || policy.softDelete;\n\n      return {\n        allowed: shouldDefer || shouldSoftDelete,\n        reason: `File is under retention until ${retentionEnd.toISOString()}`,\n        policy,\n        underRetention: true,\n        retentionUntil: retentionEnd,\n        shouldDefer,\n        shouldSoftDelete,\n      };\n    }\n\n    // Retention expired\n    return {\n      allowed: true,\n      policy,\n      underRetention: false,\n    };\n  }\n\n  /**\n   * Get retention policy for a file category\n   *\n   * @param category - File category\n   * @param override - Optional policy override\n   * @returns Retention policy\n   */\n  getRetentionPolicy(\n    category: FILE_CATEGORY,\n    override?: Partial<StorageRetentionPolicy>\n  ): StorageRetentionPolicy {\n    let policy: StorageRetentionPolicy;\n\n    // Check category-specific policy\n    if (this.config.retentionPolicies?.[category]) {\n      policy = this.config.retentionPolicies[category]!;\n    } else if (this.config.defaultRetentionPolicy) {\n      // Use default policy\n      policy = this.config.defaultRetentionPolicy;\n    } else {\n      // Fallback if no default policy (compliance disabled)\n      throw new StoragePackageError(\n        'No default retention policy configured',\n        STORAGE_ERROR_CODES.COMPLIANCE_POLICY_NOT_FOUND,\n        { context: { category } }\n      );\n    }\n\n    // Apply override if provided\n    if (override) {\n      policy = { ...policy, ...override };\n    }\n\n    return policy;\n  }\n\n  /**\n   * Calculate retention end date\n   *\n   * @param uploadedAt - Upload timestamp\n   * @param retentionYears - Retention period in years\n   * @returns Retention end date\n   */\n  calculateRetentionEnd(uploadedAt: Date, retentionYears: number): Date {\n    const retentionEnd = new Date(uploadedAt);\n    retentionEnd.setFullYear(retentionEnd.getFullYear() + retentionYears);\n    return retentionEnd;\n  }\n\n  /**\n   * Calculate grace period end date\n   *\n   * @param deletedAt - Deletion timestamp\n   * @param gracePeriodDays - Grace period in days\n   * @returns Grace period end date\n   */\n  calculateGracePeriodEnd(deletedAt: Date, gracePeriodDays: number): Date {\n    const gracePeriodEnd = new Date(deletedAt);\n    gracePeriodEnd.setDate(gracePeriodEnd.getDate() + gracePeriodDays);\n    return gracePeriodEnd;\n  }\n\n  /**\n   * Create soft delete metadata\n   *\n   * @param deletedBy - User ID who deleted the file\n   * @param reason - Deletion reason\n   * @param policy - Retention policy\n   * @returns Soft delete metadata\n   */\n  createSoftDeleteMetadata(\n    deletedBy: string,\n    reason?: string,\n    policy?: StorageRetentionPolicy\n  ): StorageSoftDeleteMetadata {\n    const deletedAt = new Date();\n    const gracePeriodUntil = policy?.gracePeriodDays\n      ? this.calculateGracePeriodEnd(deletedAt, policy.gracePeriodDays)\n      : undefined;\n\n    return {\n      deletedAt,\n      deletedBy,\n      reason,\n      permanentDeletionAt: gracePeriodUntil,\n      gracePeriodUntil,\n      canRestore: !!gracePeriodUntil && new Date() < gracePeriodUntil,\n    };\n  }\n\n  /**\n   * Enforce immutability on a file\n   *\n   * Throws error if file is immutable\n   *\n   * @param metadata - File metadata\n   * @throws {StoragePackageError} If file is immutable\n   */\n  enforceImmutability(metadata: FileMetadata): void {\n    const policy = this.getRetentionPolicy(metadata.category);\n    const check = this.checkImmutability(metadata, policy);\n\n    if (!check.allowed) {\n      throw new StoragePackageError(\n        check.reason ?? 'File is immutable and cannot be modified or deleted',\n        STORAGE_ERROR_CODES.COMPLIANCE_IMMUTABLE_FILE,\n        {\n          context: {\n            fileId: metadata.fileId,\n            filename: metadata.filename,\n            policy: check.policy,\n            matchedPattern: check.matchedPattern?.toString(),\n          },\n        }\n      );\n    }\n  }\n\n  /**\n   * Apply retention policy to a file\n   *\n   * Updates file metadata with retention information\n   *\n   * @param metadata - File metadata\n   * @returns Updated metadata with retention info\n   */\n  applyRetentionPolicy(metadata: FileMetadata): FileMetadata {\n    const policy = this.getRetentionPolicy(metadata.category);\n    const retentionEnd = this.calculateRetentionEnd(metadata.uploadedAt, policy.retentionYears);\n\n    this.logger?.debug('[ComplianceManager] Retention policy applied', {\n      fileId: metadata.fileId,\n      category: metadata.category,\n      policyType: policy.type,\n      retentionYears: policy.retentionYears,\n      retentionUntil: retentionEnd,\n      immutable: policy.immutable,\n    });\n\n    return {\n      ...metadata,\n      immutable: policy.immutable,\n      // Note: retentionUntil would need to be added to FileMetadata interface\n    };\n  }\n\n  /**\n   * Get compliance configuration\n   *\n   * @returns Compliance configuration\n   */\n  getConfig(): StorageComplianceConfig {\n    return this.config;\n  }\n\n  /**\n   * Check if compliance is enabled\n   *\n   * @returns True if compliance is enabled\n   */\n  isEnabled(): boolean {\n    return this.config.enabled !== false;\n  }\n\n  /**\n   * Check if strict mode is enabled\n   *\n   * @returns True if strict mode is enabled\n   */\n  isStrictMode(): boolean {\n    return this.config.strictMode === true;\n  }\n\n  // ============================================================================\n  // Jurisdiction-Aware Compliance Methods\n  // ============================================================================\n\n  /**\n   * Resolve applicable jurisdictions for a file\n   *\n   * Determines which jurisdictions' regulations apply based on:\n   * - User location\n   * - Entity (company/org) location\n   * - Storage location\n   * - Data category\n   * - Explicit jurisdictions\n   *\n   * @param context - Jurisdiction resolution context\n   * @returns Array of applicable jurisdictions\n   */\n  // eslint-disable-next-line complexity\n  resolveJurisdictions(context: StorageJurisdictionContext): STORAGE_JURISDICTION[] {\n    const jurisdictions: STORAGE_JURISDICTION[] = [];\n\n    // 1. Explicit jurisdictions take priority\n    if (context.explicitJurisdictions && context.explicitJurisdictions.length > 0) {\n      jurisdictions.push(...context.explicitJurisdictions);\n    }\n\n    // 2. Add user jurisdiction\n    if (context.userJurisdiction) {\n      if (!jurisdictions.includes(context.userJurisdiction)) {\n        jurisdictions.push(context.userJurisdiction);\n      }\n    }\n\n    // 3. Add entity jurisdiction\n    if (context.entityJurisdiction) {\n      if (!jurisdictions.includes(context.entityJurisdiction)) {\n        jurisdictions.push(context.entityJurisdiction);\n      }\n    }\n\n    // 4. Add storage jurisdiction\n    if (context.storageJurisdiction) {\n      if (!jurisdictions.includes(context.storageJurisdiction)) {\n        jurisdictions.push(context.storageJurisdiction);\n      }\n    }\n\n    // 5. If no jurisdictions resolved, use defaults\n    if (jurisdictions.length === 0 && this.config.defaultJurisdictions) {\n      jurisdictions.push(...this.config.defaultJurisdictions);\n    }\n\n    this.logger?.debug('[ComplianceManager] Resolved jurisdictions', {\n      context,\n      resolved: jurisdictions,\n    });\n\n    return jurisdictions;\n  }\n\n  /**\n   * Get applicable regulatory frameworks for jurisdictions\n   *\n   * @param category - File category\n   * @param jurisdictions - Applicable jurisdictions\n   * @returns Array of regulatory frameworks\n   */\n  getApplicableFrameworks(\n    category: FILE_CATEGORY,\n    jurisdictions: STORAGE_JURISDICTION[]\n  ): STORAGE_REGULATORY_FRAMEWORK[] {\n    const policy = this.getRetentionPolicy(category);\n    const frameworks: STORAGE_REGULATORY_FRAMEWORK[] = [];\n\n    // Get frameworks from policy\n    if (policy.regulatoryFrameworks) {\n      frameworks.push(...policy.regulatoryFrameworks);\n    }\n\n    // Get frameworks from jurisdiction rules\n    if (policy.jurisdictionRules) {\n      this.addJurisdictionFrameworks(policy.jurisdictionRules, jurisdictions, frameworks);\n    }\n\n    return frameworks;\n  }\n\n  /**\n   * Get jurisdiction-specific retention period\n   *\n   * Checks if a specific jurisdiction has an override in jurisdictionRules\n   *\n   * @param policy - Retention policy\n   * @param jurisdiction - Jurisdiction to check\n   * @returns Retention period in years, or undefined if no override\n   */\n  getJurisdictionSpecificRetention(\n    policy: StorageRetentionPolicy,\n    jurisdiction: STORAGE_JURISDICTION\n  ): number | undefined {\n    if (!policy.jurisdictionRules) {\n      return undefined;\n    }\n\n    const rule = policy.jurisdictionRules.find(r => r.jurisdiction === jurisdiction);\n    return rule?.retentionYears;\n  }\n\n  /**\n   * Resolve jurisdiction conflicts\n   *\n   * When multiple jurisdictions apply with different requirements,\n   * resolve conflicts using the configured strategy\n   *\n   * @param jurisdictions - Applicable jurisdictions\n   * @param policy - Retention policy\n   * @returns Resolved compliance requirements\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  resolveJurisdictionConflicts(\n    jurisdictions: STORAGE_JURISDICTION[],\n    policy: StorageRetentionPolicy\n  ): {\n    resolvedRetentionYears: number;\n    mandatoryRetention: boolean;\n    rightToErasure: boolean;\n    appliedStrategy: string;\n    conflicts: Array<{ jurisdiction: STORAGE_JURISDICTION; requirement: string }>;\n  } {\n    if (!policy.jurisdictionRules || policy.jurisdictionRules.length === 0) {\n      // No jurisdiction-specific rules, use default policy\n      return {\n        resolvedRetentionYears: policy.retentionYears,\n        mandatoryRetention: policy.immutable,\n        rightToErasure: !policy.immutable,\n        appliedStrategy: 'default-policy',\n        conflicts: [],\n      };\n    }\n\n    const strategy = this.config.jurisdictionConflictStrategy ?? 'mandatory-wins';\n    const applicableRules = policy.jurisdictionRules.filter(rule =>\n      jurisdictions.includes(rule.jurisdiction)\n    );\n\n    if (applicableRules.length === 0) {\n      return {\n        resolvedRetentionYears: policy.retentionYears,\n        mandatoryRetention: policy.immutable,\n        rightToErasure: !policy.immutable,\n        appliedStrategy: 'no-applicable-rules',\n        conflicts: [],\n      };\n    }\n\n    // Detect conflicts\n    const conflicts: Array<{ jurisdiction: STORAGE_JURISDICTION; requirement: string }> = [];\n    const retentionYears: number[] = [];\n    let hasMandatoryRetention = false;\n    let hasRightToErasure = false;\n\n    for (const rule of applicableRules) {\n      if (rule.retentionYears !== undefined) {\n        retentionYears.push(rule.retentionYears);\n      }\n      if (rule.mandatoryRetention) {\n        hasMandatoryRetention = true;\n        conflicts.push({\n          jurisdiction: rule.jurisdiction,\n          requirement: `Mandatory retention: ${rule.retentionYears} years`,\n        });\n      }\n      if (rule.rightToErasure) {\n        hasRightToErasure = true;\n        conflicts.push({\n          jurisdiction: rule.jurisdiction,\n          requirement: 'Right to erasure (GDPR)',\n        });\n      }\n    }\n\n    // Resolve based on strategy\n    let resolvedRetentionYears = policy.retentionYears;\n    let mandatoryRetention = policy.immutable;\n    let rightToErasure = !policy.immutable;\n\n    switch (strategy) {\n      case 'most-restrictive':\n        // Use the longest retention period\n        resolvedRetentionYears = Math.max(...retentionYears, policy.retentionYears);\n        mandatoryRetention = hasMandatoryRetention || policy.immutable;\n        rightToErasure = hasRightToErasure && !hasMandatoryRetention;\n        break;\n\n      case 'least-restrictive':\n        // Use the shortest retention period\n        resolvedRetentionYears = Math.min(...retentionYears, policy.retentionYears);\n        mandatoryRetention = hasMandatoryRetention && policy.immutable;\n        rightToErasure = hasRightToErasure || !policy.immutable;\n        break;\n\n      case 'mandatory-wins':\n        // Mandatory retention overrides right to erasure\n        if (hasMandatoryRetention) {\n          resolvedRetentionYears = Math.max(...retentionYears, policy.retentionYears);\n          mandatoryRetention = true;\n          rightToErasure = false; // Cannot exercise right to erasure during retention\n        } else {\n          resolvedRetentionYears = policy.retentionYears;\n          mandatoryRetention = policy.immutable;\n          rightToErasure = hasRightToErasure || !policy.immutable;\n        }\n        break;\n\n      case 'custom':\n      default:\n        // Use default policy values\n        resolvedRetentionYears = policy.retentionYears;\n        mandatoryRetention = policy.immutable;\n        rightToErasure = !policy.immutable;\n        break;\n    }\n\n    this.logger?.debug('[ComplianceManager] Resolved jurisdiction conflicts', {\n      jurisdictions,\n      strategy,\n      resolvedRetentionYears,\n      mandatoryRetention,\n      rightToErasure,\n      conflicts,\n    });\n\n    return {\n      resolvedRetentionYears,\n      mandatoryRetention,\n      rightToErasure,\n      appliedStrategy: strategy,\n      conflicts,\n    };\n  }\n\n  /**\n   * Check if file can be deleted in a specific jurisdiction\n   *\n   * Jurisdiction-aware version of canDeleteFile()\n   *\n   * @param metadata - File metadata\n   * @param jurisdiction - Jurisdiction to check against\n   * @param options - Delete compliance options\n   * @returns Compliance check result\n   */\n  // eslint-disable-next-line complexity\n  canDeleteFileInJurisdiction(\n    metadata: FileMetadata,\n    jurisdiction: STORAGE_JURISDICTION,\n\n    options?: StorageDeleteComplianceOptions\n  ): StorageComplianceCheckResult {\n    const policy = this.getRetentionPolicy(metadata.category, options?.retentionOverride);\n\n    // Check jurisdiction-specific rules\n    const jurisdictionRule = policy.jurisdictionRules?.find(\n      rule => rule.jurisdiction === jurisdiction\n    );\n\n    if (!jurisdictionRule) {\n      // No specific rule for this jurisdiction, use default\n      return this.canDeleteFile(metadata, options);\n    }\n\n    // Apply jurisdiction-specific retention\n    const retentionYears = jurisdictionRule.retentionYears ?? policy.retentionYears;\n    const retentionUntil = this.calculateRetentionEnd(metadata.uploadedAt, retentionYears);\n    const now = new Date();\n\n    // Check if under retention\n    if (now < retentionUntil && jurisdictionRule.mandatoryRetention && !options?.ignoreRetention) {\n      return {\n        allowed: false,\n        reason: `File is under mandatory retention in ${jurisdiction} until ${retentionUntil.toISOString()}`,\n        policy,\n        retentionUntil,\n        underRetention: true,\n        isImmutable: jurisdictionRule.mandatoryRetention,\n        applicableJurisdictions: [jurisdiction],\n        applicableFrameworks: jurisdictionRule.frameworks,\n      };\n    }\n\n    // Check right to erasure\n    if (jurisdictionRule.rightToErasure && options?.reason === 'gdpr_erasure') {\n      return {\n        allowed: true,\n        reason: `Right to erasure exercised in ${jurisdiction} (GDPR Article 17)`,\n        policy,\n        shouldSoftDelete: policy.softDelete,\n        applicableJurisdictions: [jurisdiction],\n        applicableFrameworks: jurisdictionRule.frameworks,\n      };\n    }\n\n    // Default check\n    return this.canDeleteFile(metadata, options);\n  }\n\n  /**\n   * Helper: Add frameworks from jurisdiction rules\n   */\n  private addJurisdictionFrameworks(\n    jurisdictionRules: Array<{ jurisdiction: STORAGE_JURISDICTION; frameworks?: string[] }>,\n    jurisdictions: STORAGE_JURISDICTION[],\n    frameworks: string[]\n  ): void {\n    for (const rule of jurisdictionRules) {\n      if (!jurisdictions.includes(rule.jurisdiction) || !rule.frameworks) {\n        continue;\n      }\n\n      for (const framework of rule.frameworks) {\n        if (!frameworks.includes(framework)) {\n          frameworks.push(framework);\n        }\n      }\n    }\n  }\n}\n","/**\n * Plugin Registry\n * @module @plyaz/storage/plugins\n *\n * Manages storage plugins and executes lifecycle hooks in priority order.\n */\n\nimport type {\n  StoragePlugin,\n  StoragePluginContext,\n  StoragePluginFile,\n  StoragePluginUploadResult,\n  StoragePluginDeleteResult,\n  StoragePluginAccessEvent,\n  StoragePluginExecutionResult,\n  BeforeUploadResult,\n  BeforeDeleteResult,\n  FileMetadata,\n  PluginRegistryConfig,\n  StoragePluginExecutionOptions,\n  StorageKnownPluginName,\n} from '@plyaz/types/storage';\nimport type { StorageLogger } from '../../core/logger';\nimport type { BaseStorageAdapter } from '../../adapters/base/BaseStorageAdapter';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types';\nimport { StoragePackageError } from '@plyaz/errors';\n\n/**\n * Plugin Registry constants\n */\nconst PLUGIN_REGISTRY_CONSTANTS = {\n  DEFAULT_MAX_EXECUTION_TIME_MS: 30000,\n} as const;\n\n/**\n * Plugin Registry\n *\n * Central registry for managing and executing storage plugins.\n * Handles plugin registration, initialization, and lifecycle hook execution.\n *\n * @example\n * ```typescript\n * const registry = new PluginRegistry({ logger });\n *\n * // Register plugins\n * await registry.register(virusScanPlugin);\n * await registry.register(metadataPlugin);\n *\n * // Execute beforeUpload hooks\n * const result = await registry.executeBeforeUpload(file, context);\n * if (!result.allowed) {\n *   throw new Error(result.reason);\n * }\n *\n * // Execute afterUpload hooks (async)\n * await registry.executeAfterUpload(uploadResult, context);\n * ```\n */\nexport class PluginRegistry {\n  private readonly plugins: Map<string, StoragePlugin> = new Map();\n  private readonly logger?: StorageLogger;\n  private readonly continueOnError: boolean;\n  private readonly maxExecutionTime: number;\n  private currentAdapter?: BaseStorageAdapter;\n\n  constructor(config: PluginRegistryConfig = {}) {\n    this.logger = config.logger as StorageLogger | undefined;\n    this.continueOnError = config.continueOnError ?? true;\n    this.maxExecutionTime =\n      config.maxExecutionTime ?? PLUGIN_REGISTRY_CONSTANTS.DEFAULT_MAX_EXECUTION_TIME_MS; // 30 seconds default\n  }\n\n  /**\n   * Register a plugin\n   * Initializes the plugin if it has an initialize method\n   */\n  // eslint-disable-next-line complexity\n  async register(plugin: StoragePlugin): Promise<void> {\n    if (this.plugins.has(plugin.name)) {\n      this.logger?.warn(`Plugin ${plugin.name} already registered, replacing`, {\n        oldPriority: this.plugins.get(plugin.name)?.priority,\n        newPriority: plugin.priority,\n      });\n    }\n\n    this.logger?.info(`Registering plugin: ${plugin.name}`, {\n      type: plugin.type,\n      priority: plugin.priority,\n      enabled: plugin.enabled,\n    });\n\n    // Set storage adapter if available\n    if (\n      this.currentAdapter &&\n      'setStorageAdapter' in plugin &&\n      typeof plugin.setStorageAdapter === 'function'\n    ) {\n      plugin.setStorageAdapter(this.currentAdapter);\n      this.logger?.debug(`Storage adapter set for plugin: ${plugin.name}`);\n    }\n\n    // Initialize plugin if it has an initialize method\n    if (plugin.initialize) {\n      try {\n        await plugin.initialize();\n        this.logger?.debug(`Plugin ${plugin.name} initialized successfully`);\n      } catch (error) {\n        this.logger?.error(`Failed to initialize plugin ${plugin.name}`, {\n          error: error instanceof Error ? error.message : String(error),\n        });\n        throw error;\n      }\n    }\n\n    this.plugins.set(plugin.name, plugin);\n  }\n\n  /**\n   * Unregister a plugin\n   * Destroys the plugin if it has a destroy method\n   */\n  // eslint-disable-next-line complexity\n  async unregister(name: string): Promise<void> {\n    const plugin = this.plugins.get(name);\n    if (!plugin) {\n      this.logger?.warn(`Plugin ${name} not found, cannot unregister`);\n      return;\n    }\n\n    this.logger?.info(`Unregistering plugin: ${name}`);\n\n    // Destroy plugin if it has a destroy method\n    if (plugin.destroy) {\n      try {\n        await plugin.destroy();\n        this.logger?.debug(`Plugin ${name} destroyed successfully`);\n      } catch (error) {\n        this.logger?.error(`Failed to destroy plugin ${name}`, {\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    }\n\n    this.plugins.delete(name);\n  }\n\n  /**\n   * Get a plugin by name\n   */\n  get(name: string): StoragePlugin | undefined {\n    return this.plugins.get(name);\n  }\n\n  /**\n   * Get all registered plugins\n   */\n  getAll(): StoragePlugin[] {\n    return Array.from(this.plugins.values());\n  }\n\n  /**\n   * Set the storage adapter for all registered plugins\n   * Called by StorageService when adapter is initialized or changed\n   *\n   * @param adapter - The storage adapter instance\n   */\n  setStorageAdapter(adapter: BaseStorageAdapter): void {\n    this.currentAdapter = adapter;\n\n    this.logger?.debug('Setting storage adapter for all plugins', {\n      adapter: adapter.name,\n      pluginCount: this.plugins.size,\n    });\n\n    // Update adapter for all registered plugins\n    for (const plugin of this.plugins.values()) {\n      if ('setStorageAdapter' in plugin && typeof plugin.setStorageAdapter === 'function') {\n        plugin.setStorageAdapter(adapter);\n        this.logger?.debug(`Storage adapter updated for plugin: ${plugin.name}`);\n      }\n    }\n  }\n\n  /**\n   * Get enabled plugins sorted by priority (lower priority first)\n   */\n  private getEnabledPluginsSorted(): StoragePlugin[] {\n    return Array.from(this.plugins.values())\n      .filter(plugin => plugin.enabled !== false)\n      .sort((a, b) => a.priority - b.priority);\n  }\n\n  /**\n   * Filter plugins based on skip/only rules\n   */\n  private filterPlugins(\n    plugins: StoragePlugin[],\n    skipPlugins?: readonly StorageKnownPluginName[],\n    onlyPlugins?: readonly StorageKnownPluginName[]\n  ): StoragePlugin[] {\n    let filtered = plugins;\n    if (onlyPlugins && onlyPlugins.length > 0) {\n      filtered = filtered.filter(p => onlyPlugins.includes(p.name));\n    }\n    if (skipPlugins && skipPlugins.length > 0) {\n      filtered = filtered.filter(p => !skipPlugins.includes(p.name));\n    }\n    return filtered;\n  }\n\n  /**\n   * Execute beforeUpload hooks\n   * BLOCKING - All plugins must allow upload or it will be rejected\n   */\n  // eslint-disable-next-line complexity\n  async executeBeforeUpload(\n    file: StoragePluginFile,\n    context: StoragePluginContext,\n    options?: StoragePluginExecutionOptions\n  ): Promise<StoragePluginExecutionResult> {\n    const startTime = Date.now();\n    const plugins = this.filterPlugins(\n      this.getEnabledPluginsSorted(),\n      options?.skipPlugins,\n      options?.onlyPlugins\n    );\n    const errors: Array<{ plugin: string; error: Error }> = [];\n    let modifiedMetadata: Partial<FileMetadata> = {};\n    let pluginData: Record<string, unknown> = {};\n\n    this.logger?.debug(`Executing beforeUpload hooks for ${plugins.length} plugins`);\n\n    for (const plugin of plugins) {\n      if (!plugin.beforeUpload) continue;\n\n      try {\n        const result: BeforeUploadResult = await this.withTimeout(\n          plugin.beforeUpload.bind(plugin)(file, context),\n          this.maxExecutionTime,\n          `Plugin ${plugin.name} beforeUpload timeout`\n        );\n\n        // If upload is not allowed, reject immediately\n        if (!result.allowed) {\n          this.logger?.warn(`Upload rejected by plugin ${plugin.name}`, {\n            reason: result.reason,\n          });\n\n          return {\n            allowed: false,\n            reason: result.reason ?? `Upload rejected by plugin: ${plugin.name}`,\n            rejectedBy: plugin.name,\n            duration: Date.now() - startTime,\n            pluginsExecuted: plugins.indexOf(plugin) + 1,\n          };\n        }\n\n        // Merge modified metadata\n        if (result.modifiedMetadata) {\n          modifiedMetadata = { ...modifiedMetadata, ...result.modifiedMetadata };\n        }\n\n        // Merge plugin data\n        if (result.pluginData) {\n          pluginData = { ...pluginData, ...result.pluginData };\n        }\n      } catch (error) {\n        const err =\n          error instanceof Error\n            ? error\n            : new StoragePackageError(String(error), STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED, {\n                context: { plugin: plugin.name, hook: 'beforeUpload' },\n              });\n        errors.push({ plugin: plugin.name, error: err });\n\n        this.logger?.error(`Plugin ${plugin.name} beforeUpload failed`, {\n          error: err.message,\n        });\n\n        if (!this.continueOnError) {\n          return {\n            allowed: false,\n            reason: `Plugin ${plugin.name} failed: ${err.message}`,\n            rejectedBy: plugin.name,\n            duration: Date.now() - startTime,\n            pluginsExecuted: plugins.indexOf(plugin) + 1,\n            errors,\n          };\n        }\n      }\n    }\n\n    return {\n      allowed: true,\n      modifiedMetadata: Object.keys(modifiedMetadata).length > 0 ? modifiedMetadata : undefined,\n      pluginData: Object.keys(pluginData).length > 0 ? pluginData : undefined,\n      duration: Date.now() - startTime,\n      pluginsExecuted: plugins.length,\n      errors: errors.length > 0 ? errors : undefined,\n    };\n  }\n\n  /**\n   * Execute afterUpload hooks\n   * ASYNC - Runs in background, doesn't block\n   */\n  async executeAfterUpload(\n    result: StoragePluginUploadResult,\n    context: StoragePluginContext,\n    options?: StoragePluginExecutionOptions\n  ): Promise<void> {\n    const plugins = this.filterPlugins(\n      this.getEnabledPluginsSorted(),\n      options?.skipPlugins,\n      options?.onlyPlugins\n    );\n\n    this.logger?.debug(`Executing afterUpload hooks for ${plugins.length} plugins`);\n\n    // Execute all plugins in parallel (they're async anyway)\n    await Promise.allSettled(\n      plugins\n        .filter(plugin => plugin.afterUpload)\n        .map(async plugin => {\n          try {\n            await this.withTimeout(\n              plugin.afterUpload!(result, context),\n              this.maxExecutionTime,\n              `Plugin ${plugin.name} afterUpload timeout`\n            );\n          } catch (error) {\n            this.logger?.error(`Plugin ${plugin.name} afterUpload failed`, {\n              error: error instanceof Error ? error.message : String(error),\n            });\n          }\n        })\n    );\n  }\n\n  /**\n   * Execute beforeDelete hooks\n   * BLOCKING - All plugins must allow deletion or it will be rejected\n   */\n  // eslint-disable-next-line complexity\n  async executeBeforeDelete(\n    fileId: string,\n    metadata: FileMetadata | undefined,\n    context: StoragePluginContext,\n    options?: StoragePluginExecutionOptions\n  ): Promise<StoragePluginExecutionResult> {\n    const startTime = Date.now();\n    const plugins = this.filterPlugins(\n      this.getEnabledPluginsSorted(),\n      options?.skipPlugins,\n      options?.onlyPlugins\n    );\n    const errors: Array<{ plugin: string; error: Error }> = [];\n    let pluginData: Record<string, unknown> = {};\n\n    this.logger?.debug(`Executing beforeDelete hooks for ${plugins.length} plugins`);\n\n    for (const plugin of plugins) {\n      if (!plugin.beforeDelete) continue;\n\n      try {\n        const result: BeforeDeleteResult = await this.withTimeout(\n          plugin.beforeDelete.bind(plugin)(fileId, metadata, context),\n          this.maxExecutionTime,\n          `Plugin ${plugin.name} beforeDelete timeout`\n        );\n\n        // If deletion is not allowed, reject immediately\n        if (!result.allowed) {\n          this.logger?.warn(`Delete rejected by plugin ${plugin.name}`, {\n            reason: result.reason,\n          });\n\n          return {\n            allowed: false,\n            reason: result.reason ?? `Delete rejected by plugin: ${plugin.name}`,\n            rejectedBy: plugin.name,\n            duration: Date.now() - startTime,\n            pluginsExecuted: plugins.indexOf(plugin) + 1,\n          };\n        }\n\n        // Merge plugin data\n        if (result.pluginData) {\n          pluginData = { ...pluginData, ...result.pluginData };\n        }\n      } catch (error) {\n        const err =\n          error instanceof Error\n            ? error\n            : new StoragePackageError(String(error), STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED, {\n                context: { plugin: plugin.name, hook: 'beforeDelete' },\n              });\n        errors.push({ plugin: plugin.name, error: err });\n\n        this.logger?.error(`Plugin ${plugin.name} beforeDelete failed`, {\n          error: err.message,\n        });\n\n        if (!this.continueOnError) {\n          return {\n            allowed: false,\n            reason: `Plugin ${plugin.name} failed: ${err.message}`,\n            rejectedBy: plugin.name,\n            duration: Date.now() - startTime,\n            pluginsExecuted: plugins.indexOf(plugin) + 1,\n            errors,\n          };\n        }\n      }\n    }\n\n    return {\n      allowed: true,\n      pluginData: Object.keys(pluginData).length > 0 ? pluginData : undefined,\n      duration: Date.now() - startTime,\n      pluginsExecuted: plugins.length,\n      errors: errors.length > 0 ? errors : undefined,\n    };\n  }\n\n  /**\n   * Execute afterDelete hooks\n   * ASYNC - Runs in background, doesn't block\n   */\n  async executeAfterDelete(\n    result: StoragePluginDeleteResult,\n    context: StoragePluginContext,\n    options?: StoragePluginExecutionOptions\n  ): Promise<void> {\n    const plugins = this.filterPlugins(\n      this.getEnabledPluginsSorted(),\n      options?.skipPlugins,\n      options?.onlyPlugins\n    );\n\n    this.logger?.debug(`Executing afterDelete hooks for ${plugins.length} plugins`);\n\n    // Execute all plugins in parallel\n    await Promise.allSettled(\n      plugins\n        .filter(plugin => plugin.afterDelete)\n        .map(async plugin => {\n          try {\n            await this.withTimeout(\n              plugin.afterDelete!(result, context),\n              this.maxExecutionTime,\n              `Plugin ${plugin.name} afterDelete timeout`\n            );\n          } catch (error) {\n            this.logger?.error(`Plugin ${plugin.name} afterDelete failed`, {\n              error: error instanceof Error ? error.message : String(error),\n            });\n          }\n        })\n    );\n  }\n\n  /**\n   * Execute onAccess hooks\n   * ASYNC - Runs in background, doesn't block\n   */\n  async executeOnAccess(\n    event: StoragePluginAccessEvent,\n    context: StoragePluginContext,\n    options?: StoragePluginExecutionOptions\n  ): Promise<void> {\n    const plugins = this.filterPlugins(\n      this.getEnabledPluginsSorted(),\n      options?.skipPlugins,\n      options?.onlyPlugins\n    );\n\n    this.logger?.debug(`Executing onAccess hooks for ${plugins.length} plugins`);\n\n    // Execute all plugins in parallel\n    await Promise.allSettled(\n      plugins\n        .filter(plugin => plugin.onAccess)\n        .map(async plugin => {\n          try {\n            await this.withTimeout(\n              plugin.onAccess!(event, context),\n              this.maxExecutionTime,\n              `Plugin ${plugin.name} onAccess timeout`\n            );\n          } catch (error) {\n            this.logger?.error(`Plugin ${plugin.name} onAccess failed`, {\n              error: error instanceof Error ? error.message : String(error),\n            });\n          }\n        })\n    );\n  }\n\n  /**\n   * Check health of all plugins\n   */\n  async healthCheckAll(): Promise<Map<string, boolean>> {\n    const results = new Map<string, boolean>();\n    const plugins = Array.from(this.plugins.values());\n\n    for (const plugin of plugins) {\n      if (plugin.healthCheck) {\n        try {\n          const health = await plugin.healthCheck();\n          results.set(plugin.name, health.healthy);\n        } catch (error) {\n          this.logger?.error(`Health check failed for plugin ${plugin.name}`, {\n            error: error instanceof Error ? error.message : String(error),\n          });\n          results.set(plugin.name, false);\n        }\n      } else {\n        // If no health check method, assume healthy if enabled\n        results.set(plugin.name, plugin.enabled !== false);\n      }\n    }\n\n    return results;\n  }\n\n  /**\n   * Destroy all plugins\n   */\n  async destroyAll(): Promise<void> {\n    const plugins = Array.from(this.plugins.keys());\n\n    this.logger?.info(`Destroying ${plugins.length} plugins`);\n\n    for (const name of plugins) {\n      await this.unregister(name);\n    }\n  }\n\n  /**\n   * Helper: Execute promise with timeout\n   */\n  private async withTimeout<T>(\n    promise: Promise<T>,\n    timeoutMs: number,\n    timeoutMessage: string\n  ): Promise<T> {\n    return Promise.race([\n      promise,\n      new Promise<T>((_, reject) =>\n        setTimeout(\n          () =>\n            reject(\n              new StoragePackageError(timeoutMessage, STORAGE_ERROR_CODES.ADAPTER_TIMEOUT, {\n                context: { timeoutMs },\n              })\n            ),\n          timeoutMs\n        )\n      ),\n    ]);\n  }\n}\n","/**\n * Idempotency Store for Storage Webhook Processing\n *\n * Prevents duplicate processing of webhook events\n * Supports both in-memory and external storage (Redis, DB)\n */\n\nimport type { StorageIdempotencyRecord } from '@plyaz/types/storage';\nimport type { CoreInMemoryIdempotencyAdapterConfig } from '@plyaz/types/core';\nimport type { LoggerInterface } from '@plyaz/types';\n\n// Idempotency store constants\nconst SECONDS_PER_MINUTE = 60;\nconst MS_PER_SECOND = 1000;\nconst DEFAULT_TTL_MINUTES = 60; // 1 hour\nconst DEFAULT_CLEANUP_INTERVAL_MINUTES = 5;\nconst DEFAULT_MAX_KEYS = 10000;\nconst EVICTION_PERCENTAGE = 0.1; // Remove 10% of oldest keys when full\n\n/**\n * Idempotency Store for Storage Webhooks\n *\n * Prevents duplicate processing of webhook events using unique keys\n */\nexport class InMemoryIdempotencyAdapter {\n  private store: Map<string, StorageIdempotencyRecord> = new Map();\n  private cleanupTimer?: globalThis.NodeJS.Timeout;\n\n  private readonly defaultTTL: number;\n  private readonly cleanupInterval: number;\n  private readonly maxKeys: number;\n\n  constructor(\n    private config: CoreInMemoryIdempotencyAdapterConfig = {},\n    private logger: LoggerInterface | undefined = undefined\n  ) {\n    this.defaultTTL = config.defaultTTL ?? DEFAULT_TTL_MINUTES * SECONDS_PER_MINUTE * MS_PER_SECOND; // 1 hour\n    this.cleanupInterval =\n      config.cleanupInterval ??\n      DEFAULT_CLEANUP_INTERVAL_MINUTES * SECONDS_PER_MINUTE * MS_PER_SECOND; // 5 minutes\n    this.maxKeys = config.maxKeys ?? DEFAULT_MAX_KEYS;\n\n    // Start automatic cleanup\n    this.startCleanup();\n  }\n\n  /**\n   * Check if key has been processed (idempotency check)\n   *\n   * @param key - Unique idempotency key\n   * @returns True if already processed\n   */\n  async has(key: string): Promise<boolean> {\n    // Check in-memory store\n    const record = this.store.get(key);\n\n    if (!record) {\n      return false;\n    }\n\n    // Check if expired\n    if (record.expiresAt < new Date()) {\n      this.store.delete(key);\n      return false;\n    }\n\n    this.logger?.debug('Idempotency key found in memory', { key });\n    return true;\n  }\n\n  /**\n   * Mark key as processed\n   *\n   * @param key - Unique idempotency key\n   * @param ttl - Time to live in milliseconds (optional, uses default if not provided)\n   * @param metadata - Additional data to store with the key\n   */\n  async set(key: string, ttl?: number, metadata?: Record<string, unknown>): Promise<void> {\n    const effectiveTTL = ttl ?? this.defaultTTL;\n    const now = new Date();\n    const expiresAt = new Date(now.getTime() + effectiveTTL);\n\n    const record: StorageIdempotencyRecord = {\n      key,\n      processedAt: now,\n      expiresAt,\n      metadata,\n    };\n\n    // Store in memory\n    this.store.set(key, record);\n\n    // Check if we need to evict old keys\n    if (this.store.size > this.maxKeys) {\n      this.evictOldest();\n    }\n\n    this.logger?.debug('Stored idempotency key in memory', {\n      key,\n      ttl: effectiveTTL,\n      storeSize: this.store.size,\n    });\n  }\n\n  /**\n   * Remove key from store\n   *\n   * @param key - Idempotency key to remove\n   */\n  async delete(key: string): Promise<void> {\n    this.store.delete(key);\n    this.logger?.debug('Deleted idempotency key', { key });\n  }\n\n  /**\n   * Clear all keys (useful for testing)\n   */\n  async clear(): Promise<void> {\n    this.store.clear();\n    this.logger?.info('Cleared idempotency store');\n  }\n\n  /**\n   * Get store statistics\n   */\n  getStats(): {\n    size: number;\n    maxKeys: number;\n    oldestKey?: { key: string; age: number };\n  } {\n    let oldest: { key: string; age: number } | undefined;\n\n    if (this.store.size > 0) {\n      const now = Date.now();\n      for (const [key, record] of this.store.entries()) {\n        const age = now - record.processedAt.getTime();\n        if (!oldest || age > oldest.age) {\n          oldest = { key, age };\n        }\n      }\n    }\n\n    return {\n      size: this.store.size,\n      maxKeys: this.maxKeys,\n      oldestKey: oldest,\n    };\n  }\n\n  /**\n   * Start automatic cleanup of expired keys\n   */\n  private startCleanup(): void {\n    if (this.cleanupTimer) {\n      return;\n    }\n\n    this.cleanupTimer = setInterval(() => {\n      this.cleanup();\n    }, this.cleanupInterval);\n\n    // Prevent timer from keeping process alive\n    this.cleanupTimer.unref();\n\n    this.logger?.debug('Started idempotency cleanup', {\n      interval: this.cleanupInterval,\n    });\n  }\n\n  /**\n   * Stop automatic cleanup\n   */\n  stop(): void {\n    if (this.cleanupTimer) {\n      clearInterval(this.cleanupTimer);\n      this.cleanupTimer = undefined;\n      this.logger?.debug('Stopped idempotency cleanup');\n    }\n  }\n\n  /**\n   * Clean up expired keys\n   */\n  private cleanup(): void {\n    const now = new Date();\n    let cleaned = 0;\n\n    for (const [key, record] of this.store.entries()) {\n      if (record.expiresAt < now) {\n        this.store.delete(key);\n        cleaned++;\n      }\n    }\n\n    if (cleaned > 0) {\n      this.logger?.debug('Cleaned up expired idempotency keys', {\n        cleaned,\n        remaining: this.store.size,\n      });\n    }\n  }\n\n  /**\n   * Evict oldest keys when maxKeys is exceeded\n   */\n  private evictOldest(): void {\n    // Sort by processedAt and remove oldest 10%\n    const entries = Array.from(this.store.entries());\n    entries.sort((a, b) => a[1].processedAt.getTime() - b[1].processedAt.getTime());\n\n    const toRemove = Math.ceil(this.maxKeys * EVICTION_PERCENTAGE);\n    const removed = entries.slice(0, toRemove);\n\n    for (const [key] of removed) {\n      this.store.delete(key);\n    }\n\n    this.logger?.warn('Evicted oldest idempotency keys', {\n      evicted: toRemove,\n      remaining: this.store.size,\n    });\n  }\n}\n","/**\n * Redis Idempotency Store\n *\n * Redis-based implementation of the external idempotency store interface.\n * Provides persistent, distributed idempotency checking across multiple server instances.\n *\n * Features:\n * - Persistent storage (survives server restarts)\n * - Distributed support (multiple servers share same Redis)\n * - TTL support with automatic expiration\n * - High performance with Redis\n * - Optional dependency (graceful fallback if Redis unavailable)\n */\n\nimport type {\n  StorageExternalIdempotencyStore,\n  StorageIdempotencyRecord,\n} from '@plyaz/types/storage';\nimport type { CoreRedisIdempotencyAdapterConfig } from '@plyaz/types/core';\nimport { Redis, type RedisOptions } from 'ioredis';\nimport { StoragePackageError } from '@plyaz/errors';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types';\n\nconst KEY_PREFIX = 'webhook:idempotency:';\nconst DEFAULT_TTL_SECONDS = 3600; // 1 hour\n\n/**\n * Redis Idempotency Adapter constants\n */\nconst REDIS_IDEMPOTENCY_CONSTANTS = {\n  MILLISECONDS_PER_SECOND: 1000,\n} as const;\n\n/**\n * Redis Idempotency Store\n *\n * @example\n * ```typescript\n * import Redis from 'ioredis';\n * import { RedisIdempotencyAdapter } from '@plyaz/storage/webhooks';\n *\n * const redis = new Redis({\n *   host: 'localhost',\n *   port: 6379,\n *   password: 'your-password',\n * });\n *\n * const store = new RedisIdempotencyAdapter({ redis });\n *\n * // Use with WebhookManager\n * const webhookManager = new WebhookManager(eventManager, logger, {\n *   idempotency: {\n *     externalStore: store,\n *     defaultTTL: 3600000, // 1 hour in ms\n *   }\n * });\n * ```\n */\nexport class RedisIdempotencyAdapter implements StorageExternalIdempotencyStore {\n  private redis: Redis | null = null;\n  private readonly keyPrefix: string;\n  private readonly defaultTTL: number;\n  private readonly debug: boolean;\n  private redisOptions?: RedisOptions;\n\n  constructor(config: CoreRedisIdempotencyAdapterConfig) {\n    this.redis = (config.redis as Redis | undefined) ?? null;\n    this.redisOptions = config.redisOptions as RedisOptions | undefined;\n    this.keyPrefix = config.keyPrefix ?? KEY_PREFIX;\n    this.defaultTTL = config.defaultTTL ?? DEFAULT_TTL_SECONDS;\n    this.debug = config.debug ?? false;\n\n    // Lazy initialization if redis not provided\n    if (!this.redis && !this.redisOptions) {\n      throw new StoragePackageError(\n        'RedisIdempotencyAdapter requires either a redis client instance or redisOptions',\n        STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n        { context: { config } }\n      );\n    }\n  }\n\n  /**\n   * Get or create Redis client\n   */\n  private async getRedis(): Promise<Redis> {\n    if (this.redis) {\n      return this.redis;\n    }\n\n    if (!this.redisOptions) {\n      throw new StoragePackageError(\n        'Redis options are required to create Redis client',\n        STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n        { context: { hasRedis: !!this.redis, hasRedisOptions: !!this.redisOptions } }\n      );\n    }\n\n    try {\n      this.redis = new Redis(this.redisOptions);\n\n      // Handle connection errors\n      this.redis.on('error', err => {\n        if (this.debug) {\n          console.error('[RedisIdempotencyAdapter] Redis error:', err);\n        }\n      });\n\n      return this.redis;\n    } catch (error) {\n      throw new StoragePackageError(\n        'ioredis is not installed. Install it with: pnpm add ioredis',\n        STORAGE_ERROR_CODES.INITIALIZATION_FAILED,\n        { context: { dependency: 'ioredis', error } }\n      );\n    }\n  }\n\n  /**\n   * Build full Redis key with prefix\n   */\n  private buildKey(key: string): string {\n    return `${this.keyPrefix}${key}`;\n  }\n\n  /**\n   * Check if key exists\n   */\n  async has(key: string): Promise<boolean> {\n    try {\n      const redis = await this.getRedis();\n      const fullKey = this.buildKey(key);\n      const exists = await redis.exists(fullKey);\n\n      if (this.debug) {\n        console.log(`[RedisIdempotencyAdapter] has(${key}): ${exists === 1}`);\n      }\n\n      return exists === 1;\n    } catch (error) {\n      if (this.debug) {\n        console.error(`[RedisIdempotencyAdapter] has(${key}) error:`, error);\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Set key with TTL\n   */\n  async set(key: string, ttl: number, metadata?: Record<string, unknown>): Promise<void> {\n    try {\n      const redis = await this.getRedis();\n      const fullKey = this.buildKey(key);\n      const ttlSeconds = Math.floor(ttl / REDIS_IDEMPOTENCY_CONSTANTS.MILLISECONDS_PER_SECOND); // Convert ms to seconds\n\n      const record: StorageIdempotencyRecord = {\n        key,\n        processedAt: new Date(),\n        expiresAt: new Date(Date.now() + ttl),\n        metadata: metadata ?? {},\n      };\n\n      // Store as JSON with TTL\n      await redis.setex(fullKey, ttlSeconds, JSON.stringify(record));\n\n      if (this.debug) {\n        console.log(`[RedisIdempotencyAdapter] set(${key}, TTL: ${ttlSeconds}s)`);\n      }\n    } catch (error) {\n      if (this.debug) {\n        console.error(`[RedisIdempotencyAdapter] set(${key}) error:`, error);\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Get record by key\n   */\n  async get(key: string): Promise<StorageIdempotencyRecord | null> {\n    try {\n      const redis = await this.getRedis();\n      const fullKey = this.buildKey(key);\n      const data = await redis.get(fullKey);\n\n      if (!data) {\n        if (this.debug) {\n          console.log(`[RedisIdempotencyAdapter] get(${key}): null`);\n        }\n        return null;\n      }\n\n      const record = JSON.parse(data) as StorageIdempotencyRecord;\n\n      // Parse dates\n      record.processedAt = new Date(record.processedAt);\n      record.expiresAt = new Date(record.expiresAt);\n\n      if (this.debug) {\n        console.log(`[RedisIdempotencyAdapter] get(${key}): found`);\n      }\n\n      return record;\n    } catch (error) {\n      if (this.debug) {\n        console.error(`[RedisIdempotencyAdapter] get(${key}) error:`, error);\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Delete key\n   */\n  async delete(key: string): Promise<void> {\n    try {\n      const redis = await this.getRedis();\n      const fullKey = this.buildKey(key);\n      await redis.del(fullKey);\n\n      if (this.debug) {\n        console.log(`[RedisIdempotencyAdapter] delete(${key})`);\n      }\n    } catch (error) {\n      if (this.debug) {\n        console.error(`[RedisIdempotencyAdapter] delete(${key}) error:`, error);\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Clear all keys (optional)\n   */\n  async clear(): Promise<void> {\n    try {\n      const redis = await this.getRedis();\n\n      // Scan for all keys with prefix\n      const stream = redis.scanStream({\n        match: `${this.keyPrefix}*`,\n        count: 100,\n      });\n\n      const pipeline = redis.pipeline();\n      let keysToDelete = 0;\n\n      for await (const keys of stream) {\n        for (const key of keys as string[]) {\n          pipeline.del(key);\n          keysToDelete++;\n        }\n      }\n\n      if (keysToDelete > 0) {\n        await pipeline.exec();\n      }\n\n      if (this.debug) {\n        console.log(`[RedisIdempotencyAdapter] clear(): deleted ${keysToDelete} keys`);\n      }\n    } catch (error) {\n      if (this.debug) {\n        console.error('[RedisIdempotencyAdapter] clear() error:', error);\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Close Redis connection\n   */\n  async close(): Promise<void> {\n    if (this.redis) {\n      await this.redis.quit();\n      this.redis = null;\n\n      if (this.debug) {\n        console.log('[RedisIdempotencyAdapter] Connection closed');\n      }\n    }\n  }\n\n  /**\n   * Get Redis client (for advanced usage)\n   */\n  getClient(): Redis | null {\n    return this.redis;\n  }\n\n  /**\n   * Health check\n   */\n  async healthCheck(): Promise<boolean> {\n    try {\n      const redis = await this.getRedis();\n      const result = await redis.ping();\n      return result === 'PONG';\n    } catch (error) {\n      if (this.debug) {\n        console.error('[RedisIdempotencyAdapter] Health check failed:', error);\n      }\n      return false;\n    }\n  }\n}\n","/**\n * Idempotency Store Service\n *\n * Main service for idempotency checking with pluggable adapters.\n * Supports multiple storage backends: in-memory, Redis, and more.\n */\nimport type {\n  StorageExternalIdempotencyStore,\n  StorageIdempotencyRecord,\n} from '@plyaz/types/storage';\nimport type { LoggerInterface } from '@plyaz/types';\nimport type {\n  CoreIdempotencyStoreConfig,\n  CoreIdempotencyStoreType,\n  CoreInMemoryIdempotencyAdapterConfig,\n  CoreRedisIdempotencyAdapterConfig,\n} from '@plyaz/types/core';\nimport { InMemoryIdempotencyAdapter } from './adapters/InMemoryIdempotencyAdapter';\nimport { RedisIdempotencyAdapter } from './adapters/RedisIdempotencyAdapter';\nimport { StoragePackageError } from '@plyaz/errors';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types';\n\n/**\n * Idempotency Store Service\n *\n * Factory service that creates and manages idempotency store adapters\n *\n * @example\n * ```typescript\n * import { IdempotencyStoreService } from '@plyaz/storage/idempotency';\n * import type { CoreIdempotencyStoreConfig } from '@plyaz/types/core';\n *\n * // In-memory store (default)\n * const service = new IdempotencyStoreService({\n *   type: 'in-memory',\n *   options: {\n *     defaultTTL: 3600000,\n *     maxKeys: 10000,\n *   }\n * });\n *\n * // Redis store\n * import Redis from 'ioredis';\n * const redis = new Redis({ host: 'localhost', port: 6379 });\n *\n * const service = new IdempotencyStoreService({\n *   type: 'redis',\n *   options: {\n *     redis,\n *     keyPrefix: 'webhook:',\n *   }\n * });\n * ```\n */\nexport class IdempotencyStoreService implements StorageExternalIdempotencyStore {\n  private adapter: StorageExternalIdempotencyStore;\n  private logger?: LoggerInterface;\n\n  constructor(\n    config: CoreIdempotencyStoreConfig<CoreIdempotencyStoreType>,\n    logger?: LoggerInterface\n  ) {\n    this.logger = logger;\n    this.adapter = this.createAdapter(config);\n  }\n\n  /**\n   * Create adapter based on type\n   */\n  private createAdapter(\n    config: CoreIdempotencyStoreConfig<CoreIdempotencyStoreType>\n  ): StorageExternalIdempotencyStore {\n    const storeType: CoreIdempotencyStoreType = config.type;\n\n    switch (storeType) {\n      case 'in-memory':\n        return new InMemoryIdempotencyAdapter(\n          config.options as CoreInMemoryIdempotencyAdapterConfig,\n          this.logger\n        );\n\n      case 'redis':\n        return this.createRedisAdapter(config.options as CoreRedisIdempotencyAdapterConfig);\n\n      default:\n        throw new StoragePackageError(\n          `Unknown idempotency store type: ${storeType as string}`,\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { storeType } }\n        );\n    }\n  }\n\n  /**\n   * Lazy load Redis adapter (optional dependency)\n   */\n  private createRedisAdapter(\n    options: CoreRedisIdempotencyAdapterConfig\n  ): StorageExternalIdempotencyStore {\n    try {\n      return new RedisIdempotencyAdapter(options);\n    } catch (error) {\n      throw new StoragePackageError(\n        'Redis adapter requires ioredis package. Install with: pnpm add ioredis',\n        STORAGE_ERROR_CODES.INITIALIZATION_FAILED,\n        { context: { dependency: 'ioredis', error } }\n      );\n    }\n  }\n\n  /**\n   * Check if key exists\n   */\n  async has(key: string): Promise<boolean> {\n    return this.adapter.has(key);\n  }\n\n  /**\n   * Set key with TTL\n   */\n  async set(key: string, ttl: number, metadata?: Record<string, unknown>): Promise<void> {\n    return this.adapter.set(key, ttl, metadata);\n  }\n\n  /**\n   * Get record by key\n   */\n  async get(key: string): Promise<StorageIdempotencyRecord | null> {\n    if ('get' in this.adapter && typeof this.adapter.get === 'function') {\n      return this.adapter.get(key);\n    }\n    throw new StoragePackageError(\n      'Adapter does not support get() method',\n      STORAGE_ERROR_CODES.ADAPTER_UNSUPPORTED_OPERATION,\n      { context: { method: 'get' } }\n    );\n  }\n\n  /**\n   * Delete key\n   */\n  async delete(key: string): Promise<void> {\n    return this.adapter.delete(key);\n  }\n\n  /**\n   * Clear all keys (optional)\n   */\n  async clear(): Promise<void> {\n    if ('clear' in this.adapter && typeof this.adapter.clear === 'function') {\n      return this.adapter.clear();\n    }\n    throw new StoragePackageError(\n      'Adapter does not support clear() method',\n      STORAGE_ERROR_CODES.ADAPTER_UNSUPPORTED_OPERATION,\n      { context: { method: 'clear' } }\n    );\n  }\n\n  /**\n   * Get underlying adapter (for advanced usage)\n   */\n  getAdapter(): StorageExternalIdempotencyStore {\n    return this.adapter;\n  }\n\n  /**\n   * Health check\n   */\n  async healthCheck(): Promise<boolean> {\n    if ('healthCheck' in this.adapter && typeof this.adapter.healthCheck === 'function') {\n      return (this.adapter as RedisIdempotencyAdapter).healthCheck();\n    }\n    return true; // In-memory is always healthy\n  }\n}\n","/**\n * Retry Logic Utilities\n *\n * Provides exponential backoff retry functionality for storage operations\n */\n\nimport { RETRY_STRATEGY } from '@plyaz/types/storage';\nimport type { StorageRetryOptions } from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../errors';\n\n/**\n * Retry an async operation with exponential backoff\n *\n * @param operation - The async operation to retry\n * @param options - Retry configuration\n * @returns Promise resolving to operation result\n * @throws StoragePackageError if all retry attempts fail\n */\nexport async function retry<T>(\n  operation: () => Promise<T>,\n  options: StorageRetryOptions\n): Promise<T> {\n  const { maxAttempts, initialDelay, maxDelay = 30000, backoffMultiplier = 2, onRetry } = options;\n\n  let lastError: Error | unknown;\n  let delay = initialDelay;\n\n  for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n    try {\n      return await operation();\n    } catch (error) {\n      lastError = error;\n\n      // Don't retry on last attempt\n      if (attempt === maxAttempts) {\n        break;\n      }\n\n      // Handle retry callback and delay\n      await handleRetryAttempt(error, attempt, delay, onRetry);\n\n      // Calculate next delay with exponential backoff\n      delay = Math.min(delay * backoffMultiplier, maxDelay);\n    }\n  }\n\n  // All attempts failed - throw error with details\n  throw createRetryFailureError(maxAttempts, lastError);\n}\n\n/**\n * Handle a retry attempt by calling callback and waiting\n */\nasync function handleRetryAttempt(\n  error: unknown,\n  attempt: number,\n  delay: number,\n  onRetry?: (attempt: number, error: Error) => void\n): Promise<void> {\n  // Call retry callback if provided\n  if (onRetry && error instanceof Error) {\n    onRetry(attempt, error);\n  }\n\n  // Wait before retry\n  await sleep(delay);\n}\n\n/**\n * Create error for retry failure\n */\nfunction createRetryFailureError(maxAttempts: number, lastError: unknown): StoragePackageError {\n  return new StoragePackageError(\n    'Operation failed after all retry attempts',\n    STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED,\n    {\n      context: {\n        maxAttempts,\n        lastError: lastError instanceof Error ? lastError.message : String(lastError),\n      },\n      cause: lastError instanceof Error ? lastError : undefined,\n    }\n  );\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n  return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Options for calculating retry delay\n */\ninterface RetryDelayOptions {\n  strategy: RETRY_STRATEGY;\n  attempt: number;\n  initialDelay: number;\n  maxDelay?: number;\n  backoffMultiplier?: number;\n}\n\n/**\n * Calculate delay for retry attempt based on strategy\n *\n * @param options - Retry delay calculation options\n * @returns Delay in milliseconds\n */\nexport function calculateRetryDelay(options: RetryDelayOptions): number {\n  const { strategy, attempt, initialDelay, maxDelay = 30000, backoffMultiplier = 2 } = options;\n\n  switch (strategy) {\n    case RETRY_STRATEGY.ExponentialBackoff:\n      return Math.min(initialDelay * Math.pow(backoffMultiplier, attempt - 1), maxDelay);\n\n    case RETRY_STRATEGY.LinearBackoff:\n      return Math.min(initialDelay * attempt, maxDelay);\n\n    case RETRY_STRATEGY.FixedDelay:\n      return initialDelay;\n\n    case RETRY_STRATEGY.NoRetry:\n      return 0;\n\n    default:\n      return initialDelay;\n  }\n}\n","/**\n * Storage Webhook Manager\n *\n * Orchestrates storage webhook processing with support for:\n * - Multiple adapters per provider\n * - Middleware pipeline (pre/post processing)\n * - Idempotency handling\n * - Sequential execution with priority\n * - Error handling and recovery\n * - Integration with storage events\n */\n\nimport type { EventManager } from '../core/EventManager';\nimport type {\n  StorageWebhookAdapter,\n  StorageWebhookPayload,\n  StorageWebhookProcessingResult,\n  StorageWebhookMiddleware,\n  ProcessedStorageWebhookEvent,\n  StorageWebhookManagerConfig,\n  StorageWebhookRetryConfig,\n  STORAGE_WEBHOOK_EVENT_TYPE,\n  StorageExternalIdempotencyStore,\n} from '@plyaz/types/storage';\nimport { IdempotencyStoreService } from '../idempotency/IdempotencyStoreService';\nimport { InMemoryIdempotencyAdapter } from '../idempotency/adapters/InMemoryIdempotencyAdapter';\nimport {\n  STORAGE_EVENT_TYPE,\n  RETRY_STRATEGY,\n  WEBHOOK_EVENT_TYPE_MAPPING,\n} from '@plyaz/types/storage';\nimport { StoragePackageError } from '@plyaz/errors';\nimport { retry } from '../utils/retry';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types/errors';\nimport type { LoggerInterface } from '@plyaz/types';\n\n// Default webhook processing timeout\nconst DEFAULT_WEBHOOK_TIMEOUT_MS = 30000; // 30 seconds\nconst DEFAULT_PRIORITY = 100; // Default priority\n\n// Default retry configuration\nconst DEFAULT_RETRY_ENABLED = true;\nconst DEFAULT_RETRY_MAX_ATTEMPTS = 3;\nconst DEFAULT_RETRY_INITIAL_DELAY = 1000; // 1 second\nconst DEFAULT_RETRY_MAX_DELAY = 30000; // 30 seconds\nconst DEFAULT_RETRY_BACKOFF_MULTIPLIER = 2;\n\n// Default idempotency TTL\nconst DEFAULT_IDEMPOTENCY_TTL_MS = 3600000; // 1 hour\n\n// Non-retryable error codes (permanent failures)\nconst NON_RETRYABLE_ERROR_CODES = [\n  STORAGE_ERROR_CODES.WEBHOOK_SIGNATURE_INVALID,\n  STORAGE_ERROR_CODES.WEBHOOK_PAYLOAD_INVALID,\n  STORAGE_ERROR_CODES.INVALID_OPERATION,\n];\n\n/**\n * Storage Webhook Manager\n *\n * Manages webhook adapters and processes incoming storage webhooks with middleware support\n */\nexport class WebhookManager {\n  private readonly adapters: Map<string, StorageWebhookAdapter[]> = new Map();\n  private readonly middlewares: StorageWebhookMiddleware[] = [];\n  private readonly idempotencyStore: StorageExternalIdempotencyStore;\n\n  private readonly timeout: number;\n  private readonly enabled: boolean;\n  private readonly idempotencyTTL: number;\n  private readonly retryConfig: Omit<Required<StorageWebhookRetryConfig>, 'onRetry'> &\n    Pick<StorageWebhookRetryConfig, 'onRetry'>;\n\n  constructor(\n    private readonly eventManager: EventManager,\n    private readonly logger: LoggerInterface | undefined = undefined,\n    config: StorageWebhookManagerConfig = {}\n  ) {\n    this.timeout = config.timeout ?? DEFAULT_WEBHOOK_TIMEOUT_MS; // 30 seconds\n    this.enabled = config.enabled ?? true;\n\n    // Initialize idempotency configuration\n    this.idempotencyTTL = config.idempotency?.options?.defaultTTL ?? DEFAULT_IDEMPOTENCY_TTL_MS;\n    this.idempotencyStore = this.initializeIdempotencyStore(config, logger);\n\n    // Initialize retry configuration\n    this.retryConfig = this.initializeRetryConfig(config);\n\n    this.logInitialization();\n  }\n\n  /**\n   * Initialize idempotency store from config\n   */\n  private initializeIdempotencyStore(\n    config: StorageWebhookManagerConfig,\n    logger?: LoggerInterface\n  ): StorageExternalIdempotencyStore {\n    return new IdempotencyStoreService(config.idempotency ?? { type: 'in-memory' }, logger);\n  }\n\n  /**\n   * Initialize retry configuration from config\n   */\n  // eslint-disable-next-line complexity\n  private initializeRetryConfig(\n    config: StorageWebhookManagerConfig\n  ): Omit<Required<StorageWebhookRetryConfig>, 'onRetry'> &\n    Pick<StorageWebhookRetryConfig, 'onRetry'> {\n    return {\n      enabled: config.retry?.enabled ?? DEFAULT_RETRY_ENABLED,\n      strategy: config.retry?.strategy ?? RETRY_STRATEGY.ExponentialBackoff,\n      maxAttempts: config.retry?.maxAttempts ?? DEFAULT_RETRY_MAX_ATTEMPTS,\n      initialDelay: config.retry?.initialDelay ?? DEFAULT_RETRY_INITIAL_DELAY,\n      maxDelay: config.retry?.maxDelay ?? DEFAULT_RETRY_MAX_DELAY,\n      backoffMultiplier: config.retry?.backoffMultiplier ?? DEFAULT_RETRY_BACKOFF_MULTIPLIER,\n      nonRetryableErrorCodes: config.retry?.nonRetryableErrorCodes ?? NON_RETRYABLE_ERROR_CODES,\n      onRetry: config.retry?.onRetry,\n    };\n  }\n\n  /**\n   * Log initialization information\n   */\n  private logInitialization(): void {\n    this.logger?.info('Storage WebhookManager initialized', {\n      timeout: this.timeout,\n      enabled: this.enabled,\n      retryEnabled: this.retryConfig.enabled,\n      retryMaxAttempts: this.retryConfig.maxAttempts,\n    });\n  }\n\n  /**\n   * Register webhook adapter\n   *\n   * @param adapter - Webhook adapter instance\n   */\n  registerAdapter(adapter: StorageWebhookAdapter): void {\n    const key = this.getAdapterKey(adapter.providerName, adapter.eventType);\n    const existing = this.adapters.get(key) ?? [];\n\n    existing.push(adapter);\n\n    // Sort by priority (lower = higher priority)\n    existing.sort((a, b) => (a.priority ?? DEFAULT_PRIORITY) - (b.priority ?? DEFAULT_PRIORITY));\n\n    this.adapters.set(key, existing);\n\n    this.logger?.info('Storage webhook adapter registered', {\n      provider: adapter.providerName,\n      eventType: adapter.eventType,\n      priority: adapter.priority ?? DEFAULT_PRIORITY,\n      totalAdapters: existing.length,\n    });\n  }\n\n  /**\n   * Register multiple adapters\n   *\n   * @param adapters - Array of webhook adapters\n   */\n  registerAdapters(adapters: StorageWebhookAdapter[]): void {\n    adapters.forEach(adapter => this.registerAdapter(adapter));\n  }\n\n  /**\n   * Register middleware\n   *\n   * @param middleware - Webhook middleware\n   */\n  registerMiddleware(middleware: StorageWebhookMiddleware): void {\n    this.middlewares.push(middleware);\n\n    // Sort by priority (lower = runs earlier)\n    this.middlewares.sort(\n      (a, b) => (a.priority ?? DEFAULT_PRIORITY) - (b.priority ?? DEFAULT_PRIORITY)\n    );\n\n    this.logger?.debug('Storage webhook middleware registered', {\n      name: middleware.name,\n      priority: middleware.priority ?? DEFAULT_PRIORITY,\n      totalMiddlewares: this.middlewares.length,\n    });\n  }\n\n  /**\n   * Handle incoming webhook\n   *\n   * @param providerName - Provider name (aws-s3, r2, cloudinary, etc.)\n   * @param eventType - Storage event type\n   * @param payload - Raw webhook payload\n   * @returns Processing result\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  async handleWebhook(\n    providerName: string,\n    eventType: STORAGE_WEBHOOK_EVENT_TYPE | string,\n    payload: StorageWebhookPayload<unknown>\n  ): Promise<StorageWebhookProcessingResult> {\n    if (!this.enabled) {\n      this.logger?.warn('Storage webhook processing is disabled', { provider: providerName });\n      return {\n        success: false,\n        events: [],\n        error: new Error('Storage webhook processing is disabled'),\n      };\n    }\n\n    const startTime = Date.now();\n\n    try {\n      this.logger?.info('Processing storage webhook', {\n        provider: providerName,\n        eventType,\n        method: payload.method,\n        url: payload.url,\n      });\n\n      // Get adapters for this provider/eventType\n      const adapters = this.getAdapters(providerName, eventType);\n\n      if (adapters.length === 0) {\n        this.logger?.warn('No storage webhook adapter found', {\n          provider: providerName,\n          eventType,\n        });\n\n        return {\n          success: false,\n          events: [],\n          error: new Error(`No storage webhook adapter found for ${providerName}/${eventType}`),\n        };\n      }\n\n      // Execute middleware before processing\n      let modifiedPayload = payload;\n      for (const middleware of this.middlewares) {\n        if (middleware.before) {\n          // eslint-disable-next-line max-depth\n          try {\n            const result = await middleware.before(modifiedPayload);\n            // eslint-disable-next-line max-depth\n            if (result) {\n              modifiedPayload = result;\n            }\n          } catch (error) {\n            this.logger?.error('Middleware before() failed', {\n              middleware: middleware.name,\n              error,\n            });\n          }\n        }\n      }\n\n      // Process with adapters (in priority order)\n      let result: StorageWebhookProcessingResult | undefined;\n\n      for (const adapter of adapters) {\n        // Check if adapter should process this webhook\n        if (adapter.shouldProcess && !adapter.shouldProcess(modifiedPayload)) {\n          this.logger?.debug('Adapter skipped webhook', {\n            provider: adapter.providerName,\n            eventType: adapter.eventType,\n          });\n          continue;\n        }\n\n        try {\n          result = await this.processWithAdapter(adapter, modifiedPayload);\n          // eslint-disable-next-line max-depth\n          if (result.success) {\n            break; // First successful adapter wins\n          }\n        } catch (error) {\n          this.logger?.error('Adapter processing failed', {\n            provider: adapter.providerName,\n            error,\n          });\n\n          // eslint-disable-next-line max-depth\n          if (adapter.handleError) {\n            await adapter.handleError(error as Error, modifiedPayload);\n          }\n        }\n      }\n\n      result ??= {\n        success: false,\n        events: [],\n        error: new Error('All adapters failed to process webhook'),\n      };\n\n      // Execute middleware after processing\n      for (const middleware of this.middlewares) {\n        if (middleware.after) {\n          // eslint-disable-next-line max-depth\n          try {\n            const modifiedResult = await middleware.after(result, modifiedPayload);\n\n            // eslint-disable-next-line max-depth\n            if (modifiedResult) {\n              result = modifiedResult;\n            }\n          } catch (error) {\n            this.logger?.error('Middleware after() failed', {\n              middleware: middleware.name,\n              error,\n            });\n          }\n        }\n      }\n\n      // Add processing metadata\n      result.metadata = {\n        ...result.metadata,\n        processingTime: Date.now() - startTime,\n        eventCount: result.events.length,\n      };\n\n      this.logger?.info('Storage webhook processed', {\n        provider: providerName,\n        success: result.success,\n        events: result.events.length,\n        duplicate: result.duplicate,\n        processingTime: result.metadata.processingTime,\n      });\n\n      // Emit audit event for all webhook processing\n      await this.emitAuditEvent(providerName, eventType, payload, result);\n\n      return result;\n    } catch (error) {\n      const processingTime = Date.now() - startTime;\n\n      this.logger?.error('Storage webhook processing failed', {\n        provider: providerName,\n        eventType,\n        error,\n        processingTime,\n      });\n\n      // Execute middleware error handlers\n      for (const middleware of this.middlewares) {\n        if (middleware.onError) {\n          // eslint-disable-next-line max-depth\n          try {\n            await middleware.onError(error as Error, payload);\n          } catch (middlewareError) {\n            this.logger?.error('Middleware onError() failed', {\n              middleware: middleware.name,\n              error: middlewareError,\n            });\n          }\n        }\n      }\n\n      return {\n        success: false,\n        events: [],\n        error: error as Error,\n        metadata: {\n          processingTime,\n        },\n      };\n    }\n  }\n\n  /**\n   * Process webhook with a specific adapter\n   */\n\n  private async processWithAdapter(\n    adapter: StorageWebhookAdapter,\n    payload: StorageWebhookPayload<unknown>\n  ): Promise<StorageWebhookProcessingResult> {\n    // 1. Check idempotency (before retry - duplicates should not be retried)\n    const idempotencyKey = adapter.getIdempotencyKey\n      ? adapter.getIdempotencyKey(payload)\n      : undefined;\n\n    if (idempotencyKey) {\n      const alreadyProcessed = await this.idempotencyStore.has(idempotencyKey);\n\n      if (alreadyProcessed) {\n        this.logger?.info('Duplicate storage webhook detected', {\n          provider: adapter.providerName,\n          idempotencyKey,\n        });\n\n        return {\n          success: true,\n          events: [],\n          duplicate: true,\n        };\n      }\n    }\n\n    // 2. Process with retry if enabled\n    if (this.retryConfig.enabled) {\n      return await this.processWithRetry(adapter, payload, idempotencyKey);\n    }\n\n    // 3. Process without retry\n    return await this.executeWebhookProcessing(adapter, payload, idempotencyKey);\n  }\n\n  /**\n   * Process webhook with retry logic\n   */\n  private async processWithRetry(\n    adapter: StorageWebhookAdapter,\n    payload: StorageWebhookPayload<unknown>,\n    idempotencyKey?: string\n  ): Promise<StorageWebhookProcessingResult> {\n    const retryErrors: Array<{ attempt: number; error: string; timestamp: number }> = [];\n    let retryAttempts = 0;\n\n    try {\n      const result = await retry<StorageWebhookProcessingResult>(\n        () => this.executeWebhookProcessing(adapter, payload, idempotencyKey),\n        {\n          maxAttempts: this.retryConfig.maxAttempts,\n          initialDelay: this.retryConfig.initialDelay,\n          maxDelay: this.retryConfig.maxDelay,\n          backoffMultiplier: this.retryConfig.backoffMultiplier,\n          onRetry: (attempt, error) => {\n            retryAttempts = attempt;\n\n            // Track retry errors\n            retryErrors.push({\n              attempt,\n              error: error.message,\n              timestamp: Date.now(),\n            });\n\n            // Check if error is retryable\n            if (error instanceof StoragePackageError) {\n              const isNonRetryable = this.retryConfig.nonRetryableErrorCodes.includes(error.code);\n\n              if (isNonRetryable) {\n                this.logger?.warn('Non-retryable error encountered, stopping retries', {\n                  provider: adapter.providerName,\n                  errorCode: error.code,\n                  attempt,\n                });\n\n                // Throw to stop retries\n                throw error;\n              }\n            }\n\n            this.logger?.info('Retrying webhook processing', {\n              provider: adapter.providerName,\n              attempt,\n              maxAttempts: this.retryConfig.maxAttempts,\n              error: error.message,\n            });\n\n            // Call custom retry callback if provided\n            if (this.retryConfig.onRetry) {\n              this.retryConfig.onRetry(attempt, error, payload);\n            }\n          },\n        }\n      );\n\n      // Add retry metadata to successful result\n      if (retryAttempts > 0) {\n        result.metadata = {\n          ...result.metadata,\n          retryAttempts,\n          retryErrors,\n        };\n      }\n\n      return result;\n    } catch (error) {\n      // Max retries exceeded or non-retryable error\n      const result = {\n        success: false,\n        events: [],\n        error: error as Error,\n        metadata: {\n          retryAttempts,\n          maxRetriesExceeded: retryAttempts >= this.retryConfig.maxAttempts,\n          retryErrors,\n        },\n      };\n\n      // Emit DLQ event for permanently failed webhooks\n      if (retryAttempts >= this.retryConfig.maxAttempts) {\n        await this.emitDLQEvent(adapter, payload, error as Error, retryErrors);\n      }\n\n      return result;\n    }\n  }\n\n  /**\n   * Execute webhook processing (single attempt)\n   */\n  private async executeWebhookProcessing(\n    adapter: StorageWebhookAdapter,\n    payload: StorageWebhookPayload<unknown>,\n    idempotencyKey?: string\n  ): Promise<StorageWebhookProcessingResult> {\n    // 1. Verify signature\n    const verification = await adapter.verify(payload);\n\n    if (!verification.valid) {\n      this.logger?.warn('Storage webhook signature verification failed', {\n        provider: adapter.providerName,\n        error: verification.error,\n      });\n\n      throw new StoragePackageError(\n        `Signature verification failed: ${verification.error}`,\n        STORAGE_ERROR_CODES.WEBHOOK_SIGNATURE_INVALID,\n        { context: { provider: adapter.providerName, error: verification.error } }\n      );\n    }\n\n    // 2. Process webhook\n    const events = await Promise.race([adapter.process(payload), this.createTimeout(this.timeout)]);\n\n    // 3. Emit events via EventManager\n    for (const event of events) {\n      await this.emitEvent(event);\n    }\n\n    // 4. Mark as processed (idempotency)\n    if (idempotencyKey) {\n      await this.idempotencyStore.set(idempotencyKey, this.idempotencyTTL);\n    }\n\n    return {\n      success: true,\n      events,\n    };\n  }\n\n  /**\n   * Emit processed webhook event via EventManager\n   */\n  private async emitEvent(event: ProcessedStorageWebhookEvent): Promise<void> {\n    try {\n      // Map webhook event type to internal storage event name\n      const eventName = this.mapEventType(event.eventType);\n\n      await this.eventManager.emit(eventName, {\n        type: eventName,\n        timestamp: event.timestamp,\n        data: {\n          provider: event.provider,\n          objectKey: event.objectKey,\n          bucket: event.bucket,\n          operation: event.operation,\n          fileSize: event.fileSize,\n          contentType: event.contentType,\n          etag: event.etag,\n          versionId: event.versionId,\n          webhookSource: true,\n          ...event.metadata,\n        },\n      });\n\n      this.logger?.debug('Storage webhook event emitted', {\n        event: eventName,\n        objectKey: event.objectKey,\n        bucket: event.bucket,\n      });\n    } catch (error) {\n      this.logger?.error('Failed to emit storage webhook event', {\n        event: event.eventType,\n        objectKey: event.objectKey,\n        error,\n      });\n    }\n  }\n\n  /**\n   * Map webhook event type to internal storage event name\n   */\n  private mapEventType(eventType: STORAGE_WEBHOOK_EVENT_TYPE): STORAGE_EVENT_TYPE {\n    return WEBHOOK_EVENT_TYPE_MAPPING[eventType] ?? STORAGE_EVENT_TYPE.WebhookReceived;\n  }\n\n  /**\n   * Emit audit event for webhook processing\n   * Tracks all webhook processing for compliance and debugging\n   */\n  private async emitAuditEvent(\n    providerName: string,\n    eventType: string,\n    payload: StorageWebhookPayload<unknown>,\n    result: StorageWebhookProcessingResult\n  ): Promise<void> {\n    try {\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.WebhookProcessed, {\n        type: STORAGE_EVENT_TYPE.WebhookProcessed,\n        timestamp: new Date(),\n        data: {\n          provider: providerName,\n          eventType,\n          success: result.success,\n          duplicate: result.duplicate,\n          processingTime: result.metadata?.processingTime,\n          eventsEmitted: result.events.length,\n          retryAttempts: result.metadata?.retryAttempts,\n          error: result.error?.message,\n          url: payload.url,\n          method: payload.method,\n        },\n      });\n\n      this.logger?.debug('Webhook audit event emitted', {\n        provider: providerName,\n        eventType,\n        success: result.success,\n      });\n    } catch (error) {\n      this.logger?.error('Failed to emit webhook audit event', {\n        provider: providerName,\n        eventType,\n        error,\n      });\n    }\n  }\n\n  /**\n   * Emit DLQ (Dead Letter Queue) event for permanently failed webhooks\n   * Enables external systems to handle failed webhooks (alerting, persistence, retry)\n   */\n  private async emitDLQEvent(\n    adapter: StorageWebhookAdapter,\n    payload: StorageWebhookPayload<unknown>,\n    error: Error,\n    retryErrors: Array<{ attempt: number; error: string; timestamp: number }>\n  ): Promise<void> {\n    try {\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.WebhookRetryExhausted, {\n        type: STORAGE_EVENT_TYPE.WebhookRetryExhausted,\n        timestamp: new Date(),\n        data: {\n          provider: adapter.providerName,\n          eventType: adapter.eventType,\n          payload: {\n            url: payload.url,\n            method: payload.method,\n            headers: payload.headers,\n            body: payload.body,\n          },\n          error: {\n            message: error.message,\n            stack: error.stack,\n            name: error.name,\n          },\n          retryAttempts: retryErrors.length,\n          retryErrors,\n          firstAttemptTimestamp: retryErrors[0]?.timestamp,\n          lastAttemptTimestamp: retryErrors[retryErrors.length - 1]?.timestamp,\n          maxAttempts: this.retryConfig.maxAttempts,\n        },\n      });\n\n      this.logger?.warn('Webhook DLQ event emitted', {\n        provider: adapter.providerName,\n        eventType: adapter.eventType,\n        retryAttempts: retryErrors.length,\n      });\n    } catch (emitError) {\n      this.logger?.error('Failed to emit webhook DLQ event', {\n        provider: adapter.providerName,\n        eventType: adapter.eventType,\n        error: emitError,\n      });\n    }\n  }\n\n  /**\n   * Create timeout promise\n   */\n  private createTimeout(ms: number): Promise<never> {\n    return new Promise((_, reject) => {\n      setTimeout(() => {\n        reject(new Error(`Storage webhook processing timeout after ${ms}ms`));\n      }, ms);\n    });\n  }\n\n  /**\n   * Get adapters for provider/eventType\n   * Returns all webhook adapters sorted by priority\n   */\n  getAdapters(providerName: string, eventType: string): StorageWebhookAdapter[] {\n    const key = this.getAdapterKey(providerName, eventType);\n    return this.adapters.get(key) ?? [];\n  }\n\n  /**\n   * Get adapter key\n   */\n  private getAdapterKey(providerName: string, eventType: string): string {\n    return `${providerName}:${eventType}`;\n  }\n\n  /**\n   * Get all registered adapters\n   */\n  getAllAdapters(): StorageWebhookAdapter[] {\n    return Array.from(this.adapters.values()).flat();\n  }\n\n  /**\n   * Get adapter by provider and eventType\n   */\n  getAdapter(providerName: string, eventType: string): StorageWebhookAdapter | undefined {\n    const adapters = this.getAdapters(providerName, eventType);\n    return adapters[0]; // Return highest priority\n  }\n\n  /**\n   * Get idempotency store statistics\n   * Only available for in-memory adapter\n   */\n  getIdempotencyStats(): {\n    size: number;\n    maxKeys: number;\n    oldestKey?: { key: string; age: number };\n  } | null {\n    // Check if adapter is in-memory and supports getStats\n    if (this.idempotencyStore instanceof IdempotencyStoreService) {\n      const adapter = this.idempotencyStore.getAdapter();\n      if (adapter instanceof InMemoryIdempotencyAdapter) {\n        return adapter.getStats();\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Clear idempotency store (for testing)\n   */\n  async clearIdempotency(): Promise<void> {\n    if (this.idempotencyStore instanceof IdempotencyStoreService) {\n      await this.idempotencyStore.clear();\n    }\n  }\n\n  /**\n   * Stop the webhook manager\n   */\n  stop(): void {\n    // Stop in-memory adapter cleanup if applicable\n    if (this.idempotencyStore instanceof IdempotencyStoreService) {\n      const adapter = this.idempotencyStore.getAdapter();\n      if (adapter instanceof InMemoryIdempotencyAdapter) {\n        adapter.stop();\n      }\n    }\n    this.logger?.info('Storage WebhookManager stopped');\n  }\n}\n","/**\n * PresetManager - Device-aware variant preset management\n *\n * Manages transformation presets for generating optimized file variants\n * based on device type, file category, and custom configurations.\n *\n * Features:\n * - Built-in presets (profile-picture, post-image, hero-banner, video-streaming)\n * - Custom preset registration\n * - Device-aware variant selection (mobile, tablet, desktop, 4K, TV, watch)\n * - Default variants by file category\n * - Preset composition (combine multiple presets)\n * - Variant resolution and merging\n *\n * @example\n * ```ts\n * const presetManager = new PresetManager({\n *   enableBuiltInPresets: true,\n *   defaultDevice: STORAGE_DEVICE_TYPE.AUTO,\n * });\n *\n * // Register custom preset\n * presetManager.registerPreset({\n *   name: 'custom-profile',\n *   variants: ['thumbnail', 'medium', 'large'],\n *   format: 'webp',\n *   quality: 90,\n * });\n *\n * // Resolve variants for upload\n * const variants = presetManager.resolveVariants({\n *   presets: ['profile-picture'],\n *   device: STORAGE_DEVICE_TYPE.MOBILE,\n *   category: FILE_CATEGORY.ProfileImage,\n * });\n * ```\n */\n\nimport type {\n  FILE_CATEGORY,\n  STORAGE_DEVICE_TYPE,\n  StoragePresetConfig,\n  StorageVariantConfig,\n  StoragePresetManagerConfig,\n  StorageResolveVariantsOptions,\n} from '@plyaz/types/storage';\nimport type { LoggerInterface } from '@plyaz/types';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types';\nimport {\n  BUILT_IN_PRESETS,\n  DEFAULT_VARIANTS_BY_CATEGORY,\n  STANDARD_VARIANT_DEFINITIONS,\n} from '@plyaz/config';\nimport { StoragePackageError } from '@plyaz/errors';\n\n/**\n * PresetManager class\n * Manages variant presets and device-aware optimization\n */\nexport class PresetManager {\n  private presets: Map<string, StoragePresetConfig> = new Map();\n  private defaultVariants: Map<FILE_CATEGORY, string[]> = new Map();\n  private config: StoragePresetManagerConfig;\n  private logger?: unknown;\n\n  constructor(config: StoragePresetManagerConfig = {}) {\n    this.config = {\n      enableBuiltInPresets: true,\n      defaultDevice: 'auto', // STORAGE_DEVICE_TYPE.AUTO\n      enableDeviceDetection: true,\n      ...config,\n    };\n\n    this.logger = config.logger;\n\n    // Register built-in presets\n    if (this.config.enableBuiltInPresets !== false) {\n      this.registerBuiltInPresets();\n    }\n\n    // Register custom presets from config\n    if (config.presets) {\n      for (const preset of config.presets) {\n        this.registerPreset(preset);\n      }\n    }\n\n    // Load default variants by category\n    this.loadDefaultVariants();\n  }\n\n  /**\n   * Register a preset\n   */\n  registerPreset(preset: StoragePresetConfig): void {\n    if (!preset.name) {\n      throw new StoragePackageError(\n        'Preset name is required',\n        STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID\n      );\n    }\n\n    if (this.presets.has(preset.name)) {\n      this.log('warn', `Preset '${preset.name}' already exists. Overwriting.`);\n    }\n\n    this.presets.set(preset.name, {\n      ...preset,\n      enabled: preset.enabled !== false,\n    });\n\n    this.log('debug', `Registered preset: ${preset.name}`);\n  }\n\n  /**\n   * Get a preset by name\n   */\n  getPreset(name: string): StoragePresetConfig | undefined {\n    return this.presets.get(name);\n  }\n\n  /**\n   * Get all registered presets\n   */\n  getAllPresets(): StoragePresetConfig[] {\n    return Array.from(this.presets.values()).filter(p => p.enabled !== false);\n  }\n\n  /**\n   * Resolve variants from presets, custom variants, and device context\n   * This is the main entry point for variant resolution\n   */\n  // eslint-disable-next-line complexity\n  resolveVariants(options: StorageResolveVariantsOptions): StorageVariantConfig[] {\n    const {\n      presets: presetNames,\n      variants: customVariants,\n      device = this.config.defaultDevice,\n      category,\n      allDevices = false,\n    } = options;\n\n    // Cast device to StorageDeviceType (it comes as string from interface)\n    const deviceType = device as STORAGE_DEVICE_TYPE;\n\n    // If custom variants provided, use those directly\n    if (customVariants && customVariants.length > 0) {\n      return this.normalizeVariants(customVariants, deviceType, allDevices);\n    }\n\n    // Resolve from presets\n    let variantConfigs: StorageVariantConfig[] = [];\n\n    if (presetNames) {\n      const names = Array.isArray(presetNames) ? presetNames : [presetNames];\n      variantConfigs = this.resolvePresetsToVariants(names, deviceType, allDevices);\n    }\n\n    // If no presets and no custom variants, use category defaults\n    if (variantConfigs.length === 0 && category) {\n      const defaultVariantNames = this.getDefaultVariants(category);\n      if (defaultVariantNames.length > 0) {\n        variantConfigs = this.resolveVariantNames(defaultVariantNames, deviceType, allDevices);\n      }\n    }\n\n    return variantConfigs;\n  }\n\n  /**\n   * Resolve preset names to variant configurations\n   */\n  // eslint-disable-next-line complexity\n  private resolvePresetsToVariants(\n    presetNames: string[],\n    device: STORAGE_DEVICE_TYPE,\n    allDevices: boolean\n  ): StorageVariantConfig[] {\n    const allVariants: StorageVariantConfig[] = [];\n\n    for (const presetName of presetNames) {\n      const preset = this.presets.get(presetName);\n\n      if (!preset) {\n        this.log('warn', `Preset '${presetName}' not found. Skipping.`);\n        continue;\n      }\n\n      if (preset.enabled === false) {\n        this.log('debug', `Preset '${presetName}' is disabled. Skipping.`);\n        continue;\n      }\n\n      // Check if preset applies to this device\n      if (!allDevices && preset.devices && preset.devices.length > 0) {\n        if (!preset.devices.includes(device)) {\n          this.log(\n            'debug',\n            `Preset '${presetName}' does not apply to device '${device}'. Skipping.`\n          );\n          continue;\n        }\n      }\n\n      // Resolve preset variants\n      const presetVariants = this.resolvePresetVariants(preset, device, allDevices);\n      allVariants.push(...presetVariants);\n    }\n\n    // Remove duplicates by variant name (later variants override earlier)\n    const variantMap = new Map<string, StorageVariantConfig>();\n    for (const variant of allVariants) {\n      variantMap.set(variant.name, variant);\n    }\n\n    return Array.from(variantMap.values());\n  }\n\n  /**\n   * Resolve a single preset to variants\n   */\n  private resolvePresetVariants(\n    preset: StoragePresetConfig,\n    device: STORAGE_DEVICE_TYPE,\n    allDevices: boolean\n  ): StorageVariantConfig[] {\n    const variants = preset.variants;\n\n    // If variants are variant names (string[])\n    if (variants.length > 0 && typeof variants[0] === 'string') {\n      return this.resolveVariantNames(variants as string[], device, allDevices).map(v => ({\n        ...v,\n        // Apply preset defaults\n        format: v.format ?? preset.format,\n        quality: v.quality ?? preset.quality,\n        aspectRatio: v.aspectRatio ?? preset.aspectRatio,\n        codec: v.codec ?? preset.codec,\n      }));\n    }\n\n    // If variants are StorageVariantConfig objects\n    return (variants as StorageVariantConfig[])\n      .map(v => ({\n        ...v,\n        // Apply preset defaults if not set\n        format: v.format ?? preset.format,\n        quality: v.quality ?? preset.quality,\n        aspectRatio: v.aspectRatio ?? preset.aspectRatio,\n        codec: v.codec ?? preset.codec,\n      }))\n      .filter(v => {\n        // Filter by device if not allDevices\n        if (!allDevices && v.devices && v.devices.length > 0) {\n          return v.devices.includes(device);\n        }\n        return true;\n      });\n  }\n\n  /**\n   * Resolve variant names to variant configurations\n   */\n  private resolveVariantNames(\n    variantNames: string[],\n    device: STORAGE_DEVICE_TYPE,\n    allDevices: boolean\n  ): StorageVariantConfig[] {\n    // This is where we map variant names like 'thumbnail', 'mobile', 'desktop'\n    // to actual variant configurations based on device and best practices\n    const variants: StorageVariantConfig[] = [];\n\n    for (const name of variantNames) {\n      const variantConfig = this.getVariantConfigByName(name, device, allDevices);\n      if (variantConfig) {\n        variants.push(variantConfig);\n      }\n    }\n\n    return variants;\n  }\n\n  /**\n   * Get variant configuration by name\n   * Maps standard variant names to device-aware configurations\n   */\n  private getVariantConfigByName(\n    name: string,\n    device: STORAGE_DEVICE_TYPE,\n    allDevices: boolean\n  ): StorageVariantConfig | null {\n    // Get variant definition from config (cast name to access the record)\n    const baseConfig =\n      STANDARD_VARIANT_DEFINITIONS[name as keyof typeof STANDARD_VARIANT_DEFINITIONS];\n    if (!baseConfig) {\n      this.log('warn', `Unknown variant name: ${name}`);\n      return null;\n    }\n\n    // Check device compatibility\n    if (!allDevices && baseConfig.devices && baseConfig.devices.length > 0) {\n      if (!baseConfig.devices.includes(device)) {\n        return null; // Variant not compatible with this device\n      }\n    }\n\n    return {\n      name,\n      ...baseConfig,\n    } as StorageVariantConfig;\n  }\n\n  /**\n   * Normalize variants (string[] or StorageVariantConfig[]) to StorageVariantConfig[]\n   */\n  private normalizeVariants(\n    variants: string[] | StorageVariantConfig[],\n    device: STORAGE_DEVICE_TYPE,\n    allDevices: boolean\n  ): StorageVariantConfig[] {\n    if (variants.length === 0) return [];\n\n    // If string array, resolve to variant configs\n    if (typeof variants[0] === 'string') {\n      return this.resolveVariantNames(variants as string[], device, allDevices);\n    }\n\n    // If already variant configs, filter by device\n    return (variants as StorageVariantConfig[]).filter(v => {\n      if (!allDevices && v.devices && v.devices.length > 0) {\n        return v.devices.includes(device);\n      }\n      return true;\n    });\n  }\n\n  /**\n   * Get default variants for a file category\n   */\n  getDefaultVariants(category: FILE_CATEGORY): string[] {\n    return this.defaultVariants.get(category) ?? [];\n  }\n\n  /**\n   * Set default variants for a category\n   */\n  setDefaultVariants(category: FILE_CATEGORY, variantNames: string[]): void {\n    this.defaultVariants.set(category, variantNames);\n  }\n\n  /**\n   * Register built-in presets\n   */\n  private registerBuiltInPresets(): void {\n    for (const preset of BUILT_IN_PRESETS) {\n      this.registerPreset(preset);\n    }\n  }\n\n  /**\n   * Load default variants by category\n   */\n  private loadDefaultVariants(): void {\n    // Load from config if provided\n    if (this.config.defaultVariants) {\n      for (const [category, variants] of Object.entries(this.config.defaultVariants)) {\n        this.defaultVariants.set(category as FILE_CATEGORY, variants);\n      }\n    }\n\n    // Load built-in defaults\n    for (const [category, variants] of Object.entries(DEFAULT_VARIANTS_BY_CATEGORY)) {\n      if (!this.defaultVariants.has(category as FILE_CATEGORY) && Array.isArray(variants)) {\n        this.defaultVariants.set(category as FILE_CATEGORY, variants);\n      }\n    }\n  }\n\n  /**\n   * Log helper\n   */\n  private log(\n    level: 'debug' | 'info' | 'warn' | 'error',\n    message: string,\n    ...args: unknown[]\n  ): void {\n    const logger = this.logger as LoggerInterface;\n    if (logger && typeof logger[level] === 'function') {\n      logger[level](`[PresetManager] ${message}`, ...args);\n    }\n  }\n}\n","/**\n * File Path Generator Utility\n *\n * Provides multiple strategies for generating storage paths:\n * - Hash-based: Deterministic paths based on file content (enables deduplication)\n * - Entity-based: Organized by entity type and ID\n * - Date-based: Organized by upload date (year/month/day)\n * - Category-based: Organized by file category\n * - Flat: All files in a single directory (with unique IDs)\n */\n\nimport * as crypto from 'node:crypto';\nimport { PATH_GENERATION_STRATEGY } from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../errors';\nimport type {\n  PathGenerationConfig,\n  FileMetadata,\n  StorageHashPathOptions,\n  StorageEntityPathOptions,\n  StorageDatePathOptions,\n  StorageCategoryPathOptions,\n  StorageFlatPathOptions,\n  StorageTemplateVariables,\n} from '@plyaz/types/storage';\n\n/**\n * Constants for file path generation\n */\nconst PATH_GENERATOR_CONSTANTS = {\n  DEFAULT_HASH_LEVELS: 3, // Number of subdirectory levels for hash-based paths\n  HASH_CHARS_PER_LEVEL: 2, // Characters per subdirectory level\n  DATE_MONTH_OFFSET: 1, // JavaScript month index offset (0-based to 1-based)\n  DATE_PADDING_LENGTH: 2, // Padding length for month and day\n  DATE_PADDING_CHAR: '0', // Padding character for date parts\n} as const;\n\n/**\n * File Path Generator Class\n * Provides static methods for generating storage paths using various strategies\n */\nexport class FilePathGenerator {\n  /**\n   * Generate path using specified strategy\n   *\n   * @param config - Path generation configuration\n   * @param metadata - File metadata\n   * @param fileBuffer - File buffer (required for hash-based strategy)\n   * @returns Generated path\n   */\n  // eslint-disable-next-line complexity\n  static generate(\n    config: PathGenerationConfig,\n    metadata: Partial<FileMetadata>,\n    fileBuffer?: Buffer\n  ): string {\n    switch (config.strategy) {\n      case PATH_GENERATION_STRATEGY.HashBased:\n        if (!fileBuffer) {\n          throw new StoragePackageError(\n            'File buffer required for hash-based path generation',\n            STORAGE_ERROR_CODES.VALIDATION_FAILED,\n            { context: { strategy: config.strategy } }\n          );\n        }\n        return this.generateHashPath(fileBuffer, {\n          algorithm: 'sha256',\n          extension: metadata.extension,\n          prefix: 'files',\n        });\n\n      case PATH_GENERATION_STRATEGY.EntityBased:\n        if (\n          !metadata.entityType ||\n          !metadata.entityId ||\n          !metadata.category ||\n          !metadata.filename\n        ) {\n          throw new StoragePackageError(\n            'Entity type, entity ID, category, and filename required for entity-based path generation',\n            STORAGE_ERROR_CODES.VALIDATION_FAILED,\n            { context: { strategy: config.strategy, metadata } }\n          );\n        }\n        return this.generateEntityPath({\n          entityType: metadata.entityType,\n          entityId: metadata.entityId,\n          category: metadata.category,\n          filename: metadata.filename,\n          includeTimestamp: config.includeTimestamp ?? true,\n        });\n\n      case PATH_GENERATION_STRATEGY.DateBased:\n        if (!metadata.category || !metadata.filename) {\n          throw new StoragePackageError(\n            'Category and filename required for date-based path generation',\n            STORAGE_ERROR_CODES.VALIDATION_FAILED,\n            { context: { strategy: config.strategy, metadata } }\n          );\n        }\n        return this.generateDatePath({\n          category: metadata.category,\n          filename: metadata.filename,\n          baseDir: 'uploads',\n          includeUuid: true,\n        });\n\n      case PATH_GENERATION_STRATEGY.CategoryBased:\n        if (!metadata.category || !metadata.filename) {\n          throw new StoragePackageError(\n            'Category and filename required for category-based path generation',\n            STORAGE_ERROR_CODES.VALIDATION_FAILED,\n            { context: { strategy: config.strategy, metadata } }\n          );\n        }\n        return this.generateCategoryPath({\n          category: metadata.category,\n          filename: metadata.filename,\n          entityId: metadata.entityId,\n        });\n\n      case PATH_GENERATION_STRATEGY.FLAT:\n        if (!metadata.filename) {\n          throw new StoragePackageError(\n            'Filename required for flat path generation',\n            STORAGE_ERROR_CODES.VALIDATION_FAILED,\n            { context: { strategy: config.strategy, metadata } }\n          );\n        }\n        return this.generateFlatPath({\n          filename: metadata.filename,\n          baseDir: 'files',\n          includeUuid: true,\n        });\n\n      default:\n        throw new StoragePackageError(\n          `Unknown path generation strategy: ${config.strategy}`,\n          STORAGE_ERROR_CODES.VALIDATION_FAILED,\n          { context: { strategy: config.strategy } }\n        );\n    }\n  }\n\n  /**\n   * Generate hash-based path (deterministic)\n   * Same file content always generates same path (enables deduplication)\n   *\n   * Example: files/ab/c1/23/abc123456789.jpg\n   *\n   * @param fileBuffer - File buffer to hash\n   * @param options - Hash path options\n   * @returns Generated hash-based path\n   */\n  static generateHashPath(fileBuffer: Buffer, options: StorageHashPathOptions = {}): string {\n    const algorithm = options.algorithm ?? 'sha256';\n    const prefix = options.prefix ?? 'files';\n    const extension = options.extension ?? '';\n    const levels = options.levels ?? PATH_GENERATOR_CONSTANTS.DEFAULT_HASH_LEVELS;\n\n    // Generate hash\n    const hash = crypto.createHash(algorithm).update(fileBuffer).digest('hex');\n\n    // Split hash into subdirectories for better filesystem performance\n    // Example: abc123... -> ab/c1/23/abc123...\n    const parts: string[] = [prefix];\n    let offset = 0;\n\n    for (let i = 0; i < levels; i++) {\n      parts.push(hash.substring(offset, offset + PATH_GENERATOR_CONSTANTS.HASH_CHARS_PER_LEVEL));\n      offset += PATH_GENERATOR_CONSTANTS.HASH_CHARS_PER_LEVEL;\n    }\n\n    // Remaining hash as filename\n    const filename = hash.substring(offset);\n    parts.push(`${filename}${extension}`);\n\n    return parts.join('/');\n  }\n\n  /**\n   * Generate entity-based path (organized by entity)\n   *\n   * Example: athletes/abc123/videos/1706745600000-workout-video.mp4\n   *\n   * @param options - Entity path options\n   * @returns Generated entity-based path\n   */\n  static generateEntityPath(options: StorageEntityPathOptions): string {\n    const { entityType, entityId, category, filename, includeTimestamp = true } = options;\n\n    // Pluralize entity type and convert to lowercase\n    const entityFolder = this.pluralize(entityType.toLowerCase());\n\n    // Convert category to folder name\n    const categoryFolder = category.toLowerCase().replace(/_/g, '-');\n\n    // Sanitize filename\n    const safeName = this.sanitizeFilename(filename);\n\n    // Build path\n    const parts = [entityFolder, entityId, categoryFolder];\n\n    if (includeTimestamp) {\n      const timestamp = Date.now();\n      parts.push(`${timestamp}-${safeName}`);\n    } else {\n      parts.push(safeName);\n    }\n\n    return parts.join('/');\n  }\n\n  /**\n   * Generate raw adapter path (NO pluralization, NO transformations)\n   * Uses exact values as provided - matches what storage adapters actually use\n   *\n   * Example: organization/abc123/financial_document/report.pdf\n   *\n   * @param options - Entity path options\n   * @returns Generated raw adapter path (no pluralization)\n   */\n  static generateAdapterPath(options: StorageEntityPathOptions): string {\n    const { entityType, entityId, category, filename, includeTimestamp = false } = options;\n\n    // NO pluralization, NO transformations - use raw values as adapters do\n    const parts = [entityType, entityId, category];\n\n    if (includeTimestamp) {\n      const timestamp = Date.now();\n      parts.push(`${timestamp}-${filename}`);\n    } else {\n      parts.push(filename);\n    }\n\n    return parts.join('/');\n  }\n\n  /**\n   * Generate date-based path (organized by upload date)\n   *\n   * Example: uploads/2025/01/31/abc123-video.mp4\n   *\n   * @param options - Date path options\n   * @returns Generated date-based path\n   */\n  static generateDatePath(options: StorageDatePathOptions): string {\n    // eslint-disable-next-line no-unused-vars -- category is part of interface but not used in this implementation\n    const { category, filename, baseDir = 'uploads', includeUuid = true } = options;\n\n    const date = new Date();\n    const year = date.getFullYear().toString();\n    const month = String(date.getMonth() + PATH_GENERATOR_CONSTANTS.DATE_MONTH_OFFSET).padStart(\n      PATH_GENERATOR_CONSTANTS.DATE_PADDING_LENGTH,\n      PATH_GENERATOR_CONSTANTS.DATE_PADDING_CHAR\n    );\n    const day = String(date.getDate()).padStart(\n      PATH_GENERATOR_CONSTANTS.DATE_PADDING_LENGTH,\n      PATH_GENERATOR_CONSTANTS.DATE_PADDING_CHAR\n    );\n\n    // Sanitize filename\n    const safeName = this.sanitizeFilename(filename);\n\n    // Build path\n    const parts = [baseDir, year, month, day];\n\n    if (includeUuid) {\n      const uuid = crypto.randomUUID();\n      parts.push(`${uuid}-${safeName}`);\n    } else {\n      parts.push(safeName);\n    }\n\n    return parts.join('/');\n  }\n\n  /**\n   * Generate category-based path (organized by file category)\n   *\n   * Example: documents/user-abc123/report.pdf\n   *\n   * @param options - Category path options\n   * @returns Generated category-based path\n   */\n  static generateCategoryPath(options: StorageCategoryPathOptions): string {\n    const { category, filename, entityId } = options;\n\n    // Convert category to folder name\n    const categoryFolder = category.toLowerCase().replace(/_/g, '-');\n\n    // Sanitize filename\n    const safeName = this.sanitizeFilename(filename);\n\n    // Build path\n    const parts = [categoryFolder];\n\n    if (entityId) {\n      parts.push(`user-${entityId}`);\n    }\n\n    const uuid = crypto.randomUUID();\n    parts.push(`${uuid}-${safeName}`);\n\n    return parts.join('/');\n  }\n\n  /**\n   * Generate flat path (all files in same directory with unique IDs)\n   *\n   * Example: files/abc123-document.pdf\n   *\n   * @param options - Flat path options\n   * @returns Generated flat path\n   */\n  static generateFlatPath(options: StorageFlatPathOptions): string {\n    const { filename, baseDir = 'files', includeUuid = true } = options;\n\n    // Sanitize filename\n    const safeName = this.sanitizeFilename(filename);\n\n    if (includeUuid) {\n      const uuid = crypto.randomUUID();\n      return `${baseDir}/${uuid}-${safeName}`;\n    }\n\n    return `${baseDir}/${safeName}`;\n  }\n\n  /**\n   * Generate path from template\n   * Supports variables: {entityType}, {entityId}, {category}, {year}, {month}, {day}, {uuid}, {filename}, {hash}, {timestamp}\n   *\n   * Example template: \"{entityType}/{entityId}/{category}/{year}/{month}/{uuid}-{filename}\"\n   *\n   * @param template - Path template with variables\n   * @param variables - Template variables\n   * @returns Generated path\n   */\n  static generateFromTemplate(template: string, variables: StorageTemplateVariables): string {\n    let path = template;\n\n    // Replace all variables\n    for (const [key, value] of Object.entries(variables)) {\n      if (value !== undefined) {\n        const placeholder = `{${key}}`;\n        path = path.replace(new RegExp(placeholder, 'g'), String(value));\n      }\n    }\n\n    // Check if any unreplaced variables remain\n    const unreplaced = path.match(/\\{[^}]+\\}/g);\n    if (unreplaced) {\n      throw new StoragePackageError(\n        `Template contains unreplaced variables: ${unreplaced.join(', ')}`,\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { template, unreplaced } }\n      );\n    }\n\n    return path;\n  }\n\n  /**\n   * Sanitize filename (remove special characters, make filesystem-safe)\n   *\n   * @param filename - Original filename\n   * @returns Sanitized filename\n   */\n  static sanitizeFilename(filename: string): string {\n    return (\n      filename\n        .toLowerCase()\n        // Replace spaces with hyphens\n        .replace(/\\s+/g, '-')\n        // Remove special characters (keep alphanumeric, dots, hyphens)\n        .replace(/[^a-z0-9.-]/g, '-')\n        // Remove consecutive hyphens\n        .replace(/-+/g, '-')\n        // Remove leading/trailing hyphens\n        .replace(/^-|-$/g, '')\n    );\n  }\n\n  /**\n   * Extract file extension from filename\n   *\n   * @param filename - Filename\n   * @returns Extension with dot (e.g., \".jpg\") or empty string\n   */\n  static getExtension(filename: string): string {\n    const parts = filename.split('.');\n    return parts.length > 1 ? `.${parts[parts.length - 1].toLowerCase()}` : '';\n  }\n\n  /**\n   * Generate unique filename with timestamp and UUID\n   *\n   * @param originalFilename - Original filename\n   * @returns Unique filename\n   */\n  static generateUniqueFilename(originalFilename: string): string {\n    const extension = this.getExtension(originalFilename);\n    const baseName = originalFilename.replace(extension, '');\n    const safeName = this.sanitizeFilename(baseName);\n    const timestamp = Date.now();\n    const uuid = crypto.randomUUID().split('-')[0]; // Use first segment of UUID\n\n    return `${timestamp}-${uuid}-${safeName}${extension}`;\n  }\n\n  /**\n   * Pluralize entity type (simple implementation)\n   *\n   * @param entityType - Entity type\n   * @returns Pluralized entity type\n   */\n  private static pluralize(entityType: string): string {\n    // Simple pluralization rules\n    if (entityType.endsWith('y')) {\n      return entityType.slice(0, -1) + 'ies'; // entity -> entities\n    }\n    if (entityType.endsWith('s')) {\n      return entityType; // already plural\n    }\n    return entityType + 's'; // user -> users\n  }\n}\n\n/**\n * Helper function to generate storage path with specified strategy\n * Convenience wrapper around FilePathGenerator.generate\n *\n * @param strategy - Path generation strategy\n * @param metadata - File metadata\n * @param fileBuffer - File buffer (required for hash-based strategy)\n * @returns Generated path\n */\nexport function generateStoragePath(\n  strategy: PATH_GENERATION_STRATEGY,\n  metadata: Partial<FileMetadata>,\n  fileBuffer?: Buffer\n): string {\n  return FilePathGenerator.generate({ strategy }, metadata, fileBuffer);\n}\n","/**\n * File Validator Utility\n *\n * Provides comprehensive file validation including:\n * - MIME type detection from magic numbers (file signatures)\n * - MIME type validation against whitelist/blacklist\n * - File size validation\n * - Extension validation against MIME type\n * - Executable file detection for security\n * - Custom validation support\n */\n\nimport type { FileValidationResult, ValidationRule, FileMetadata } from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../errors';\n\n/**\n * Constants for file signature magic numbers\n */\nconst MAGIC_NUMBERS = {\n  // Common bytes\n  NULL: 0x00,\n  // PNG\n  PNG_1: 0x89,\n  PNG_2: 0x50,\n  PNG_3: 0x4e,\n  PNG_4: 0x47,\n  PNG_5: 0x0d,\n  PNG_6: 0x0a,\n  PNG_7: 0x1a,\n  PNG_8: 0x0a,\n  // JPEG\n  JPEG_1: 0xff,\n  JPEG_2: 0xd8,\n  JPEG_3: 0xff,\n  // GIF\n  GIF_G: 0x47,\n  GIF_I: 0x49,\n  GIF_F: 0x46,\n  GIF_8: 0x38,\n  GIF_7: 0x37,\n  GIF_9: 0x39,\n  GIF_A: 0x61,\n  // RIFF formats (WEBP, AVI, WAV)\n  RIFF_R: 0x52,\n  RIFF_I: 0x49,\n  RIFF_F: 0x46,\n  RIFF_F2: 0x46,\n  // BMP\n  BMP_B: 0x42,\n  BMP_M: 0x4d,\n  // ICO\n  ICO_1: 0x00,\n  ICO_2: 0x00,\n  ICO_3: 0x01,\n  ICO_4: 0x00,\n  // TIFF\n  TIFF_II: 0x49,\n  TIFF_MM: 0x4d,\n  TIFF_42: 0x2a,\n  // PDF\n  PDF_1: 0x25,\n  PDF_2: 0x50,\n  PDF_3: 0x44,\n  PDF_4: 0x46,\n  // ZIP/Office formats\n  ZIP_PK_1: 0x50,\n  ZIP_PK_2: 0x4b,\n  ZIP_PK_3: 0x03,\n  ZIP_PK_4: 0x04,\n  // RAR\n  RAR_1: 0x52,\n  RAR_2: 0x61,\n  RAR_3: 0x72,\n  RAR_4: 0x21,\n  RAR_5: 0x1a,\n  RAR_6: 0x07,\n  // 7Z\n  SEVEN_Z_1: 0x37,\n  SEVEN_Z_2: 0x7a,\n  SEVEN_Z_3: 0xbc,\n  SEVEN_Z_4: 0xaf,\n  SEVEN_Z_5: 0x27,\n  SEVEN_Z_6: 0x1c,\n  // GZIP\n  GZIP_1: 0x1f,\n  GZIP_2: 0x8b,\n  // TAR\n  TAR_U: 0x75,\n  TAR_S: 0x73,\n  TAR_T: 0x74,\n  TAR_A: 0x61,\n  TAR_R: 0x72,\n  // MP4/MOV video\n  MP4_SIZE_1: 0x00,\n  MP4_SIZE_2: 0x00,\n  MP4_SIZE_3: 0x00,\n  MP4_SIZE_4_18: 0x18,\n  MP4_SIZE_4_14: 0x14,\n  MP4_F: 0x66,\n  MP4_T: 0x74,\n  MP4_Y: 0x79,\n  MP4_P: 0x70,\n  // MKV/WEBM\n  MKV_1: 0x1a,\n  MKV_2: 0x45,\n  MKV_3: 0xdf,\n  MKV_4: 0xa3,\n  // FLV\n  FLV_F: 0x46,\n  FLV_L: 0x4c,\n  FLV_V: 0x56,\n  // MP3\n  MP3_1: 0xff,\n  MP3_2: 0xfb,\n  MP3_ID3_I: 0x49,\n  MP3_ID3_D: 0x44,\n  MP3_ID3_3: 0x33,\n  // OGG\n  OGG_O: 0x4f,\n  OGG_G: 0x67,\n  OGG_G2: 0x67,\n  OGG_S: 0x53,\n  // FLAC\n  FLAC_F: 0x66,\n  FLAC_L: 0x4c,\n  FLAC_A: 0x61,\n  FLAC_C: 0x43,\n  // XML/HTML\n  XML_LT: 0x3c,\n  XML_QM: 0x3f,\n  XML_X: 0x78,\n  XML_M: 0x6d,\n  XML_L: 0x6c,\n  HTML_BANG: 0x21,\n  HTML_D: 0x44,\n  HTML_O: 0x4f,\n  HTML_C: 0x43,\n  HTML_T: 0x54,\n  HTML_Y: 0x59,\n  HTML_P: 0x50,\n  HTML_E: 0x45,\n  HTML_H: 0x68,\n  HTML_T2: 0x74,\n  HTML_M: 0x6d,\n  HTML_L: 0x6c,\n  // Executables\n  EXE_M: 0x4d,\n  EXE_Z: 0x5a,\n  ELF_DEL: 0x7f,\n  ELF_E: 0x45,\n  ELF_L: 0x4c,\n  ELF_F: 0x46,\n  MACHO_1: 0xcf,\n  MACHO_2: 0xfa,\n  MACHO_3: 0xed,\n  MACHO_4: 0xfe,\n  // Constants for string matching\n  WEBP_STRING_OFFSET: 8,\n  WEBP_STRING_END: 12,\n  TAR_OFFSET: 257,\n  // Wildcard suffix length\n  WILDCARD_SUFFIX_LENGTH: 2,\n} as const;\n\n/**\n * File signature for magic number detection\n */\ninterface FileSignature {\n  /** Magic bytes to match */\n  bytes: number[];\n  /** MIME type for this signature */\n  mimeType: string;\n  /** Optional offset where signature starts */\n  offset?: number;\n}\n\n/**\n * Comprehensive file signatures for common file types\n * Based on magic numbers (file signatures)\n */\nconst FILE_SIGNATURES: Record<string, FileSignature> = {\n  // Images\n  png: {\n    bytes: [\n      MAGIC_NUMBERS.PNG_1,\n      MAGIC_NUMBERS.PNG_2,\n      MAGIC_NUMBERS.PNG_3,\n      MAGIC_NUMBERS.PNG_4,\n      MAGIC_NUMBERS.PNG_5,\n      MAGIC_NUMBERS.PNG_6,\n      MAGIC_NUMBERS.PNG_7,\n      MAGIC_NUMBERS.PNG_8,\n    ],\n    mimeType: 'image/png',\n  },\n  jpg: {\n    bytes: [MAGIC_NUMBERS.JPEG_1, MAGIC_NUMBERS.JPEG_2, MAGIC_NUMBERS.JPEG_3],\n    mimeType: 'image/jpeg',\n  },\n  gif87a: {\n    bytes: [\n      MAGIC_NUMBERS.GIF_G,\n      MAGIC_NUMBERS.GIF_I,\n      MAGIC_NUMBERS.GIF_F,\n      MAGIC_NUMBERS.GIF_8,\n      MAGIC_NUMBERS.GIF_7,\n      MAGIC_NUMBERS.GIF_A,\n    ],\n    mimeType: 'image/gif',\n  },\n  gif89a: {\n    bytes: [\n      MAGIC_NUMBERS.GIF_G,\n      MAGIC_NUMBERS.GIF_I,\n      MAGIC_NUMBERS.GIF_F,\n      MAGIC_NUMBERS.GIF_8,\n      MAGIC_NUMBERS.GIF_9,\n      MAGIC_NUMBERS.GIF_A,\n    ],\n    mimeType: 'image/gif',\n  },\n  webp: {\n    bytes: [\n      MAGIC_NUMBERS.RIFF_R,\n      MAGIC_NUMBERS.RIFF_I,\n      MAGIC_NUMBERS.RIFF_F,\n      MAGIC_NUMBERS.RIFF_F2,\n    ],\n    mimeType: 'image/webp',\n  }, // RIFF header, need to check WEBP at offset 8\n  bmp: { bytes: [MAGIC_NUMBERS.BMP_B, MAGIC_NUMBERS.BMP_M], mimeType: 'image/bmp' },\n  ico: {\n    bytes: [MAGIC_NUMBERS.ICO_1, MAGIC_NUMBERS.ICO_2, MAGIC_NUMBERS.ICO_3, MAGIC_NUMBERS.ICO_4],\n    mimeType: 'image/x-icon',\n  },\n  tiff1: {\n    bytes: [\n      MAGIC_NUMBERS.TIFF_II,\n      MAGIC_NUMBERS.TIFF_II,\n      MAGIC_NUMBERS.TIFF_42,\n      MAGIC_NUMBERS.NULL,\n    ],\n    mimeType: 'image/tiff',\n  },\n  tiff2: {\n    bytes: [\n      MAGIC_NUMBERS.TIFF_MM,\n      MAGIC_NUMBERS.TIFF_MM,\n      MAGIC_NUMBERS.NULL,\n      MAGIC_NUMBERS.TIFF_42,\n    ],\n    mimeType: 'image/tiff',\n  },\n\n  // Documents\n  pdf: {\n    bytes: [MAGIC_NUMBERS.PDF_1, MAGIC_NUMBERS.PDF_2, MAGIC_NUMBERS.PDF_3, MAGIC_NUMBERS.PDF_4],\n    mimeType: 'application/pdf',\n  },\n  docx: {\n    bytes: [\n      MAGIC_NUMBERS.ZIP_PK_1,\n      MAGIC_NUMBERS.ZIP_PK_2,\n      MAGIC_NUMBERS.ZIP_PK_3,\n      MAGIC_NUMBERS.ZIP_PK_4,\n    ],\n    mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n  },\n  xlsx: {\n    bytes: [\n      MAGIC_NUMBERS.ZIP_PK_1,\n      MAGIC_NUMBERS.ZIP_PK_2,\n      MAGIC_NUMBERS.ZIP_PK_3,\n      MAGIC_NUMBERS.ZIP_PK_4,\n    ],\n    mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n  },\n  pptx: {\n    bytes: [\n      MAGIC_NUMBERS.ZIP_PK_1,\n      MAGIC_NUMBERS.ZIP_PK_2,\n      MAGIC_NUMBERS.ZIP_PK_3,\n      MAGIC_NUMBERS.ZIP_PK_4,\n    ],\n    mimeType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n  },\n\n  // Archives\n  zip: {\n    bytes: [\n      MAGIC_NUMBERS.ZIP_PK_1,\n      MAGIC_NUMBERS.ZIP_PK_2,\n      MAGIC_NUMBERS.ZIP_PK_3,\n      MAGIC_NUMBERS.ZIP_PK_4,\n    ],\n    mimeType: 'application/zip',\n  },\n  rar: {\n    bytes: [\n      MAGIC_NUMBERS.RAR_1,\n      MAGIC_NUMBERS.RAR_2,\n      MAGIC_NUMBERS.RAR_3,\n      MAGIC_NUMBERS.RAR_4,\n      MAGIC_NUMBERS.RAR_5,\n      MAGIC_NUMBERS.RAR_6,\n    ],\n    mimeType: 'application/x-rar-compressed',\n  },\n  '7z': {\n    bytes: [\n      MAGIC_NUMBERS.SEVEN_Z_1,\n      MAGIC_NUMBERS.SEVEN_Z_2,\n      MAGIC_NUMBERS.SEVEN_Z_3,\n      MAGIC_NUMBERS.SEVEN_Z_4,\n      MAGIC_NUMBERS.SEVEN_Z_5,\n      MAGIC_NUMBERS.SEVEN_Z_6,\n    ],\n    mimeType: 'application/x-7z-compressed',\n  },\n  gz: { bytes: [MAGIC_NUMBERS.GZIP_1, MAGIC_NUMBERS.GZIP_2], mimeType: 'application/gzip' },\n  tar: {\n    bytes: [\n      MAGIC_NUMBERS.TAR_U,\n      MAGIC_NUMBERS.TAR_S,\n      MAGIC_NUMBERS.TAR_T,\n      MAGIC_NUMBERS.TAR_A,\n      MAGIC_NUMBERS.TAR_R,\n    ],\n    mimeType: 'application/x-tar',\n    offset: MAGIC_NUMBERS.TAR_OFFSET,\n  },\n\n  // Video\n  mp4: {\n    bytes: [\n      MAGIC_NUMBERS.MP4_SIZE_1,\n      MAGIC_NUMBERS.MP4_SIZE_2,\n      MAGIC_NUMBERS.MP4_SIZE_3,\n      MAGIC_NUMBERS.MP4_SIZE_4_18,\n      MAGIC_NUMBERS.MP4_F,\n      MAGIC_NUMBERS.MP4_T,\n      MAGIC_NUMBERS.MP4_Y,\n      MAGIC_NUMBERS.MP4_P,\n    ],\n    mimeType: 'video/mp4',\n  },\n  avi: {\n    bytes: [\n      MAGIC_NUMBERS.RIFF_R,\n      MAGIC_NUMBERS.RIFF_I,\n      MAGIC_NUMBERS.RIFF_F,\n      MAGIC_NUMBERS.RIFF_F2,\n    ],\n    mimeType: 'video/x-msvideo',\n  },\n  mkv: {\n    bytes: [MAGIC_NUMBERS.MKV_1, MAGIC_NUMBERS.MKV_2, MAGIC_NUMBERS.MKV_3, MAGIC_NUMBERS.MKV_4],\n    mimeType: 'video/x-matroska',\n  },\n  webm: {\n    bytes: [MAGIC_NUMBERS.MKV_1, MAGIC_NUMBERS.MKV_2, MAGIC_NUMBERS.MKV_3, MAGIC_NUMBERS.MKV_4],\n    mimeType: 'video/webm',\n  },\n  mov: {\n    bytes: [\n      MAGIC_NUMBERS.MP4_SIZE_1,\n      MAGIC_NUMBERS.MP4_SIZE_2,\n      MAGIC_NUMBERS.MP4_SIZE_3,\n      MAGIC_NUMBERS.MP4_SIZE_4_14,\n      MAGIC_NUMBERS.MP4_F,\n      MAGIC_NUMBERS.MP4_T,\n      MAGIC_NUMBERS.MP4_Y,\n      MAGIC_NUMBERS.MP4_P,\n    ],\n    mimeType: 'video/quicktime',\n  },\n  flv: {\n    bytes: [MAGIC_NUMBERS.FLV_F, MAGIC_NUMBERS.FLV_L, MAGIC_NUMBERS.FLV_V],\n    mimeType: 'video/x-flv',\n  },\n\n  // Audio\n  mp3: { bytes: [MAGIC_NUMBERS.MP3_1, MAGIC_NUMBERS.MP3_2], mimeType: 'audio/mpeg' },\n  mp3_id3: {\n    bytes: [MAGIC_NUMBERS.MP3_ID3_I, MAGIC_NUMBERS.MP3_ID3_D, MAGIC_NUMBERS.MP3_ID3_3],\n    mimeType: 'audio/mpeg',\n  }, // ID3v2\n  wav: {\n    bytes: [\n      MAGIC_NUMBERS.RIFF_R,\n      MAGIC_NUMBERS.RIFF_I,\n      MAGIC_NUMBERS.RIFF_F,\n      MAGIC_NUMBERS.RIFF_F2,\n    ],\n    mimeType: 'audio/wav',\n  },\n  ogg: {\n    bytes: [MAGIC_NUMBERS.OGG_O, MAGIC_NUMBERS.OGG_G, MAGIC_NUMBERS.OGG_G2, MAGIC_NUMBERS.OGG_S],\n    mimeType: 'audio/ogg',\n  },\n  flac: {\n    bytes: [MAGIC_NUMBERS.FLAC_F, MAGIC_NUMBERS.FLAC_L, MAGIC_NUMBERS.FLAC_A, MAGIC_NUMBERS.FLAC_C],\n    mimeType: 'audio/flac',\n  },\n  m4a: {\n    bytes: [\n      MAGIC_NUMBERS.MP4_SIZE_1,\n      MAGIC_NUMBERS.MP4_SIZE_2,\n      MAGIC_NUMBERS.MP4_SIZE_3,\n      MAGIC_NUMBERS.MP4_SIZE_4_18,\n      MAGIC_NUMBERS.MP4_F,\n      MAGIC_NUMBERS.MP4_T,\n      MAGIC_NUMBERS.MP4_Y,\n      MAGIC_NUMBERS.MP4_P,\n    ],\n    mimeType: 'audio/mp4',\n  },\n\n  // Text\n  txt: { bytes: [], mimeType: 'text/plain' }, // No magic number, check by extension\n  json: { bytes: [], mimeType: 'application/json' },\n  xml: {\n    bytes: [\n      MAGIC_NUMBERS.XML_LT,\n      MAGIC_NUMBERS.XML_QM,\n      MAGIC_NUMBERS.XML_X,\n      MAGIC_NUMBERS.XML_M,\n      MAGIC_NUMBERS.XML_L,\n    ],\n    mimeType: 'application/xml',\n  },\n  html: {\n    bytes: [\n      MAGIC_NUMBERS.XML_LT,\n      MAGIC_NUMBERS.HTML_BANG,\n      MAGIC_NUMBERS.HTML_D,\n      MAGIC_NUMBERS.HTML_O,\n      MAGIC_NUMBERS.HTML_C,\n      MAGIC_NUMBERS.HTML_T,\n      MAGIC_NUMBERS.HTML_Y,\n      MAGIC_NUMBERS.HTML_P,\n      MAGIC_NUMBERS.HTML_E,\n    ],\n    mimeType: 'text/html',\n  },\n  html2: {\n    bytes: [\n      MAGIC_NUMBERS.XML_LT,\n      MAGIC_NUMBERS.HTML_H,\n      MAGIC_NUMBERS.HTML_T2,\n      MAGIC_NUMBERS.HTML_M,\n      MAGIC_NUMBERS.HTML_L,\n    ],\n    mimeType: 'text/html',\n  },\n  css: { bytes: [], mimeType: 'text/css' },\n  js: { bytes: [], mimeType: 'application/javascript' },\n\n  // Executables (for security detection)\n  exe: { bytes: [MAGIC_NUMBERS.EXE_M, MAGIC_NUMBERS.EXE_Z], mimeType: 'application/x-msdownload' },\n  elf: {\n    bytes: [MAGIC_NUMBERS.ELF_DEL, MAGIC_NUMBERS.ELF_E, MAGIC_NUMBERS.ELF_L, MAGIC_NUMBERS.ELF_F],\n    mimeType: 'application/x-executable',\n  },\n  macho: {\n    bytes: [\n      MAGIC_NUMBERS.MACHO_1,\n      MAGIC_NUMBERS.MACHO_2,\n      MAGIC_NUMBERS.MACHO_3,\n      MAGIC_NUMBERS.MACHO_4,\n    ],\n    mimeType: 'application/x-mach-binary',\n  },\n};\n\n/**\n * MIME type to file extension mappings\n */\nconst MIME_TO_EXTENSIONS: Record<string, string[]> = {\n  // Images\n  'image/jpeg': ['.jpg', '.jpeg', '.jpe'],\n  'image/png': ['.png'],\n  'image/gif': ['.gif'],\n  'image/webp': ['.webp'],\n  'image/bmp': ['.bmp'],\n  'image/x-icon': ['.ico'],\n  'image/tiff': ['.tiff', '.tif'],\n  'image/svg+xml': ['.svg'],\n\n  // Documents\n  'application/pdf': ['.pdf'],\n  'application/msword': ['.doc'],\n  'application/vnd.openxmlformats-officedocument.wordprocessingml.document': ['.docx'],\n  'application/vnd.ms-excel': ['.xls'],\n  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': ['.xlsx'],\n  'application/vnd.ms-powerpoint': ['.ppt'],\n  'application/vnd.openxmlformats-officedocument.presentationml.presentation': ['.pptx'],\n\n  // Archives\n  'application/zip': ['.zip'],\n  'application/x-rar-compressed': ['.rar'],\n  'application/x-7z-compressed': ['.7z'],\n  'application/gzip': ['.gz'],\n  'application/x-tar': ['.tar'],\n\n  // Video\n  'video/mp4': ['.mp4', '.m4v'],\n  'video/x-msvideo': ['.avi'],\n  'video/x-matroska': ['.mkv'],\n  'video/webm': ['.webm'],\n  'video/quicktime': ['.mov'],\n  'video/x-flv': ['.flv'],\n  'video/mpeg': ['.mpeg', '.mpg'],\n\n  // Audio\n  'audio/mpeg': ['.mp3'],\n  'audio/wav': ['.wav'],\n  'audio/ogg': ['.ogg'],\n  'audio/flac': ['.flac'],\n  'audio/mp4': ['.m4a'],\n  'audio/aac': ['.aac'],\n\n  // Text\n  'text/plain': ['.txt'],\n  'application/json': ['.json'],\n  'application/xml': ['.xml'],\n  'text/html': ['.html', '.htm'],\n  'text/css': ['.css'],\n  'application/javascript': ['.js'],\n  'text/csv': ['.csv'],\n  'text/markdown': ['.md'],\n\n  // Others\n  'application/octet-stream': [], // Generic binary\n};\n\n/**\n * Executable file extensions for security detection\n */\nconst EXECUTABLE_EXTENSIONS = [\n  '.exe',\n  '.dll',\n  '.bat',\n  '.cmd',\n  '.com',\n  '.sh',\n  '.bash',\n  '.app',\n  '.dmg',\n  '.jar',\n  '.msi',\n  '.run',\n  '.deb',\n  '.rpm',\n  '.apk',\n  '.vbs',\n  '.js', // Can be executable in some contexts\n  '.ps1',\n  '.psm1',\n];\n\n/**\n * Dangerous MIME types that should be blocked by default\n */\nconst BLOCKED_MIME_TYPES = [\n  'application/x-msdownload', // .exe\n  'application/x-executable', // Linux executables\n  'application/x-mach-binary', // macOS executables\n  'application/x-sh', // Shell scripts\n  'application/x-bat', // Batch files\n  'application/x-apple-diskimage', // .dmg\n  'application/vnd.microsoft.portable-executable',\n];\n\n/**\n * File Validator Class\n * Provides static methods for comprehensive file validation\n */\nexport class FileValidator {\n  /**\n   * Validate a file against provided rules\n   *\n   * @param file - File buffer or stream\n   * @param filename - Original filename\n   * @param mimeType - Provided MIME type (will be verified)\n   * @param rules - Validation rules to apply\n   * @returns Validation result with success/failure and error details\n   */\n  static async validate(\n    file: Buffer,\n    filename: string,\n    mimeType: string,\n    rules?: ValidationRule\n  ): Promise<FileValidationResult> {\n    // 1. Detect actual MIME type from file contents\n    const detectedMimeType = this.detectMimeType(file);\n    const actualMimeType = detectedMimeType ?? mimeType;\n\n    // 2. Validate file size\n    const sizeValidation = this.validateSizeRules(file.length, rules);\n    if (!sizeValidation.valid) {\n      return sizeValidation;\n    }\n\n    // 3-4. Validate MIME type\n    const mimeValidation = this.validateMimeTypeRules(actualMimeType, rules);\n    if (!mimeValidation.valid) {\n      return mimeValidation;\n    }\n\n    // 5-7. Validate file extension and executables\n    const extensionValidation = this.validateExtensionRules(filename, actualMimeType, rules);\n    if (!extensionValidation.valid) {\n      return extensionValidation;\n    }\n\n    // 8. Custom validation\n    if (rules?.customValidation) {\n      const customValidation = await this.runCustomValidation(\n        file,\n        filename,\n        actualMimeType,\n        rules.customValidation\n      );\n      if (!customValidation.valid) {\n        return customValidation;\n      }\n    }\n\n    return { valid: true };\n  }\n\n  /**\n   * Validate file size against rules\n   */\n  private static validateSizeRules(fileSize: number, rules?: ValidationRule): FileValidationResult {\n    if (rules?.maxSize && fileSize > rules.maxSize) {\n      return {\n        valid: false,\n        errorCode: STORAGE_ERROR_CODES.FILE_TOO_LARGE,\n        errorMessage: `File size ${fileSize} bytes exceeds maximum ${rules.maxSize} bytes`,\n        context: { fileSize, maxSize: rules.maxSize },\n      };\n    }\n\n    if (rules?.minSize && fileSize < rules.minSize) {\n      return {\n        valid: false,\n        errorCode: STORAGE_ERROR_CODES.FILE_SIZE_INVALID,\n        errorMessage: `File size ${fileSize} bytes is below minimum ${rules.minSize} bytes`,\n        context: { fileSize, minSize: rules.minSize },\n      };\n    }\n\n    return { valid: true };\n  }\n\n  /**\n   * Validate MIME type against rules\n   */\n  private static validateMimeTypeRules(\n    mimeType: string,\n    rules?: ValidationRule\n  ): FileValidationResult {\n    // Check allowed MIME types\n    if (rules?.allowedMimeTypes && rules.allowedMimeTypes.length > 0) {\n      if (!this.validateMimeType(mimeType, rules.allowedMimeTypes)) {\n        return {\n          valid: false,\n          errorCode: STORAGE_ERROR_CODES.FILE_TYPE_NOT_ALLOWED,\n          errorMessage: `MIME type ${mimeType} is not allowed`,\n          context: { mimeType, allowedMimeTypes: rules.allowedMimeTypes },\n        };\n      }\n    }\n\n    // Check blocked MIME types\n    if (BLOCKED_MIME_TYPES.includes(mimeType)) {\n      return {\n        valid: false,\n        errorCode: STORAGE_ERROR_CODES.FILE_TYPE_NOT_ALLOWED,\n        errorMessage: `MIME type ${mimeType} is blocked for security reasons`,\n        context: { mimeType },\n      };\n    }\n\n    return { valid: true };\n  }\n\n  /**\n   * Validate file extension against rules\n   */\n  // eslint-disable-next-line complexity\n  private static validateExtensionRules(\n    filename: string,\n    mimeType: string,\n    rules?: ValidationRule\n  ): FileValidationResult {\n    const extension = this.getExtension(filename);\n\n    // Check allowed extensions\n    if (rules?.allowedExtensions && rules.allowedExtensions.length > 0) {\n      if (!rules.allowedExtensions.includes(extension)) {\n        return {\n          valid: false,\n          errorCode: STORAGE_ERROR_CODES.FILE_EXTENSION_INVALID,\n          errorMessage: `File extension ${extension} is not allowed`,\n          context: { extension, allowedExtensions: rules.allowedExtensions },\n        };\n      }\n    }\n\n    // Validate extension matches MIME type\n    if (!this.validateExtension(filename, mimeType)) {\n      return {\n        valid: false,\n        errorCode: STORAGE_ERROR_CODES.FILE_EXTENSION_MISMATCH,\n        errorMessage: `File extension does not match MIME type ${mimeType}`,\n        context: { filename, mimeType },\n      };\n    }\n\n    // Check for executable files (security)\n    if (!rules?.allowExecutables && this.isExecutable(filename)) {\n      return {\n        valid: false,\n        errorCode: STORAGE_ERROR_CODES.FILE_TYPE_NOT_ALLOWED,\n        errorMessage: 'Executable files are not allowed',\n        context: { filename },\n      };\n    }\n\n    return { valid: true };\n  }\n\n  /**\n   * Run custom validation function\n   */\n  private static async runCustomValidation(\n    file: Buffer,\n    filename: string,\n    mimeType: string,\n    customValidation: (file: Buffer, metadata: Partial<FileMetadata>) => boolean | Promise<boolean>\n  ): Promise<FileValidationResult> {\n    try {\n      const customValid = await customValidation(file, {\n        filename,\n        mimeType,\n      } as Partial<FileMetadata>);\n      if (!customValid) {\n        return {\n          valid: false,\n          errorCode: STORAGE_ERROR_CODES.VALIDATION_FAILED,\n          errorMessage: 'Custom validation failed',\n          context: { filename },\n        };\n      }\n    } catch (error) {\n      return {\n        valid: false,\n        errorCode: STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        errorMessage: error instanceof Error ? error.message : 'Custom validation error',\n        context: { error },\n      };\n    }\n\n    return { valid: true };\n  }\n\n  /**\n   * Validate MIME type against allowed types (with wildcard support)\n   *\n   * @param mimeType - MIME type to validate\n   * @param allowedTypes - Array of allowed MIME types (supports wildcards like \"image/*\")\n   * @returns true if MIME type is allowed\n   */\n  static validateMimeType(mimeType: string, allowedTypes: string[]): boolean {\n    return allowedTypes.some(allowed => {\n      // Support wildcards: image/* matches image/jpeg, image/png, etc.\n      if (allowed.endsWith('/*')) {\n        const prefix = allowed.slice(0, -MAGIC_NUMBERS.WILDCARD_SUFFIX_LENGTH);\n        return mimeType.startsWith(prefix + '/');\n      }\n      return mimeType === allowed;\n    });\n  }\n\n  /**\n   * Detect MIME type from file buffer using magic numbers (file signatures)\n   *\n   * @param fileBuffer - File buffer to analyze\n   * @returns Detected MIME type or null if unknown\n   */\n  // eslint-disable-next-line complexity\n  static detectMimeType(fileBuffer: Buffer): string | null {\n    if (!fileBuffer || fileBuffer.length === 0) {\n      return null;\n    }\n\n    // Check each file signature\n    for (const [name, signature] of Object.entries(FILE_SIGNATURES)) {\n      if (signature.bytes.length === 0) continue; // Skip text files without magic numbers\n\n      const offset = signature.offset ?? 0;\n      if (!this.matchesSignature(fileBuffer, signature.bytes, offset)) {\n        continue;\n      }\n\n      // Special case for WEBP: check for WEBP string at offset 8\n      if (name === 'webp') {\n        if (this.isValidWebp(fileBuffer)) {\n          return signature.mimeType;\n        }\n        continue;\n      }\n\n      return signature.mimeType;\n    }\n\n    return null;\n  }\n\n  /**\n   * Check if buffer is a valid WEBP file\n   */\n  private static isValidWebp(buffer: Buffer): boolean {\n    if (buffer.length < MAGIC_NUMBERS.WEBP_STRING_END) {\n      return false;\n    }\n    const webpMarker = buffer.toString(\n      'utf8',\n      MAGIC_NUMBERS.WEBP_STRING_OFFSET,\n      MAGIC_NUMBERS.WEBP_STRING_END\n    );\n    return webpMarker === 'WEBP';\n  }\n\n  /**\n   * Validate file size\n   *\n   * @param fileSize - File size in bytes\n   * @param maxSize - Maximum allowed size in bytes\n   * @returns true if size is valid\n   */\n  static validateFileSize(fileSize: number, maxSize: number): boolean {\n    return fileSize <= maxSize;\n  }\n\n  /**\n   * Validate file extension matches MIME type\n   *\n   * @param filename - Filename with extension\n   * @param mimeType - MIME type\n   * @returns true if extension matches MIME type\n   */\n  static validateExtension(filename: string, mimeType: string): boolean {\n    const ext = this.getExtension(filename);\n    const expectedExts = this.getExpectedExtensions(mimeType);\n\n    // If no expected extensions defined, consider it valid\n    if (expectedExts.length === 0) {\n      return true;\n    }\n\n    return expectedExts.includes(ext);\n  }\n\n  /**\n   * Check if file is executable (security check)\n   *\n   * @param filename - Filename with extension\n   * @returns true if file is executable\n   */\n  static isExecutable(filename: string): boolean {\n    const ext = this.getExtension(filename);\n    return EXECUTABLE_EXTENSIONS.includes(ext);\n  }\n\n  /**\n   * Get file extension from filename\n   *\n   * @param filename - Filename\n   * @returns Extension with dot (e.g., \".jpg\") or empty string\n   */\n  static getExtension(filename: string): string {\n    if (!filename) {\n      return '';\n    }\n    const parts = filename.split('.');\n    return parts.length > 1 ? `.${parts[parts.length - 1].toLowerCase()}` : '';\n  }\n\n  /**\n   * Get expected file extensions for a MIME type\n   *\n   * @param mimeType - MIME type\n   * @returns Array of valid extensions for this MIME type\n   */\n  static getExpectedExtensions(mimeType: string): string[] {\n    return MIME_TO_EXTENSIONS[mimeType] ?? [];\n  }\n\n  /**\n   * Match file signature at specified offset\n   *\n   * @param buffer - File buffer\n   * @param signature - Signature bytes to match\n   * @param offset - Byte offset to start matching (default: 0)\n   * @returns true if signature matches\n   */\n  private static matchesSignature(buffer: Buffer, signature: number[], offset = 0): boolean {\n    if (buffer.length < offset + signature.length) {\n      return false;\n    }\n\n    return signature.every((byte, index) => buffer[offset + index] === byte);\n  }\n}\n\n/**\n * Validate file and throw error if invalid\n * Convenience wrapper around FileValidator.validate that throws on failure\n *\n * @param file - File buffer\n * @param filename - Filename\n * @param mimeType - MIME type\n * @param rules - Validation rules\n * @throws StoragePackageError if validation fails\n */\nexport async function validateFile(\n  file: Buffer,\n  filename: string,\n  mimeType: string,\n  rules?: ValidationRule\n): Promise<void> {\n  const result = await FileValidator.validate(file, filename, mimeType, rules);\n\n  if (!result.valid) {\n    throw new StoragePackageError(\n      result.errorMessage ?? 'File validation failed',\n      result.errorCode ?? STORAGE_ERROR_CODES.VALIDATION_FAILED,\n      {\n        context: result.context,\n      }\n    );\n  }\n}\n","/**\n * StorageService - Main orchestrator for storage operations\n *\n * Responsibilities:\n * - Manage storage adapters via AdapterRegistry\n * - Handle event emission via EventManager\n * - Provide high-level file operations (upload, download, delete, getSignedUrl)\n * - Automatic failover on adapter failures\n * - Input validation\n * - Correlation ID tracking\n *\n * @example\n * ```ts\n * const service = new StorageService({\n *   adapters: [cloudflareAdapter, supabaseAdapter],\n *   eventHandlers: {\n *     [STORAGE_EVENT_TYPE.FileUploaded]: async (payload) => {\n *       await saveToDatabase(payload.metadata);\n *     },\n *   },\n * });\n *\n * const result = await service.uploadFile({\n *   file: fileBuffer,\n *   filename: 'avatar.jpg',\n *   mimeType: 'image/jpeg',\n *   category: FILE_CATEGORY.AVATAR,\n *   entityType: ENTITY_TYPE.USER,\n *   entityId: 'user-123',\n * });\n * ```\n */\n\nimport type {\n  UploadParams,\n  UploadResult,\n  DownloadParams,\n  DownloadResult,\n  DeleteParams,\n  FileDeleteResult,\n  PresignedUrlOptions,\n  PresignedUrlResult,\n  StorageEventPayload,\n  StorageTemplateEngineConfig,\n  TemplateService,\n  StorageQueueConfig,\n  StorageQueuedOperation,\n  StorageQueueStatistics,\n  StorageEventHandlers,\n  StorageComplianceConfig,\n  FileMetadata,\n  StoragePluginUploadResult,\n  GenerateFileParams,\n  GenerateFileToPathParams,\n  GenerateFileToPathResult,\n  UpdateFileParams,\n  StorageWebhookAdapter,\n  StorageWebhookPayload,\n  StorageWebhookProcessingResult,\n  STORAGE_WEBHOOK_EVENT_TYPE,\n  StorageServiceConfig,\n  StorageVariantConfig,\n  StoragePublicUrlParams,\n  StorageSignedUploadUrlParams,\n  StorageReplaceFileParams,\n  StorageCopyFileParams,\n  StorageMoveFileParams,\n  StorageUpdateBucketParams,\n  StorageBucketInfo,\n  StorageListBucketsResult,\n  StorageSignedUploadUrlResult,\n  StorageListFilesParams,\n  StorageListFilesResult,\n  BucketConfiguration,\n  BucketDeletionResult,\n  UploadProgressEvent,\n  StorageRetentionPolicy,\n  StoragePluginFile,\n  FILE_CATEGORY,\n  StorageTemplateBuildMetadataOptions,\n} from '@plyaz/types/storage';\nimport type { LoggerInterface } from '@plyaz/types';\nimport {\n  STORAGE_EVENT_TYPE,\n  STORAGE_EVENT_HANDLER_MAPPING,\n  UPLOAD_STATUS,\n  OUTPUT_FORMAT,\n  FILE_ACCESS_LEVEL,\n  STORAGE_QUEUE_PRIORITY,\n} from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../errors';\nimport { AdapterRegistry } from './AdapterRegistry';\nimport { EventManager } from './EventManager';\nimport { BucketRouter } from './BucketRouter';\nimport type { BaseStorageAdapter } from '../adapters/base/BaseStorageAdapter';\nimport { TemplateEngine } from '../templates/TemplateEngine';\nimport { FileSystemTemplateService } from '../templates/FileSystemTemplateService';\nimport { RendererRegistry } from '../renderers/core/RendererRegistry';\nimport { PDFKitRenderer } from '../renderers/adapters/PDFKitRenderer';\nimport { PuppeteerRenderer } from '../renderers/adapters/PuppeteerRenderer';\nimport { PlaywrightRenderer } from '../renderers/adapters/PlaywrightRenderer';\nimport { ExcelJSRenderer } from '../renderers/adapters/ExcelJSRenderer';\nimport { DocxTemplaterRenderer } from '../renderers/adapters/DocxTemplaterRenderer';\nimport { STORAGE_RENDERER_TYPE } from '@plyaz/types/storage';\nimport { InMemoryQueue } from '../queue/InMemoryQueue';\nimport { QueueProcessor } from '../queue/QueueProcessor';\nimport { ComplianceManager } from '../compliance/ComplianceManager';\nimport { DEFAULT_COMPLIANCE_CONFIG } from '@plyaz/config';\nimport { PluginRegistry } from '../plugins/registry/PluginRegistry';\nimport { WebhookManager } from '../webhooks/WebhookManager';\nimport { PresetManager } from '../presets/PresetManager';\nimport { FilePathGenerator } from '../utils/filePathGenerator';\nimport { StorageCategoryClassifier } from '../utils/storageCategories';\nimport { shouldUseStorageChunkedUpload } from '@plyaz/config';\nimport { validateFile } from '../utils/fileValidator';\nimport { getStorageFormatInfo } from '@plyaz/config';\nimport { dirname } from 'node:path';\nimport { mkdirSync, writeFileSync } from 'node:fs';\n\n/**\n * StorageService constants\n */\nconst STORAGE_SERVICE_DEFAULTS = {\n  MAX_FAILOVER_ATTEMPTS: 3,\n  TEMPLATE_CACHE_TTL_MS: 300000, // 5 minutes\n  QUEUE_INTERVAL_MS: 100,\n  QUEUE_MAX_RETRIES: 3,\n  WEBHOOK_TIMEOUT_MS: 30000,\n  DEFAULT_PRIORITY: 100,\n  DEFAULT_CONCURRENCY: 5,\n  MAX_CONCURRENCY: 10,\n  RANDOM_ID_LENGTH: 9,\n  RANDOM_ID_RADIX: 36,\n  RANDOM_ID_START_INDEX: 2,\n  MILLISECONDS_PER_SECOND: 1000,\n} as const;\n\n/**\n * StorageService - Main orchestrator for storage operations\n */\nexport class StorageService {\n  private readonly adapterRegistry: AdapterRegistry;\n  private readonly eventManager: EventManager;\n  private readonly bucketRouter: BucketRouter;\n  private readonly logger?: LoggerInterface;\n  private readonly maxFailoverAttempts: number;\n  private readonly templateEngine: TemplateEngine;\n  private readonly queue?: InMemoryQueue;\n  private readonly queueProcessor?: QueueProcessor;\n  private readonly queueConfig?: StorageQueueConfig;\n  private readonly complianceManager: ComplianceManager;\n  private readonly pluginRegistry: PluginRegistry;\n  private readonly webhookManager?: WebhookManager;\n  private readonly presetManager: PresetManager;\n\n  // eslint-disable-next-line complexity, max-lines-per-function\n  constructor(config: StorageServiceConfig<BaseStorageAdapter>) {\n    this.logger = config.logger;\n    this.maxFailoverAttempts =\n      config.maxFailoverAttempts ?? STORAGE_SERVICE_DEFAULTS.MAX_FAILOVER_ATTEMPTS;\n\n    // Initialize AdapterRegistry\n    this.adapterRegistry = new AdapterRegistry({\n      ...config.adapterRegistryConfig,\n      logger: this.logger,\n    });\n\n    // Initialize EventManager\n    this.eventManager = new EventManager({\n      ...config.eventManagerConfig,\n      logger: this.logger,\n    });\n\n    // Register adapters\n    for (const adapter of config.adapters) {\n      this.adapterRegistry.register(adapter);\n    }\n\n    // Initialize BucketRouter with available adapters\n    const availableAdapterNames = config.adapters.map(a => a.name);\n    this.bucketRouter = new BucketRouter({\n      ...config.bucketRouterConfig,\n      availableAdapters: availableAdapterNames,\n      logger: this.logger,\n    });\n\n    // Log routing configuration\n    if (this.logger) {\n      this.logger.info('[StorageService] BucketRouter initialized', {\n        availableAdapters: availableAdapterNames,\n        adapterPreferences: config.bucketRouterConfig?.adapterPreferences,\n        customRulesCount: config.bucketRouterConfig?.customRules?.length ?? 0,\n      });\n    }\n\n    // Register event handlers (supports both old and new syntax)\n    if (config.eventHandlers) {\n      for (const [eventType, handler] of Object.entries(config.eventHandlers)) {\n        if (handler) {\n          this.eventManager.on(eventType as STORAGE_EVENT_TYPE, handler);\n        }\n      }\n    }\n\n    // Register handlers using cleaner camelCase syntax\n    if (config.handlers) {\n      this.registerCleanHandlers(config.handlers);\n    }\n\n    // Initialize template service (defaults to FileSystemTemplateService)\n    const templateService: TemplateService =\n      config.templateService ??\n      new FileSystemTemplateService({\n        basePath: config.template?.templateBasePath,\n        logger: this.logger,\n      });\n\n    // Initialize renderer registry with auto-registration based on config\n    const rendererRegistry = this.initializeRendererRegistry(config.template);\n\n    // Initialize template engine for PDF generation\n    this.templateEngine = new TemplateEngine({\n      templateService,\n      rendererRegistry,\n      logger: this.logger,\n      defaultLocale: config.template?.defaultLocale ?? 'en',\n      cacheEnabled: config.template?.cacheEnabled ?? true,\n      cacheTTL: config.template?.cacheTTL ?? STORAGE_SERVICE_DEFAULTS.TEMPLATE_CACHE_TTL_MS,\n    });\n\n    // Initialize queue system if configured\n    if (config.queue?.enabled) {\n      this.queueConfig = config.queue;\n\n      // Create queue\n      this.queue = new InMemoryQueue({ logger: this.logger });\n\n      // Create processor with operation handler\n      this.queueProcessor = new QueueProcessor(\n        this.queue,\n        async (operation: StorageQueuedOperation) => {\n          await this.processQueuedOperation(operation);\n        },\n        {\n          concurrency: config.queue.concurrency ?? 1,\n          interval: config.queue.interval ?? STORAGE_SERVICE_DEFAULTS.QUEUE_INTERVAL_MS,\n          maxRetries: config.queue.maxRetries ?? STORAGE_SERVICE_DEFAULTS.QUEUE_MAX_RETRIES,\n          eventManager: this.eventManager,\n          logger: this.logger,\n        }\n      );\n\n      // Auto-start if configured\n      if (config.queue.autoStart) {\n        this.queueProcessor.start();\n        this.logger?.info('[StorageService] Queue processor auto-started', {\n          concurrency: config.queue.concurrency ?? 1,\n        });\n      }\n    }\n\n    // Initialize ComplianceManager (always enabled by default)\n    // Merge with default compliance config from @plyaz/config\n    const complianceConfig: StorageComplianceConfig =\n      config.compliance ?? DEFAULT_COMPLIANCE_CONFIG;\n\n    this.complianceManager = new ComplianceManager({\n      compliance: complianceConfig,\n      logger: this.logger,\n    });\n\n    this.logger?.info('[StorageService] ComplianceManager initialized', {\n      enabled: complianceConfig.enabled !== false,\n      strictMode: complianceConfig.strictMode ?? false,\n      hasDefaultPolicy: !!complianceConfig.defaultRetentionPolicy,\n      categoryPolicies: Object.keys(complianceConfig.retentionPolicies ?? {}).length,\n      defaultRetentionYears: complianceConfig.defaultRetentionPolicy?.retentionYears,\n      defaultGracePeriodDays: complianceConfig.defaultRetentionPolicy?.gracePeriodDays,\n    });\n\n    // Initialize PluginRegistry\n    this.pluginRegistry = new PluginRegistry({\n      ...config.pluginRegistryConfig,\n      logger: this.logger,\n    });\n\n    // Register plugins\n    const registeredPlugins: string[] = [];\n    if (config.plugins) {\n      for (const plugin of config.plugins) {\n        this.pluginRegistry\n          .register(plugin)\n          .then(() => {\n            registeredPlugins.push(plugin.constructor.name);\n          })\n          .catch(error => {\n            this.logger?.error(`Failed to register plugin ${plugin.name}`, {\n              error: error instanceof Error ? error.message : String(error),\n            });\n          });\n      }\n    }\n\n    this.logger?.info('[StorageService] PluginRegistry initialized', {\n      pluginCount: registeredPlugins.length,\n      plugins: registeredPlugins,\n    });\n\n    // Initialize WebhookManager if webhooks are configured\n    if (config.webhooks || config.webhookAdapters) {\n      this.webhookManager = new WebhookManager(this.eventManager, this.logger, config.webhooks);\n\n      // Register webhook adapters\n      const registeredAdapters: string[] = [];\n      if (config.webhookAdapters) {\n        for (const adapter of config.webhookAdapters) {\n          this.webhookManager.registerAdapter(adapter);\n          registeredAdapters.push(`${adapter.providerName}:${adapter.eventType}`);\n        }\n      }\n\n      this.logger?.info('[StorageService] WebhookManager initialized', {\n        enabled: config.webhooks?.enabled !== false,\n        timeout: config.webhooks?.timeout ?? STORAGE_SERVICE_DEFAULTS.WEBHOOK_TIMEOUT_MS,\n        adapterCount: registeredAdapters.length,\n        adapters: registeredAdapters,\n      });\n    }\n\n    // Initialize PresetManager (always enabled)\n    this.presetManager = new PresetManager({\n      ...config.presets,\n      logger: this.logger,\n    });\n\n    this.logger?.info('[StorageService] PresetManager initialized', {\n      enableBuiltInPresets: config.presets?.enableBuiltInPresets !== false,\n      customPresetCount: config.presets?.presets?.length ?? 0,\n      defaultDevice: config.presets?.defaultDevice ?? 'auto',\n    });\n\n    this.logger?.info('StorageService initialized', {\n      adapterCount: config.adapters.length,\n      eventHandlerCount: this.eventManager.getTotalCallbackCount(),\n      maxFailoverAttempts: this.maxFailoverAttempts,\n      complianceEnabled: !!this.complianceManager,\n      templateEngineEnabled: true,\n      defaultLocale: config.template?.defaultLocale ?? 'en',\n      rendererEnabled: !!rendererRegistry,\n      queueEnabled: !!this.queue,\n      queueConcurrency: config.queue?.concurrency,\n      plugins: registeredPlugins,\n    });\n  }\n\n  /**\n   * Initialize renderer registry with auto-registration based on config\n   * Supports config.template.renderer.use to specify the renderer to use\n   * @private\n   */\n  private initializeRendererRegistry(\n    templateConfig?: StorageTemplateEngineConfig\n  ): RendererRegistry | undefined {\n    // If no renderer config, return undefined\n    if (!templateConfig?.renderer) {\n      return undefined;\n    }\n\n    const registry = new RendererRegistry({ logger: this.logger });\n\n    const defaultRendererName = templateConfig.renderer.use;\n    const rendererOptions = templateConfig.renderer.options ?? {};\n\n    // Register default renderer specified in 'use' field\n    // Additional renderers will be registered on-demand when requested\n    if (defaultRendererName) {\n      this.logger?.debug('[StorageService] Registering default renderer', {\n        renderer: defaultRendererName,\n      });\n\n      this.registerRenderer(registry, defaultRendererName, rendererOptions);\n    }\n\n    return registry;\n  }\n\n  /**\n   * Register a specific renderer (called on-demand or at initialization)\n   */\n  // eslint-disable-next-line complexity\n  private registerRenderer(\n    registry: RendererRegistry,\n    rendererName: string,\n    rendererOptions: Record<string, unknown> = {}\n  ): void {\n    // Check if already registered\n    try {\n      registry.getRendererByName(rendererName);\n      this.logger?.debug('[StorageService] Renderer already registered', {\n        renderer: rendererName,\n      });\n      return; // Already registered\n    } catch {\n      // Not registered, continue to register it\n    }\n\n    this.logger?.debug('[StorageService] Registering renderer on-demand', {\n      renderer: rendererName,\n    });\n\n    try {\n      let renderer;\n\n      switch (rendererName.toLowerCase()) {\n        case STORAGE_RENDERER_TYPE.PUPPETEER:\n          renderer = new PuppeteerRenderer({\n            name: STORAGE_RENDERER_TYPE.PUPPETEER,\n            type: STORAGE_RENDERER_TYPE.PUPPETEER,\n            enabled: true,\n            priority: STORAGE_SERVICE_DEFAULTS.DEFAULT_PRIORITY,\n            supportedFormats: [OUTPUT_FORMAT.PDF, OUTPUT_FORMAT.PNG, OUTPUT_FORMAT.JPEG],\n            logger: this.logger,\n            config: rendererOptions,\n          });\n          break;\n\n        case STORAGE_RENDERER_TYPE.PDFKIT:\n          renderer = new PDFKitRenderer({\n            name: STORAGE_RENDERER_TYPE.PDFKIT,\n            type: STORAGE_RENDERER_TYPE.PDFKIT,\n            enabled: true,\n            priority: 80,\n            supportedFormats: [OUTPUT_FORMAT.PDF],\n            logger: this.logger,\n            config: rendererOptions,\n          });\n          break;\n\n        case STORAGE_RENDERER_TYPE.PLAYWRIGHT:\n          renderer = new PlaywrightRenderer({\n            name: STORAGE_RENDERER_TYPE.PLAYWRIGHT,\n            type: STORAGE_RENDERER_TYPE.PLAYWRIGHT,\n            enabled: true,\n            priority: 90,\n            supportedFormats: [OUTPUT_FORMAT.PDF, OUTPUT_FORMAT.PNG, OUTPUT_FORMAT.JPEG],\n            logger: this.logger,\n            config: rendererOptions,\n          });\n          break;\n\n        case STORAGE_RENDERER_TYPE.EXCELJS:\n          renderer = new ExcelJSRenderer({\n            name: STORAGE_RENDERER_TYPE.EXCELJS,\n            type: STORAGE_RENDERER_TYPE.EXCELJS,\n            enabled: true,\n            priority: STORAGE_SERVICE_DEFAULTS.DEFAULT_PRIORITY,\n            supportedFormats: [OUTPUT_FORMAT.EXCEL],\n            logger: this.logger,\n            config: rendererOptions,\n          });\n          break;\n\n        case STORAGE_RENDERER_TYPE.DOCXTEMPLATER:\n        case 'officegen': // Legacy alias\n          renderer = new DocxTemplaterRenderer({\n            name: STORAGE_RENDERER_TYPE.DOCXTEMPLATER,\n            type: STORAGE_RENDERER_TYPE.DOCXTEMPLATER,\n            enabled: true,\n            priority: STORAGE_SERVICE_DEFAULTS.DEFAULT_PRIORITY,\n            supportedFormats: [OUTPUT_FORMAT.WORD],\n            logger: this.logger,\n            config: rendererOptions,\n          });\n          break;\n\n        default:\n          this.logger?.warn(`[StorageService] Unknown renderer: ${rendererName}`);\n          return;\n      }\n\n      if (renderer) {\n        registry.register(renderer);\n        this.logger?.info('[StorageService] Renderer registered successfully', {\n          renderer: rendererName,\n        });\n      }\n    } catch (error) {\n      this.logger?.error('[StorageService] Failed to register renderer', {\n        renderer: rendererName,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Upload a file to storage\n   * Automatically selects best adapter and handles failover\n   *\n   * If templateId is provided, generates PDF from template before upload:\n   * 1. Renders template with templateData\n   * 2. Converts HTML to PDF\n   * 3. Uploads generated PDF\n   *\n   * Locale override: params.locale > service config > 'en'\n  // eslint-disable-next-line complexity\n   */\n  // eslint-disable-next-line complexity\n  async uploadFile(params: UploadParams): Promise<UploadResult> {\n    // If useQueue is true, enqueue the operation instead of processing immediately\n    if (params.useQueue) {\n      if (!this.queue) {\n        throw new StoragePackageError(\n          'Queue is not enabled. Enable queue in StorageServiceConfig.',\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { useQueue: params.useQueue } }\n        );\n      }\n\n      // Enqueue the operation\n      const operation: StorageQueuedOperation = {\n        id: `upload-${Date.now()}-${Math.random().toString(STORAGE_SERVICE_DEFAULTS.RANDOM_ID_RADIX).substr(STORAGE_SERVICE_DEFAULTS.RANDOM_ID_START_INDEX, STORAGE_SERVICE_DEFAULTS.RANDOM_ID_LENGTH)}`,\n        type: 'upload',\n        uploadParams: params,\n        priority:\n          params.queuePriority ??\n          this.queueConfig?.defaultPriority ??\n          STORAGE_QUEUE_PRIORITY.NORMAL,\n        retryCount: 0,\n        maxRetries: this.queueConfig?.maxRetries ?? STORAGE_SERVICE_DEFAULTS.QUEUE_MAX_RETRIES,\n        createdAt: new Date(),\n        metadata: params.queueMetadata,\n      };\n\n      await this.queue.enqueue(operation);\n\n      this.logger?.info('[StorageService] Upload queued', {\n        operationId: operation.id,\n        priority: operation.priority,\n        filename: params.filename,\n      });\n\n      // Return a placeholder result indicating the operation was queued\n      // The actual upload will happen asynchronously via the queue processor\n      return {\n        metadata: {\n          fileId: operation.id, // Use operation ID as temporary fileId\n          filename: params.filename ?? 'queued-file',\n          mimeType: params.mimeType ?? 'application/octet-stream',\n          size: 0, // Size unknown until processed\n          category: params.category,\n          entityType: params.entityType,\n          entityId: params.entityId,\n          path: '', // Path will be generated during processing\n          adapter: 'queued',\n          uploadedAt: new Date(),\n          accessLevel: params.accessLevel ?? FILE_ACCESS_LEVEL.PRIVATE,\n          status: UPLOAD_STATUS.PENDING, // Queued for processing\n        },\n        warnings: [\n          'Operation queued for background processing. Use getQueueStatistics() to monitor progress.',\n        ],\n      };\n    }\n\n    // Generate PDF from template if templateId provided\n    if (params.templateId && params.templateData) {\n      return await this.uploadFromTemplate(params);\n    }\n\n    // Regular file upload (existing logic)\n    return await this.uploadFileToAdapter(params);\n  }\n\n  /**\n   * Upload multiple files in parallel or via queue\n   *\n   * Efficiently uploads multiple files using concurrent batching or background queue processing.\n   * Each file is validated, uploaded, and tracked independently with proper error handling.\n   *\n   * **Features:**\n   * - Concurrent upload with configurable batch size (default: 5)\n   * - Queue mode for background processing\n   * - Continue on error to upload remaining files\n   * - Individual progress tracking per file (via onProgress callback in params)\n   * - Automatic chunked uploads for large files (>100MB)\n   * - Reuses all existing features: validation, events, plugins, retry logic\n   *\n   * **Important Notes:**\n   * - Neither Supabase nor Cloudflare R2 SDKs support native batch uploads\n   * - Each file makes a separate API call to the storage provider\n   * - Concurrency control prevents overwhelming the API and network\n   * - Queue mode is non-blocking and returns immediately with operation IDs\n   *\n   * @param files - Array of upload parameters (one per file)\n   * @param options - Upload configuration options\n   * @param options.concurrency - Max concurrent uploads (default: 5, max recommended: 10)\n   * @param options.useQueue - Enable background queue processing (default: false)\n   * @param options.continueOnError - Continue uploading remaining files on error (default: false)\n   *\n   * @returns Array of upload results (empty if useQueue=true)\n   *\n   * @throws {StoragePackageError} If no files provided, queue not enabled (when useQueue=true), or upload fails (when continueOnError=false)\n   *\n   * @example\n   * ```typescript\n   * // Parallel upload (immediate mode)\n   * const results = await storageService.uploadMultipleFiles([\n   *   { file: buffer1, filename: 'photo1.jpg', category: FILE_CATEGORY.IMAGE, entityType: ENTITY_TYPE.USER, entityId: 'user-1' },\n   *   { file: buffer2, filename: 'photo2.jpg', category: FILE_CATEGORY.IMAGE, entityType: ENTITY_TYPE.USER, entityId: 'user-1' }\n   * ]);\n   *\n   * // With concurrency control (3 files at a time)\n   * const results = await storageService.uploadMultipleFiles(files, { concurrency: 3 });\n   *\n   * // Continue on error (partial success allowed)\n   * const results = await storageService.uploadMultipleFiles(files, {\n   *   continueOnError: true // Uploads all files even if some fail\n   * });\n   *\n   * // Queue mode for background processing\n   * await storageService.uploadMultipleFiles(files, { useQueue: true });\n   * // Returns immediately, uploads happen in background\n   * // Monitor progress with getQueueStatistics()\n   * ```\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  async uploadMultipleFiles(\n    files: UploadParams[],\n    options?: {\n      concurrency?: number;\n      useQueue?: boolean;\n      continueOnError?: boolean;\n    }\n  ): Promise<UploadResult[]> {\n    // Validate inputs\n    if (!files || files.length === 0) {\n      throw new StoragePackageError(\n        'No files provided for multi-file upload',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { filesCount: 0 } }\n      );\n    }\n\n    const concurrency = Math.min(\n      options?.concurrency ?? STORAGE_SERVICE_DEFAULTS.DEFAULT_CONCURRENCY,\n      STORAGE_SERVICE_DEFAULTS.MAX_CONCURRENCY\n    );\n    const useQueue = options?.useQueue ?? false;\n    const continueOnError = options?.continueOnError ?? false;\n\n    this.logger?.info('[StorageService] Starting multi-file upload', {\n      fileCount: files.length,\n      concurrency,\n      useQueue,\n      continueOnError,\n    });\n\n    // Queue mode - enqueue all files for background processing\n    if (useQueue) {\n      if (!this.queue) {\n        throw new StoragePackageError(\n          'Queue is not enabled. Enable queue in StorageServiceConfig.',\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { useQueue: true } }\n        );\n      }\n\n      const operationIds: string[] = [];\n\n      for (const params of files) {\n        const operation: StorageQueuedOperation = {\n          id: `upload-${Date.now()}-${Math.random().toString(STORAGE_SERVICE_DEFAULTS.RANDOM_ID_RADIX).substr(STORAGE_SERVICE_DEFAULTS.RANDOM_ID_START_INDEX, STORAGE_SERVICE_DEFAULTS.RANDOM_ID_LENGTH)}`,\n          type: 'upload',\n          uploadParams: { ...params, useQueue: false }, // Prevent recursive queueing\n          priority:\n            params.queuePriority ??\n            (this.queueConfig?.defaultPriority as STORAGE_QUEUE_PRIORITY) ??\n            ('normal' as STORAGE_QUEUE_PRIORITY),\n          retryCount: 0,\n          maxRetries: this.queueConfig?.maxRetries ?? STORAGE_SERVICE_DEFAULTS.QUEUE_MAX_RETRIES,\n          createdAt: new Date(),\n          metadata: params.queueMetadata,\n        };\n\n        await this.queue.enqueue(operation);\n        operationIds.push(operation.id);\n      }\n\n      this.logger?.info('[StorageService] Multi-file upload enqueued', {\n        fileCount: files.length,\n        operationIds,\n      });\n\n      // Return empty results in queue mode (async processing)\n      return [];\n    }\n\n    // Immediate mode - parallel upload with concurrency control\n    const results: UploadResult[] = [];\n    const errors: Array<{ index: number; filename: string; error: Error }> = [];\n\n    // Process files in batches to respect concurrency limit\n    for (let i = 0; i < files.length; i += concurrency) {\n      const batch = files.slice(i, i + concurrency);\n\n      this.logger?.debug('[StorageService] Processing batch', {\n        batchStart: i,\n        batchSize: batch.length,\n        totalFiles: files.length,\n      });\n\n      // Upload batch in parallel\n      const batchPromises = batch.map(async (params, batchIndex) => {\n        const globalIndex = i + batchIndex;\n        try {\n          // Upload with existing uploadFile logic (validation, events, plugins, chunking)\n          const result = await this.uploadFile({ ...params, useQueue: false });\n\n          this.logger?.debug('[StorageService] File uploaded successfully', {\n            fileIndex: globalIndex,\n            filename: params.filename,\n            fileId: result.metadata.fileId,\n          });\n\n          return result;\n        } catch (error) {\n          const uploadError = error as Error;\n\n          this.logger?.error('[StorageService] File upload failed', {\n            fileIndex: globalIndex,\n            filename: params.filename,\n            error: uploadError.message,\n            continueOnError,\n          });\n\n          if (continueOnError) {\n            // Track error but continue with remaining files\n            errors.push({\n              index: globalIndex,\n              filename: params.filename ?? `file-${globalIndex}`,\n              error: uploadError,\n            });\n            return null;\n          } else {\n            // Fail fast - stop entire operation\n            throw new StoragePackageError(\n              `Multi-file upload failed at index ${globalIndex}: ${uploadError.message}`,\n              STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED,\n              {\n                context: {\n                  fileIndex: globalIndex,\n                  filename: params.filename,\n                  filesProcessed: results.length,\n                  totalFiles: files.length,\n                  originalError: uploadError.message,\n                },\n              }\n            );\n          }\n        }\n      });\n\n      // Wait for batch to complete\n      const batchResults = await Promise.all(batchPromises);\n\n      // Collect successful results (filter out nulls from errors)\n      for (const result of batchResults) {\n        if (result !== null) {\n          results.push(result);\n        }\n      }\n    }\n\n    // Log summary\n    this.logger?.info('[StorageService] Multi-file upload completed', {\n      total: files.length,\n      succeeded: results.length,\n      failed: errors.length,\n      errors:\n        errors.length > 0\n          ? errors.map(e => ({ index: e.index, filename: e.filename, error: e.error.message }))\n          : undefined,\n    });\n\n    // If continueOnError and some files failed, attach warnings\n    if (continueOnError && errors.length > 0) {\n      this.logger?.warn('[StorageService] Some files failed to upload', {\n        failedCount: errors.length,\n        failedFiles: errors.map(e => e.filename),\n      });\n    }\n\n    return results;\n  }\n\n  /**\n   * Upload file from template (generates document in specified format)\n   * @private\n   */\n  private async uploadFromTemplate(params: UploadParams): Promise<UploadResult> {\n    const outputFormat = (params.outputFormat ?? OUTPUT_FORMAT.PDF) as OUTPUT_FORMAT;\n    this.logger?.debug('[StorageService] Generating document from template', {\n      templateId: params.templateId,\n      locale: params.locale,\n      outputFormat,\n      rendererName: params.rendererName,\n    });\n\n    try {\n      const { documentBuffer, renderer, locale } = await this.generateDocumentFromTemplate(\n        params,\n        outputFormat\n      );\n      const { extension, mimeType } = this.getFormatDetails(outputFormat);\n      const complianceInfo = this.getTemplateComplianceInfo(params);\n\n      return await this.uploadFileToAdapter({\n        ...params,\n        file: documentBuffer,\n        filename: params.filename ?? `${params.templateId?.replace('/', '-')}.${extension}`,\n        mimeType,\n        customMetadata: this.buildTemplateMetadata({\n          params,\n          documentBuffer,\n          renderer,\n          locale,\n          outputFormat,\n          complianceInfo,\n        }),\n      });\n    } catch (error) {\n      this.handleTemplateError(error, params.templateId, outputFormat);\n    }\n  }\n\n  /**\n   * Generate document from template using the template engine\n   *\n   * @param params - Upload parameters including templateId and templateData\n   * @param outputFormat - Target output format (pdf, excel, word, etc.)\n   * @returns Generated document buffer with renderer info and locale\n   * @throws StoragePackageError if renderer registry not configured\n   * @internal\n   */\n  // eslint-disable-next-line complexity\n  private async generateDocumentFromTemplate(\n    params: UploadParams,\n    outputFormat: OUTPUT_FORMAT\n  ): Promise<{ documentBuffer: Buffer; renderer: { name: string; type: string }; locale: string }> {\n    const locale = params.locale ?? this.templateEngine.getDefaultLocale();\n    const registry = this.templateEngine.getRendererRegistry();\n    if (!registry) {\n      throw new StoragePackageError(\n        'Renderer registry not configured',\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n        {\n          context: { templateId: params.templateId },\n        }\n      );\n    }\n\n    const renderer = params.rendererName\n      ? registry.getRendererByName(params.rendererName)\n      : registry.getRenderer(outputFormat);\n    this.logger?.debug('[StorageService] Using renderer', {\n      renderer: renderer.name,\n      outputFormat,\n    });\n\n    const pdfOptions =\n      outputFormat === 'pdf'\n        ? {\n            pageSize: params.pdfOptions?.pageSize ?? 'A4',\n            orientation: params.pdfOptions?.orientation ?? 'portrait',\n            margins: params.pdfOptions?.margins,\n            printBackground: params.pdfOptions?.printBackground ?? true,\n            metadata: params.pdfOptions?.metadata,\n            ...params.pdfOptions,\n          }\n        : undefined;\n\n    const documentBuffer = await this.templateEngine.renderToFormat({\n      templateId: params.templateId!,\n      data: params.templateData ?? {},\n      format: outputFormat,\n      locale,\n      pdfOptions,\n      validation: params.validation,\n    });\n\n    this.logger?.debug('[StorageService] Document generated successfully', {\n      templateId: params.templateId,\n      size: documentBuffer.length,\n      locale,\n      format: outputFormat,\n    });\n    return { documentBuffer, renderer, locale };\n  }\n\n  /**\n   * Get file extension and MIME type for output format\n   *\n   * @param outputFormat - Output format to get details for\n   * @returns Extension and MIME type for the format\n   * @internal\n   */\n  private getFormatDetails(outputFormat: OUTPUT_FORMAT): { extension: string; mimeType: string } {\n    const formatInfo = getStorageFormatInfo(outputFormat);\n    return {\n      extension: formatInfo.extension ?? 'bin',\n      mimeType: formatInfo.mimeType ?? 'application/octet-stream',\n    };\n  }\n\n  /**\n   * Get compliance/retention policy info for template upload\n   *\n   * @param params - Upload parameters with optional category\n   * @returns Retention policy if compliance manager configured and category provided\n   * @internal\n   */\n  private getTemplateComplianceInfo(params: UploadParams): StorageRetentionPolicy | undefined {\n    if (this.complianceManager && params.category) {\n      return this.getComplianceInfo(this.complianceManager, params.category);\n    }\n    return undefined;\n  }\n\n  /**\n   * Build metadata object for template-generated uploads\n   *\n   * @param options - Metadata building options\n   * @returns Metadata object with generation details and compliance info\n   * @internal\n   */\n  private buildTemplateMetadata(\n    options: StorageTemplateBuildMetadataOptions\n  ): Record<string, unknown> {\n    const { params, documentBuffer, renderer, locale, outputFormat, complianceInfo } = options;\n    return {\n      ...params.customMetadata,\n      generation: {\n        templateId: params.templateId,\n        locale,\n        outputFormat,\n        renderer: renderer.name,\n        rendererType: renderer.type,\n        generatedAt: new Date().toISOString(),\n        size: documentBuffer.length,\n      },\n      ...(complianceInfo && { compliance: complianceInfo }),\n    };\n  }\n\n  /**\n   * Handle template generation errors with consistent error wrapping\n   *\n   * @param error - The caught error\n   * @param templateId - Template ID for context\n   * @param outputFormat - Output format for context\n   * @throws StoragePackageError - Always throws\n   * @internal\n   */\n  private handleTemplateError(\n    error: unknown,\n    templateId: string | undefined,\n    outputFormat: OUTPUT_FORMAT\n  ): never {\n    this.logger?.error('[StorageService] Document generation failed', {\n      templateId,\n      error: error instanceof Error ? error.message : String(error),\n    });\n    if (error instanceof StoragePackageError) throw error;\n    throw new StoragePackageError(\n      'Failed to generate document from template',\n      STORAGE_ERROR_CODES.TEMPLATE_RENDER_FAILED,\n      {\n        cause: error instanceof Error ? error : undefined,\n        context: { templateId, outputFormat },\n      }\n    );\n  }\n\n  /**\n   * Upload file to adapter (actual upload logic)\n   * @private\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  private async uploadFileToAdapter(params: UploadParams): Promise<UploadResult> {\n    this.logger?.info('Upload file requested', {\n      filename: params.filename,\n      mimeType: params.mimeType,\n      category: params.category,\n      entityType: params.entityType,\n      entityId: params.entityId,\n    });\n\n    const startTime = Date.now();\n\n    // Check if chunked upload is needed based on file size\n    const isLargeFile = shouldUseStorageChunkedUpload(params.file);\n\n    // Try routing first based on content purpose\n    const routingDecision = this.bucketRouter.route(params);\n    let selectedAdapter: BaseStorageAdapter | null | undefined = null;\n\n    if (routingDecision) {\n      // Use routed adapter\n      selectedAdapter = this.adapterRegistry.getAdapter(routingDecision.adapterName) ?? null;\n\n      // Log routing decision (for configuration change logging)\n      this.logger?.info('[StorageService] Routing decision', {\n        adapter: routingDecision.adapterName,\n        purpose: routingDecision.bucketPurpose,\n        reason: routingDecision.reason,\n        path: routingDecision.path,\n        pathStrategy: routingDecision.pathStrategy,\n      });\n\n      // If routed adapter is not healthy, log warning and fall back\n      if (selectedAdapter && !selectedAdapter.isAvailable()) {\n        this.logger?.warn('[StorageService] Routed adapter not available, falling back', {\n          adapter: routingDecision.adapterName,\n        });\n        selectedAdapter = null;\n      }\n\n      // Apply routed path to params if generated\n      if (routingDecision.path && !params.customPath) {\n        params.customPath = routingDecision.path;\n      }\n    }\n\n    // Fall back to default adapter selection if no routing or routed adapter unavailable\n    if (!selectedAdapter) {\n      selectedAdapter = await this.adapterRegistry.selectHealthyAdapter();\n\n      if (routingDecision) {\n        this.logger?.info('[StorageService] Fallback to default adapter selection', {\n          requestedAdapter: routingDecision.adapterName,\n          selectedAdapter: selectedAdapter?.name,\n        });\n      }\n    }\n\n    if (!selectedAdapter) {\n      throw new StoragePackageError(\n        'No healthy adapters available for upload',\n        STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS\n      );\n    }\n\n    // Validate file before upload (if file is a Buffer)\n    // FileValidator performs comprehensive validation:\n    // - Detects actual MIME type from file content (magic numbers)\n    // - Validates file size against limits\n    // - Checks MIME type against whitelist\n    // - Validates extension matches MIME type (prevents spoofing)\n    // - Detects executables for security (blocks .exe, .sh, etc.)\n    if (params.file && Buffer.isBuffer(params.file) && params.filename && params.mimeType) {\n      // Determine bucket purpose for validation rules\n      const bucketPurpose = StorageCategoryClassifier.classify(params);\n\n      // Get validation rules from adapter (if supported)\n      let maxFileSize: number | undefined;\n      let allowedMimeTypes: string[] | undefined;\n\n      if (typeof selectedAdapter.getFileSizeLimit === 'function') {\n        maxFileSize = selectedAdapter.getFileSizeLimit(bucketPurpose);\n      }\n\n      if (typeof selectedAdapter.getAllowedMimeTypes === 'function') {\n        allowedMimeTypes = selectedAdapter.getAllowedMimeTypes(bucketPurpose);\n      }\n\n      // Validate file (throws StoragePackageError on failure)\n      // This includes: magic number detection, extension validation, size check, MIME type check, executable detection\n      await validateFile(params.file, params.filename, params.mimeType, {\n        maxSize: maxFileSize,\n        allowedMimeTypes,\n        allowExecutables: false, // Block executables for security\n      });\n\n      this.logger?.debug('[StorageService] File validation passed', {\n        filename: params.filename,\n        size: params.file.length,\n        mimeType: params.mimeType,\n        bucketPurpose,\n        maxFileSize,\n        allowedMimeTypes,\n      });\n    }\n\n    // Wrap onProgress callback to emit events via EventManager and calculate speed/ETA\n    const wrappedParams = { ...params };\n    if (params.onProgress || this.eventManager) {\n      const originalOnProgress = params.onProgress;\n      const progressStartTime = Date.now();\n      // eslint-disable-next-line no-unused-vars -- lastLoaded reserved for future speed calculation enhancement\n      let lastLoaded = 0;\n\n      wrappedParams.onProgress = (progress: UploadProgressEvent) => {\n        // Calculate speed and ETA if not provided by adapter\n        let enrichedProgress: UploadProgressEvent = progress;\n        if (!progress.speed && progress.loaded > 0) {\n          const elapsedTime =\n            (Date.now() - progressStartTime) / STORAGE_SERVICE_DEFAULTS.MILLISECONDS_PER_SECOND;\n          const speed = progress.loaded / elapsedTime; // bytes/second\n          const remainingBytes = progress.total - progress.loaded;\n          const estimatedTimeRemaining = speed > 0 ? remainingBytes / speed : undefined;\n\n          enrichedProgress = {\n            ...progress,\n            speed,\n            estimatedTimeRemaining,\n          };\n        }\n\n        // Emit progress event via EventManager\n        void this.eventManager?.emit(STORAGE_EVENT_TYPE.UploadProgress, {\n          type: STORAGE_EVENT_TYPE.UploadProgress,\n          timestamp: new Date(),\n          data: {\n            fileId: enrichedProgress.fileId,\n            filename: enrichedProgress.filename,\n            loaded: enrichedProgress.loaded,\n            total: enrichedProgress.total,\n            percentage: enrichedProgress.percentage,\n            speed: enrichedProgress.speed,\n            estimatedTimeRemaining: enrichedProgress.estimatedTimeRemaining,\n            currentChunk: enrichedProgress.currentChunk,\n            totalChunks: enrichedProgress.totalChunks,\n            mimeType: enrichedProgress.mimeType,\n            entityType: enrichedProgress.entityType,\n            entityId: enrichedProgress.entityId,\n            adapter: enrichedProgress.adapter,\n          },\n        });\n\n        this.logger?.info('[StorageService] Current Upload Progress Details', enrichedProgress);\n\n        // Call user's original progress callback if provided\n        if (originalOnProgress) {\n          originalOnProgress(enrichedProgress);\n        }\n\n        lastLoaded = progress.loaded;\n      };\n    }\n\n    // Handle abort signal - emit event on abort\n    if (params.abortSignal) {\n      params.abortSignal.addEventListener('abort', () => {\n        void this.eventManager?.emit(STORAGE_EVENT_TYPE.UploadAborted, {\n          type: STORAGE_EVENT_TYPE.UploadAborted,\n          timestamp: new Date(),\n          data: {\n            filename: params.filename ?? 'unknown',\n            entityType: params.entityType,\n            entityId: params.entityId,\n          },\n        });\n\n        this.logger?.info('[StorageService] Upload aborted', params);\n      });\n    }\n\n    // Use chunked upload for large files if adapter supports it\n    if (isLargeFile && selectedAdapter.uploadChunked) {\n      const fileSize = (params.file as Buffer).length;\n      this.logger?.info('[StorageService] Using chunked upload for large file', {\n        fileSize,\n        adapter: selectedAdapter.name,\n        filename: params.filename,\n      });\n      return await selectedAdapter.uploadChunked(wrappedParams);\n    }\n\n    // Fall back to regular upload if chunked upload not needed/supported\n    if (isLargeFile && !selectedAdapter.uploadChunked) {\n      this.logger?.warn(\n        '[StorageService] Adapter does not support chunked upload, using regular upload',\n        {\n          adapter: selectedAdapter.name,\n          fileSize: (params.file as Buffer).length,\n        }\n      );\n    }\n\n    // Resolve variants from PresetManager (if presets or variants specified)\n    let resolvedVariants: StorageVariantConfig[] = [];\n    if (params.presets || params.variants || params.category) {\n      try {\n        resolvedVariants = this.presetManager.resolveVariants({\n          presets: params.presets,\n          variants: params.variants,\n          device: params.device,\n          category: params.category,\n          allDevices: params.allDevices,\n        });\n\n        this.logger?.debug('[StorageService] Variants resolved', {\n          presets: params.presets,\n          device: params.device,\n          category: params.category,\n          variantCount: resolvedVariants.length,\n          variantNames: resolvedVariants.map(v => v.name),\n        });\n      } catch (error) {\n        this.logger?.warn('[StorageService] Failed to resolve variants', {\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    }\n\n    // Execute beforeUpload plugin hooks (BLOCKING)\n    // Note: Plugins only run when file is a Buffer (not ReadableStream)\n    if (params.file && Buffer.isBuffer(params.file) && params.filename && params.mimeType) {\n      const pluginFile: StoragePluginFile = {\n        buffer: params.file,\n        metadata: {\n          fileId: '', // Will be generated during upload\n          filename: params.filename,\n          mimeType: params.mimeType,\n          size: params.file.length,\n          category: params.category,\n          entityType: params.entityType,\n          entityId: params.entityId,\n          accessLevel: params.accessLevel as FileMetadata['accessLevel'],\n          path: '', // Will be generated during upload\n          status: UPLOAD_STATUS.PENDING,\n          customMetadata: params.customMetadata,\n          uploadedAt: new Date(),\n        },\n        filename: params.filename,\n        mimeType: params.mimeType,\n        size: params.file.length,\n      } as const;\n\n      const pluginContext = {\n        operation: 'upload',\n        timestamp: new Date(),\n        userId: params.customMetadata?.userId as string | undefined,\n        correlationId: params.customMetadata?.correlationId as string | undefined,\n        metadata: {\n          ...params.customMetadata,\n          variants: resolvedVariants.length > 0 ? resolvedVariants : undefined,\n        },\n        storageAdapter: selectedAdapter,\n      } as const;\n\n      const beforeUploadResult = await this.pluginRegistry.executeBeforeUpload(\n        pluginFile,\n        pluginContext,\n        { skipPlugins: params.skipPlugins, onlyPlugins: params.onlyPlugins }\n      );\n\n      // If plugins rejected the upload, throw error\n      if (!beforeUploadResult.allowed) {\n        throw new StoragePackageError(\n          beforeUploadResult.reason ?? 'Upload rejected by plugin',\n          STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n          {\n            context: {\n              rejectedBy: beforeUploadResult.rejectedBy,\n              pluginsExecuted: beforeUploadResult.pluginsExecuted,\n            },\n          }\n        );\n      }\n\n      // Apply modified metadata from plugins (if any)\n      if (beforeUploadResult.modifiedMetadata) {\n        if (beforeUploadResult.modifiedMetadata.customMetadata) {\n          params.customMetadata = {\n            ...params.customMetadata,\n            ...beforeUploadResult.modifiedMetadata.customMetadata,\n          };\n        }\n      }\n\n      this.logger?.debug('beforeUpload plugins executed', {\n        pluginsExecuted: beforeUploadResult.pluginsExecuted,\n        duration: beforeUploadResult.duration,\n      });\n    }\n\n    // ========================================\n    // COMPLIANCE CHECK: Prevent overwriting immutable files\n    // ========================================\n    // Generate the expected file path using FilePathGenerator.generateAdapterPath()\n    // This matches exactly what adapters use (no pluralization, raw values)\n    const generateExpectedPath = (): string => {\n      if (!params.entityType || !params.entityId || !params.category || !params.filename) {\n        return ''; // Can't generate path without required fields\n      }\n\n      return FilePathGenerator.generateAdapterPath({\n        entityType: params.entityType,\n        entityId: params.entityId,\n        category: params.category,\n        filename: params.filename,\n        includeTimestamp: false, // Match exact filename without timestamp prefix\n      });\n    };\n\n    // Check BOTH customPath and auto-generated filePath for existing immutable files\n    const pathToCheck = params.customPath ?? generateExpectedPath();\n\n    if (this.complianceManager && this.isComplianceEnabled()) {\n      // Check if a file already exists at this path\n      let existingFile: FileMetadata | undefined;\n      try {\n        // Get the actual bucket name from the adapter\n        // The routing decision has bucketPurpose (e.g., \"user-uploads\") but we need\n        // the provider-specific bucket name (e.g., \"plyaz-prod-weur-user-uploads\")\n        let bucketToCheck: string | undefined;\n\n        if (routingDecision) {\n          // Use routing decision if available\n          bucketToCheck = selectedAdapter.getBucketName(\n            routingDecision.bucketPurpose,\n            routingDecision.bucketConfig\n          );\n        } else {\n          // No routing decision - classify the upload ourselves\n          const bucketPurpose = StorageCategoryClassifier.classify(params);\n          const bucketConfig: BucketConfiguration = {\n            purpose: bucketPurpose,\n            businessModel: params.businessModel,\n            tier: params.organizationTier,\n            organizationId: params.organizationId,\n            environment: params.environment ?? selectedAdapter.defaultEnvironment,\n            region: params.region ?? selectedAdapter.defaultRegion,\n          };\n          bucketToCheck = selectedAdapter.getBucketName(bucketPurpose, bucketConfig);\n        }\n\n        if (bucketToCheck) {\n          existingFile = await selectedAdapter.getFileMetadata(pathToCheck, bucketToCheck);\n\n          this.logger?.debug('[StorageService] Found existing file during compliance check', {\n            fileId: existingFile.fileId,\n            path: existingFile.path,\n            bucket: existingFile.bucket,\n            category: existingFile.category,\n          });\n        }\n      } catch {\n        // File doesn't exist - safe to proceed\n        existingFile = undefined;\n      }\n\n      if (existingFile) {\n        this.validateFileOverwriteCompliance(existingFile, pathToCheck);\n      }\n    }\n\n    let lastError: Error | undefined;\n    let attemptCount = 0;\n\n    // Try primary adapter, then failover adapters\n    const excludedAdapters: string[] = [];\n\n    while (attemptCount < this.maxFailoverAttempts) {\n      attemptCount++;\n\n      try {\n        // Select adapter (excluding previously failed ones)\n        // Use the selected adapter from beforeUpload on first attempt, fallback on retries\n        const adapter =\n          attemptCount === 1 && excludedAdapters.length === 0\n            ? selectedAdapter\n            : excludedAdapters.length === 0\n              ? await this.adapterRegistry.selectHealthyAdapter()\n              : await this.adapterRegistry.getFallbackAdapter(\n                  excludedAdapters[excludedAdapters.length - 1]\n                );\n\n        if (!adapter) {\n          throw new StoragePackageError(\n            'No healthy adapters available for upload',\n            STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS,\n            {\n              context: {\n                attemptCount,\n                excludedAdapters,\n              },\n            }\n          );\n        }\n\n        this.logger?.debug('Attempting upload', {\n          adapter: adapter.name,\n          attempt: attemptCount,\n        });\n\n        // Perform upload (use wrappedParams for progress/abort handling)\n        const result = await adapter.upload(wrappedParams);\n\n        // Emit success event\n        await this.eventManager.emit(STORAGE_EVENT_TYPE.FileUploaded, {\n          type: STORAGE_EVENT_TYPE.FileUploaded,\n          timestamp: new Date(),\n          metadata: result.metadata,\n          data: {\n            adapter: adapter.name,\n            duration: Date.now() - startTime,\n            attemptCount,\n          },\n        });\n\n        this.logger?.info('File uploaded successfully', {\n          fileId: result.metadata.fileId,\n          adapter: adapter.name,\n          duration: Date.now() - startTime,\n        });\n\n        // Execute afterUpload plugin hooks (ASYNC - non-blocking)\n        const afterUploadContext = {\n          operation: 'upload',\n          timestamp: new Date(),\n          userId: params.customMetadata?.userId as string | undefined,\n          correlationId: params.customMetadata?.correlationId as string | undefined,\n          metadata: {\n            ...params.customMetadata,\n            // Pass resolved variants to afterUpload plugins\n            variants: resolvedVariants.length > 0 ? resolvedVariants : undefined,\n          },\n          storageAdapter: adapter,\n        } as const;\n\n        const pluginUploadResult: StoragePluginUploadResult = {\n          fileId: result.metadata.fileId,\n          url: result.url ?? result.signedUrl ?? '',\n          cdnUrl: undefined,\n          metadata: result.metadata,\n          adapter: adapter.name,\n          duration: Date.now() - startTime,\n        };\n\n        this.pluginRegistry\n          .executeAfterUpload(pluginUploadResult, afterUploadContext, {\n            skipPlugins: params.skipPlugins,\n            onlyPlugins: params.onlyPlugins,\n          })\n          .then(() => {\n            this.logger?.debug('afterUpload plugins executed');\n          })\n          .catch(error => {\n            this.logger?.error('afterUpload plugins failed', {\n              error: error instanceof Error ? error.message : String(error),\n            });\n          });\n\n        // Enrich result with routing information\n        const enhancedResult: UploadResult = {\n          ...result,\n          // Add preset information if presets were used\n          appliedPresets: params.presets\n            ? Array.isArray(params.presets)\n              ? params.presets\n              : [params.presets]\n            : undefined,\n          targetDevice: params.device,\n          // Add bucket and routing information\n          metadata: {\n            ...result.metadata,\n            adapter: adapter.name,\n            bucketPurpose: routingDecision?.bucketPurpose,\n            // Bucket name will be set by the adapter itself\n          },\n        };\n\n        return enhancedResult;\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error(String(error));\n\n        const adapter = await this.adapterRegistry.selectHealthyAdapter();\n        excludedAdapters.push(adapter.name);\n\n        this.logger?.warn('Upload attempt failed', {\n          adapter: adapter.name,\n          attempt: attemptCount,\n          error: lastError.message,\n        });\n\n        // Emit adapter failed event\n        await this.eventManager.emit(STORAGE_EVENT_TYPE.AdapterFailed, {\n          type: STORAGE_EVENT_TYPE.AdapterFailed,\n          timestamp: new Date(),\n          data: {\n            adapter: adapter.name,\n            operation: 'upload',\n            error: lastError.message,\n            attemptCount,\n          },\n        });\n\n        // Continue to next attempt if more attempts available\n        if (attemptCount >= this.maxFailoverAttempts) {\n          break;\n        }\n      }\n    }\n\n    // All attempts failed\n    const error = new StoragePackageError(\n      'File upload failed after all retry attempts',\n      STORAGE_ERROR_CODES.ALL_ADAPTERS_FAILED,\n      {\n        context: {\n          attemptCount,\n          excludedAdapters,\n        },\n        cause: lastError,\n      }\n    );\n\n    // Emit failure event\n    await this.eventManager.emit(STORAGE_EVENT_TYPE.FileUploadFailed, {\n      type: STORAGE_EVENT_TYPE.FileUploadFailed,\n      timestamp: new Date(),\n      data: {\n        filename: params.filename,\n        error: error.message,\n        attemptCount,\n        duration: Date.now() - startTime,\n      },\n    });\n\n    throw error;\n  }\n\n  /**\n  // eslint-disable-next-line complexity\n   * Download a file from storage\n   */\n  // eslint-disable-next-line complexity\n  async downloadFile(params: DownloadParams): Promise<DownloadResult> {\n    this.logger?.info('Download file requested', {\n      fileId: params.fileId,\n      adapter: params.adapter,\n      bucket: params.bucket,\n    });\n\n    const startTime = Date.now();\n\n    try {\n      // Select adapter based on params or default\n      let adapter: BaseStorageAdapter | null | undefined = null;\n\n      if (params.adapter) {\n        // Use specified adapter\n        adapter = this.adapterRegistry.getAdapter(params.adapter) ?? null;\n\n        if (adapter) {\n          this.logger?.info('[StorageService] Using specified adapter for download', {\n            adapter: params.adapter,\n            fileId: params.fileId,\n            bucket: params.bucket,\n          });\n        } else {\n          this.logger?.warn('[StorageService] Specified adapter not found, falling back', {\n            requestedAdapter: params.adapter,\n            fileId: params.fileId,\n          });\n        }\n      }\n\n      // Fallback to default adapter selection\n      if (!adapter) {\n        adapter = await this.adapterRegistry.selectHealthyAdapter();\n\n        this.logger?.info('[StorageService] Using default adapter for download', {\n          adapter: adapter.name,\n          fileId: params.fileId,\n        });\n      }\n\n      this.logger?.debug('Attempting download', {\n        adapter: adapter.name,\n        fileId: params.fileId,\n        bucket: params.bucket,\n      });\n\n      const result = await adapter.download(params);\n\n      // Emit success event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileAccessed, {\n        type: STORAGE_EVENT_TYPE.FileAccessed,\n        timestamp: new Date(),\n        metadata: result.metadata,\n        data: {\n          adapter: adapter.name,\n          duration: Date.now() - startTime,\n        },\n      });\n\n      this.logger?.info('File downloaded successfully', {\n        fileId: params.fileId,\n        adapter: adapter.name,\n        duration: Date.now() - startTime,\n      });\n\n      return result;\n    } catch (error) {\n      this.logger?.error('File download failed', {\n        fileId: params.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      throw error;\n    }\n  }\n\n  /**\n  // eslint-disable-next-line complexity\n   * Delete a file from storage\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  async deleteFile(params: DeleteParams): Promise<FileDeleteResult> {\n    this.logger?.info('Delete file requested', {\n      fileId: params.fileId,\n      adapter: params.adapter,\n      bucket: params.bucket,\n    });\n\n    const startTime = Date.now();\n\n    try {\n      // Select adapter based on params or default\n      let adapter: BaseStorageAdapter | null | undefined = null;\n\n      if (params.adapter) {\n        // Use specified adapter\n        adapter = this.adapterRegistry.getAdapter(params.adapter) ?? null;\n\n        if (adapter) {\n          this.logger?.info('[StorageService] Using specified adapter for delete', {\n            adapter: params.adapter,\n            fileId: params.fileId,\n            bucket: params.bucket,\n          });\n        } else {\n          this.logger?.warn('[StorageService] Specified adapter not found, falling back', {\n            requestedAdapter: params.adapter,\n            fileId: params.fileId,\n          });\n        }\n      }\n\n      // Fallback to default adapter selection\n      if (!adapter) {\n        adapter = await this.adapterRegistry.selectHealthyAdapter();\n\n        this.logger?.info('[StorageService] Using default adapter for delete', {\n          adapter: adapter.name,\n          fileId: params.fileId,\n        });\n      }\n\n      // Execute beforeDelete plugin hooks (BLOCKING)\n      // Fetch metadata first for plugin context\n      const fileMetadata = await adapter.getFileMetadata(params.fileId, params.bucket);\n\n      const pluginContext = {\n        operation: 'delete',\n        timestamp: new Date(),\n        userId: params.customMetadata?.userId as string | undefined,\n        correlationId: params.customMetadata?.correlationId as string | undefined,\n        metadata: params.customMetadata,\n        storageAdapter: adapter,\n      } as const;\n\n      const beforeDeleteResult = await this.pluginRegistry.executeBeforeDelete(\n        params.fileId,\n        fileMetadata,\n        pluginContext,\n        { skipPlugins: params.skipPlugins, onlyPlugins: params.onlyPlugins }\n      );\n\n      // If plugins rejected the delete, throw error\n      if (!beforeDeleteResult.allowed) {\n        throw new StoragePackageError(\n          beforeDeleteResult.reason ?? 'Delete rejected by plugin',\n          STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n          {\n            context: {\n              rejectedBy: beforeDeleteResult.rejectedBy,\n              pluginsExecuted: beforeDeleteResult.pluginsExecuted,\n            },\n          }\n        );\n      }\n\n      this.logger?.debug('beforeDelete plugins executed', {\n        pluginsExecuted: beforeDeleteResult.pluginsExecuted,\n        duration: beforeDeleteResult.duration,\n      });\n\n      // Compliance checks (if enabled)\n      if (this.complianceManager && this.isComplianceEnabled()) {\n        params = await this.performDeleteComplianceCheck(params, fileMetadata);\n      }\n\n      this.logger?.debug('Attempting delete', {\n        adapter: adapter.name,\n        fileId: params.fileId,\n        complianceEnabled: this.isComplianceEnabled(),\n      });\n\n      const result = await adapter.delete(params);\n\n      // Emit success event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileDeleted, {\n        type: STORAGE_EVENT_TYPE.FileDeleted,\n        timestamp: new Date(),\n        metadata: result.metadata,\n        data: {\n          adapter: adapter.name,\n          duration: Date.now() - startTime,\n          permanent: params.permanent,\n        },\n      });\n\n      // Emit soft delete event if applicable\n      if (result.softDelete) {\n        await this.eventManager.emit(STORAGE_EVENT_TYPE.SoftDeleteProcessed, {\n          type: STORAGE_EVENT_TYPE.SoftDeleteProcessed,\n          timestamp: new Date(),\n          metadata: result.metadata,\n          data: {\n            softDelete: result.softDelete,\n            gracePeriodUntil: result.softDelete.gracePeriodUntil,\n            canRestore: result.softDelete.canRestore,\n          },\n        });\n      }\n\n      this.logger?.info('File deleted successfully', {\n        fileId: params.fileId,\n        adapter: adapter.name,\n        duration: Date.now() - startTime,\n      });\n\n      // Execute afterDelete plugin hooks (ASYNC - non-blocking)\n      const pluginDeleteResult = {\n        fileId: params.fileId,\n        metadata: result.metadata ?? fileMetadata,\n        softDelete: result.softDelete !== undefined,\n        deletedAt: new Date(),\n      };\n\n      this.pluginRegistry\n        .executeAfterDelete(pluginDeleteResult, pluginContext, {\n          skipPlugins: params.skipPlugins,\n          onlyPlugins: params.onlyPlugins,\n        })\n        .then(() => {\n          this.logger?.debug('afterDelete plugins executed');\n        })\n        .catch(error => {\n          this.logger?.error('afterDelete plugins failed', {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        });\n\n      return result;\n    } catch (error) {\n      // Emit failure event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileDeleteFailed, {\n        type: STORAGE_EVENT_TYPE.FileDeleteFailed,\n        timestamp: new Date(),\n        data: {\n          fileId: params.fileId,\n          error: error instanceof Error ? error.message : String(error),\n        },\n      });\n\n      this.logger?.error('File delete failed', {\n        fileId: params.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      throw error;\n    }\n  }\n\n  /**\n   * Restore a soft-deleted file\n   *\n   * @param fileId - ID of the file to restore\n   * @returns Promise<FileMetadata> - Restored file metadata\n   *\n   * @example\n   * ```typescript\n   * const restored = await service.restoreFile('file-123');\n   * console.log('File restored:', restored.fileId);\n   * ```\n   */\n  async restoreFile(fileId: string): Promise<FileMetadata> {\n    this.logger?.info('Restoring soft-deleted file', { fileId });\n\n    const startTime = Date.now();\n\n    try {\n      const adapter = await this.adapterRegistry.selectHealthyAdapter();\n\n      this.logger?.debug('Restoring file via adapter', {\n        adapter: adapter.name,\n        fileId,\n      });\n\n      const metadata = await adapter.restoreFile(fileId);\n\n      // Emit file restored event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileRestored, {\n        type: STORAGE_EVENT_TYPE.FileRestored,\n        timestamp: new Date(),\n        metadata,\n        data: {\n          adapter: adapter.name,\n          fileId,\n          duration: Date.now() - startTime,\n        },\n      });\n\n      this.logger?.info('File restored successfully', {\n        fileId,\n        adapter: adapter.name,\n        duration: Date.now() - startTime,\n      });\n\n      return metadata;\n    } catch (error) {\n      this.logger?.error('File restore failed', {\n        fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      throw error;\n    }\n  }\n\n  /**\n   * Generate file to buffer (without uploading)\n   *\n   * Useful when you want to:\n   * - Process the file further before uploading\n   * - Send the file directly in an HTTP response\n   * - Store the file elsewhere\n   * - Preview/test file generation\n   *\n   * @param params - Generation parameters\n   * @returns Buffer containing the generated file\n   *\n   * @example\n   * ```typescript\n   * // Generate PDF invoice to buffer\n   * const buffer = await storage.generateFile({\n   *   templateId: 'invoices/standard-invoice',\n   *   templateData: { customer: 'John Doe', amount: 1500 },\n   *   outputFormat: 'pdf',\n   * });\n   *\n   * // Do something with the buffer (e.g., send via email, process further, etc.)\n   * await emailService.sendAttachment(buffer, 'invoice.pdf');\n   * ```\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  async generateFile(params: GenerateFileParams): Promise<Buffer> {\n    const outputFormat = (params.outputFormat ?? OUTPUT_FORMAT.PDF) as OUTPUT_FORMAT;\n    const startTime = Date.now();\n\n    this.logger?.debug('[StorageService] Generating file to buffer', {\n      templateId: params.templateId,\n      locale: params.locale,\n      outputFormat,\n    });\n\n    try {\n      const locale = params.locale ?? this.templateEngine.getDefaultLocale();\n      const registry = this.templateEngine.getRendererRegistry();\n\n      if (!registry) {\n        throw new StoragePackageError(\n          'Renderer registry not configured',\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { templateId: params.templateId } }\n        );\n      }\n\n      // Register renderer on-demand if specified and not yet registered\n      if (params.rendererName) {\n        this.registerRenderer(registry, params.rendererName);\n      }\n\n      // For format-based selection, try to auto-register appropriate renderer\n      let renderer;\n      try {\n        renderer = params.rendererName\n          ? registry.getRendererByName(params.rendererName)\n          : registry.getRenderer(outputFormat);\n      } catch (error) {\n        // Renderer not found, try to auto-register based on format\n        const rendererMap: Partial<Record<OUTPUT_FORMAT, STORAGE_RENDERER_TYPE>> = {\n          [OUTPUT_FORMAT.PDF]: STORAGE_RENDERER_TYPE.PUPPETEER,\n          [OUTPUT_FORMAT.PNG]: STORAGE_RENDERER_TYPE.PUPPETEER,\n          [OUTPUT_FORMAT.JPEG]: STORAGE_RENDERER_TYPE.PUPPETEER,\n          [OUTPUT_FORMAT.EXCEL]: STORAGE_RENDERER_TYPE.EXCELJS,\n          [OUTPUT_FORMAT.WORD]: STORAGE_RENDERER_TYPE.DOCXTEMPLATER,\n        };\n\n        const suggestedRenderer = rendererMap[outputFormat.toLowerCase() as OUTPUT_FORMAT];\n        if (suggestedRenderer) {\n          this.logger?.debug(\n            `[StorageService] Auto-registering renderer for format: ${outputFormat}`,\n            { renderer: suggestedRenderer }\n          );\n          this.registerRenderer(registry, suggestedRenderer);\n\n          // Retry getting the renderer\n          renderer = params.rendererName\n            ? registry.getRendererByName(params.rendererName)\n            : registry.getRenderer(outputFormat);\n        } else {\n          throw error; // Re-throw if we can't auto-register\n        }\n      }\n\n      this.logger?.debug('[StorageService] Using renderer', {\n        renderer: renderer.name,\n        outputFormat,\n      });\n\n      // Generate the file buffer\n      const documentBuffer = await this.templateEngine.renderToFormat({\n        templateId: params.templateId,\n        data: params.templateData,\n        format: outputFormat,\n        locale,\n        pdfOptions:\n          outputFormat === 'pdf'\n            ? {\n                pageSize: params.pdfOptions?.pageSize ?? 'A4',\n                orientation: params.pdfOptions?.orientation ?? 'portrait',\n                margins: params.pdfOptions?.margins,\n                printBackground: params.pdfOptions?.printBackground ?? true,\n                metadata: params.pdfOptions?.metadata,\n                ...params.pdfOptions,\n              }\n            : undefined,\n        validation: params.validation,\n      });\n\n      this.logger?.debug('[StorageService] File generated successfully', {\n        templateId: params.templateId,\n        size: documentBuffer.length,\n        locale,\n        format: outputFormat,\n      });\n\n      // Emit FILE_GENERATED event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileGenerated, {\n        type: STORAGE_EVENT_TYPE.FileGenerated,\n        timestamp: new Date(),\n        data: {\n          templateId: params.templateId,\n          locale,\n          outputFormat,\n          renderer: renderer.name,\n          size: documentBuffer.length,\n          duration: Date.now() - startTime,\n        },\n      });\n\n      return documentBuffer;\n    } catch (error) {\n      this.logger?.error('[StorageService] File generation failed', {\n        templateId: params.templateId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      // Emit FILE_GENERATION_FAILED event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileGenerationFailed, {\n        type: STORAGE_EVENT_TYPE.FileGenerationFailed,\n        timestamp: new Date(),\n        data: {\n          templateId: params.templateId,\n          outputFormat,\n          error: error instanceof Error ? error.message : String(error),\n          duration: Date.now() - startTime,\n        },\n      });\n\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n\n      throw new StoragePackageError(\n        'Failed to generate file from template',\n        STORAGE_ERROR_CODES.TEMPLATE_RENDER_FAILED,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: { templateId: params.templateId, outputFormat },\n        }\n      );\n    }\n  }\n\n  /**\n   * Generate file and save to local path (without uploading to storage adapter)\n   *\n   * Useful when you want to:\n   * - Save generated files to a local directory for batch processing\n   * - Generate files for a local file system\n   * - Create files that will be uploaded via a different mechanism\n   *\n   * @param params - Generation parameters including output path\n   * @returns Metadata about the generated file\n   *\n   * @example\n   * ```typescript\n   * // Generate and save invoice to local path\n   * const result = await storage.generateFileToPath({\n   *   templateId: 'invoices/standard-invoice',\n   *   templateData: { customer: 'John Doe', amount: 1500 },\n   *   outputFormat: 'pdf',\n   *   outputPath: '/tmp/invoices/invoice-12345.pdf',\n   * });\n   *\n  // eslint-disable-next-line complexity\n   * console.log(`File saved to: ${result.path}`);\n   * console.log(`File size: ${result.size} bytes`);\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async generateFileToPath(params: GenerateFileToPathParams): Promise<GenerateFileToPathResult> {\n    this.logger?.debug('[StorageService] Generating file to path', {\n      templateId: params.templateId,\n      outputPath: params.outputPath,\n      outputFormat: params.outputFormat,\n    });\n\n    try {\n      // Generate the file buffer\n      const buffer = await this.generateFile(params);\n\n      // Ensure directory exists\n      const dir = dirname(params.outputPath);\n      mkdirSync(dir, { recursive: true });\n\n      // Write file to disk\n      writeFileSync(params.outputPath, buffer);\n\n      const registry = this.templateEngine.getRendererRegistry();\n      const outputFormat = params.outputFormat ?? OUTPUT_FORMAT.PDF;\n      const renderer = params.rendererName\n        ? registry?.getRendererByName(params.rendererName)\n        : registry?.getRenderer(outputFormat as OUTPUT_FORMAT);\n\n      this.logger?.info('[StorageService] File saved to path', {\n        templateId: params.templateId,\n        path: params.outputPath,\n        size: buffer.length,\n      });\n\n      return {\n        path: params.outputPath,\n        size: buffer.length,\n        format: outputFormat,\n        renderer: renderer?.name ?? 'unknown',\n      };\n    } catch (error) {\n      this.logger?.error('[StorageService] File save to path failed', {\n        templateId: params.templateId,\n        outputPath: params.outputPath,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      throw error;\n    }\n  }\n\n  /**\n   * Update/replace an existing file\n   *\n   * @param params - Update parameters\n   * @returns Updated file metadata\n   *\n   * @example\n   * ```typescript\n   * // Update existing invoice with new data\n   * const result = await storage.updateFile({\n   *   fileId: 'existing-file-id',\n   *   file: newBuffer, // or\n   *   templateId: 'invoices/standard-invoice', // regenerate from template\n  // eslint-disable-next-line complexity\n   *   templateData: { ...updatedData },\n   *   reason: 'Updated invoice with corrected amount',\n   * });\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async updateFile(params: UpdateFileParams): Promise<UploadResult> {\n    const startTime = Date.now();\n\n    this.logger?.info('[StorageService] Updating file', {\n      fileId: params.fileId,\n      hasFile: !!params.file,\n      hasTemplate: !!params.templateId,\n    });\n\n    try {\n      // Get existing file metadata\n      const existingFile = await this.downloadFile({ fileId: params.fileId });\n\n      // Generate new file if template provided\n      let fileBuffer: Buffer;\n      if (params.templateId && params.templateData) {\n        fileBuffer = await this.generateFile({\n          templateId: params.templateId,\n          templateData: params.templateData,\n          outputFormat: params.outputFormat,\n          locale: params.locale,\n          validation: params.validation,\n        });\n      } else if (params.file) {\n        fileBuffer = params.file;\n      } else {\n        throw new StoragePackageError(\n          'Either file or templateId/templateData must be provided',\n          STORAGE_ERROR_CODES.VALIDATION_FAILED\n        );\n      }\n\n      // Delete old file\n      await this.deleteFile({\n        fileId: params.fileId,\n        reason: params.reason ?? 'File updated/replaced',\n      });\n\n      // Upload new file with same metadata\n      const uploadResult = await this.uploadFile({\n        file: fileBuffer,\n        filename: existingFile.metadata.filename,\n        mimeType: existingFile.metadata.mimeType,\n        category: existingFile.metadata.category,\n        entityType: existingFile.metadata.entityType,\n        entityId: existingFile.metadata.entityId,\n        accessLevel: existingFile.metadata.accessLevel,\n        customMetadata: {\n          ...existingFile.metadata.customMetadata,\n          ...params.customMetadata,\n          updatedFrom: params.fileId,\n          updateReason: params.reason,\n          updatedAt: new Date().toISOString(),\n        },\n        tags: existingFile.metadata.tags,\n        immutable: existingFile.metadata.immutable,\n        retentionPolicyId: existingFile.metadata.retentionPolicyId,\n      });\n\n      this.logger?.info('[StorageService] File updated successfully', {\n        oldFileId: params.fileId,\n        newFileId: uploadResult.metadata.fileId,\n      });\n\n      // Emit FILE_UPDATED event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileUpdated, {\n        type: STORAGE_EVENT_TYPE.FileUpdated,\n        timestamp: new Date(),\n        metadata: uploadResult.metadata,\n        data: {\n          oldFileId: params.fileId,\n          newFileId: uploadResult.metadata.fileId,\n          reason: params.reason,\n          duration: Date.now() - startTime,\n        },\n      });\n\n      return uploadResult;\n    } catch (error) {\n      this.logger?.error('[StorageService] File update failed', {\n        fileId: params.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      // Emit FILE_UPDATE_FAILED event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileUpdateFailed, {\n        type: STORAGE_EVENT_TYPE.FileUpdateFailed,\n        timestamp: new Date(),\n        data: {\n          fileId: params.fileId,\n          error: error instanceof Error ? error.message : String(error),\n          duration: Date.now() - startTime,\n        },\n      });\n\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n\n      throw new StoragePackageError(\n        'Failed to update file',\n        STORAGE_ERROR_CODES.STORAGE_FILE_UPDATE_FAILED,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: { fileId: params.fileId },\n        }\n      );\n    }\n  }\n\n  /**\n   * Generate a presigned/signed URL for file access\n   */\n  // eslint-disable-next-line complexity\n  async getSignedUrl(options: PresignedUrlOptions): Promise<PresignedUrlResult> {\n    this.logger?.info('Signed URL requested', {\n      fileId: options.fileId,\n      operation: options.operation,\n      expiresIn: options.expiresIn,\n      adapter: options.adapter,\n      bucket: options.bucket,\n    });\n\n    const startTime = Date.now();\n\n    try {\n      // Select adapter based on params or default\n      let adapter: BaseStorageAdapter | null | undefined = null;\n\n      if (options.adapter) {\n        // Use specified adapter\n        adapter = this.adapterRegistry.getAdapter(options.adapter) ?? null;\n\n        if (adapter) {\n          this.logger?.info('[StorageService] Using specified adapter for signed URL', {\n            adapter: options.adapter,\n            fileId: options.fileId,\n            bucket: options.bucket,\n            operation: options.operation,\n          });\n        } else {\n          this.logger?.warn('[StorageService] Specified adapter not found, falling back', {\n            requestedAdapter: options.adapter,\n            fileId: options.fileId,\n          });\n        }\n      }\n\n      // Fallback to default adapter selection\n      if (!adapter) {\n        adapter = await this.adapterRegistry.selectHealthyAdapter();\n\n        this.logger?.info('[StorageService] Using default adapter for signed URL', {\n          adapter: adapter.name,\n          fileId: options.fileId,\n        });\n      }\n\n      this.logger?.debug('Generating signed URL', {\n        adapter: adapter.name,\n        fileId: options.fileId,\n        operation: options.operation,\n        bucket: options.bucket,\n      });\n\n      const result = await adapter.getSignedUrl(options);\n\n      // Emit success event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.SignedUrlGenerated, {\n        type: STORAGE_EVENT_TYPE.SignedUrlGenerated,\n        timestamp: new Date(),\n        data: {\n          adapter: adapter.name,\n          fileId: options.fileId,\n          operation: options.operation,\n          expiresIn: options.expiresIn,\n          duration: Date.now() - startTime,\n        },\n      });\n\n      this.logger?.info('Signed URL generated successfully', {\n        fileId: options.fileId,\n        adapter: adapter.name,\n        duration: Date.now() - startTime,\n      });\n\n      // Execute onAccess plugin hooks (ASYNC - non-blocking)\n      // Fetch metadata for plugin context (async, don't block the response)\n      if (options.fileId) {\n        adapter\n          .getFileMetadata(options.fileId)\n          .then(fileMetadata => {\n            const pluginContext = {\n              operation: 'access',\n              timestamp: new Date(),\n              userId: options.customMetadata?.userId as string | undefined,\n              correlationId: options.customMetadata?.correlationId as string | undefined,\n              metadata: options.customMetadata,\n              storageAdapter: adapter,\n            } as const;\n\n            const accessEvent = {\n              fileId: options.fileId!,\n              userId: options.customMetadata?.userId as string | 'anonymous',\n              accessType: options.operation === 'get' ? 'download' : 'other',\n              timestamp: new Date(),\n              metadata: fileMetadata,\n            } as const;\n\n            return this.pluginRegistry.executeOnAccess(accessEvent, pluginContext, {\n              skipPlugins: options.skipPlugins,\n              onlyPlugins: options.onlyPlugins,\n            });\n          })\n          .then(() => {\n            this.logger?.debug('onAccess plugins executed');\n          })\n          .catch(error => {\n            this.logger?.error('onAccess plugins failed', {\n              error: error instanceof Error ? error.message : String(error),\n            });\n          });\n      }\n\n      return result;\n    } catch (error) {\n      this.logger?.error('Signed URL generation failed', {\n        fileId: options.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      throw error;\n    }\n  }\n\n  /**\n   * Get adapter registry health summary\n   */\n  getHealthSummary(): ReturnType<AdapterRegistry['getHealthSummary']> {\n    return this.adapterRegistry.getHealthSummary();\n  }\n\n  /**\n   * Get event manager statistics\n   */\n  getEventStatistics(): ReturnType<EventManager['getStatistics']> {\n    return this.eventManager.getStatistics();\n  }\n\n  /**\n   * Manually trigger health check for all adapters\n   */\n  async checkAllAdaptersHealth(): Promise<void> {\n    await this.adapterRegistry.checkAllAdaptersHealth();\n  }\n\n  /**\n   * Delete buckets from storage adapters\n   * Useful for cleanup in tests or migrations\n   *\n   * @param bucketNames - Array of bucket names to delete\n   * @param adapterName - Optional specific adapter to use (defaults to all adapters)\n   * @returns Results showing which buckets were deleted and which failed\n   *\n   * @example\n   * ```typescript\n   * // Delete test buckets from all adapters\n   * const result = await storageService.deleteBuckets([\n   *   'compliance',\n   *   'media-images',\n   *   'test-bucket'\n   * ]);\n   * console.log(`Deleted: ${result.deleted.length}, Failed: ${result.failed.length}`);\n   *\n   * // Delete from specific adapter\n   * const result = await storageService.deleteBuckets(\n   *   ['old-bucket'],\n   *   'supabase-storage'\n   * );\n   * ```\n   */\n  async deleteBuckets(\n    bucketNames: string[],\n    adapterName?: string\n  ): Promise<{\n    deleted: string[];\n    failed: Array<{ bucket: string; error: string; adapter?: string }>;\n  }> {\n    const deleted: string[] = [];\n    const failed: Array<{ bucket: string; error: string; adapter?: string }> = [];\n\n    // Get adapters to use\n    const adapters = adapterName\n      ? [this.adapterRegistry.getAdapter(adapterName)].filter(\n          (a): a is NonNullable<typeof a> => a !== undefined\n        )\n      : this.adapterRegistry.getAllAdapters();\n\n    for (const adapter of adapters) {\n      // Check if adapter has deleteBuckets method\n      if ('deleteBuckets' in adapter && typeof adapter.deleteBuckets === 'function') {\n        try {\n          const result = await adapter.deleteBuckets(bucketNames);\n\n          // Merge results\n          deleted.push(...result.deleted);\n          failed.push(\n            ...result.failed.map((f: BucketDeletionResult['failed']) => ({\n              ...f,\n              adapter: adapter.name,\n            }))\n          );\n        } catch (error) {\n          // If the adapter doesn't support bucket deletion, add all buckets to failed\n          const errorMessage = error instanceof Error ? error.message : String(error);\n          bucketNames.forEach(bucket => {\n            failed.push({\n              bucket,\n              error: `Adapter ${adapter.name} failed: ${errorMessage}`,\n              adapter: adapter.name,\n            });\n          });\n        }\n      } else {\n        // Adapter doesn't support deleteBuckets\n        bucketNames.forEach(bucket => {\n          failed.push({\n            bucket,\n            error: `Adapter ${adapter.name} does not support bucket deletion`,\n            adapter: adapter.name,\n          });\n        });\n      }\n    }\n\n    return { deleted: [...new Set(deleted)], failed }; // Deduplicate deleted buckets\n  }\n\n  /**\n   * Register a new event handler\n   */\n  onEvent(\n    eventType: STORAGE_EVENT_TYPE,\n    handler: (payload: StorageEventPayload) => void | Promise<void>\n  ): () => void {\n    return this.eventManager.on(eventType, handler);\n  }\n\n  /**\n   * Register an event listener (alias for onEvent)\n   *\n   * @param eventType - The event type to listen for\n   * @param handler - The event handler callback\n   * @returns Unsubscribe function\n   *\n   * @example\n   * ```typescript\n   * // Listen to compliance events\n   * service.on(STORAGE_EVENT_TYPE.RetentionEnforced, (event) => {\n   *   console.log('File deletion blocked:', event.data);\n   * });\n   *\n   * // Listen to soft delete events\n   * service.on(STORAGE_EVENT_TYPE.SoftDeleteProcessed, (event) => {\n   *   console.log('File soft deleted:', event.metadata?.fileId);\n   * });\n   * ```\n   */\n  on(\n    eventType: STORAGE_EVENT_TYPE,\n    handler: (payload: StorageEventPayload) => void | Promise<void>\n  ): () => void {\n    return this.eventManager.on(eventType, handler);\n  }\n\n  /**\n   * Unregister an event listener\n   *\n   * @param eventType - The event type\n   * @param handler - The event handler to remove\n   *\n   * @example\n   * ```typescript\n   * const handler = (event) => console.log(event);\n   * service.on(STORAGE_EVENT_TYPE.FileUploaded, handler);\n   *\n   * // Later, unregister the handler\n   * service.off(STORAGE_EVENT_TYPE.FileUploaded, handler);\n   * ```\n   */\n  off(\n    eventType: STORAGE_EVENT_TYPE,\n    handler: (payload: StorageEventPayload) => void | Promise<void>\n  ): void {\n    this.eventManager.off(eventType, handler);\n  }\n\n  /**\n   * Get template engine instance (for PDF generation and custom template operations)\n   *\n   * @returns TemplateEngine instance\n   *\n   * @example\n   * ```typescript\n   * const engine = service.getTemplateEngine();\n   * engine.setDefaultLocale('es');\n   * const result = await engine.render('invoices/standard', data);\n   * ```\n   */\n  getTemplateEngine(): TemplateEngine {\n    return this.templateEngine;\n  }\n\n  /**\n   * Process a queued operation\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private async processQueuedOperation(operation: StorageQueuedOperation): Promise<void> {\n    switch (operation.type) {\n      case 'upload':\n        if (operation.uploadParams) {\n          await this.uploadFile(operation.uploadParams);\n        }\n        break;\n\n      case 'render':\n        if (operation.templateId && operation.templateData && operation.uploadParams) {\n          // Render template and upload\n          const uploadParams = {\n            ...operation.uploadParams,\n            templateId: operation.templateId,\n            templateData: operation.templateData,\n          };\n          await this.uploadFile(uploadParams);\n        }\n        break;\n\n      case 'delete':\n        if (operation.fileId) {\n          await this.deleteFile({ fileId: operation.fileId });\n        }\n        break;\n\n      default:\n        throw new StoragePackageError(\n          `Unknown operation type: ${operation.type}`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          {\n            context: {\n              operationType: operation.type,\n              operationId: operation.id,\n            },\n          }\n        );\n    }\n  }\n\n  /**\n   * Queue bulk uploads for background processing\n   *\n   * @param files - Array of upload parameters with optional priority\n   * @returns Promise that resolves when all operations are queued\n   *\n   * @example\n   * ```typescript\n   * await service.queueBulkUpload([\n   *   { file: buffer1, filename: 'image1.jpg', category: FILE_CATEGORY.PostImage, entityType: ENTITY_TYPE.POST, entityId: '1' },\n   *   { file: buffer2, filename: 'image2.jpg', category: FILE_CATEGORY.PostImage, entityType: ENTITY_TYPE.POST, entityId: '2', priority: 'high' },\n   * ]);\n   * ```\n   */\n  async queueBulkUpload(\n    files: Array<UploadParams & { priority?: 'high' | 'normal' | 'low' }>\n  ): Promise<void> {\n    if (!this.queue) {\n      throw new StoragePackageError(\n        'Queue is not enabled. Enable queue in StorageServiceConfig.',\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED\n      );\n    }\n\n    for (const fileParams of files) {\n      const { priority, ...uploadParams } = fileParams;\n      const operation: StorageQueuedOperation = {\n        id: `upload-${Date.now()}-${Math.random().toString(STORAGE_SERVICE_DEFAULTS.RANDOM_ID_RADIX).substr(STORAGE_SERVICE_DEFAULTS.RANDOM_ID_START_INDEX, STORAGE_SERVICE_DEFAULTS.RANDOM_ID_LENGTH)}`,\n        type: 'upload',\n        uploadParams,\n        priority: (priority as STORAGE_QUEUE_PRIORITY) ?? ('normal' as STORAGE_QUEUE_PRIORITY),\n        retryCount: 0,\n        maxRetries: this.queueConfig?.maxRetries ?? STORAGE_SERVICE_DEFAULTS.QUEUE_MAX_RETRIES,\n        createdAt: new Date(),\n      };\n\n      await this.queue.enqueue(operation);\n    }\n\n    this.logger?.info('[StorageService] Bulk upload queued', {\n      count: files.length,\n    });\n  }\n\n  /**\n   * Queue document generation for background processing\n   *\n   * @param options - Document generation options\n   * @returns Promise that resolves when operation is queued\n   *\n   * @example\n   * ```typescript\n   * await service.queueDocumentGeneration({\n   *   templateId: 'invoices/standard-invoice',\n   *   data: invoiceData,\n   *   outputOptions: {\n   *     filename: 'invoice.pdf',\n   *     category: FILE_CATEGORY.InvoiceDocument,\n   *     entityType: ENTITY_TYPE.USER,\n   *     entityId: 'user-123',\n   *   },\n   *   priority: 'high',\n   * });\n   * ```\n   */\n  async queueDocumentGeneration(options: {\n    templateId: string;\n    data: Record<string, unknown>;\n    outputOptions: Omit<UploadParams, 'file' | 'templateId' | 'templateData'>;\n    priority?: 'high' | 'normal' | 'low';\n  }): Promise<void> {\n    if (!this.queue) {\n      throw new StoragePackageError(\n        'Queue is not enabled. Enable queue in StorageServiceConfig.',\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED\n      );\n    }\n\n    const operation: StorageQueuedOperation = {\n      id: `render-${Date.now()}-${Math.random().toString(STORAGE_SERVICE_DEFAULTS.RANDOM_ID_RADIX).substr(STORAGE_SERVICE_DEFAULTS.RANDOM_ID_START_INDEX, STORAGE_SERVICE_DEFAULTS.RANDOM_ID_LENGTH)}`,\n      type: 'render',\n      templateId: options.templateId,\n      templateData: options.data,\n      uploadParams: options.outputOptions as UploadParams,\n      priority:\n        (options.priority as STORAGE_QUEUE_PRIORITY) ?? ('normal' as STORAGE_QUEUE_PRIORITY),\n      retryCount: 0,\n      maxRetries: this.queueConfig?.maxRetries ?? STORAGE_SERVICE_DEFAULTS.QUEUE_MAX_RETRIES,\n      createdAt: new Date(),\n    };\n\n    await this.queue.enqueue(operation);\n\n    this.logger?.info('[StorageService] Document generation queued', {\n      templateId: options.templateId,\n      priority: options.priority,\n    });\n  }\n\n  /**\n   * Start the queue processor\n   */\n  startQueue(): void {\n    if (!this.queueProcessor) {\n      throw new StoragePackageError(\n        'Queue is not enabled. Enable queue in StorageServiceConfig.',\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED\n      );\n    }\n\n    this.queueProcessor.start();\n    this.logger?.info('[StorageService] Queue processor started');\n  }\n\n  /**\n   * Stop the queue processor\n   * Waits for active operations to complete\n   */\n  async stopQueue(): Promise<void> {\n    if (!this.queueProcessor) {\n      throw new StoragePackageError(\n        'Queue is not enabled. Enable queue in StorageServiceConfig.',\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED\n      );\n    }\n\n    await this.queueProcessor.stop();\n    this.logger?.info('[StorageService] Queue processor stopped');\n  }\n\n  /**\n   * Get queue statistics\n   *\n   * @returns Queue statistics including counts and status\n   */\n  getQueueStatistics(): StorageQueueStatistics {\n    if (!this.queue) {\n      throw new StoragePackageError(\n        'Queue is not enabled. Enable queue in StorageServiceConfig.',\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED\n      );\n    }\n\n    return this.queue.getStatistics();\n  }\n\n  /**\n   * Get ComplianceManager instance\n   *\n   * @returns ComplianceManager (always available, enabled by default)\n   */\n  getComplianceManager(): ComplianceManager {\n    return this.complianceManager;\n  }\n\n  /**\n   * Check if compliance is enabled\n   *\n   * @returns True if compliance manager is enabled\n   */\n  isComplianceEnabled(): boolean {\n    return this.complianceManager.isEnabled();\n  }\n\n  /**\n   * Register a webhook adapter\n   * Allows dynamic registration of webhook adapters after initialization\n   *\n   * @param adapter - Webhook adapter to register\n   *\n   * @example\n   * ```typescript\n   * const mediaWebhook = new MediaProcessingWebhook({\n   *   secret: process.env.MEDIA_PROCESSING_SECRET!,\n   *   signatureMethod: STORAGE_SIGNATURE_METHOD.HmacSha256,\n   *   logger,\n   * });\n   *\n   * storageService.registerWebhookAdapter(mediaWebhook);\n   * ```\n   */\n  registerWebhookAdapter(adapter: StorageWebhookAdapter): void {\n    if (!this.webhookManager) {\n      throw new StoragePackageError(\n        'Webhooks are not enabled. Configure webhooks in StorageServiceConfig.',\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED\n      );\n    }\n\n    this.webhookManager.registerAdapter(adapter);\n    this.logger?.info('[StorageService] Webhook adapter registered', {\n      provider: adapter.providerName,\n      eventType: adapter.eventType,\n    });\n  }\n\n  /**\n   * Handle incoming webhook from external service\n   *\n   * @param providerName - Provider name (e.g., 'media-processing', 'aws-mediaconvert')\n   * @param eventType - Storage event type\n   * @param payload - Raw webhook payload from HTTP request\n   * @returns Processing result\n   *\n   * @example\n   * ```typescript\n   * // In your Express/Fastify webhook endpoint:\n   * app.post('/webhooks/:provider', async (req, res) => {\n   *   const result = await storageService.handleWebhook(\n   *     req.params.provider,\n   *     req.headers['x-event-type'] ?? 'transcode.complete',\n   *     {\n   *       method: req.method,\n   *       url: req.url,\n   *       headers: req.headers,\n   *       body: req.body,\n   *       rawBody: req.rawBody, // Important for signature verification\n   *     }\n   *   );\n   *\n   *   if (result.success) {\n   *     res.status(200).json({ received: true });\n   *   } else {\n   *     res.status(400).json({ error: result.error?.message });\n   *   }\n   * });\n   * ```\n   */\n  async handleWebhook(\n    providerName: string,\n    eventType: STORAGE_WEBHOOK_EVENT_TYPE | string,\n    payload: StorageWebhookPayload<unknown>\n  ): Promise<StorageWebhookProcessingResult> {\n    if (!this.webhookManager) {\n      throw new StoragePackageError(\n        'Webhooks are not enabled. Configure webhooks in StorageServiceConfig.',\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED\n      );\n    }\n\n    return this.webhookManager.handleWebhook(providerName, eventType, payload);\n  }\n\n  /**\n   * Get webhook manager instance\n   * Provides access to webhook manager for advanced operations\n   *\n   * @returns WebhookManager instance or undefined if not enabled\n   */\n  getWebhookManager(): WebhookManager | undefined {\n    return this.webhookManager;\n  }\n\n  /**\n   * Check if webhooks are enabled\n   *\n   * @returns True if webhook manager is initialized\n   */\n  isWebhooksEnabled(): boolean {\n    return !!this.webhookManager;\n  }\n\n  /**\n   * Register event handlers using cleaner camelCase syntax\n   * Maps camelCase method names to enum-based event types using centralized mapping\n   * @private\n   */\n  private registerCleanHandlers(handlers: StorageEventHandlers): void {\n    // Use centralized mapping from @plyaz/types\n    // This ensures consistency across the codebase and allows reuse in other packages\n    for (const [handlerName, eventType] of Object.entries(STORAGE_EVENT_HANDLER_MAPPING)) {\n      const handler = handlers[handlerName as keyof StorageEventHandlers];\n      if (handler) {\n        this.eventManager.on(eventType, handler);\n      }\n    }\n  }\n\n  /**\n   * List all buckets\n   * Requires adapter support for bucket listing\n   *\n   * @param adapterName - Optional specific adapter to use\n   * @returns Promise<ListBucketsResult> - List of all buckets\n   *\n   * @example\n   * ```typescript\n   * const buckets = await service.listBuckets('supabase-storage');\n   * console.log('Buckets:', buckets.buckets.map(b => b.name));\n   * ```\n   */\n  async listBuckets(adapterName?: string): Promise<StorageListBucketsResult> {\n    try {\n      const adapter = adapterName\n        ? this.adapterRegistry.getAdapter(adapterName)\n        : await this.adapterRegistry.selectHealthyAdapter();\n\n      if (!adapter) {\n        throw new StoragePackageError(\n          'No adapter available for listBuckets',\n          STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS\n        );\n      }\n\n      if (!adapter.listBuckets) {\n        throw new StoragePackageError(\n          `Adapter '${adapter.name}' does not support listBuckets`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { adapter: adapter.name } }\n        );\n      }\n\n      this.logger?.debug('[StorageService] Listing buckets', {\n        adapter: adapter.name,\n      });\n\n      return await adapter.listBuckets();\n    } catch (error) {\n      this.logger?.error('[StorageService] listBuckets failed', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Get bucket details\n   * Requires adapter support for bucket info retrieval\n   *\n   * @param bucketName - Bucket name\n   * @param adapterName - Optional specific adapter to use\n   * @returns Promise<BucketInfo> - Bucket information\n   *\n   * @example\n   * ```typescript\n   * const bucket = await service.getBucket('media-images', 'supabase-storage');\n   * console.log('Bucket:', bucket.name, 'Public:', bucket.public);\n   * ```\n   */\n  async getBucket(bucketName: string, adapterName?: string): Promise<StorageBucketInfo> {\n    try {\n      const adapter = adapterName\n        ? this.adapterRegistry.getAdapter(adapterName)\n        : await this.adapterRegistry.selectHealthyAdapter();\n\n      if (!adapter) {\n        throw new StoragePackageError(\n          'No adapter available for getBucket',\n          STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS\n        );\n      }\n\n      if (!adapter.getBucket) {\n        throw new StoragePackageError(\n          `Adapter '${adapter.name}' does not support getBucket`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { adapter: adapter.name } }\n        );\n      }\n\n      this.logger?.debug('[StorageService] Getting bucket', {\n        bucketName,\n        adapter: adapter.name,\n      });\n\n      return await adapter.getBucket(bucketName);\n    } catch (error) {\n      this.logger?.error('[StorageService] getBucket failed', {\n        bucketName,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Update bucket settings\n   * Requires adapter support for bucket updates\n   *\n   * @param params - Update parameters\n   * @param adapterName - Optional specific adapter to use\n   *\n   * @example\n  // eslint-disable-next-line complexity\n   * ```typescript\n   * await service.updateBucket({\n   *   bucketName: 'media-images',\n   *   public: true,\n   *   fileSizeLimit: 10 * 1024 * 1024, // 10MB\n   * }, 'supabase-storage');\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async updateBucket(params: StorageUpdateBucketParams, adapterName?: string): Promise<void> {\n    try {\n      const adapter = adapterName\n        ? this.adapterRegistry.getAdapter(adapterName)\n        : await this.adapterRegistry.selectHealthyAdapter();\n\n      if (!adapter) {\n        throw new StoragePackageError(\n          'No adapter available for updateBucket',\n          STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS\n        );\n      }\n\n      if (!adapter.updateBucket) {\n        throw new StoragePackageError(\n          `Adapter '${adapter.name}' does not support updateBucket`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { adapter: adapter.name } }\n        );\n      }\n\n      this.logger?.debug('[StorageService] Updating bucket', {\n        bucketName: params.bucketName,\n        adapter: adapter.name,\n      });\n\n      await adapter.updateBucket(params);\n\n      this.logger?.info('[StorageService] Bucket updated', {\n        bucketName: params.bucketName,\n        adapter: adapter.name,\n      });\n    } catch (error) {\n      this.logger?.error('[StorageService] updateBucket failed', {\n        bucketName: params.bucketName,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * List files in a bucket\n   * Requires adapter support for file listing\n   *\n   * @param params - List parameters\n   * @param adapterName - Optional specific adapter to use\n   * @returns Promise<ListFilesResult> - List of files\n   *\n   * @example\n   * ```typescript\n   * const files = await service.listFiles({\n   *   bucket: 'media-images',\n   *   prefix: 'user-123/',\n   *   limit: 50,\n   *   sortBy: 'createdAt',\n   *   sortOrder: 'desc',\n   * });\n   * console.log('Files:', files.files.length, 'Has more:', files.hasMore);\n   * ```\n   */\n  async listFiles(\n    params: StorageListFilesParams,\n    adapterName?: string\n  ): Promise<StorageListFilesResult> {\n    try {\n      const adapter = adapterName\n        ? this.adapterRegistry.getAdapter(adapterName)\n        : await this.adapterRegistry.selectHealthyAdapter();\n\n      if (!adapter) {\n        throw new StoragePackageError(\n          'No adapter available for listFiles',\n          STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS\n        );\n      }\n\n      if (!adapter.listFiles) {\n        throw new StoragePackageError(\n          `Adapter '${adapter.name}' does not support listFiles`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { adapter: adapter.name } }\n        );\n      }\n\n      this.logger?.debug('[StorageService] Listing files', {\n        bucket: params.bucket,\n        prefix: params.prefix,\n        adapter: adapter.name,\n      });\n\n      return await adapter.listFiles(params);\n    } catch (error) {\n      this.logger?.error('[StorageService] listFiles failed', {\n        bucket: params.bucket,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Move a file from one location to another\n   * Requires adapter support for file moving\n   *\n   * SECURITY: This method runs the complete compliance stack:\n   * - beforeDelete hooks (check if source file can be deleted)\n   * - beforeUpload hooks (validate destination)\n   * - Compliance checks (immutability, retention on source file)\n   * - Event emissions (FILE_MOVED or FILE_MOVE_FAILED)\n   * - afterUpload hooks (notifications for new location)\n   * - afterDelete hooks (cleanup for old location)\n   *\n   * NOTE: Move is equivalent to copy + delete, so source file must be deletable\n   *\n   * @param params - Move parameters\n   * @returns Promise<FileMetadata> - Metadata of moved file\n   *\n   * @example\n   * ```typescript\n   * const metadata = await service.moveFile({\n   *   sourceBucket: 'temp',\n   *   sourcePath: 'upload-123.pdf',\n   *   destinationBucket: 'documents',\n   *   destinationPath: 'final/invoice-123.pdf',\n   * });\n   * ```\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  async moveFile(params: StorageMoveFileParams): Promise<FileMetadata> {\n    const startTime = Date.now();\n\n    this.logger?.info('[StorageService] Move file requested', {\n      from: `${params.sourceBucket}/${params.sourcePath}`,\n      to: `${params.destinationBucket}/${params.destinationPath}`,\n    });\n\n    try {\n      const adapter = params.sourceAdapter\n        ? this.adapterRegistry.getAdapter(params.sourceAdapter)\n        : await this.adapterRegistry.selectHealthyAdapter();\n\n      if (!adapter) {\n        throw new StoragePackageError(\n          'No adapter available for moveFile',\n          STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS\n        );\n      }\n\n      if (!adapter.moveFile) {\n        throw new StoragePackageError(\n          `Adapter '${adapter.name}' does not support moveFile`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { adapter: adapter.name } }\n        );\n      }\n\n      // Fetch source file metadata first for compliance checks\n      // Note: We need to construct fileId from path for getFileMetadata\n      const sourceFileId = params.sourcePath;\n      let sourceMetadata: FileMetadata | undefined;\n\n      try {\n        sourceMetadata = await adapter.getFileMetadata(sourceFileId, params.sourceBucket);\n      } catch (error) {\n        this.logger?.warn('[StorageService] Could not fetch source file metadata', {\n          sourcePath: params.sourcePath,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n\n      // ========================================\n      // PHASE 1: beforeDelete hooks (check if source can be deleted)\n      // ========================================\n      if (sourceMetadata) {\n        const deletePluginContext = {\n          operation: 'delete',\n          timestamp: new Date(),\n          userId: params.customMetadata?.userId as string | undefined,\n          correlationId: params.customMetadata?.correlationId as string | undefined,\n          metadata: {\n            ...params.customMetadata,\n            isMove: true,\n            destination: `${params.destinationBucket}/${params.destinationPath}`,\n          },\n          storageAdapter: adapter,\n        } as const;\n\n        const beforeDeleteResult = await this.pluginRegistry.executeBeforeDelete(\n          sourceFileId,\n          sourceMetadata,\n          deletePluginContext,\n          { skipPlugins: params.skipPlugins, onlyPlugins: params.onlyPlugins }\n        );\n\n        if (!beforeDeleteResult.allowed) {\n          throw new StoragePackageError(\n            beforeDeleteResult.reason ??\n              'File move rejected by beforeDelete plugin (source file cannot be deleted)',\n            STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n            {\n              context: {\n                rejectedBy: beforeDeleteResult.rejectedBy,\n                pluginsExecuted: beforeDeleteResult.pluginsExecuted,\n                operation: 'move',\n              },\n            }\n          );\n        }\n\n        this.logger?.debug('[StorageService] beforeDelete hooks executed for move', {\n          pluginsExecuted: beforeDeleteResult.pluginsExecuted,\n          duration: beforeDeleteResult.duration,\n        });\n      }\n\n      // ========================================\n      // PHASE 2: Compliance checks on source file\n      // ========================================\n      if (sourceMetadata && this.complianceManager && this.isComplianceEnabled()) {\n        const complianceCheck = this.complianceManager.canDeleteFile(sourceMetadata, {\n          ignoreRetention: params.bypassRetention,\n        });\n\n        if (!complianceCheck.allowed) {\n          await this.handleMoveComplianceViolation(complianceCheck, sourceFileId, sourceMetadata);\n        }\n\n        this.logger?.debug('[StorageService] Compliance checks passed for move', {\n          sourceFileId,\n        });\n      }\n\n      // ========================================\n      // PHASE 3: Check DESTINATION compliance (prevent overwriting immutable files)\n      // ========================================\n      if (this.complianceManager && this.isComplianceEnabled()) {\n        let destinationFile: FileMetadata | undefined;\n        try {\n          destinationFile = await adapter.getFileMetadata(\n            params.destinationPath,\n            params.destinationBucket\n          );\n        } catch {\n          // Destination doesn't exist - safe to proceed\n          destinationFile = undefined;\n        }\n\n        if (destinationFile) {\n          this.validateMoveDestinationCompliance(destinationFile, params.destinationPath);\n        }\n      }\n\n      // ========================================\n      // PHASE 4: Perform the actual move operation\n      // ========================================\n      this.logger?.debug('[StorageService] Executing file move', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n        adapter: adapter.name,\n      });\n\n      // Note: For moveFile, customMetadata is used for plugin context tracking only\n      // The file itself is being moved, not modified, so metadata stays unchanged\n      const result = await adapter.moveFile(params);\n\n      // ========================================\n      // PHASE 4: Emit success event\n      // ========================================\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileMoved, {\n        type: STORAGE_EVENT_TYPE.FileMoved,\n        timestamp: new Date(),\n        metadata: result,\n        data: {\n          adapter: adapter.name,\n          duration: Date.now() - startTime,\n          sourceBucket: params.sourceBucket,\n          sourcePath: params.sourcePath,\n          destinationBucket: params.destinationBucket,\n          destinationPath: params.destinationPath,\n        },\n      });\n\n      this.logger?.info('[StorageService] File moved successfully', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n        adapter: adapter.name,\n        duration: Date.now() - startTime,\n      });\n\n      // ========================================\n      // PHASE 5: afterUpload hooks for destination (ASYNC - non-blocking)\n      // ========================================\n      const pluginUploadResult = {\n        fileId: result.fileId,\n        url: '', // Move operation doesn't return URL\n        metadata: result,\n        adapter: adapter.name,\n        duration: Date.now() - startTime,\n      };\n\n      const uploadPluginContext = {\n        operation: 'upload',\n        timestamp: new Date(),\n        userId: params.customMetadata?.userId as string | undefined,\n        correlationId: params.customMetadata?.correlationId as string | undefined,\n        metadata: {\n          ...params.customMetadata,\n          isMove: true,\n          sourceLocation: `${params.sourceBucket}/${params.sourcePath}`,\n        },\n        storageAdapter: adapter,\n      } as const;\n\n      this.pluginRegistry\n        .executeAfterUpload(pluginUploadResult, uploadPluginContext, {\n          skipPlugins: params.skipPlugins,\n          onlyPlugins: params.onlyPlugins,\n        })\n        .then(() => {\n          this.logger?.debug('[StorageService] afterUpload hooks executed for move');\n        })\n        .catch(error => {\n          this.logger?.error('[StorageService] afterUpload hooks failed for move', {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        });\n\n      // ========================================\n      // PHASE 6: afterDelete hooks for source (ASYNC - non-blocking)\n      // ========================================\n      if (sourceMetadata) {\n        const pluginDeleteResult = {\n          fileId: sourceFileId,\n          metadata: sourceMetadata,\n          softDelete: false,\n          deletedAt: new Date(),\n        };\n\n        const deletePluginContext = {\n          operation: 'delete',\n          timestamp: new Date(),\n          userId: params.customMetadata?.userId as string | undefined,\n          correlationId: params.customMetadata?.correlationId as string | undefined,\n          metadata: {\n            ...params.customMetadata,\n            isMove: true,\n            destination: `${params.destinationBucket}/${params.destinationPath}`,\n          },\n          storageAdapter: adapter,\n        } as const;\n\n        this.pluginRegistry\n          .executeAfterDelete(pluginDeleteResult, deletePluginContext, {\n            skipPlugins: params.skipPlugins,\n            onlyPlugins: params.onlyPlugins,\n          })\n          .then(() => {\n            this.logger?.debug('[StorageService] afterDelete hooks executed for move');\n          })\n          .catch(error => {\n            this.logger?.error('[StorageService] afterDelete hooks failed for move', {\n              error: error instanceof Error ? error.message : String(error),\n            });\n          });\n      }\n\n      return result;\n    } catch (error) {\n      // Emit failure event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileMoveFailed, {\n        type: STORAGE_EVENT_TYPE.FileMoveFailed,\n        timestamp: new Date(),\n        data: {\n          sourceBucket: params.sourceBucket,\n          sourcePath: params.sourcePath,\n          destinationBucket: params.destinationBucket,\n          destinationPath: params.destinationPath,\n          error: error instanceof Error ? error.message : String(error),\n          duration: Date.now() - startTime,\n        },\n      });\n\n      this.logger?.error('[StorageService] moveFile failed', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Copy a file to another location\n   * Requires adapter support for file copying\n   *\n   * SECURITY: This method runs the complete compliance stack:\n   * - beforeUpload hooks (validate destination file will be created)\n   * - Event emissions (FILE_COPIED or FILE_COPY_FAILED)\n   * - afterUpload hooks (notifications, CDN invalidation for new file)\n   *\n   * NOTE: Copy creates a new file, so only beforeUpload/afterUpload hooks are needed\n   * Source file is NOT modified, so no beforeDelete/afterDelete hooks\n   *\n   * @param params - Copy parameters\n   * @returns Promise<FileMetadata> - Metadata of copied file\n   *\n   * @example\n   * ```typescript\n   * const metadata = await service.copyFile({\n   *   sourceBucket: 'documents',\n   *   sourcePath: 'template.pdf',\n   *   destinationBucket: 'documents',\n   *   destinationPath: 'user-123/copy.pdf',\n   * });\n   * ```\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  async copyFile(params: StorageCopyFileParams): Promise<FileMetadata> {\n    const startTime = Date.now();\n\n    this.logger?.info('[StorageService] Copy file requested', {\n      from: `${params.sourceBucket}/${params.sourcePath}`,\n      to: `${params.destinationBucket}/${params.destinationPath}`,\n    });\n\n    try {\n      const adapter = params.sourceAdapter\n        ? this.adapterRegistry.getAdapter(params.sourceAdapter)\n        : await this.adapterRegistry.selectHealthyAdapter();\n\n      if (!adapter) {\n        throw new StoragePackageError(\n          'No adapter available for copyFile',\n          STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS\n        );\n      }\n\n      if (!adapter.copyFile) {\n        throw new StoragePackageError(\n          `Adapter '${adapter.name}' does not support copyFile`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { adapter: adapter.name } }\n        );\n      }\n\n      // Fetch source file metadata (for context and validation)\n      const sourceFileId = params.sourcePath;\n      let sourceMetadata: FileMetadata | undefined;\n\n      try {\n        sourceMetadata = await adapter.getFileMetadata(sourceFileId);\n      } catch (error) {\n        this.logger?.warn('[StorageService] Could not fetch source file metadata', {\n          sourcePath: params.sourcePath,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n\n      // ========================================\n      // PHASE 1: beforeUpload hooks (for destination file)\n      // ========================================\n      // Note: For copy operations, we validate that the NEW file being created\n      // meets all upload requirements. We don't need to download the source file,\n      // but we provide source metadata for context.\n      if (sourceMetadata) {\n        const uploadPluginContext = {\n          operation: 'upload',\n          timestamp: new Date(),\n          userId: params.customMetadata?.userId as string | undefined,\n          correlationId: params.customMetadata?.correlationId as string | undefined,\n          metadata: {\n            ...params.customMetadata,\n            isCopy: true,\n            sourceLocation: `${params.sourceBucket}/${params.sourcePath}`,\n            sourceFileId,\n          },\n          storageAdapter: adapter,\n        } as const;\n\n        // Create a pseudo-file object for plugin validation\n        // Note: We don't have the actual buffer, but we have metadata\n        const pluginFile = {\n          buffer: Buffer.from(''), // Empty buffer - copy operation doesn't need full file\n          metadata: sourceMetadata,\n          filename: sourceMetadata.filename,\n          mimeType: sourceMetadata.mimeType,\n          size: sourceMetadata.size,\n        };\n\n        const beforeUploadResult = await this.pluginRegistry.executeBeforeUpload(\n          pluginFile,\n          uploadPluginContext,\n          { skipPlugins: params.skipPlugins, onlyPlugins: params.onlyPlugins }\n        );\n\n        if (!beforeUploadResult.allowed) {\n          throw new StoragePackageError(\n            beforeUploadResult.reason ??\n              'File copy rejected by beforeUpload plugin (destination validation failed)',\n            STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n            {\n              context: {\n                rejectedBy: beforeUploadResult.rejectedBy,\n                pluginsExecuted: beforeUploadResult.pluginsExecuted,\n                operation: 'copy',\n              },\n            }\n          );\n        }\n\n        // Apply modified metadata from plugins (if any)\n        if (beforeUploadResult.modifiedMetadata?.customMetadata) {\n          params.customMetadata = {\n            ...params.customMetadata,\n            ...beforeUploadResult.modifiedMetadata.customMetadata,\n          };\n        }\n\n        this.logger?.debug('[StorageService] beforeUpload hooks executed for copy', {\n          pluginsExecuted: beforeUploadResult.pluginsExecuted,\n          duration: beforeUploadResult.duration,\n        });\n      }\n\n      // ========================================\n      // PHASE 2: Check DESTINATION compliance (prevent overwriting immutable files)\n      // ========================================\n      if (this.complianceManager && this.isComplianceEnabled()) {\n        let destinationFile: FileMetadata | undefined;\n        try {\n          destinationFile = await adapter.getFileMetadata(\n            params.destinationPath,\n            params.destinationBucket\n          );\n        } catch {\n          // Destination doesn't exist - safe to proceed\n          destinationFile = undefined;\n        }\n\n        if (destinationFile) {\n          this.validateCopyDestinationCompliance(destinationFile, params.destinationPath);\n        }\n      }\n\n      // ========================================\n      // PHASE 3: Perform the actual copy operation\n      // ========================================\n      this.logger?.debug('[StorageService] Executing file copy', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n        adapter: adapter.name,\n      });\n\n      // Note: For copyFile, customMetadata is primarily for plugin context tracking\n      // The destination file inherits metadata from source, so we don't merge here\n      const result = await adapter.copyFile(params);\n\n      // ========================================\n      // PHASE 3: Emit success event\n      // ========================================\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileCopied, {\n        type: STORAGE_EVENT_TYPE.FileCopied,\n        timestamp: new Date(),\n        metadata: result,\n        data: {\n          adapter: adapter.name,\n          duration: Date.now() - startTime,\n          sourceBucket: params.sourceBucket,\n          sourcePath: params.sourcePath,\n          destinationBucket: params.destinationBucket,\n          destinationPath: params.destinationPath,\n        },\n      });\n\n      this.logger?.info('[StorageService] File copied successfully', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n        adapter: adapter.name,\n        duration: Date.now() - startTime,\n      });\n\n      // ========================================\n      // PHASE 4: afterUpload hooks for destination (ASYNC - non-blocking)\n      // ========================================\n      const pluginUploadResult = {\n        fileId: result.fileId,\n        url: '', // Copy operation doesn't return URL\n        metadata: result,\n        adapter: adapter.name,\n        duration: Date.now() - startTime,\n      };\n\n      const uploadPluginContext = {\n        operation: 'upload',\n        timestamp: new Date(),\n        userId: params.customMetadata?.userId as string | undefined,\n        correlationId: params.customMetadata?.correlationId as string | undefined,\n        metadata: {\n          ...params.customMetadata,\n          isCopy: true,\n          sourceLocation: `${params.sourceBucket}/${params.sourcePath}`,\n        },\n        storageAdapter: adapter,\n      } as const;\n\n      this.pluginRegistry\n        .executeAfterUpload(pluginUploadResult, uploadPluginContext, {\n          skipPlugins: params.skipPlugins,\n          onlyPlugins: params.onlyPlugins,\n        })\n        .then(() => {\n          this.logger?.debug('[StorageService] afterUpload hooks executed for copy');\n        })\n        .catch(error => {\n          this.logger?.error('[StorageService] afterUpload hooks failed for copy', {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        });\n\n      return result;\n    } catch (error) {\n      // Emit failure event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileCopyFailed, {\n        type: STORAGE_EVENT_TYPE.FileCopyFailed,\n        timestamp: new Date(),\n        data: {\n          sourceBucket: params.sourceBucket,\n          sourcePath: params.sourcePath,\n          destinationBucket: params.destinationBucket,\n          destinationPath: params.destinationPath,\n          error: error instanceof Error ? error.message : String(error),\n          duration: Date.now() - startTime,\n        },\n      });\n\n      this.logger?.error('[StorageService] copyFile failed', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Replace an existing file\n   * Requires adapter support for file replacement\n   *\n   * SECURITY: This method runs the complete compliance stack:\n   * - beforeDelete hooks (compliance checks on old file)\n   * - beforeUpload hooks (virus scan, validation on new file)\n   * - Compliance checks (immutability, retention policies)\n   * - Event emissions (FILE_REPLACED or FILE_REPLACE_FAILED)\n   * - afterUpload hooks (notifications, CDN invalidation)\n   * - afterDelete hooks (cleanup, audit logs)\n   *\n   * @param params - Replace parameters\n   * @returns Promise<FileMetadata> - Metadata of replaced file\n   *\n   * @example\n   * ```typescript\n   * const metadata = await service.replaceFile({\n   *   fileId: 'invoice-123.pdf',\n   *   file: newBuffer,\n   *   bucket: 'documents',\n   *   mimeType: 'application/pdf',\n   * });\n   * ```\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  async replaceFile(params: StorageReplaceFileParams): Promise<FileMetadata> {\n    const startTime = Date.now();\n\n    this.logger?.info('[StorageService] Replace file requested', {\n      fileId: params.fileId,\n      bucket: params.bucket,\n    });\n\n    try {\n      const adapter = params.adapter\n        ? this.adapterRegistry.getAdapter(params.adapter)\n        : await this.adapterRegistry.selectHealthyAdapter();\n\n      if (!adapter) {\n        throw new StoragePackageError(\n          'No adapter available for replaceFile',\n          STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS\n        );\n      }\n\n      if (!adapter.replaceFile) {\n        throw new StoragePackageError(\n          `Adapter '${adapter.name}' does not support replaceFile`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { adapter: adapter.name } }\n        );\n      }\n\n      // Fetch existing file metadata first for compliance and plugin checks\n      const existingMetadata = await adapter.getFileMetadata(params.fileId, params.bucket);\n\n      // ========================================\n      // PHASE 1: beforeDelete hooks (for old file)\n      // ========================================\n      const deletePluginContext = {\n        operation: 'delete',\n        timestamp: new Date(),\n        userId: params.customMetadata?.userId as string | undefined,\n        correlationId: params.customMetadata?.correlationId as string | undefined,\n        metadata: params.customMetadata,\n        storageAdapter: adapter,\n      } as const;\n\n      const beforeDeleteResult = await this.pluginRegistry.executeBeforeDelete(\n        params.fileId,\n        existingMetadata,\n        deletePluginContext,\n        { skipPlugins: params.skipPlugins, onlyPlugins: params.onlyPlugins }\n      );\n\n      if (!beforeDeleteResult.allowed) {\n        throw new StoragePackageError(\n          beforeDeleteResult.reason ?? 'File replacement rejected by beforeDelete plugin',\n          STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n          {\n            context: {\n              rejectedBy: beforeDeleteResult.rejectedBy,\n              pluginsExecuted: beforeDeleteResult.pluginsExecuted,\n            },\n          }\n        );\n      }\n\n      this.logger?.debug('[StorageService] beforeDelete hooks executed for replace', {\n        pluginsExecuted: beforeDeleteResult.pluginsExecuted,\n        duration: beforeDeleteResult.duration,\n      });\n\n      // ========================================\n      // PHASE 2: Compliance checks (immutability, retention)\n      // ========================================\n      if (this.complianceManager && this.isComplianceEnabled()) {\n        const complianceCheck = this.complianceManager.canDeleteFile(existingMetadata, {\n          ignoreRetention: params.bypassRetention,\n        });\n\n        if (!complianceCheck.allowed) {\n          await this.handleReplaceComplianceViolation(\n            complianceCheck,\n            params.fileId,\n            existingMetadata\n          );\n        }\n\n        this.logger?.debug('[StorageService] Compliance checks passed for replace', {\n          fileId: params.fileId,\n        });\n      }\n\n      // ========================================\n      // PHASE 3: beforeUpload hooks (for new file)\n      // ========================================\n      if (params.file && Buffer.isBuffer(params.file) && params.mimeType) {\n        const pluginFile = {\n          buffer: params.file,\n          metadata: existingMetadata, // Use existing metadata as base\n          filename: existingMetadata.filename,\n          mimeType: params.mimeType,\n          size: params.file.length,\n        };\n\n        const uploadPluginContext = {\n          operation: 'upload',\n          timestamp: new Date(),\n          userId: params.customMetadata?.userId as string | undefined,\n          correlationId: params.customMetadata?.correlationId as string | undefined,\n          metadata: {\n            ...params.customMetadata,\n            isReplacement: true,\n            originalFileId: params.fileId,\n          },\n          storageAdapter: adapter,\n        } as const;\n\n        const beforeUploadResult = await this.pluginRegistry.executeBeforeUpload(\n          pluginFile,\n          uploadPluginContext,\n          { skipPlugins: params.skipPlugins, onlyPlugins: params.onlyPlugins }\n        );\n\n        if (!beforeUploadResult.allowed) {\n          throw new StoragePackageError(\n            beforeUploadResult.reason ?? 'File replacement rejected by beforeUpload plugin',\n            STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n            {\n              context: {\n                rejectedBy: beforeUploadResult.rejectedBy,\n                pluginsExecuted: beforeUploadResult.pluginsExecuted,\n              },\n            }\n          );\n        }\n\n        // Apply modified metadata from plugins\n        if (beforeUploadResult.modifiedMetadata?.customMetadata) {\n          params.customMetadata = {\n            ...params.customMetadata,\n            ...beforeUploadResult.modifiedMetadata.customMetadata,\n          };\n        }\n\n        this.logger?.debug('[StorageService] beforeUpload hooks executed for replace', {\n          pluginsExecuted: beforeUploadResult.pluginsExecuted,\n          duration: beforeUploadResult.duration,\n        });\n      }\n\n      // ========================================\n      // PHASE 4: Perform the actual replacement\n      // ========================================\n      this.logger?.debug('[StorageService] Executing file replacement', {\n        fileId: params.fileId,\n        bucket: params.bucket,\n        adapter: adapter.name,\n      });\n\n      // Merge customMetadata into metadata for storage (if customMetadata was modified by plugins)\n      // This ensures plugin-modified metadata is persisted\n      const adapterParams = {\n        ...params,\n        metadata:\n          params.customMetadata && Object.keys(params.customMetadata).length > 0\n            ? { ...params.metadata, ...params.customMetadata }\n            : params.metadata,\n      };\n\n      const result = await adapter.replaceFile(adapterParams);\n\n      // ========================================\n      // PHASE 5: Emit success event\n      // ========================================\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileReplaced, {\n        type: STORAGE_EVENT_TYPE.FileReplaced,\n        timestamp: new Date(),\n        metadata: result,\n        data: {\n          adapter: adapter.name,\n          duration: Date.now() - startTime,\n          previousMetadata: existingMetadata,\n        },\n      });\n\n      this.logger?.info('[StorageService] File replaced successfully', {\n        fileId: params.fileId,\n        adapter: adapter.name,\n        duration: Date.now() - startTime,\n      });\n\n      // ========================================\n      // PHASE 6: afterUpload hooks (ASYNC - non-blocking)\n      // ========================================\n      const pluginUploadResult = {\n        fileId: result.fileId,\n        url: '', // Replace operation doesn't return URL\n        metadata: result,\n        adapter: adapter.name,\n        duration: Date.now() - startTime,\n      };\n\n      const uploadPluginContext = {\n        operation: 'upload',\n        timestamp: new Date(),\n        userId: params.customMetadata?.userId as string | undefined,\n        correlationId: params.customMetadata?.correlationId as string | undefined,\n        metadata: {\n          ...params.customMetadata,\n          isReplacement: true,\n          originalFileId: params.fileId,\n        },\n        storageAdapter: adapter,\n      } as const;\n\n      this.pluginRegistry\n        .executeAfterUpload(pluginUploadResult, uploadPluginContext, {\n          skipPlugins: params.skipPlugins,\n          onlyPlugins: params.onlyPlugins,\n        })\n        .then(() => {\n          this.logger?.debug('[StorageService] afterUpload hooks executed for replace');\n        })\n        .catch(error => {\n          this.logger?.error('[StorageService] afterUpload hooks failed for replace', {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        });\n\n      // ========================================\n      // PHASE 7: afterDelete hooks (ASYNC - non-blocking)\n      // ========================================\n      const pluginDeleteResult = {\n        fileId: params.fileId,\n        metadata: existingMetadata,\n        softDelete: false,\n        deletedAt: new Date(),\n      };\n\n      this.pluginRegistry\n        .executeAfterDelete(pluginDeleteResult, deletePluginContext, {\n          skipPlugins: params.skipPlugins,\n          onlyPlugins: params.onlyPlugins,\n        })\n        .then(() => {\n          this.logger?.debug('[StorageService] afterDelete hooks executed for replace');\n        })\n        .catch(error => {\n          this.logger?.error('[StorageService] afterDelete hooks failed for replace', {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        });\n\n      return result;\n    } catch (error) {\n      // Emit failure event\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileReplaceFailed, {\n        type: STORAGE_EVENT_TYPE.FileReplaceFailed,\n        timestamp: new Date(),\n        data: {\n          fileId: params.fileId,\n          bucket: params.bucket,\n          error: error instanceof Error ? error.message : String(error),\n          duration: Date.now() - startTime,\n        },\n      });\n\n      this.logger?.error('[StorageService] replaceFile failed', {\n        fileId: params.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Create a signed URL for direct upload\n   * Requires adapter support for signed upload URLs\n   *\n   * @param params - Signed upload URL parameters\n   * @returns Promise<SignedUploadUrlResult> - Signed URL and metadata\n   *\n   * @example\n   * ```typescript\n   * const result = await service.createSignedUploadUrl({\n  // eslint-disable-next-line complexity\n   *   bucket: 'user-uploads',\n   *   path: 'user-123/photo.jpg',\n   *   expiresIn: 3600,\n   *   contentType: 'image/jpeg',\n   *   fileSizeLimit: 5 * 1024 * 1024, // 5MB\n   * });\n   * // Client can now upload directly to result.url\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async createSignedUploadUrl(\n    params: StorageSignedUploadUrlParams\n  ): Promise<StorageSignedUploadUrlResult> {\n    const startTime = Date.now();\n\n    try {\n      const adapter = params.adapter\n        ? this.adapterRegistry.getAdapter(params.adapter)\n        : await this.adapterRegistry.selectHealthyAdapter();\n\n      if (!adapter) {\n        throw new StoragePackageError(\n          'No adapter available for createSignedUploadUrl',\n          STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS\n        );\n      }\n\n      if (!adapter.createSignedUploadUrl) {\n        throw new StoragePackageError(\n          `Adapter '${adapter.name}' does not support createSignedUploadUrl`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { adapter: adapter.name } }\n        );\n      }\n\n      this.logger?.info('[StorageService] Creating signed upload URL', {\n        bucket: params.bucket,\n        path: params.path,\n        adapter: adapter.name,\n        expiresIn: params.expiresIn,\n        upsert: params.upsert,\n      });\n\n      // ========================================\n      // COMPLIANCE CHECKS (Before generating URL)\n      // ========================================\n      if (params.upsert && this.complianceManager && this.isComplianceEnabled()) {\n        await this.checkSignedUrlCompliance(adapter, params);\n      }\n\n      // Generate signed URL\n      const result = await adapter.createSignedUploadUrl(params);\n\n      // Emit event for audit trail (CRITICAL: Include user identity for compliance)\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.SignedUrlGenerated, {\n        type: STORAGE_EVENT_TYPE.SignedUrlGenerated,\n        timestamp: new Date(),\n        data: {\n          bucket: params.bucket,\n          path: params.path,\n          adapter: adapter.name,\n          expiresAt: result.expiresAt,\n          expiresIn: params.expiresIn,\n          contentType: params.contentType,\n          fileSizeLimit: params.fileSizeLimit,\n          upsert: params.upsert,\n          // COMPLIANCE: Track WHO requested the URL\n          userId: params.userId,\n          entityType: params.entityType,\n          entityId: params.entityId,\n          metadata: params.metadata,\n          duration: Date.now() - startTime,\n        },\n      });\n\n      // COMPLIANCE WARNING: Log if upsert is enabled (can overwrite immutable files)\n      if (params.upsert) {\n        this.logger?.warn(\n          '[StorageService] Signed URL with upsert enabled - CAN OVERWRITE IMMUTABLE FILES',\n          {\n            bucket: params.bucket,\n            path: params.path,\n            userId: params.userId,\n            warning: 'This URL can bypass immutability and retention policies',\n          }\n        );\n      }\n\n      this.logger?.info('[StorageService] Signed upload URL created', {\n        bucket: params.bucket,\n        path: params.path,\n        expiresAt: result.expiresAt,\n        duration: Date.now() - startTime,\n      });\n\n      return result;\n    } catch (error) {\n      this.logger?.error('[StorageService] createSignedUploadUrl failed', {\n        bucket: params.bucket,\n        path: params.path,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Get public URL for a file\n   * Requires adapter support for public URLs\n   *\n   * @param params - Public URL parameters\n   * @returns Promise<string> - Public URL\n  // eslint-disable-next-line complexity\n   *\n   * @example\n   * ```typescript\n   * const url = await service.getPublicUrl({\n   *   bucket: 'media-images',\n   *   path: 'posts/image-123.jpg',\n   * });\n   * // Use the URL directly in HTML: <img src={url} />\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async getPublicUrl(params: StoragePublicUrlParams): Promise<string> {\n    const startTime = Date.now();\n\n    try {\n      const adapter = params.adapter\n        ? this.adapterRegistry.getAdapter(params.adapter)\n        : await this.adapterRegistry.selectHealthyAdapter();\n\n      if (!adapter) {\n        throw new StoragePackageError(\n          'No adapter available for getPublicUrl',\n          STORAGE_ERROR_CODES.NO_HEALTHY_ADAPTERS\n        );\n      }\n\n      if (!adapter.getPublicUrl) {\n        throw new StoragePackageError(\n          `Adapter '${adapter.name}' does not support getPublicUrl`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { adapter: adapter.name } }\n        );\n      }\n\n      this.logger?.info('[StorageService] Getting public URL', {\n        bucket: params.bucket,\n        path: params.path,\n        adapter: adapter.name,\n        download: params.download,\n      });\n\n      // Generate public URL\n      const url = await adapter.getPublicUrl(params);\n\n      // Emit event for audit trail (FILE_ACCESSED event)\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.FileAccessed, {\n        type: STORAGE_EVENT_TYPE.FileAccessed,\n        timestamp: new Date(),\n        data: {\n          bucket: params.bucket,\n          path: params.path,\n          adapter: adapter.name,\n          operation: 'getPublicUrl',\n          download: params.download,\n          duration: Date.now() - startTime,\n        },\n      });\n\n      this.logger?.info('[StorageService] Public URL generated', {\n        bucket: params.bucket,\n        path: params.path,\n        duration: Date.now() - startTime,\n      });\n\n      return url;\n    } catch (error) {\n      this.logger?.error('[StorageService] getPublicUrl failed', {\n        bucket: params.bucket,\n        path: params.path,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Helper: Get compliance retention policy info\n   */\n  private getComplianceInfo(\n    complianceManager: ComplianceManager,\n    category: FILE_CATEGORY\n  ): StorageRetentionPolicy | undefined {\n    try {\n      const policy = complianceManager.getRetentionPolicy(category);\n      if (policy) {\n        return {\n          retentionYears: policy.retentionYears,\n          immutable: policy.immutable,\n          regulatoryFrameworks: policy.regulatoryFrameworks,\n          softDelete: policy.softDelete,\n          gracePeriodDays: policy.gracePeriodDays,\n        } as StorageRetentionPolicy;\n      }\n    } catch {\n      // Policy not found or compliance disabled - skip\n      this.logger?.debug('[StorageService] No compliance policy found for category', {\n        category,\n      });\n    }\n    return undefined;\n  }\n\n  /**\n   * Helper: Validate file overwrite compliance (for upload operations)\n   */\n  // eslint-disable-next-line complexity\n  private validateFileOverwriteCompliance(existingFile: FileMetadata, pathToCheck: string): void {\n    const complianceCheck = this.complianceManager!.canDeleteFile(existingFile, {\n      ignoreRetention: false,\n    });\n\n    if (!complianceCheck.allowed) {\n      const regulatoryFrameworks =\n        complianceCheck.policy?.regulatoryFrameworks?.join(' / ') ?? 'N/A';\n\n      if (complianceCheck.isImmutable) {\n        throw new StoragePackageError(\n          `Cannot upload: File at path '${pathToCheck}' is IMMUTABLE and cannot be overwritten.`,\n          STORAGE_ERROR_CODES.COMPLIANCE_IMMUTABLE_FILE,\n          {\n            context: {\n              path: pathToCheck,\n              fileId: existingFile.fileId,\n              regulatoryFrameworks: complianceCheck.policy?.regulatoryFrameworks,\n              regulation: regulatoryFrameworks,\n            },\n          }\n        );\n      }\n\n      if (complianceCheck.retentionUntil) {\n        throw new StoragePackageError(\n          `Cannot upload: File at path '${pathToCheck}' is under RETENTION policy until ${complianceCheck.retentionUntil.toISOString()}.`,\n          STORAGE_ERROR_CODES.COMPLIANCE_RETENTION_VIOLATION,\n          {\n            context: {\n              path: pathToCheck,\n              fileId: existingFile.fileId,\n              retentionUntil: complianceCheck.retentionUntil,\n              regulatoryFrameworks: complianceCheck.policy?.regulatoryFrameworks,\n              regulation: regulatoryFrameworks,\n            },\n          }\n        );\n      }\n    }\n  }\n\n  /**\n   * Helper: Handle compliance check for delete operation\n   */\n  private async handleDeleteComplianceCheck(\n    complianceCheck: ReturnType<ComplianceManager['canDeleteFile']>,\n    params: DeleteParams,\n    metadata: FileMetadata\n  ): Promise<DeleteParams> {\n    if (!complianceCheck.allowed) {\n      // Emit compliance violation event\n      if (complianceCheck.isImmutable) {\n        await this.eventManager.emit(STORAGE_EVENT_TYPE.ImmutabilityEnforced, {\n          type: STORAGE_EVENT_TYPE.ImmutabilityEnforced,\n          timestamp: new Date(),\n          metadata,\n          data: {\n            fileId: params.fileId,\n            policy: complianceCheck.policy,\n            retentionUntil: complianceCheck.retentionUntil,\n            reason: complianceCheck.reason,\n            applicableJurisdictions: complianceCheck.applicableJurisdictions,\n            applicableFrameworks: complianceCheck.applicableFrameworks,\n          },\n        });\n      } else if (complianceCheck.underRetention) {\n        await this.eventManager.emit(STORAGE_EVENT_TYPE.RetentionEnforced, {\n          type: STORAGE_EVENT_TYPE.RetentionEnforced,\n          timestamp: new Date(),\n          metadata,\n          data: {\n            fileId: params.fileId,\n            policy: complianceCheck.policy,\n            retentionUntil: complianceCheck.retentionUntil,\n            reason: complianceCheck.reason,\n            applicableJurisdictions: complianceCheck.applicableJurisdictions,\n            applicableFrameworks: complianceCheck.applicableFrameworks,\n          },\n        });\n      }\n\n      // Throw error - file cannot be deleted\n      throw new StoragePackageError(\n        complianceCheck.reason ?? 'File cannot be deleted due to compliance policy',\n        STORAGE_ERROR_CODES.COMPLIANCE_RETENTION_VIOLATION,\n        {\n          context: {\n            fileId: params.fileId,\n            policy: complianceCheck.policy,\n            retentionUntil: complianceCheck.retentionUntil,\n            isImmutable: complianceCheck.isImmutable,\n            underRetention: complianceCheck.underRetention,\n            applicableJurisdictions: complianceCheck.applicableJurisdictions,\n            applicableFrameworks: complianceCheck.applicableFrameworks,\n          },\n        }\n      );\n    }\n\n    // Apply soft delete if compliance requires it\n    if (complianceCheck.shouldSoftDelete && !params.permanent) {\n      const softDeleteMetadata = this.complianceManager!.createSoftDeleteMetadata(\n        'system', // TODO: Should come from authenticated user context\n        params.reason,\n        complianceCheck.policy\n      );\n\n      params = {\n        ...params,\n        permanent: false,\n        softDeleteMetadata,\n      };\n\n      this.logger?.debug('Compliance requires soft delete', {\n        fileId: params.fileId,\n        gracePeriodDays: softDeleteMetadata.gracePeriodDays,\n      });\n    }\n\n    return params;\n  }\n\n  /**\n   * Helper: Validate move destination compliance\n   */\n  // eslint-disable-next-line complexity\n  private validateMoveDestinationCompliance(\n    destinationFile: FileMetadata,\n    destinationPath: string\n  ): void {\n    const destComplianceCheck = this.complianceManager!.canDeleteFile(destinationFile, {\n      ignoreRetention: false,\n    });\n\n    if (!destComplianceCheck.allowed) {\n      const regulatoryFrameworks =\n        destComplianceCheck.policy?.regulatoryFrameworks?.join(' / ') ?? 'N/A';\n\n      if (destComplianceCheck.isImmutable) {\n        throw new StoragePackageError(\n          `Cannot move: Destination '${destinationPath}' is IMMUTABLE.`,\n          STORAGE_ERROR_CODES.COMPLIANCE_IMMUTABLE_FILE,\n          {\n            context: {\n              destinationPath: destinationPath,\n              fileId: destinationFile.fileId,\n              regulatoryFrameworks: destComplianceCheck.policy?.regulatoryFrameworks,\n              regulation: regulatoryFrameworks,\n            },\n          }\n        );\n      }\n\n      if (destComplianceCheck.retentionUntil) {\n        throw new StoragePackageError(\n          `Cannot move: Destination '${destinationPath}' under RETENTION until ${destComplianceCheck.retentionUntil.toISOString()}.`,\n          STORAGE_ERROR_CODES.COMPLIANCE_RETENTION_VIOLATION,\n          {\n            context: {\n              destinationPath: destinationPath,\n              fileId: destinationFile.fileId,\n\n              retentionUntil: destComplianceCheck.retentionUntil,\n              regulatoryFrameworks: destComplianceCheck.policy?.regulatoryFrameworks,\n              regulation: regulatoryFrameworks,\n            },\n          }\n        );\n      }\n    }\n  }\n\n  /**\n   * Helper: Validate copy destination compliance\n   */\n  // eslint-disable-next-line complexity\n  private validateCopyDestinationCompliance(\n    destinationFile: FileMetadata,\n    destinationPath: string\n  ): void {\n    const destComplianceCheck = this.complianceManager!.canDeleteFile(destinationFile, {\n      ignoreRetention: false,\n    });\n\n    if (!destComplianceCheck.allowed) {\n      const regulatoryFrameworks =\n        destComplianceCheck.policy?.regulatoryFrameworks?.join(' / ') ?? 'N/A';\n\n      if (destComplianceCheck.isImmutable) {\n        throw new StoragePackageError(\n          `Cannot copy: Destination '${destinationPath}' is IMMUTABLE.`,\n          STORAGE_ERROR_CODES.COMPLIANCE_IMMUTABLE_FILE,\n          {\n            context: {\n              destinationPath: destinationPath,\n              fileId: destinationFile.fileId,\n              regulatoryFrameworks: destComplianceCheck.policy?.regulatoryFrameworks,\n              regulation: regulatoryFrameworks,\n            },\n          }\n        );\n      }\n\n      if (destComplianceCheck.retentionUntil) {\n        throw new StoragePackageError(\n          `Cannot copy: Destination '${destinationPath}' under RETENTION until ${destComplianceCheck.retentionUntil.toISOString()}.`,\n          STORAGE_ERROR_CODES.COMPLIANCE_RETENTION_VIOLATION,\n          {\n            context: {\n              destinationPath: destinationPath,\n              fileId: destinationFile.fileId,\n              retentionUntil: destComplianceCheck.retentionUntil,\n              regulatoryFrameworks: destComplianceCheck.policy?.regulatoryFrameworks,\n              regulation: regulatoryFrameworks,\n            },\n          }\n        );\n      }\n    }\n  }\n\n  /**\n   * Helper: Handle replace file compliance violation\n   */\n  private async handleReplaceComplianceViolation(\n    complianceCheck: ReturnType<ComplianceManager['canDeleteFile']>,\n    fileId: string,\n    existingMetadata: FileMetadata\n  ): Promise<never> {\n    // Emit compliance violation event\n    if (complianceCheck.isImmutable) {\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.ImmutabilityEnforced, {\n        type: STORAGE_EVENT_TYPE.ImmutabilityEnforced,\n        timestamp: new Date(),\n        metadata: existingMetadata,\n        data: {\n          fileId: fileId,\n          operation: 'replace',\n          policy: complianceCheck.policy,\n          retentionUntil: complianceCheck.retentionUntil,\n          reason: complianceCheck.reason,\n          applicableJurisdictions: complianceCheck.applicableJurisdictions,\n          applicableFrameworks: complianceCheck.applicableFrameworks,\n        },\n      });\n    } else if (complianceCheck.underRetention) {\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.RetentionEnforced, {\n        type: STORAGE_EVENT_TYPE.RetentionEnforced,\n        timestamp: new Date(),\n        metadata: existingMetadata,\n        data: {\n          fileId: fileId,\n          operation: 'replace',\n          policy: complianceCheck.policy,\n          retentionUntil: complianceCheck.retentionUntil,\n          reason: complianceCheck.reason,\n          applicableJurisdictions: complianceCheck.applicableJurisdictions,\n          applicableFrameworks: complianceCheck.applicableFrameworks,\n        },\n      });\n    }\n\n    throw new StoragePackageError(\n      complianceCheck.reason ?? 'File cannot be replaced due to compliance policy',\n      STORAGE_ERROR_CODES.COMPLIANCE_RETENTION_VIOLATION,\n      {\n        context: {\n          fileId: fileId,\n          policy: complianceCheck.policy,\n          retentionUntil: complianceCheck.retentionUntil,\n          isImmutable: complianceCheck.isImmutable,\n          underRetention: complianceCheck.underRetention,\n          applicableJurisdictions: complianceCheck.applicableJurisdictions,\n          applicableFrameworks: complianceCheck.applicableFrameworks,\n        },\n      }\n    );\n  }\n\n  /**\n   * Helper: Perform delete compliance check\n   */\n  private async performDeleteComplianceCheck(\n    params: DeleteParams,\n    metadata: FileMetadata\n  ): Promise<DeleteParams> {\n    try {\n      // Run compliance checks\n      const complianceCheck = this.complianceManager!.canDeleteFile(\n        metadata,\n        params.complianceOptions\n      );\n\n      // Handle compliance check result\n      return await this.handleDeleteComplianceCheck(complianceCheck, params, metadata);\n    } catch (error) {\n      // If it's a compliance error, rethrow it\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n      // If metadata fetch fails, log warning but continue (graceful degradation)\n      this.logger?.warn('Compliance check failed, proceeding with delete', {\n        fileId: params.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      return params;\n    }\n  }\n\n  /**\n   * Helper: Check signed URL compliance for upsert operations\n   */\n  private async checkSignedUrlCompliance(\n    adapter: BaseStorageAdapter,\n    params: StorageSignedUploadUrlParams\n  ): Promise<void> {\n    // Check if file exists at this path\n    let existingFile: FileMetadata | undefined;\n    try {\n      existingFile = await adapter.getFileMetadata(params.path, params.bucket);\n      this.logger?.debug('[StorageService] Found existing file during compliance check', {\n        fileId: existingFile.fileId,\n        path: params.path,\n        bucket: params.bucket,\n        category: existingFile.category,\n      });\n    } catch (error) {\n      // File doesn't exist OR lookup failed\n      const errorMessage = error instanceof Error ? error.message : String(error);\n\n      // Log the error for debugging\n      this.logger?.debug('[StorageService] File lookup during compliance check', {\n        path: params.path,\n        bucket: params.bucket,\n        error: errorMessage,\n        note: 'File may not exist or lookup failed - allowing URL generation',\n      });\n\n      existingFile = undefined;\n    }\n\n    if (!existingFile) {\n      return;\n    }\n\n    // File exists - check if it's immutable or under retention\n    const complianceCheck = this.complianceManager!.canDeleteFile(existingFile, {\n      ignoreRetention: false, // Don't allow retention bypass\n    });\n\n    if (!complianceCheck.allowed) {\n      this.handleSignedUrlComplianceViolation(complianceCheck, existingFile, params);\n    }\n\n    this.logger?.info('[StorageService] Compliance check passed - file can be overwritten', {\n      path: params.path,\n      bucket: params.bucket,\n    });\n  }\n\n  /**\n   * Helper: Handle move file compliance violation\n   */\n  private async handleMoveComplianceViolation(\n    complianceCheck: ReturnType<ComplianceManager['canDeleteFile']>,\n    sourceFileId: string,\n    sourceMetadata: FileMetadata\n  ): Promise<never> {\n    // Emit compliance violation event\n    if (complianceCheck.isImmutable) {\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.ImmutabilityEnforced, {\n        type: STORAGE_EVENT_TYPE.ImmutabilityEnforced,\n        timestamp: new Date(),\n        metadata: sourceMetadata,\n        data: {\n          fileId: sourceFileId,\n          operation: 'move',\n          policy: complianceCheck.policy,\n          retentionUntil: complianceCheck.retentionUntil,\n          reason: complianceCheck.reason,\n          applicableJurisdictions: complianceCheck.applicableJurisdictions,\n          applicableFrameworks: complianceCheck.applicableFrameworks,\n        },\n      });\n    } else if (complianceCheck.underRetention) {\n      await this.eventManager.emit(STORAGE_EVENT_TYPE.RetentionEnforced, {\n        type: STORAGE_EVENT_TYPE.RetentionEnforced,\n        timestamp: new Date(),\n        metadata: sourceMetadata,\n        data: {\n          fileId: sourceFileId,\n          operation: 'move',\n          policy: complianceCheck.policy,\n          retentionUntil: complianceCheck.retentionUntil,\n          reason: complianceCheck.reason,\n          applicableJurisdictions: complianceCheck.applicableJurisdictions,\n          applicableFrameworks: complianceCheck.applicableFrameworks,\n        },\n      });\n    }\n\n    throw new StoragePackageError(\n      complianceCheck.reason ??\n        'File cannot be moved due to compliance policy (source file is protected)',\n      STORAGE_ERROR_CODES.COMPLIANCE_RETENTION_VIOLATION,\n      {\n        context: {\n          fileId: sourceFileId,\n          operation: 'move',\n\n          policy: complianceCheck.policy,\n          retentionUntil: complianceCheck.retentionUntil,\n          isImmutable: complianceCheck.isImmutable,\n          underRetention: complianceCheck.underRetention,\n          applicableJurisdictions: complianceCheck.applicableJurisdictions,\n          applicableFrameworks: complianceCheck.applicableFrameworks,\n        },\n      }\n    );\n  }\n\n  /**\n   * Helper: Handle signed URL compliance violation\n   */\n  // eslint-disable-next-line complexity\n  private handleSignedUrlComplianceViolation(\n    complianceCheck: ReturnType<ComplianceManager['canDeleteFile']>,\n    existingFile: FileMetadata,\n    params: StorageSignedUploadUrlParams\n  ): never {\n    const regulatoryFrameworks = complianceCheck.policy?.regulatoryFrameworks?.join(' / ') ?? 'N/A';\n\n    // REJECT: File is immutable or under retention\n    if (complianceCheck.isImmutable) {\n      this.logger?.error('[StorageService] REJECTED: Signed URL would overwrite IMMUTABLE file', {\n        bucket: params.bucket,\n        path: params.path,\n        userId: params.userId,\n        fileId: existingFile.fileId,\n        regulatoryFrameworks: complianceCheck.policy?.regulatoryFrameworks,\n      });\n\n      throw new StoragePackageError(\n        `Cannot generate signed upload URL: File is IMMUTABLE and cannot be overwritten. Regulatory compliance: ${regulatoryFrameworks}`,\n        STORAGE_ERROR_CODES.COMPLIANCE_IMMUTABLE_FILE,\n        {\n          context: {\n            fileId: existingFile.fileId,\n            path: params.path,\n            bucket: params.bucket,\n            userId: params.userId,\n            regulatoryFrameworks: complianceCheck.policy?.regulatoryFrameworks,\n            regulation: regulatoryFrameworks,\n          },\n        }\n      );\n    }\n\n    if (complianceCheck.retentionUntil) {\n      this.logger?.error(\n        '[StorageService] REJECTED: Signed URL would overwrite file under RETENTION',\n        {\n          bucket: params.bucket,\n          path: params.path,\n          userId: params.userId,\n          retentionUntil: complianceCheck.retentionUntil,\n          regulatoryFrameworks: complianceCheck.policy?.regulatoryFrameworks,\n        }\n      );\n\n      throw new StoragePackageError(\n        `Cannot generate signed upload URL: File is under RETENTION policy until ${complianceCheck.retentionUntil.toISOString()}. Regulatory compliance: ${regulatoryFrameworks}`,\n        STORAGE_ERROR_CODES.COMPLIANCE_RETENTION_VIOLATION,\n        {\n          context: {\n            fileId: existingFile.fileId,\n            path: params.path,\n            bucket: params.bucket,\n            userId: params.userId,\n            retentionUntil: complianceCheck.retentionUntil,\n            regulatoryFrameworks: complianceCheck.policy?.regulatoryFrameworks,\n            regulation: regulatoryFrameworks,\n          },\n        }\n      );\n    }\n\n    // Should never reach here, but TypeScript needs this\n    throw new StoragePackageError(\n      'File cannot be overwritten due to compliance policy',\n      STORAGE_ERROR_CODES.COMPLIANCE_RETENTION_VIOLATION\n    );\n  }\n\n  /**\n   * Cleanup resources\n   */\n  async destroy(): Promise<void> {\n    // Stop queue if running\n    if (this.queueProcessor?.isRunning()) {\n      await this.queueProcessor.stop();\n    }\n\n    // Stop webhook manager if enabled\n    if (this.webhookManager) {\n      this.webhookManager.stop();\n    }\n\n    await this.eventManager.destroy();\n    this.adapterRegistry.destroy();\n\n    this.logger?.info('StorageService destroyed');\n  }\n}\n","/**\n * File utility functions for storage operations\n * @module utils/fileUtils\n */\n\nimport { StoragePackageError } from '@plyaz/errors';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types/errors';\n\n/**\n * Convert file parameter to Buffer\n * Handles Buffer, ReadableStream, or throws error\n *\n * @param file - File data (Buffer or stream)\n * @param streamConverter - Optional function to convert stream to buffer\n * @returns Buffer\n */\nexport async function convertFileToBuffer(\n  file: Buffer | globalThis.NodeJS.ReadableStream | null | undefined,\n  streamConverter?: (stream: globalThis.NodeJS.ReadableStream) => Promise<Buffer>\n): Promise<Buffer> {\n  if (!file) {\n    throw new StoragePackageError(\n      'File is required for upload',\n      STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n    );\n  }\n\n  if (Buffer.isBuffer(file)) {\n    return file;\n  }\n\n  // It's a stream - convert it if converter provided\n  if (streamConverter) {\n    return await streamConverter(file);\n  }\n\n  throw new StoragePackageError(\n    'Stream conversion not supported - streamConverter not provided',\n    STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n  );\n}\n\n/**\n * Extract filename from file key/path\n * Returns the last segment after splitting by '/'\n *\n * @param key - File key or path\n * @returns Filename\n */\nexport function extractFilenameFromKey(key: string): string {\n  return key.split('/').pop() ?? key;\n}\n","/**\n * BaseStorageAdapter - Abstract base class for all storage adapters\n *\n * Provides common functionality:\n * - Built-in retry logic with exponential backoff\n * - Error handling and categorization\n * - Health check interface\n * - Circuit breaker integration\n * - Request/response logging\n * - Correlation ID propagation\n * - API Client initialization (optional for REST API adapters)\n *\n * Subclasses MUST implement:\n * - upload() - Upload file to storage\n * - download() - Download file from storage\n * - delete() - Delete file from storage\n * - getSignedUrl() - Generate signed/presigned URL\n * - isAvailable() - Check if adapter is configured and ready\n * - healthCheck() - Provider health status\n *\n * Retry Configuration:\n * - By default, uses STORAGE_RETRY_CONFIG constants (3 attempts, exponential backoff)\n * - Can be customized per adapter via BaseStorageAdapterConfig.retry\n * - Can be disabled by setting retry to false\n * - Automatically tracks retry attempts in results\n *\n * @example\n * ```ts\n * class MyStorageAdapter extends BaseStorageAdapter {\n *   async upload(params: UploadParams): Promise<UploadResult> {\n *     // Implementation\n *   }\n *   // ... other methods\n * }\n * ```\n */\n\nimport type {\n  StorageBucketInfo,\n  StorageCopyFileParams,\n  StorageListBucketsResult,\n  StorageListFilesParams,\n  StorageListFilesResult,\n  StorageMoveFileParams,\n  StoragePublicUrlParams,\n  StorageReplaceFileParams,\n  StorageSignedUploadUrlParams,\n  StorageSignedUploadUrlResult,\n  StorageUpdateBucketParams,\n  BaseStorageAdapterConfig,\n  UploadParams,\n  UploadResult,\n  DownloadParams,\n  DownloadResult,\n  DeleteParams,\n  FileDeleteResult,\n  PresignedUrlOptions,\n  PresignedUrlResult,\n  AdapterHealthCheck,\n  StorageRetryConfig,\n  StorageApiClientConfig,\n  FileMetadata,\n  BucketConfiguration,\n  UploadProgressEvent,\n  STORAGE_ADAPTER_TYPE,\n  BUCKET_PURPOSE,\n  STORAGE_ENVIRONMENT,\n} from '@plyaz/types/storage';\nimport { ADAPTER_HEALTH_STATUS, FILE_ACCESS_LEVEL, UPLOAD_STATUS } from '@plyaz/types/storage';\nimport { STORAGE_RETRY_CONFIG } from '@plyaz/config';\nimport { StoragePackageError } from '@plyaz/errors';\nimport { createApiClient, setDefaultApiClient, uploadWithProgress } from '@plyaz/api';\nimport { retry } from '../../utils/retry';\nimport { StorageCategoryClassifier } from '../../utils/storageCategories';\nimport { convertFileToBuffer } from '../../utils/fileUtils';\nimport { type LoggerInterface, STORAGE_ERROR_CODES } from '@plyaz/types';\n\n/**\n * Constants for BaseStorageAdapter\n */\nconst DEFAULT_ADAPTER_PRIORITY = 100;\n\n/**\n * BaseStorageAdapter - Abstract base class for all storage adapters\n *\n * Provides:\n * - Automatic retry logic with exponential backoff\n * - Error handling and wrapping\n * - Health monitoring\n * - Logging\n * - Retry attempt tracking\n *\n * Subclasses must implement all abstract methods\n */\nexport abstract class BaseStorageAdapter {\n  readonly name: string;\n  readonly type: STORAGE_ADAPTER_TYPE;\n  readonly priority: number;\n  readonly enabled: boolean;\n\n  protected readonly logger?: LoggerInterface;\n  protected readonly retryConfig: StorageRetryConfig | false;\n  protected readonly autoCreateBuckets: boolean;\n  public readonly defaultEnvironment?: STORAGE_ENVIRONMENT;\n  public readonly defaultRegion?: string;\n  protected readonly adapterOnProgress?: (progress: UploadProgressEvent) => void;\n  protected readonly adapterAbortSignal?: AbortSignal;\n\n  // API client for REST API-based adapters (like CustomStorageAdapter)\n  // Using Awaited<ReturnType<>> to get the actual return type from createApiClient\n  // This avoids type version mismatches between packages\n  private apiClient: Awaited<ReturnType<typeof createApiClient>> | null = null;\n  private clientInitPromise: Promise<void> | null = null;\n  private readonly apiClientConfig?: StorageApiClientConfig;\n\n  private lastHealthCheck?: Date;\n  private healthStatus: ADAPTER_HEALTH_STATUS = ADAPTER_HEALTH_STATUS.UNKNOWN;\n\n  constructor(config: BaseStorageAdapterConfig) {\n    this.name = config.name;\n    this.type = config.type;\n    this.priority = config.priority ?? DEFAULT_ADAPTER_PRIORITY;\n    this.enabled = config.enabled ?? true;\n\n    // Setup retry configuration\n    this.retryConfig = config.retry ?? {\n      strategy: STORAGE_RETRY_CONFIG.DEFAULT_STRATEGY,\n      maxAttempts: STORAGE_RETRY_CONFIG.DEFAULT_MAX_ATTEMPTS,\n      initialDelay: STORAGE_RETRY_CONFIG.DEFAULT_INITIAL_DELAY_MS,\n      maxDelay: STORAGE_RETRY_CONFIG.MAX_DELAY_MS,\n      backoffMultiplier: STORAGE_RETRY_CONFIG.BACKOFF_MULTIPLIER,\n    };\n\n    // Setup bucket management\n    this.autoCreateBuckets = config.autoCreateBuckets ?? true;\n    this.defaultEnvironment = config.defaultEnvironment;\n    this.defaultRegion = config.defaultRegion;\n\n    // Store progress/abort callbacks (adapter-level)\n    this.adapterOnProgress = config.onProgress;\n    this.adapterAbortSignal = config.abortSignal;\n\n    // Store API client config (for REST API adapters only)\n    this.apiClientConfig = config.apiClientConfig;\n\n    // Initialize API client if config provided\n    if (this.apiClientConfig) {\n      this.initializeApiClient();\n    }\n  }\n\n  /**\n   * Initialize API client for REST API-based adapters\n   * SDK-based adapters (CloudflareR2, Supabase) do NOT need this\n   */\n  private initializeApiClient(): void {\n    if (this.clientInitPromise || !this.apiClientConfig) {\n      return;\n    }\n\n    this.clientInitPromise = (async () => {\n      try {\n        // Pass through the full StorageApiClientConfig to createApiClient\n        // This allows adapters to override any global config (error handlers, retries, etc.)\n        // Global config from setupGlobalApiConfig is used as defaults\n        this.apiClient = await createApiClient(this.apiClientConfig!);\n\n        // Set as default client for all fetchers\n        setDefaultApiClient(this.apiClient);\n\n        this.logger?.debug('API client initialized', {\n          adapter: this.name,\n          baseURL: this.apiClientConfig!.baseURL,\n        });\n      } catch (error) {\n        this.logger?.error('Failed to initialize API client', {\n          adapter: this.name,\n          error: error instanceof Error ? error.message : String(error),\n        });\n        throw error;\n      }\n    })();\n  }\n\n  /**\n   * Ensure API client is initialized (for REST API adapters)\n   * Throws if adapter requires API client but it's not initialized\n   */\n  protected async ensureApiClientInitialized(): Promise<void> {\n    if (this.clientInitPromise) {\n      await this.clientInitPromise;\n    }\n    if (this.apiClientConfig && !this.apiClient) {\n      throw new StoragePackageError(\n        'API client initialization timeout',\n        STORAGE_ERROR_CODES.ADAPTER_TIMEOUT,\n        {\n          context: { adapter: this.name },\n        }\n      );\n    }\n  }\n\n  // ===== Abstract Methods (must be implemented by subclasses) =====\n\n  /**\n   * Upload a file to storage\n   * Subclasses must implement the actual upload logic\n   */\n  abstract upload(params: UploadParams): Promise<UploadResult>;\n\n  /**\n   * Download a file from storage\n   * Subclasses must implement the actual download logic\n   */\n  abstract download(params: DownloadParams): Promise<DownloadResult>;\n\n  /**\n   * Delete a file from storage\n   * Subclasses must implement the actual delete logic\n   */\n  abstract delete(params: DeleteParams): Promise<FileDeleteResult>;\n\n  /**\n   * Generate a presigned/signed URL for file access\n   * Subclasses must implement the URL generation logic\n   */\n  abstract getSignedUrl(options: PresignedUrlOptions): Promise<PresignedUrlResult>;\n\n  /**\n   * Check if adapter is available and properly configured\n   * Subclasses must implement availability check\n   */\n  abstract isAvailable(): boolean;\n\n  /**\n   * Perform health check on the storage provider\n   * Subclasses must implement provider-specific health check\n   */\n  abstract healthCheck(): Promise<AdapterHealthCheck>;\n\n  /**\n   * Get file metadata (required for compliance checks)\n   * Subclasses must implement metadata retrieval\n   *\n   * @param fileId - Unique file identifier\n   * @returns File metadata\n   * @param fileId - File ID or path\n   * @param bucket - Optional bucket name (required for dynamic bucket mode)\n   * @throws StoragePackageError if file not found\n   */\n  abstract getFileMetadata(fileId: string, bucket?: string): Promise<FileMetadata>;\n\n  /**\n   * Restore a soft-deleted file\n   * Subclasses must implement file restoration\n   *\n   * @param fileId - Unique file identifier\n   * @returns Restored file metadata\n   * @throws StoragePackageError if file not found or cannot be restored\n   */\n  abstract restoreFile(fileId: string): Promise<FileMetadata>;\n\n  /**\n   * Translate bucket purpose to provider-specific bucket name\n   * Each adapter implements its own naming convention\n   *\n   * Examples:\n   * - CloudflareR2: BUCKET_PURPOSE.COMPLIANCE → \"plyaz-prod-weur-records-vault\"\n   * - Supabase: BUCKET_PURPOSE.COMPLIANCE → \"compliance\"\n   * - S3: BUCKET_PURPOSE.COMPLIANCE → \"plyaz-compliance-prod-us-east-1\"\n   *\n   * @param purpose - Universal bucket purpose\n   * @param config - Bucket configuration (business model, tier, org, env, region)\n   * @returns Provider-specific bucket name\n   */\n  abstract translateBucketPurpose(purpose: BUCKET_PURPOSE, config: BucketConfiguration): string;\n\n  /**\n   * Create a bucket if it doesn't exist\n   * Optional: Only needed if adapter supports bucket creation\n   *\n   * @param bucketName - Provider-specific bucket name\n   * @param purpose - Bucket purpose for configuration\n   * @throws StoragePackageError if bucket creation fails\n   */\n  abstract createBucket?(bucketName: string, purpose: BUCKET_PURPOSE): Promise<void>;\n\n  /**\n   * List all buckets\n   * Optional: Only needed if adapter supports bucket listing\n   *\n   * @returns Promise<ListBucketsResult> - List of all buckets\n   * @throws StoragePackageError if operation fails\n   */\n  abstract listBuckets?(): Promise<StorageListBucketsResult>;\n\n  /**\n   * Get bucket details\n   * Optional: Only needed if adapter supports bucket info retrieval\n   *\n   * @param bucketName - Bucket name\n   * @returns Promise<BucketInfo> - Bucket information\n   * @throws StoragePackageError if bucket not found\n   */\n  abstract getBucket?(bucketName: string): Promise<StorageBucketInfo>;\n\n  /**\n   * Update bucket settings\n   * Optional: Only needed if adapter supports bucket updates\n   *\n   * @param params - Update parameters\n   * @throws StoragePackageError if operation fails\n   */\n  abstract updateBucket?(params: StorageUpdateBucketParams): Promise<void>;\n\n  /**\n   * List files in a bucket\n   * Optional: Only needed if adapter supports file listing\n   *\n   * @param params - List parameters\n   * @returns Promise<ListFilesResult> - List of files\n   * @throws StoragePackageError if operation fails\n   */\n  abstract listFiles?(params: StorageListFilesParams): Promise<StorageListFilesResult>;\n\n  /**\n   * Move a file from one location to another\n   * Optional: Only needed if adapter supports file moving\n   *\n   * @param params - Move parameters\n   * @returns Promise<FileMetadata> - Metadata of moved file\n   * @throws StoragePackageError if operation fails\n   */\n  abstract moveFile?(params: StorageMoveFileParams): Promise<FileMetadata>;\n\n  /**\n   * Copy a file to another location\n   * Optional: Only needed if adapter supports file copying\n   *\n   * @param params - Copy parameters\n   * @returns Promise<FileMetadata> - Metadata of copied file\n   * @throws StoragePackageError if operation fails\n   */\n  abstract copyFile?(params: StorageCopyFileParams): Promise<FileMetadata>;\n\n  /**\n   * Replace/overwrite an existing file\n   * Optional: Only needed if adapter supports file replacement\n   *\n   * @param params - Replace parameters\n   * @returns Promise<FileMetadata> - Metadata of replaced file\n   * @throws StoragePackageError if operation fails\n   */\n  abstract replaceFile?(params: StorageReplaceFileParams): Promise<FileMetadata>;\n\n  /**\n   * Create a signed URL for direct upload\n   * Optional: Only needed if adapter supports signed upload URLs\n   *\n   * @param params - Signed upload URL parameters\n   * @returns Promise<SignedUploadUrlResult> - Signed URL and metadata\n   * @throws StoragePackageError if operation fails\n   */\n  abstract createSignedUploadUrl?(\n    params: StorageSignedUploadUrlParams\n  ): Promise<StorageSignedUploadUrlResult>;\n\n  /**\n   * Get public URL for a file\n   * Optional: Only needed if adapter supports public URLs\n   *\n   * @param params - Public URL parameters\n   * @returns Promise<string> - Public URL\n   * @throws StoragePackageError if operation fails\n   */\n  abstract getPublicUrl?(params: StoragePublicUrlParams): Promise<string>;\n\n  /**\n   * Upload large file using chunked/multipart upload\n   * Optional: Only needed if adapter supports chunked uploads for large files\n   * Handles entire chunked upload flow internally using provider SDK\n   *\n   * @param params - Upload parameters (same as regular upload)\n   * @returns Promise<UploadResult> - Upload result with file metadata\n   * @throws StoragePackageError if operation fails\n   */\n  uploadChunked?(params: UploadParams): Promise<UploadResult>;\n\n  /**\n   * Get file size limit for a bucket purpose\n   * Used by StorageService for validation before upload\n   *\n   * @param purpose - Bucket purpose (MEDIA_IMAGES, COMPLIANCE, etc.)\n   * @returns Maximum file size in bytes, or undefined for no limit\n   */\n  abstract getFileSizeLimit(purpose: BUCKET_PURPOSE): number | undefined;\n\n  /**\n   * Get allowed MIME types for a bucket purpose\n   * Used by StorageService for validation before upload\n   *\n   * @param purpose - Bucket purpose (MEDIA_IMAGES, COMPLIANCE, etc.)\n   * @returns Array of allowed MIME types, or undefined to allow all\n   */\n  abstract getAllowedMimeTypes(purpose: BUCKET_PURPOSE): string[] | undefined;\n\n  /**\n   * Generate file key/path for storage\n   * Each adapter implements its own key generation strategy\n   *\n   * @param params - Upload parameters\n   * @returns Generated file key/path\n   */\n  protected abstract generateFileKey(params: UploadParams): string;\n\n  // ===== Helper Methods =====\n\n  /**\n   * Get current health status\n   */\n  getHealthStatus(): ADAPTER_HEALTH_STATUS {\n    return this.healthStatus;\n  }\n\n  /**\n   * Get last health check timestamp\n   */\n  getLastHealthCheck(): Date | undefined {\n    return this.lastHealthCheck;\n  }\n\n  /**\n   * Update health status (called after health checks)\n   */\n  protected updateHealthStatus(status: ADAPTER_HEALTH_STATUS): void {\n    this.healthStatus = status;\n    this.lastHealthCheck = new Date();\n  }\n\n  /**\n   * Execute operation with retry logic\n   * Wraps any async operation with automatic retry based on adapter config\n   */\n  protected async withRetry<T>(operation: () => Promise<T>, operationName: string): Promise<T> {\n    if (!this.retryConfig) {\n      // No retry configured, execute once\n      return operation();\n    }\n\n    return retry(operation, {\n      maxAttempts: this.retryConfig.maxAttempts,\n      initialDelay: this.retryConfig.initialDelay,\n      maxDelay: this.retryConfig.maxDelay,\n      backoffMultiplier: this.retryConfig.backoffMultiplier,\n      onRetry: (attempt: number, error: Error) => {\n        this.logger?.warn(`Retry attempt ${attempt} for ${operationName}`, {\n          adapter: this.name,\n          operation: operationName,\n          attempt,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      },\n    });\n  }\n\n  /**\n   * Wrap errors with StoragePackageError\n   * Provides consistent error handling across all adapters\n   */\n  protected wrapError(\n    error: unknown,\n    operation: string,\n    context?: Record<string, unknown>\n  ): StoragePackageError {\n    if (error instanceof StoragePackageError) {\n      return error;\n    }\n\n    return new StoragePackageError(\n      `Adapter operation failed: ${operation}`,\n      STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED,\n      {\n        context: {\n          adapter: this.name,\n          operation,\n          ...context,\n        },\n        cause: error instanceof Error ? error : undefined,\n      }\n    );\n  }\n\n  /**\n   * Log operation start\n   */\n  protected logOperationStart(operation: string, params?: Record<string, unknown>): void {\n    this.logger?.info(`${operation} started`, {\n      adapter: this.name,\n      operation,\n      ...params,\n    });\n  }\n\n  /**\n   * Log operation success\n   */\n  protected logOperationSuccess(operation: string, result?: Record<string, unknown>): void {\n    this.logger?.info(`${operation} completed`, {\n      adapter: this.name,\n      operation,\n      ...result,\n    });\n  }\n\n  /**\n   * Log operation error\n   */\n  protected logOperationError(operation: string, error: unknown): void {\n    const errorMessage = error instanceof Error ? error.message : String(error);\n    this.logger?.error(`${operation} failed`, {\n      adapter: this.name,\n      operation,\n      error: errorMessage,\n    });\n  }\n\n  /**\n   * Get adapter information\n   */\n  getAdapterInfo(): {\n    name: string;\n    type: STORAGE_ADAPTER_TYPE;\n    priority: number;\n    enabled: boolean;\n    healthStatus: ADAPTER_HEALTH_STATUS;\n    lastHealthCheck?: Date;\n  } {\n    return {\n      name: this.name,\n      type: this.type,\n      priority: this.priority,\n      enabled: this.enabled,\n      healthStatus: this.healthStatus,\n      lastHealthCheck: this.lastHealthCheck,\n    };\n  }\n\n  /**\n   * Ensure bucket exists, creating it if necessary\n   * Uses autoCreateBuckets flag and createBucket() method\n   *\n   * @param purpose - Bucket purpose\n   * @param config - Bucket configuration\n   * @returns Provider-specific bucket name\n   */\n  protected async ensureBucket(\n    purpose: BUCKET_PURPOSE,\n    config: BucketConfiguration\n  ): Promise<string> {\n    // Get provider-specific bucket name\n    const bucketName = this.translateBucketPurpose(purpose, config);\n\n    // Create bucket if auto-creation is enabled and adapter supports it\n    if (this.autoCreateBuckets && this.createBucket) {\n      try {\n        await this.createBucket(bucketName, purpose);\n        this.logger?.debug('[BaseStorageAdapter] Bucket ensured', {\n          adapter: this.name,\n          bucketName,\n          purpose,\n        });\n      } catch (error) {\n        // Log but don't fail - bucket might already exist\n        this.logger?.warn('[BaseStorageAdapter] Bucket creation check failed', {\n          adapter: this.name,\n          bucketName,\n          purpose,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    }\n\n    return bucketName;\n  }\n\n  /**\n   * Get bucket name for a given purpose and configuration\n   * Does NOT create the bucket, just returns the name\n   *\n   * @param purpose - Bucket purpose\n   * @param config - Bucket configuration\n   * @returns Provider-specific bucket name\n   */\n  public getBucketName(purpose: BUCKET_PURPOSE, config: BucketConfiguration): string {\n    return this.translateBucketPurpose(purpose, config);\n  }\n\n  /**\n   * Prepare upload parameters (common logic for all adapters)\n   * Determines bucket, generates file key, ensures bucket exists\n   *\n   * @param params - Upload parameters\n   * @returns Prepared bucket name and file key\n   * @protected\n   */\n  protected async prepareUpload(params: UploadParams): Promise<{\n    bucketName: string;\n    fileKey: string;\n    bucketPurpose: BUCKET_PURPOSE;\n  }> {\n    // Determine bucket purpose\n    const bucketPurpose = StorageCategoryClassifier.classify(params);\n\n    // Build bucket configuration\n    const bucketConfig: BucketConfiguration = {\n      purpose: bucketPurpose,\n      businessModel: params.businessModel,\n      tier: params.organizationTier,\n      organizationId: params.organizationId,\n      environment: params.environment ?? this.defaultEnvironment,\n      region: params.region ?? this.defaultRegion,\n    };\n\n    // Ensure bucket exists and get bucket name\n    const bucketName = await this.ensureBucket(bucketPurpose, bucketConfig);\n\n    // Generate file key (subclasses implement this)\n    const fileKey = this.generateFileKey(params);\n\n    return {\n      bucketName,\n      fileKey,\n      bucketPurpose,\n    };\n  }\n\n  /**\n   * Convert stream to buffer (optional, subclasses can override)\n   * @param stream - Readable stream\n   * @returns Buffer\n   * @protected\n   */\n  // eslint-disable-next-line no-unused-vars -- base implementation\n  protected async streamToBuffer(_stream: globalThis.NodeJS.ReadableStream): Promise<Buffer> {\n    throw new StoragePackageError(\n      `Stream conversion not implemented for ${this.name}`,\n      STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n    );\n  }\n\n  /**\n   * Convert file parameter to Buffer\n   * Wrapper around utility function that provides adapter's streamToBuffer\n   *\n   * @param file - File data (Buffer or stream)\n   * @returns Buffer\n   * @protected\n   */\n  protected async convertToBuffer(\n    file: Buffer | globalThis.NodeJS.ReadableStream | null | undefined\n  ): Promise<Buffer> {\n    return await convertFileToBuffer(file, stream => this.streamToBuffer(stream));\n  }\n\n  /**\n   * Build FileMetadata result object\n   * Common logic for constructing metadata response\n   *\n   * @param params - Upload parameters\n   * @param fileKey - Generated file key\n   * @param bucketName - Bucket name\n   * @param bucketPurpose - Bucket purpose\n   * @param fileSize - File size in bytes\n   * @param path - Optional custom path (defaults to fileKey)\n   * @returns FileMetadata\n   * @protected\n   */\n  protected buildFileMetadata(options: {\n    params: UploadParams;\n    fileKey: string;\n    bucketName: string;\n    bucketPurpose: BUCKET_PURPOSE;\n    fileSize: number;\n    path?: string;\n  }): FileMetadata {\n    const { params, fileKey, bucketName, bucketPurpose, fileSize, path } = options;\n    return {\n      fileId: fileKey,\n      filename: params.filename?.includes('/')\n        ? params.filename.split('/').pop()!\n        : (params.filename ?? fileKey.split('/').pop()!),\n      mimeType: params.mimeType ?? 'application/octet-stream',\n      size: fileSize,\n      category: params.category,\n      entityType: params.entityType,\n      entityId: params.entityId,\n      path: path ?? fileKey,\n      adapter: this.name,\n      bucket: bucketName,\n      bucketPurpose,\n      uploadedAt: new Date(),\n      accessLevel: params.accessLevel ?? FILE_ACCESS_LEVEL.PRIVATE,\n      status: UPLOAD_STATUS.COMPLETED,\n    };\n  }\n\n  /**\n   * Emit progress callback (per-upload or adapter-level)\n   * Calls both callbacks if both are configured\n   *\n   * @param params - Upload parameters\n   * @param progress - Progress event data\n   * @protected\n   */\n  protected emitProgress(params: UploadParams, progress: UploadProgressEvent): void {\n    // Per-upload callback (highest priority)\n    if (params.onProgress) {\n      params.onProgress(progress);\n    }\n\n    // Adapter-level callback (fallback if no per-upload callback)\n    if (!params.onProgress && this.adapterOnProgress) {\n      this.adapterOnProgress(progress);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Progress-Tracking Upload Helpers\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Upload buffer to a URL with progress tracking.\n   *\n   * Uses @plyaz/api's uploadWithProgress which handles both Node.js and browser\n   * environments with real-time progress events.\n   *\n   * @param options - Upload options\n   * @param options.url - The target URL to upload to\n   * @param options.buffer - The file buffer to upload\n   * @param options.contentType - MIME type of the file\n   * @param options.params - Original upload params (for progress callbacks)\n   * @param options.fileId - File ID for progress tracking\n   * @param options.filename - Filename for progress tracking\n   * @param options.headers - Additional headers to send\n   * @param options.method - HTTP method (default: PUT)\n   * @returns Promise resolving when upload completes\n   * @protected\n   */\n  protected async uploadBufferWithProgress(options: {\n    url: string;\n    buffer: Buffer;\n    contentType: string;\n    params: UploadParams;\n    fileId: string;\n    filename: string;\n    headers?: Record<string, string>;\n    method?: 'PUT' | 'POST';\n  }): Promise<void> {\n    const {\n      url,\n      buffer,\n      contentType,\n      params,\n      fileId,\n      filename,\n      headers = {},\n      method = 'PUT',\n    } = options;\n\n    const result = await uploadWithProgress({\n      url,\n      data: buffer,\n      method,\n      contentType,\n      headers,\n      onProgress: event => {\n        this.emitProgress(params, {\n          fileId,\n          filename,\n          loaded: event.loaded,\n          total: event.total,\n          percentage: event.percentage,\n          speed: event.speed,\n          estimatedTimeRemaining: event.estimatedTimeRemaining,\n          mimeType: params.mimeType,\n          entityType: params.entityType,\n          entityId: params.entityId,\n          adapter: this.name,\n        });\n      },\n    });\n\n    if (!result.success) {\n      throw new StoragePackageError(\n        `Upload failed with status ${result.status}: ${result.data ?? result.statusText}`,\n        STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED,\n        { context: { statusCode: result.status, response: result.data } }\n      );\n    }\n  }\n}\n","/**\n * MockStorageAdapter - In-memory mock adapter for testing\n *\n * Provides a simple in-memory storage implementation for testing purposes.\n * Supports simulated failures, latency, and all standard operations.\n *\n * Features:\n * - In-memory file storage (Map-based)\n * - Configurable failure simulation\n * - Configurable latency simulation\n * - Full implementation of all adapter methods\n * - Health check support\n *\n * @example\n * ```ts\n * const adapter = new MockStorageAdapter({\n *   name: 'mock-storage',\n *   type: STORAGE_ADAPTER_TYPE.MOCK,\n *   simulateFailures: true,\n *   failureRate: 0.1, // 10% failure rate\n *   latency: 100, // 100ms simulated latency\n * });\n * ```\n */\n\nimport { BaseStorageAdapter } from '../base/BaseStorageAdapter';\nimport type {\n  MockAdapterConfig,\n  UploadParams,\n  UploadResult,\n  DownloadParams,\n  DownloadResult,\n  DeleteParams,\n  FileDeleteResult,\n  PresignedUrlOptions,\n  PresignedUrlResult,\n  AdapterHealthCheck,\n  FileMetadata,\n  BucketConfiguration,\n  StorageValidationConfig,\n  BUCKET_PURPOSE,\n  StorageBucketInfo,\n  StorageListFilesResult,\n  StorageSignedUploadUrlResult,\n  StorageListBucketsResult,\n  StoragePublicUrlParams,\n} from '@plyaz/types/storage';\nimport {\n  ADAPTER_HEALTH_STATUS,\n  STORAGE_ADAPTER_TYPE,\n  UPLOAD_STATUS,\n  FILE_ACCESS_LEVEL,\n} from '@plyaz/types/storage';\nimport { StoragePackageError } from '@plyaz/errors';\nimport { StorageCategoryClassifier } from '../../utils/storageCategories';\nimport { getStorageValidationRulesForPurpose } from '@plyaz/config';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types/errors';\n\n/**\n * Constants for MockStorageAdapter\n */\nconst MOCK_ADAPTER_CONSTANTS = {\n  DEFAULT_FAILURE_RATE: 0.1, // 10% failure rate for simulated failures\n  DEFAULT_SIGNED_URL_EXPIRY_SECONDS: 3600, // 1 hour default expiration\n  MILLISECONDS_PER_SECOND: 1000,\n  UUID_TIMESTAMP_PART_LENGTH: 36, // Length of UUID timestamp part\n  UUID_TIMESTAMP_START: 0,\n  UUID_TIMESTAMP_LENGTH: 2,\n  UUID_RANDOM_START: 2,\n  UUID_RANDOM_LENGTH: 9,\n} as const;\n\n/**\n * In-memory file storage entry\n */\ninterface StoredFile {\n  metadata: FileMetadata;\n  content: Buffer;\n  uploadedAt: Date;\n  softDeleted?: boolean;\n  deletedAt?: Date;\n  gracePeriodUntil?: Date;\n}\n\n/**\n * MockStorageAdapter - In-memory mock adapter for testing\n */\nexport class MockStorageAdapter extends BaseStorageAdapter {\n  private readonly simulateFailures: boolean;\n  private readonly failureRate: number;\n  private readonly simulatedLatency: number;\n  private readonly validation?: StorageValidationConfig;\n\n  // In-memory storage\n  private files: Map<string, StoredFile> = new Map();\n  private downloadCount = 0;\n  private uploadCount = 0;\n  private deleteCount = 0;\n\n  constructor(config: MockAdapterConfig) {\n    super({\n      name: config.name,\n      type: STORAGE_ADAPTER_TYPE.MOCK,\n      enabled: config.enabled,\n      priority: config.priority,\n      retry: config.retry,\n      autoCreateBuckets: config.autoCreateBuckets,\n      defaultEnvironment: config.defaultEnvironment,\n      defaultRegion: config.defaultRegion,\n    });\n\n    this.simulateFailures = config.simulateFailures ?? false;\n    this.failureRate = config.failureRate ?? MOCK_ADAPTER_CONSTANTS.DEFAULT_FAILURE_RATE;\n    this.simulatedLatency = config.latency ?? 0;\n    this.validation = config.validation;\n\n    this.logger?.info('MockStorageAdapter initialized', {\n      name: config.name,\n      simulateFailures: this.simulateFailures,\n      failureRate: this.failureRate,\n      latency: this.simulatedLatency,\n    });\n  }\n\n  /**\n   * Upload a file to mock storage\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  async upload(params: UploadParams): Promise<UploadResult> {\n    // Validate required fields (must be present after template rendering)\n    if (!params.file) {\n      throw new StoragePackageError(\n        'File buffer is required for upload',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { adapter: this.name } }\n      );\n    }\n    if (!params.filename) {\n      throw new StoragePackageError(\n        'Filename is required for upload',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { adapter: this.name } }\n      );\n    }\n    if (!params.mimeType) {\n      throw new StoragePackageError(\n        'MIME type is required for upload',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        { context: { adapter: this.name } }\n      );\n    }\n\n    // Determine bucket purpose from upload params\n    const bucketPurpose = StorageCategoryClassifier.classify(params);\n\n    // Build bucket configuration\n    const bucketConfig: BucketConfiguration = {\n      purpose: bucketPurpose,\n      businessModel: params.businessModel,\n      tier: params.organizationTier,\n      organizationId: params.organizationId,\n      environment: params.environment ?? this.defaultEnvironment,\n      region: params.region ?? this.defaultRegion,\n    };\n\n    // Get dynamic bucket name (auto-creates if needed)\n    const bucketName = await this.ensureBucket(bucketPurpose, bucketConfig);\n\n    this.logger?.debug('[MockStorageAdapter] Using bucket', {\n      bucketName,\n      bucketPurpose,\n    });\n\n    // Convert file to Buffer if it's a stream\n    const fileBuffer = Buffer.isBuffer(params.file)\n      ? params.file\n      : await this.streamToBuffer(params.file);\n\n    const fileId = this.generateFileId();\n    const storagePath = params.customPath ?? `mock/${fileId}/${params.filename}`;\n\n    // Emit initial progress (0%)\n    this.emitProgress(params, {\n      fileId: storagePath,\n      filename: params.filename,\n      loaded: 0,\n      total: fileBuffer.length,\n      percentage: 0,\n      speed: undefined,\n      estimatedTimeRemaining: undefined,\n    });\n\n    this.logOperationStart('upload', {\n      filename: params.filename,\n      size: fileBuffer.length,\n      customPath: params.customPath,\n    });\n\n    await this.simulateLatency();\n    this.maybeSimulateFailure('upload');\n\n    const storageUrl = `mock://${storagePath}`;\n\n    const metadata: FileMetadata = {\n      fileId,\n      filename: params.filename,\n      mimeType: params.mimeType,\n      size: fileBuffer.length,\n      category: params.category,\n      entityType: params.entityType,\n      entityId: params.entityId,\n      accessLevel: params.accessLevel ?? FILE_ACCESS_LEVEL.PRIVATE,\n      path: storagePath,\n      url: storageUrl,\n      status: UPLOAD_STATUS.COMPLETED,\n      extension: this.getFileExtension(params.filename),\n      uploadedAt: new Date(),\n      adapter: this.name,\n      bucket: bucketName,\n      bucketPurpose,\n      customMetadata: params.customMetadata,\n    };\n\n    this.files.set(fileId, {\n      metadata,\n      content: fileBuffer,\n      uploadedAt: new Date(),\n    });\n\n    this.uploadCount++;\n\n    this.logOperationSuccess('upload', {\n      fileId,\n      path: storagePath,\n      size: fileBuffer.length,\n    });\n\n    // Emit final progress (100%)\n    this.emitProgress(params, {\n      fileId: storagePath,\n      filename: params.filename,\n      loaded: fileBuffer.length,\n      total: fileBuffer.length,\n      percentage: 100,\n      speed: undefined,\n      estimatedTimeRemaining: 0,\n    });\n\n    return {\n      metadata,\n      url: storageUrl,\n    };\n  }\n\n  /**\n   * Download a file from mock storage\n   */\n  async download(params: DownloadParams): Promise<DownloadResult> {\n    this.logOperationStart('download', {\n      fileId: params.fileId,\n    });\n\n    await this.simulateLatency();\n    this.maybeSimulateFailure('download');\n\n    const file = this.files.get(params.fileId);\n    if (!file) {\n      throw new StoragePackageError('File not found', STORAGE_ERROR_CODES.FILE_NOT_FOUND, {\n        context: { fileId: params.fileId },\n      });\n    }\n\n    this.downloadCount++;\n\n    this.logOperationSuccess('download', {\n      fileId: params.fileId,\n      size: file.content.length,\n    });\n\n    // Return signed URL if requested\n    if (params.signedUrl) {\n      const expiresIn =\n        params.signedUrlExpiry ?? MOCK_ADAPTER_CONSTANTS.DEFAULT_SIGNED_URL_EXPIRY_SECONDS;\n      const expiresAt = new Date(\n        Date.now() + expiresIn * MOCK_ADAPTER_CONSTANTS.MILLISECONDS_PER_SECOND\n      );\n      const signedUrl = `mock://${file.metadata.path}?signature=mock-signature&expires=${expiresAt.getTime()}`;\n\n      return {\n        url: signedUrl,\n        metadata: file.metadata,\n      };\n    }\n\n    // Return file buffer\n    return {\n      file: file.content,\n      metadata: file.metadata,\n    };\n  }\n\n  /**\n   * Delete a file from mock storage\n   * Supports soft delete with grace period\n   */\n  async delete(params: DeleteParams): Promise<FileDeleteResult> {\n    this.logOperationStart('delete', {\n      fileId: params.fileId,\n      permanent: params.permanent,\n    });\n\n    await this.simulateLatency();\n    this.maybeSimulateFailure('delete');\n\n    const file = this.files.get(params.fileId);\n    if (!file) {\n      throw new StoragePackageError('File not found', STORAGE_ERROR_CODES.FILE_NOT_FOUND, {\n        context: { fileId: params.fileId },\n      });\n    }\n\n    const deletedAt = new Date();\n\n    // Permanent delete - remove from storage\n    if (params.permanent) {\n      this.files.delete(params.fileId);\n      this.deleteCount++;\n\n      this.logOperationSuccess('delete', {\n        fileId: params.fileId,\n        permanent: true,\n      });\n\n      return {\n        success: true,\n        metadata: file.metadata,\n        deletedAt,\n      };\n    }\n\n    // Soft delete - mark as deleted but keep in storage\n    file.softDeleted = true;\n    file.deletedAt = deletedAt;\n\n    // Set grace period if provided in softDeleteMetadata\n    if (params.softDeleteMetadata?.gracePeriodDays) {\n      const gracePeriodUntil = new Date(deletedAt);\n      gracePeriodUntil.setDate(\n        gracePeriodUntil.getDate() + params.softDeleteMetadata.gracePeriodDays\n      );\n      file.gracePeriodUntil = gracePeriodUntil;\n    }\n\n    this.deleteCount++;\n\n    this.logOperationSuccess('delete', {\n      fileId: params.fileId,\n      permanent: false,\n      softDeleted: true,\n      gracePeriodUntil: file.gracePeriodUntil?.toISOString(),\n    });\n\n    return {\n      success: true,\n      metadata: file.metadata,\n      deletedAt,\n      softDelete: params.softDeleteMetadata\n        ? {\n            deletedBy: params.softDeleteMetadata.deletedBy,\n            deletedAt,\n            reason: params.softDeleteMetadata.reason,\n            gracePeriodDays: params.softDeleteMetadata.gracePeriodDays,\n            gracePeriodUntil: file.gracePeriodUntil,\n            canRestore: file.gracePeriodUntil ? new Date() < file.gracePeriodUntil : true,\n          }\n        : undefined,\n    };\n  }\n\n  /**\n   * Generate a presigned URL for file access\n   */\n  async getSignedUrl(options: PresignedUrlOptions): Promise<PresignedUrlResult> {\n    this.logOperationStart('getSignedUrl', {\n      fileId: options.fileId,\n      operation: options.operation,\n      expiresIn: options.expiresIn,\n    });\n\n    await this.simulateLatency();\n    this.maybeSimulateFailure('getSignedUrl');\n\n    // For upload operation, generate a URL without checking existing file\n    if (options.operation === 'upload') {\n      const uploadId = this.generateFileId();\n      const expiresAt = new Date(\n        Date.now() + options.expiresIn * MOCK_ADAPTER_CONSTANTS.MILLISECONDS_PER_SECOND\n      );\n      const signedUrl = `mock://upload/${uploadId}?signature=mock-signature&expires=${expiresAt.getTime()}`;\n\n      return {\n        url: signedUrl,\n        id: uploadId,\n        expiresAt,\n      };\n    }\n\n    // For download operation, check if file exists\n    if (!options.fileId) {\n      throw new StoragePackageError(\n        'File ID required for download operation',\n        STORAGE_ERROR_CODES.VALIDATION_FAILED,\n        {\n          context: { operation: options.operation },\n        }\n      );\n    }\n\n    const file = this.files.get(options.fileId);\n    if (!file) {\n      throw new StoragePackageError('File not found', STORAGE_ERROR_CODES.FILE_NOT_FOUND, {\n        context: { fileId: options.fileId },\n      });\n    }\n\n    const expiresAt = new Date(\n      Date.now() + options.expiresIn * MOCK_ADAPTER_CONSTANTS.MILLISECONDS_PER_SECOND\n    );\n    const signedUrl = `mock://${file.metadata.path}?signature=mock-signature&expires=${expiresAt.getTime()}`;\n\n    this.logOperationSuccess('getSignedUrl', {\n      fileId: options.fileId,\n      expiresIn: options.expiresIn,\n    });\n\n    return {\n      url: signedUrl,\n      id: options.fileId,\n      expiresAt,\n    };\n  }\n\n  /**\n   * Check if adapter is available\n   */\n  isAvailable(): boolean {\n    return this.enabled;\n  }\n\n  /**\n   * Perform health check\n   */\n  async healthCheck(): Promise<AdapterHealthCheck> {\n    const startTime = Date.now();\n\n    try {\n      await this.simulateLatency();\n\n      // Simulate health check failure if configured\n      if (this.simulateFailures && Math.random() < this.failureRate) {\n        throw new StoragePackageError(\n          'Simulated health check failure',\n          STORAGE_ERROR_CODES.ADAPTER_HEALTH_CHECK_FAILED,\n          { context: { adapter: this.name, simulated: true } }\n        );\n      }\n\n      const responseTime = Date.now() - startTime;\n\n      return {\n        status: ADAPTER_HEALTH_STATUS.HEALTHY,\n        responseTime,\n        lastChecked: new Date(),\n        details: {\n          filesStored: this.files.size,\n          uploadCount: this.uploadCount,\n          downloadCount: this.downloadCount,\n          deleteCount: this.deleteCount,\n        },\n      };\n    } catch (error) {\n      return {\n        status: ADAPTER_HEALTH_STATUS.UNHEALTHY,\n        responseTime: Date.now() - startTime,\n        error: error instanceof Error ? error.message : String(error),\n        lastChecked: new Date(),\n      };\n    }\n  }\n\n  // ===== Helper Methods =====\n\n  /**\n   * Simulate latency if configured\n   */\n  private async simulateLatency(): Promise<void> {\n    if (this.simulatedLatency > 0) {\n      await new Promise(resolve => setTimeout(resolve, this.simulatedLatency));\n    }\n  }\n\n  /**\n   * Maybe simulate a failure based on configuration\n   */\n  private maybeSimulateFailure(operation: string): void {\n    if (this.simulateFailures && Math.random() < this.failureRate) {\n      throw new StoragePackageError(\n        `Simulated ${operation} failure`,\n        STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED,\n        {\n          context: {\n            operation,\n            adapter: this.name,\n            simulated: true,\n          },\n        }\n      );\n    }\n  }\n\n  /**\n   * Generate a unique file ID\n   */\n  private generateFileId(): string {\n    return `mock-${Date.now()}-${Math.random().toString(MOCK_ADAPTER_CONSTANTS.UUID_TIMESTAMP_PART_LENGTH).substring(MOCK_ADAPTER_CONSTANTS.UUID_RANDOM_START, MOCK_ADAPTER_CONSTANTS.UUID_RANDOM_LENGTH)}`;\n  }\n\n  /**\n   * Get file extension from filename\n   */\n  private getFileExtension(filename: string): string {\n    const parts = filename.split('.');\n    return parts.length > 1 ? (parts.at(-1) ?? '') : '';\n  }\n\n  /**\n   * Convert ReadableStream to Buffer\n   */\n  protected async streamToBuffer(stream: globalThis.NodeJS.ReadableStream): Promise<Buffer> {\n    const chunks: Buffer[] = [];\n\n    return new Promise((resolve, reject) => {\n      stream.on('data', (chunk: Buffer) => chunks.push(chunk));\n      stream.on('error', reject);\n      stream.on('end', () => resolve(Buffer.concat(chunks)));\n    });\n  }\n\n  // ===== Testing Utilities =====\n\n  /**\n   * Get statistics (useful for testing)\n   */\n  getStatistics(): {\n    filesStored: number;\n    uploadCount: number;\n    downloadCount: number;\n    deleteCount: number;\n    totalSize: number;\n  } {\n    let totalSize = 0;\n    for (const file of this.files.values()) {\n      totalSize += file.content.length;\n    }\n\n    return {\n      filesStored: this.files.size,\n      uploadCount: this.uploadCount,\n      downloadCount: this.downloadCount,\n      deleteCount: this.deleteCount,\n      totalSize,\n    };\n  }\n\n  /**\n   * Get all stored file metadata (useful for testing)\n   */\n  getAllFiles(): FileMetadata[] {\n    return Array.from(this.files.values()).map(file => file.metadata);\n  }\n\n  /**\n   * Clear all stored files (useful for testing)\n   */\n  clear(): void {\n    this.files.clear();\n    this.uploadCount = 0;\n    this.downloadCount = 0;\n    this.deleteCount = 0;\n\n    this.logger?.debug('Mock storage cleared');\n  }\n\n  /**\n   * Check if a file exists (useful for testing)\n   */\n  hasFile(fileId: string): boolean {\n    return this.files.has(fileId);\n  }\n\n  /**\n   * Get file metadata (required for compliance checks)\n   */\n  // eslint-disable-next-line no-unused-vars -- bucket parameter matches interface signature\n  async getFileMetadata(fileId: string, _bucket?: string): Promise<FileMetadata> {\n    await this.simulateLatency();\n\n    const file = this.files.get(fileId);\n    if (!file) {\n      throw new StoragePackageError(\n        `File not found: ${fileId}`,\n        STORAGE_ERROR_CODES.FILE_NOT_FOUND,\n        { context: { fileId } }\n      );\n    }\n\n    // Return a copy of metadata to prevent external modifications\n    return { ...file.metadata };\n  }\n\n  /**\n   * Restore a soft-deleted file\n   */\n  async restoreFile(fileId: string): Promise<FileMetadata> {\n    await this.simulateLatency();\n\n    const file = this.files.get(fileId);\n    if (!file) {\n      throw new StoragePackageError(\n        `File not found: ${fileId}`,\n        STORAGE_ERROR_CODES.FILE_NOT_FOUND,\n        { context: { fileId } }\n      );\n    }\n\n    if (!file.softDeleted) {\n      throw new StoragePackageError(\n        `File is not soft-deleted: ${fileId}`,\n        STORAGE_ERROR_CODES.INVALID_OPERATION,\n        { context: { fileId, softDeleted: file.softDeleted } }\n      );\n    }\n\n    // Check if grace period has expired\n    if (file.gracePeriodUntil && new Date() > file.gracePeriodUntil) {\n      throw new StoragePackageError(\n        `Grace period expired, file cannot be restored: ${fileId}`,\n        STORAGE_ERROR_CODES.INVALID_OPERATION,\n        {\n          context: {\n            fileId,\n            gracePeriodUntil: file.gracePeriodUntil.toISOString(),\n          },\n        }\n      );\n    }\n\n    // Restore the file\n    file.softDeleted = false;\n    file.deletedAt = undefined;\n    file.gracePeriodUntil = undefined;\n\n    this.logger?.info('File restored', {\n      fileId,\n      filename: file.metadata.filename,\n    });\n\n    return { ...file.metadata };\n  }\n\n  /**\n   * Translate bucket purpose to mock bucket name\n   * Mock adapter uses simple naming: mock-{purpose}\n   */\n  // eslint-disable-next-line no-unused-vars -- config parameter matches interface signature\n  translateBucketPurpose(purpose: BUCKET_PURPOSE, _config: BucketConfiguration): string {\n    return `mock-${purpose}`;\n  }\n\n  /**\n   * Create bucket (no-op for mock adapter)\n   * Mock adapter doesn't need actual bucket creation\n   */\n  async createBucket(bucketName: string, purpose: BUCKET_PURPOSE): Promise<void> {\n    // No-op for mock adapter\n    this.logger?.debug('[MockStorageAdapter] Bucket creation requested (no-op)', {\n      bucketName,\n      purpose,\n    });\n  }\n\n  /**\n   * List all buckets (mock implementation)\n   */\n  async listBuckets(): Promise<StorageListBucketsResult> {\n    return {\n      buckets: [],\n      count: 0,\n    };\n  }\n\n  /**\n   * Get bucket info (mock implementation)\n   */\n  async getBucket(bucketName: string): Promise<StorageBucketInfo> {\n    return {\n      name: bucketName,\n      public: false,\n      createdAt: new Date(),\n    };\n  }\n\n  /**\n   * Update bucket (no-op for mock)\n   */\n  // eslint-disable-next-line no-unused-vars -- params matches interface signature\n  async updateBucket(_params: unknown): Promise<void> {\n    // No-op\n  }\n\n  /**\n   * List files in bucket (mock implementation)\n   */\n  // eslint-disable-next-line no-unused-vars -- params matches interface signature\n  async listFiles(_params: unknown): Promise<StorageListFilesResult> {\n    return {\n      files: [],\n      count: 0,\n      hasMore: false,\n    };\n  }\n\n  /**\n   * Move file (mock implementation)\n   */\n  // eslint-disable-next-line no-unused-vars -- params matches interface signature\n  async moveFile(_params: unknown): Promise<FileMetadata> {\n    throw new StoragePackageError(\n      'moveFile not implemented in MockStorageAdapter',\n      STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED\n    );\n  }\n\n  /**\n   * Copy file (mock implementation)\n   */\n  // eslint-disable-next-line no-unused-vars -- params matches interface signature\n  async copyFile(_params: unknown): Promise<FileMetadata> {\n    throw new StoragePackageError(\n      'copyFile not implemented in MockStorageAdapter',\n      STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED\n    );\n  }\n\n  /**\n   * Replace file (mock implementation)\n   */\n  // eslint-disable-next-line no-unused-vars -- params matches interface signature\n  async replaceFile(_params: unknown): Promise<FileMetadata> {\n    throw new StoragePackageError(\n      'replaceFile not implemented in MockStorageAdapter',\n      STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED\n    );\n  }\n\n  /**\n   * Create signed upload URL (mock implementation)\n   */\n  // eslint-disable-next-line no-unused-vars -- params matches interface signature\n  async createSignedUploadUrl(_params: unknown): Promise<StorageSignedUploadUrlResult> {\n    return {\n      url: 'https://mock-upload-url.com',\n      token: 'mock-token',\n      expiresAt: new Date(\n        Date.now() +\n          MOCK_ADAPTER_CONSTANTS.DEFAULT_SIGNED_URL_EXPIRY_SECONDS *\n            MOCK_ADAPTER_CONSTANTS.MILLISECONDS_PER_SECOND\n      ),\n    };\n  }\n\n  /**\n   * Get public URL (mock implementation)\n   */\n  async getPublicUrl(params: StoragePublicUrlParams): Promise<string> {\n    return `https://mock-storage.com/${params.bucket}/${params.path}`;\n  }\n\n  /**\n   * Get file size limit for bucket purpose\n   * Used by StorageService for validation\n   */\n  public getFileSizeLimit(purpose: BUCKET_PURPOSE): number | undefined {\n    const rules = getStorageValidationRulesForPurpose(purpose, this.validation);\n    return rules.maxFileSize;\n  }\n\n  /**\n   * Get allowed MIME types for bucket purpose\n   * Used by StorageService for validation\n   */\n  public getAllowedMimeTypes(purpose: BUCKET_PURPOSE): string[] | undefined {\n    const rules = getStorageValidationRulesForPurpose(purpose, this.validation);\n    return rules.allowedMimeTypes;\n  }\n\n  /**\n   * Generate file key/path for mock storage\n   */\n  protected generateFileKey(params: UploadParams): string {\n    // Simple key generation for mock adapter\n    const parts: string[] = [];\n    if (params.entityType) parts.push(params.entityType);\n    if (params.entityId) parts.push(params.entityId);\n    if (params.category) parts.push(params.category);\n    if (params.filename) parts.push(params.filename);\n\n    return parts.length > 0 ? parts.join('/') : `mock/${Date.now()}/${params.filename ?? 'file'}`;\n  }\n}\n","/**\n * CloudflareR2Adapter - Cloudflare R2 storage adapter\n *\n * Cloudflare R2 is an S3-compatible object storage service with zero egress fees.\n * This adapter uses the AWS S3 SDK for compatibility.\n *\n * Features:\n * - S3-compatible API\n * - Zero egress fees\n * - Global edge network\n * - Automatic presigned URLs\n * - Multipart upload support (future)\n * - Custom domain support\n * - Soft delete with metadata\n *\n * Configuration:\n * - accountId: Cloudflare account ID\n * - accessKeyId: R2 API token ID\n * - secretAccessKey: R2 API token secret\n * - bucket: R2 bucket name\n * - region: Optional (defaults to 'auto')\n * - endpoint: Optional custom endpoint\n * - publicDomain: Optional public URL domain for public files\n *\n * @example\n * ```ts\n * const adapter = new CloudflareR2Adapter({\n *   name: 'r2-storage',\n *   type: STORAGE_ADAPTER_TYPE.CloudflareR2,\n *   credentials: {\n *     accountId: process.env.R2_ACCOUNT_ID!,\n *     accessKeyId: process.env.R2_ACCESS_KEY_ID!,\n *     secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,\n *   },\n *   bucket: process.env.R2_BUCKET_NAME!,\n *   publicDomain: 'https://cdn.example.com', // Optional\n * });\n * ```\n */\n\nimport { BaseStorageAdapter } from '../base/BaseStorageAdapter';\nimport {\n  S3Client,\n  PutObjectCommand,\n  GetObjectCommand,\n  DeleteObjectCommand,\n  HeadObjectCommand,\n  ListObjectsV2Command,\n  ListBucketsCommand,\n  CopyObjectCommand,\n  CreateBucketCommand,\n  HeadBucketCommand,\n  DeleteBucketCommand,\n  DeleteObjectsCommand,\n  CreateMultipartUploadCommand,\n  UploadPartCommand,\n  CompleteMultipartUploadCommand,\n  AbortMultipartUploadCommand,\n  type ListObjectsV2CommandOutput,\n} from '@aws-sdk/client-s3';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport type {\n  CloudflareR2Config,\n  UploadParams,\n  UploadResult,\n  DownloadParams,\n  DownloadResult,\n  DeleteParams,\n  FileDeleteResult,\n  PresignedUrlOptions,\n  PresignedUrlResult,\n  AdapterHealthCheck,\n  FileMetadata,\n  BucketConfiguration,\n  StorageListBucketsResult,\n  StorageBucketInfo,\n  StorageUpdateBucketParams,\n  StorageListFilesParams,\n  StorageListFilesResult,\n  StorageMoveFileParams,\n  StorageCopyFileParams,\n  StorageReplaceFileParams,\n  StorageSignedUploadUrlParams,\n  StorageSignedUploadUrlResult,\n  StoragePublicUrlParams,\n  MultipartUploadPart,\n  BucketDeletionResult,\n  StorageValidationConfig,\n  FILE_CATEGORY,\n  ENTITY_TYPE,\n  StorageChunkUploadPartResult,\n  StorageChunkExtractionResult,\n  StorageBucketDeletionResult,\n} from '@plyaz/types/storage';\nimport {\n  ADAPTER_HEALTH_STATUS,\n  STORAGE_ADAPTER_TYPE,\n  UPLOAD_STATUS,\n  FILE_ACCESS_LEVEL,\n  BUCKET_PURPOSE,\n  ORGANIZATION_TIER,\n} from '@plyaz/types/storage';\nimport { StoragePackageError } from '@plyaz/errors';\nimport { Readable } from 'stream';\nimport { getStorageOptimalChunkSize } from '@plyaz/config';\nimport { extractFilenameFromKey } from '../../utils/fileUtils';\nimport { IdempotencyStoreService } from '../../idempotency/IdempotencyStoreService';\nimport { getStorageValidationRulesForPurpose } from '@plyaz/config';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types/errors';\n\n/**\n * Constants for CloudflareR2Adapter\n */\nconst R2_ADAPTER_CONSTANTS = {\n  DEFAULT_SIGNED_URL_EXPIRY_SECONDS: 3600, // 1 hour\n  MILLISECONDS_PER_SECOND: 1000,\n  DEFAULT_LIST_LIMIT: 100,\n  PERCENTAGE_MULTIPLIER: 100, // For converting decimal to percentage\n} as const;\n\n/**\n * R2-specific metadata keys (stored as S3 object metadata)\n */\nconst R2_METADATA_KEYS = {\n  ENTITY_TYPE: 'x-amz-meta-entity-type',\n  ENTITY_ID: 'x-amz-meta-entity-id',\n  CATEGORY: 'x-amz-meta-category',\n  ACCESS_LEVEL: 'x-amz-meta-access-level',\n  UPLOADED_BY: 'x-amz-meta-uploaded-by',\n  SOFT_DELETED: 'x-amz-meta-soft-deleted',\n  DELETED_AT: 'x-amz-meta-deleted-at',\n  GRACE_PERIOD_UNTIL: 'x-amz-meta-grace-period-until',\n};\n\n/**\n * CloudflareR2Adapter - Cloudflare R2 storage adapter\n */\nexport class CloudflareR2Adapter extends BaseStorageAdapter {\n  private readonly s3Client: S3Client;\n  private readonly bucket?: string; // Optional - uses dynamic buckets when undefined\n  private readonly accountId: string;\n  private readonly publicDomain?: string;\n  private readonly region: string;\n  private readonly endpoint: string;\n\n  // Upload metadata storage (uses IdempotencyStoreService for Redis/in-memory support)\n  private readonly uploadMetadataStore: IdempotencyStoreService;\n  private readonly validation?: StorageValidationConfig;\n\n  constructor(config: CloudflareR2Config) {\n    super({\n      name: config.name,\n      type: STORAGE_ADAPTER_TYPE.CloudflareR2,\n      enabled: config.enabled,\n      priority: config.priority,\n      retry: config.retry,\n      autoCreateBuckets: config.autoCreateBuckets,\n      defaultEnvironment: config.defaultEnvironment,\n      defaultRegion: config.defaultRegion,\n    });\n\n    this.accountId = config.credentials.accountId;\n    this.bucket = config.bucket; // undefined = dynamic buckets enabled\n    this.region = config.region ?? 'auto';\n    this.publicDomain = config.publicDomain;\n\n    // R2 endpoint format: https://<accountId>.r2.cloudflarestorage.com (auto jurisdiction)\n    // Or jurisdiction-specific: .eu, .enam, .wnam, .apac\n    this.endpoint = config.endpoint ?? `https://${this.accountId}.r2.cloudflarestorage.com`;\n\n    // Initialize S3 client with R2 credentials\n    this.s3Client = new S3Client({\n      region: this.region,\n      endpoint: this.endpoint,\n      credentials: {\n        accessKeyId: config.credentials.accessKeyId,\n        secretAccessKey: config.credentials.secretAccessKey,\n      },\n    });\n\n    // Initialize upload metadata store (in-memory by default, configure Redis in production)\n    this.uploadMetadataStore = new IdempotencyStoreService({\n      type: 'in-memory',\n      options: {\n        defaultTTL: 3600000, // 1 hour TTL for upload metadata\n        maxKeys: 1000,\n      },\n    });\n\n    // Store validation config\n    this.validation = config.validation;\n\n    this.logger?.info('[CloudflareR2Adapter] Initialized', {\n      name: config.name,\n      bucket: this.bucket,\n      dynamicBuckets: !config.bucket && config.autoCreateBuckets,\n      region: this.region,\n      endpoint: this.endpoint,\n      hasPublicDomain: !!this.publicDomain,\n    });\n\n    if (!config.bucket && config.autoCreateBuckets) {\n      this.logger?.info(\n        '[CloudflareR2Adapter] Dynamic bucket mode enabled - buckets will be created based on content purpose'\n      );\n    }\n  }\n\n  /**\n   * Upload a file to Cloudflare R2\n   */\n  // eslint-disable-next-line complexity\n  async upload(params: UploadParams): Promise<UploadResult> {\n    try {\n      this.logger?.debug('[CloudflareR2Adapter] Starting upload', {\n        filename: params.filename,\n        mimeType: params.mimeType,\n        category: params.category,\n      });\n\n      // Prepare upload (bucket + file key)\n      const { bucketName, fileKey, bucketPurpose } = await this.prepareUpload(params);\n\n      this.logger?.debug('[CloudflareR2Adapter] Using bucket', {\n        bucketName,\n        bucketPurpose,\n      });\n\n      // Convert file to Buffer\n      const fileBuffer = await this.convertToBuffer(params.file);\n      // Extract filename from fileKey (last segment) to ensure consistency with generated names\n      const filename = params.filename ?? fileKey.split('/').pop() ?? 'unknown';\n\n      // Emit initial progress (0%)\n      this.emitProgress(params, {\n        fileId: fileKey,\n        filename,\n        loaded: 0,\n        total: fileBuffer.length,\n        percentage: 0,\n        speed: undefined,\n        estimatedTimeRemaining: undefined,\n      });\n\n      // Prepare S3 metadata\n      const metadata: Record<string, string> = {};\n      if (params.entityType) metadata[R2_METADATA_KEYS.ENTITY_TYPE] = params.entityType;\n      if (params.entityId) metadata[R2_METADATA_KEYS.ENTITY_ID] = params.entityId;\n      if (params.category) metadata[R2_METADATA_KEYS.CATEGORY] = params.category;\n      if (params.accessLevel) metadata[R2_METADATA_KEYS.ACCESS_LEVEL] = params.accessLevel;\n      if (params.customMetadata?.uploadedBy)\n        metadata[R2_METADATA_KEYS.UPLOADED_BY] = String(params.customMetadata.uploadedBy);\n\n      // Prepare PutObject command\n      const putCommand = new PutObjectCommand({\n        Bucket: bucketName,\n        Key: fileKey,\n        Body: fileBuffer,\n        ContentType: params.mimeType ?? 'application/octet-stream',\n        Metadata: metadata,\n      });\n\n      // Execute upload with retry\n      await this.withRetry(() => this.s3Client.send(putCommand), 'upload');\n\n      // Emit final progress (100%)\n      this.emitProgress(params, {\n        fileId: fileKey,\n        filename,\n        loaded: fileBuffer.length,\n        total: fileBuffer.length,\n        percentage: 100,\n        speed: undefined,\n        estimatedTimeRemaining: 0,\n      });\n\n      // Generate file URL\n      const fileUrl = this.publicDomain\n        ? `${this.publicDomain}/${fileKey}`\n        : `${this.endpoint}/${bucketName}/${fileKey}`;\n\n      // Build file metadata\n      const fileMetadata = this.buildFileMetadata({\n        params,\n        fileKey,\n        bucketName,\n        bucketPurpose,\n        fileSize: fileBuffer.length,\n      });\n\n      this.logger?.info('[CloudflareR2Adapter] Upload completed', {\n        fileId: fileKey,\n        size: fileBuffer.length,\n      });\n\n      return {\n        metadata: fileMetadata,\n        url: fileUrl,\n      };\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] Upload failed', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'upload');\n    }\n  }\n\n  /**\n   * Download a file from Cloudflare R2\n   */\n  // eslint-disable-next-line complexity\n  async download(params: DownloadParams): Promise<DownloadResult> {\n    try {\n      // Use bucket from params if provided, otherwise use default\n      const bucketName = params.bucket ?? this.bucket;\n\n      if (!bucketName) {\n        throw new StoragePackageError(\n          'Bucket name must be provided in params.bucket when using dynamic buckets. Store bucket info from upload metadata.',\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { fileId: params.fileId, adapter: this.name } }\n        );\n      }\n\n      this.logger?.debug('[CloudflareR2Adapter] Starting download', {\n        fileId: params.fileId,\n        bucket: bucketName,\n      });\n\n      const getCommand = new GetObjectCommand({\n        Bucket: bucketName,\n        Key: params.fileId,\n      });\n\n      // Execute download with retry\n      const response = await this.withRetry(() => this.s3Client.send(getCommand), 'download');\n\n      // Convert response body to Buffer\n      const buffer = await this.streamToBuffer(response.Body as Readable);\n\n      // Extract metadata from S3 object\n      const metadata: FileMetadata = {\n        fileId: params.fileId,\n        filename: extractFilenameFromKey(params.fileId),\n        mimeType: response.ContentType ?? 'application/octet-stream',\n        size: buffer.length,\n        category:\n          (response.Metadata?.[R2_METADATA_KEYS.CATEGORY] as FILE_CATEGORY) ??\n          ('ATTACHMENT' as FILE_CATEGORY),\n        entityType:\n          (response.Metadata?.[R2_METADATA_KEYS.ENTITY_TYPE] as ENTITY_TYPE) ??\n          ('USER' as ENTITY_TYPE),\n        entityId: response.Metadata?.[R2_METADATA_KEYS.ENTITY_ID] ?? 'unknown',\n        path: params.fileId,\n        adapter: this.name,\n        bucket: bucketName,\n        bucketPurpose: params.bucketPurpose,\n        uploadedAt: response.LastModified ?? new Date(),\n        accessLevel:\n          (response.Metadata?.[R2_METADATA_KEYS.ACCESS_LEVEL] as FILE_ACCESS_LEVEL) ??\n          FILE_ACCESS_LEVEL.PRIVATE,\n        status: UPLOAD_STATUS.COMPLETED,\n      };\n\n      this.logger?.info('[CloudflareR2Adapter] Download completed', {\n        fileId: params.fileId,\n        size: buffer.length,\n      });\n\n      return {\n        file: buffer,\n        metadata,\n      };\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] Download failed', {\n        fileId: params.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'download');\n    }\n  }\n\n  /**\n   * Delete a file from Cloudflare R2\n   */\n  // eslint-disable-next-line complexity\n  async delete(params: DeleteParams): Promise<FileDeleteResult> {\n    try {\n      // Use bucket from params if provided, otherwise use default\n      const bucketName = params.bucket ?? this.bucket;\n\n      if (!bucketName) {\n        throw new StoragePackageError(\n          'Bucket name must be provided in params.bucket when using dynamic buckets. Store bucket info from upload metadata.',\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { fileId: params.fileId, adapter: this.name } }\n        );\n      }\n\n      this.logger?.debug('[CloudflareR2Adapter] Starting delete', {\n        fileId: params.fileId,\n        bucket: bucketName,\n        permanent: params.permanent,\n      });\n\n      if (!params.permanent) {\n        // Soft delete (default): Mark as deleted with metadata\n        return await this.softDelete(\n          params.fileId,\n          params.softDeleteMetadata?.deletedBy ?? 'system',\n          bucketName\n        );\n      }\n\n      // Hard delete: Remove object permanently\n      const deleteCommand = new DeleteObjectCommand({\n        Bucket: bucketName,\n        Key: params.fileId,\n      });\n\n      await this.withRetry(() => this.s3Client.send(deleteCommand), 'delete');\n\n      this.logger?.info('[CloudflareR2Adapter] Delete completed', {\n        fileId: params.fileId,\n      });\n\n      return {\n        success: true,\n        deletedAt: new Date(),\n        metadata: await this.getFileMetadata(params.fileId, bucketName).catch(() => undefined),\n      };\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] Delete failed', {\n        fileId: params.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'delete');\n    }\n  }\n\n  /**\n   * Generate a presigned URL for temporary file access\n   */\n  // eslint-disable-next-line complexity\n  async getSignedUrl(options: PresignedUrlOptions): Promise<PresignedUrlResult> {\n    try {\n      // Use bucket from options if provided, otherwise use default\n      const bucketName = options.bucket ?? this.bucket;\n\n      if (!bucketName) {\n        throw new StoragePackageError(\n          'Bucket name must be provided in options.bucket when using dynamic buckets. Store bucket info from upload metadata.',\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { fileId: options.fileId, adapter: this.name } }\n        );\n      }\n\n      this.logger?.debug('[CloudflareR2Adapter] Generating signed URL', {\n        fileId: options.fileId,\n        bucket: bucketName,\n        expiresIn: options.expiresIn,\n      });\n\n      const command = new GetObjectCommand({\n        Bucket: bucketName,\n        Key: options.fileId,\n      });\n\n      const expiresIn = options.expiresIn ?? R2_ADAPTER_CONSTANTS.DEFAULT_SIGNED_URL_EXPIRY_SECONDS; // Default 1 hour\n      const url = await getSignedUrl(this.s3Client, command, { expiresIn });\n\n      this.logger?.info('[CloudflareR2Adapter] Signed URL generated', {\n        fileId: options.fileId,\n        expiresIn,\n      });\n\n      return {\n        url,\n        id: options.fileId ?? `presigned-${Date.now()}`,\n        expiresAt: new Date(Date.now() + expiresIn * R2_ADAPTER_CONSTANTS.MILLISECONDS_PER_SECOND),\n      };\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] Signed URL generation failed', {\n        fileId: options.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'getSignedUrl');\n    }\n  }\n\n  /**\n   * Check if adapter is available and properly configured\n   */\n  isAvailable(): boolean {\n    // Check if client is configured (bucket is optional when using dynamic buckets)\n    return !!(this.s3Client && this.accountId);\n  }\n\n  /**\n   * Perform health check on R2 storage\n   */\n  async healthCheck(): Promise<AdapterHealthCheck> {\n    try {\n      const startTime = Date.now();\n\n      // When using dynamic buckets (no default bucket), skip bucket-specific checks\n      // and just verify the S3 client is configured correctly\n      if (!this.bucket) {\n        // Dynamic buckets mode - just verify credentials/config are valid\n        // We can't list buckets in R2, so we trust the configuration is valid\n        this.updateHealthStatus(ADAPTER_HEALTH_STATUS.HEALTHY);\n\n        return {\n          status: ADAPTER_HEALTH_STATUS.HEALTHY,\n          responseTime: Date.now() - startTime,\n          lastChecked: new Date(),\n          details: {\n            adapter: this.name,\n            bucket: 'dynamic (no default bucket)',\n            message: 'R2 adapter configured for dynamic buckets',\n          },\n        };\n      }\n\n      // Default bucket specified - verify it's accessible\n      const command = new ListObjectsV2Command({\n        Bucket: this.bucket,\n        MaxKeys: 1,\n      });\n\n      await this.s3Client.send(command);\n      const responseTime = Date.now() - startTime;\n\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.HEALTHY);\n\n      return {\n        status: ADAPTER_HEALTH_STATUS.HEALTHY,\n        responseTime,\n        lastChecked: new Date(),\n        details: {\n          adapter: this.name,\n          bucket: this.bucket,\n          message: 'R2 bucket accessible',\n        },\n      };\n    } catch (error) {\n      this.updateHealthStatus(ADAPTER_HEALTH_STATUS.UNHEALTHY);\n\n      return {\n        status: ADAPTER_HEALTH_STATUS.UNHEALTHY,\n        error: error instanceof Error ? error.message : 'R2 health check failed',\n        lastChecked: new Date(),\n        details: {\n          adapter: this.name,\n          bucket: this.bucket ?? 'dynamic',\n        },\n      };\n    }\n  }\n\n  /**\n   * Get file metadata without downloading the file\n   */\n  // eslint-disable-next-line complexity\n  async getFileMetadata(fileId: string, bucket?: string): Promise<FileMetadata> {\n    try {\n      const bucketName = bucket ?? this.bucket;\n\n      this.logger?.debug('[CloudflareR2Adapter] Getting file metadata', {\n        fileId,\n        bucket: bucketName,\n      });\n\n      const command = new HeadObjectCommand({\n        Bucket: bucketName,\n        Key: fileId,\n      });\n\n      const response = await this.withRetry(() => this.s3Client.send(command), 'getFileMetadata');\n\n      const metadata: FileMetadata = {\n        fileId,\n        filename: extractFilenameFromKey(fileId),\n        mimeType: response.ContentType ?? 'application/octet-stream',\n        size: response.ContentLength ?? 0,\n        category:\n          (response.Metadata?.[R2_METADATA_KEYS.CATEGORY] as FILE_CATEGORY) ??\n          ('ATTACHMENT' as FILE_CATEGORY),\n        entityType:\n          (response.Metadata?.[R2_METADATA_KEYS.ENTITY_TYPE] as ENTITY_TYPE) ??\n          ('USER' as ENTITY_TYPE),\n        entityId: response.Metadata?.[R2_METADATA_KEYS.ENTITY_ID] ?? 'unknown',\n        path: fileId,\n        adapter: this.name,\n        bucket: bucketName,\n        uploadedAt: response.LastModified ?? new Date(),\n        accessLevel:\n          (response.Metadata?.[R2_METADATA_KEYS.ACCESS_LEVEL] as FILE_ACCESS_LEVEL) ??\n          FILE_ACCESS_LEVEL.PRIVATE,\n        status: UPLOAD_STATUS.COMPLETED,\n      };\n\n      // Store soft delete info in customMetadata\n      if (response.Metadata?.[R2_METADATA_KEYS.SOFT_DELETED] === 'true') {\n        metadata.customMetadata = {\n          ...(metadata.customMetadata ?? {}),\n          softDeleted: true,\n          deletedAt: response.Metadata[R2_METADATA_KEYS.DELETED_AT] ?? null,\n          gracePeriodUntil: response.Metadata[R2_METADATA_KEYS.GRACE_PERIOD_UNTIL] ?? null,\n        };\n      }\n\n      return metadata;\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] Get metadata failed', {\n        fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'getFileMetadata');\n    }\n  }\n\n  /**\n   * Restore a soft-deleted file\n   */\n  // eslint-disable-next-line complexity\n  async restoreFile(fileId: string, bucket?: string): Promise<FileMetadata> {\n    try {\n      const bucketName = bucket ?? this.bucket;\n\n      this.logger?.debug('[CloudflareR2Adapter] Restoring file', {\n        fileId,\n        bucket: bucketName,\n      });\n\n      // Get current metadata\n      const metadata = await this.getFileMetadata(fileId, bucketName);\n\n      // Check if file is soft deleted (stored in customMetadata)\n      if (!metadata.customMetadata?.softDeleted) {\n        throw new StoragePackageError(\n          'File is not soft deleted',\n          STORAGE_ERROR_CODES.FILE_NOT_FOUND,\n          { context: { fileId } }\n        );\n      }\n\n      // Copy file to itself with updated metadata (removing soft delete flags)\n      const copyCommand = new CopyObjectCommand({\n        Bucket: bucketName,\n        Key: fileId,\n        CopySource: `${bucketName}/${fileId}`,\n        Metadata: {\n          [R2_METADATA_KEYS.ENTITY_TYPE]: metadata.entityType ?? '',\n          [R2_METADATA_KEYS.ENTITY_ID]: metadata.entityId ?? '',\n          [R2_METADATA_KEYS.CATEGORY]: metadata.category ?? '',\n          [R2_METADATA_KEYS.ACCESS_LEVEL]: metadata.accessLevel,\n          // Soft delete flags removed\n        },\n        MetadataDirective: 'REPLACE',\n      });\n\n      await this.withRetry(() => this.s3Client.send(copyCommand), 'restoreFile');\n\n      // Fetch updated metadata\n      const restoredMetadata = await this.getFileMetadata(fileId, bucketName);\n\n      this.logger?.info('[CloudflareR2Adapter] File restored', {\n        fileId,\n      });\n\n      return restoredMetadata;\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] Restore failed', {\n        fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'restoreFile');\n    }\n  }\n\n  // ===== Private Helper Methods =====\n\n  /**\n   * Perform soft delete by updating metadata\n   */\n  private async softDelete(\n    fileId: string,\n    deletedBy: string,\n    bucket?: string\n  ): Promise<FileDeleteResult> {\n    const bucketName = bucket ?? this.bucket;\n\n    // Get current metadata\n    const metadata = await this.getFileMetadata(fileId, bucketName);\n\n    // Calculate grace period (60 days default)\n    const gracePeriodDays = 60;\n    const deletedAt = new Date();\n    const gracePeriodUntil = new Date(deletedAt);\n    gracePeriodUntil.setDate(gracePeriodUntil.getDate() + gracePeriodDays);\n\n    // Copy file to itself with soft delete metadata\n    const copyCommand = new CopyObjectCommand({\n      Bucket: bucketName,\n      Key: fileId,\n      CopySource: `${bucketName}/${fileId}`,\n      Metadata: {\n        [R2_METADATA_KEYS.ENTITY_TYPE]: metadata.entityType ?? '',\n        [R2_METADATA_KEYS.ENTITY_ID]: metadata.entityId ?? '',\n        [R2_METADATA_KEYS.CATEGORY]: metadata.category ?? '',\n        [R2_METADATA_KEYS.ACCESS_LEVEL]: metadata.accessLevel,\n        [R2_METADATA_KEYS.SOFT_DELETED]: 'true',\n        [R2_METADATA_KEYS.DELETED_AT]: deletedAt.toISOString(),\n        [R2_METADATA_KEYS.GRACE_PERIOD_UNTIL]: gracePeriodUntil.toISOString(),\n      },\n      MetadataDirective: 'REPLACE',\n    });\n\n    await this.withRetry(() => this.s3Client.send(copyCommand), 'softDelete');\n\n    this.logger?.info('[CloudflareR2Adapter] Soft delete completed', {\n      fileId,\n      bucket: bucketName,\n      gracePeriodUntil,\n    });\n\n    return {\n      success: true,\n      deletedAt,\n      metadata: await this.getFileMetadata(fileId, bucketName).catch(() => undefined),\n      softDelete: {\n        deletedBy,\n        deletedAt,\n        canRestore: true,\n        gracePeriodUntil,\n        gracePeriodDays,\n      },\n    };\n  }\n\n  /**\n   * Generate file key/path for R2 storage\n   */\n  protected generateFileKey(params: UploadParams): string {\n    // Generate path: entityType/entityId/category/filename\n    const parts: string[] = [];\n    if (params.entityType) parts.push(params.entityType);\n    if (params.entityId) parts.push(params.entityId);\n    if (params.category) parts.push(params.category);\n    parts.push(params.filename ?? `file-${Date.now()}`);\n\n    return parts.join('/');\n  }\n\n  /**\n   * Convert Readable stream to Buffer\n   */\n  protected async streamToBuffer(stream: Readable): Promise<Buffer> {\n    const chunks: Buffer[] = [];\n    for await (const chunk of stream) {\n      chunks.push(Buffer.from(chunk));\n    }\n    return Buffer.concat(chunks);\n  }\n\n  /**\n   * Map S3/R2 errors to StoragePackageError\n   */\n  // eslint-disable-next-line complexity\n  private mapS3Error(error: unknown, operation: string): StoragePackageError {\n    if (error instanceof StoragePackageError) {\n      return error;\n    }\n\n    const err = error as StoragePackageError;\n    const errorName = err.name ?? err.code ?? 'Unknown';\n    const errorMessage = err.message ?? String(error);\n\n    // Map common S3/R2 errors\n    switch (errorName) {\n      case 'NoSuchBucket':\n        return new StoragePackageError(\n          `Bucket '${this.bucket}' does not exist`,\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { operation, bucket: this.bucket }, cause: error as Error }\n        );\n\n      case 'NoSuchKey':\n      case 'NotFound':\n        return new StoragePackageError('File not found', STORAGE_ERROR_CODES.FILE_NOT_FOUND, {\n          context: { operation },\n          cause: error as Error,\n        });\n\n      case 'AccessDenied':\n      case 'InvalidAccessKeyId':\n      case 'SignatureDoesNotMatch':\n        return new StoragePackageError(\n          'R2 authentication failed',\n          STORAGE_ERROR_CODES.ADAPTER_AUTHENTICATION_FAILED,\n          { context: { operation }, cause: error as Error }\n        );\n\n      case 'RequestTimeout':\n      case 'RequestTimeTooSkewed':\n        return new StoragePackageError('R2 request timeout', STORAGE_ERROR_CODES.ADAPTER_TIMEOUT, {\n          context: { operation },\n          cause: error as Error,\n        });\n\n      case 'ServiceUnavailable':\n      case 'SlowDown':\n        return new StoragePackageError(\n          'R2 service unavailable',\n          STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED,\n          { context: { operation }, cause: error as Error }\n        );\n\n      default:\n        return new StoragePackageError(\n          `R2 operation failed: ${errorMessage}`,\n          STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED,\n          {\n            context: { operation, errorName, errorMessage },\n            cause: error as Error,\n          }\n        );\n    }\n  }\n\n  /**\n   * Translate bucket purpose to R2-specific bucket name\n   *\n   * Pattern: plyaz-{env}-{region}-{purpose}\n   * Enterprise with org: plyaz-{env}-{region}-{tier}-{org}-{purpose}\n   *\n   * Examples:\n   * - COMPLIANCE → \"plyaz-prod-weur-records-vault\"\n   * - MEDIA_IMAGES → \"plyaz-prod-weur-media-images\"\n   * - COMPLIANCE (enterprise, acme-corp) → \"plyaz-prod-weur-enterprise-acme-corp-records-vault\"\n   */\n  translateBucketPurpose(purpose: BUCKET_PURPOSE, config: BucketConfiguration): string {\n    const parts: string[] = ['plyaz'];\n\n    // Environment (prod/stg/dev)\n    const env = config.environment ?? this.defaultEnvironment ?? 'prod';\n    parts.push(env);\n\n    // Region (weur, use1, etc.)\n    const region = config.region ?? this.defaultRegion ?? this.region ?? 'auto';\n    parts.push(this.sanitizeRegion(region));\n\n    // Enterprise tier with organization\n    if (config.tier === ORGANIZATION_TIER.ENTERPRISE && config.organizationId) {\n      parts.push('enterprise');\n      parts.push(this.sanitizeName(config.organizationId));\n    }\n\n    // Purpose-specific suffix\n    const suffix = this.getPurposeSuffix(purpose);\n    parts.push(suffix);\n\n    return parts.join('-');\n  }\n\n  /**\n   * Create R2 bucket if it doesn't exist\n   * Idempotent: Returns success if bucket already exists\n   */\n  async createBucket(bucketName: string, purpose: BUCKET_PURPOSE): Promise<void> {\n    try {\n      // Check if bucket exists\n      const headCommand = new HeadBucketCommand({ Bucket: bucketName });\n      await this.s3Client.send(headCommand);\n\n      this.logger?.debug('[CloudflareR2Adapter] Bucket already exists', {\n        bucketName,\n        purpose,\n      });\n    } catch (error: unknown) {\n      // If bucket doesn't exist, create it\n      const errorName = (error as Error & { name?: string })?.name;\n      if (errorName === 'NotFound' || errorName === 'NoSuchBucket') {\n        try {\n          const createCommand = new CreateBucketCommand({\n            Bucket: bucketName,\n          });\n\n          await this.s3Client.send(createCommand);\n\n          this.logger?.info('[CloudflareR2Adapter] Bucket created', {\n            bucketName,\n            purpose,\n          });\n        } catch (createError: unknown) {\n          // Ignore if bucket was created by another process\n          this.handleBucketCreationError(createError);\n        }\n      } else {\n        throw error;\n      }\n    }\n  }\n\n  /**\n   * Delete buckets by name\n   * Useful for cleanup in tests or migrations\n   */\n  // eslint-disable-next-line complexity\n  async deleteBuckets(bucketNames: string[]): Promise<BucketDeletionResult> {\n    const deleted: string[] = [];\n    const failed: BucketDeletionResult['failed'] = [];\n\n    for (const bucketName of bucketNames) {\n      try {\n        // First, empty the bucket by listing and deleting all objects\n        let continuationToken: string | undefined = undefined;\n        let hasMoreObjects = true;\n\n        while (hasMoreObjects) {\n          const result = await this.deleteBucketObjects(bucketName, continuationToken);\n          hasMoreObjects = result.hasMore;\n          continuationToken = result.nextToken;\n        }\n\n        // Now delete the bucket\n        const deleteCommand = new DeleteBucketCommand({\n          Bucket: bucketName,\n        });\n\n        await this.s3Client.send(deleteCommand);\n\n        deleted.push(bucketName);\n        this.logger?.info('[CloudflareR2Adapter] Bucket deleted', {\n          bucketName,\n        });\n      } catch (error: unknown) {\n        // If bucket doesn't exist, consider it a success (idempotent)\n        const errorName = (error as Error & { name?: string })?.name;\n        if (errorName === 'NoSuchBucket' || errorName === 'NotFound') {\n          this.logger?.debug('[CloudflareR2Adapter] Bucket already deleted or does not exist', {\n            bucketName,\n          });\n          deleted.push(bucketName);\n        } else {\n          const errorMessage = error instanceof Error ? error.message : String(error);\n          failed.push({ bucket: bucketName, error: errorMessage });\n          this.logger?.error('[CloudflareR2Adapter] Failed to delete bucket', {\n            bucketName,\n            error: errorMessage,\n          });\n        }\n      }\n    }\n\n    return { deleted, failed };\n  }\n\n  /**\n   * Get purpose-specific bucket suffix\n   */\n  // eslint-disable-next-line complexity\n  private getPurposeSuffix(purpose: BUCKET_PURPOSE): string {\n    switch (purpose) {\n      case BUCKET_PURPOSE.COMPLIANCE:\n        return 'records-vault';\n      case BUCKET_PURPOSE.MediaImages:\n        return 'media-images';\n      case BUCKET_PURPOSE.MediaVideos:\n        return 'media-videos';\n      case BUCKET_PURPOSE.MediaStatic:\n        return 'media-static';\n      case BUCKET_PURPOSE.UserUploads:\n        return 'user-uploads';\n      case BUCKET_PURPOSE.TEMPORARY:\n        return 'temp';\n      case BUCKET_PURPOSE.ARCHIVES:\n        return 'archives';\n      case BUCKET_PURPOSE.BACKUPS:\n        return 'backups';\n      default:\n        return 'storage';\n    }\n  }\n\n  /**\n   * Sanitize region code for bucket naming\n   */\n  private sanitizeRegion(region: string): string {\n    return region.toLowerCase().replace(/[^a-z0-9]/g, '');\n  }\n\n  /**\n   * Sanitize name for bucket naming (lowercase, alphanumeric, hyphens)\n   */\n  private sanitizeName(name: string): string {\n    return name\n      .toLowerCase()\n      .normalize('NFD')\n      .replace(/[\\u0300-\\u036f]/g, '') // Remove accents\n      .replace(/[^a-z0-9-]/g, '-')\n      .replace(/-+/g, '-')\n      .replace(/^-|-$/g, '');\n  }\n\n  /**\n   * List all buckets\n   */\n  async listBuckets(): Promise<StorageListBucketsResult> {\n    try {\n      this.logger?.debug('[CloudflareR2Adapter] Listing all buckets');\n\n      const command = new ListBucketsCommand({});\n      const response = await this.s3Client.send(command);\n\n      const buckets: StorageBucketInfo[] = (response.Buckets ?? []).map(bucket => ({\n        name: bucket.Name ?? 'unknown',\n        public: false, // R2 buckets are private by default\n        createdAt: bucket.CreationDate ?? new Date(),\n        region: this.region,\n        adapter: this.name,\n      }));\n\n      this.logger?.debug('[CloudflareR2Adapter] Listed buckets', {\n        count: buckets.length,\n      });\n\n      return {\n        buckets,\n        count: buckets.length,\n      };\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] listBuckets failed', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'listBuckets');\n    }\n  }\n\n  /**\n   * Get bucket details\n   */\n  async getBucket(bucketName: string): Promise<StorageBucketInfo> {\n    try {\n      this.logger?.debug('[CloudflareR2Adapter] Getting bucket details', {\n        bucketName,\n      });\n\n      const command = new HeadBucketCommand({\n        Bucket: bucketName,\n      });\n\n      // eslint-disable-next-line no-unused-vars -- response not needed, only checking if bucket exists\n      const response = await this.s3Client.send(command);\n\n      // R2/S3 HeadBucket doesn't return much info, so we create a minimal response\n      return {\n        name: bucketName,\n        public: false, // R2 buckets are private by default\n        createdAt: new Date(), // Not available from HeadBucket\n      };\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] getBucket failed', {\n        bucketName,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'getBucket');\n    }\n  }\n\n  /**\n   * Update bucket settings\n   * Note: R2/S3 has limited bucket update capabilities via SDK\n   */\n  async updateBucket(params: StorageUpdateBucketParams): Promise<void> {\n    try {\n      this.logger?.debug('[CloudflareR2Adapter] Updating bucket', {\n        bucketName: params.bucketName,\n      });\n\n      // R2/S3 doesn't support bucket updates in the same way as Supabase\n      // You would need to use separate APIs for CORS, lifecycle, etc.\n      throw new StoragePackageError(\n        'updateBucket is not fully supported by Cloudflare R2 adapter',\n        STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n        { context: { bucketName: params.bucketName } }\n      );\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] updateBucket failed', {\n        bucketName: params.bucketName,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'updateBucket');\n    }\n  }\n\n  /**\n   * List files in a bucket\n   */\n  // eslint-disable-next-line complexity\n  async listFiles(params: StorageListFilesParams): Promise<StorageListFilesResult> {\n    try {\n      this.logger?.debug('[CloudflareR2Adapter] Listing files', {\n        bucket: params.bucket,\n        prefix: params.prefix,\n        limit: params.limit,\n      });\n\n      const command = new ListObjectsV2Command({\n        Bucket: params.bucket,\n        Prefix: params.prefix ?? '',\n        MaxKeys: params.limit ?? R2_ADAPTER_CONSTANTS.DEFAULT_LIST_LIMIT,\n        // Note: R2/S3 uses ContinuationToken instead of offset\n      });\n\n      const response = await this.s3Client.send(command);\n\n      if (!response.Contents) {\n        return { files: [], count: 0, hasMore: false };\n      }\n\n      const files = response.Contents.map(obj => ({\n        id: obj.Key ?? '',\n        name: obj.Key?.split('/').pop() ?? '',\n        size: obj.Size ?? 0,\n        mimeType: 'application/octet-stream', // R2/S3 doesn't return MIME type in list\n        createdAt: obj.LastModified ?? new Date(),\n        updatedAt: obj.LastModified ?? undefined,\n      }));\n\n      const hasMore = response.IsTruncated ?? false;\n\n      this.logger?.info('[CloudflareR2Adapter] Files listed', {\n        bucket: params.bucket,\n        count: files.length,\n        hasMore,\n      });\n\n      return {\n        files,\n        count: files.length,\n        hasMore,\n      };\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] listFiles failed', {\n        bucket: params.bucket,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'listFiles');\n    }\n  }\n\n  /**\n   * Move a file (implemented as copy + delete)\n   */\n  async moveFile(params: StorageMoveFileParams): Promise<FileMetadata> {\n    try {\n      this.logger?.debug('[CloudflareR2Adapter] Moving file', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n      });\n\n      // Copy file\n      const copyCommand = new CopyObjectCommand({\n        Bucket: params.destinationBucket,\n        Key: params.destinationPath,\n        CopySource: `${params.sourceBucket}/${params.sourcePath}`,\n      });\n\n      await this.s3Client.send(copyCommand);\n\n      // Delete original\n      const deleteCommand = new DeleteObjectCommand({\n        Bucket: params.sourceBucket,\n        Key: params.sourcePath,\n      });\n\n      await this.s3Client.send(deleteCommand);\n\n      // Get metadata of moved file\n      const metadata = await this.getFileMetadata(params.destinationPath, params.destinationBucket);\n\n      this.logger?.info('[CloudflareR2Adapter] File moved', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n      });\n\n      return metadata;\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] moveFile failed', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'moveFile');\n    }\n  }\n\n  /**\n   * Copy a file\n   */\n  async copyFile(params: StorageCopyFileParams): Promise<FileMetadata> {\n    try {\n      this.logger?.debug('[CloudflareR2Adapter] Copying file', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n      });\n\n      const command = new CopyObjectCommand({\n        Bucket: params.destinationBucket,\n        Key: params.destinationPath,\n        CopySource: `${params.sourceBucket}/${params.sourcePath}`,\n      });\n\n      await this.s3Client.send(command);\n\n      // Get metadata of copied file\n      const metadata = await this.getFileMetadata(params.destinationPath, params.destinationBucket);\n\n      this.logger?.info('[CloudflareR2Adapter] File copied', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n      });\n\n      return metadata;\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] copyFile failed', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'copyFile');\n    }\n  }\n\n  /**\n   * Replace an existing file\n   */\n  // eslint-disable-next-line complexity\n  async replaceFile(params: StorageReplaceFileParams): Promise<FileMetadata> {\n    try {\n      const bucketName = params.bucket ?? this.bucket;\n\n      if (!bucketName) {\n        throw new StoragePackageError(\n          'Bucket name must be provided when using dynamic buckets',\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { fileId: params.fileId } }\n        );\n      }\n\n      this.logger?.debug('[CloudflareR2Adapter] Replacing file', {\n        fileId: params.fileId,\n        bucket: bucketName,\n      });\n\n      // Convert file to Buffer if needed\n      let fileBuffer: Buffer;\n      if (Buffer.isBuffer(params.file)) {\n        fileBuffer = params.file;\n      } else if (params.file instanceof Readable) {\n        fileBuffer = await this.streamToBuffer(params.file);\n      } else {\n        throw new StoragePackageError(\n          'File must be a Buffer or Readable stream',\n          STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n        );\n      }\n\n      // Prepare metadata\n      const metadata: Record<string, string> = {};\n      if (params.metadata) {\n        for (const [key, value] of Object.entries(params.metadata)) {\n          metadata[`x-amz-meta-${key}`] = String(value);\n        }\n      }\n\n      // Upload (replaces existing file)\n      const command = new PutObjectCommand({\n        Bucket: bucketName,\n        Key: params.fileId,\n        Body: fileBuffer,\n        ContentType: params.mimeType ?? 'application/octet-stream',\n        Metadata: metadata,\n      });\n\n      await this.s3Client.send(command);\n\n      // Get metadata of replaced file\n      const updatedMetadata = await this.getFileMetadata(params.fileId, bucketName);\n\n      this.logger?.info('[CloudflareR2Adapter] File replaced', {\n        fileId: params.fileId,\n        bucket: bucketName,\n      });\n\n      return updatedMetadata;\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] replaceFile failed', {\n        fileId: params.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'replaceFile');\n    }\n  }\n\n  /**\n   * Create a signed upload URL\n   */\n  async createSignedUploadUrl(\n    params: StorageSignedUploadUrlParams\n  ): Promise<StorageSignedUploadUrlResult> {\n    try {\n      this.logger?.debug('[CloudflareR2Adapter] Creating signed upload URL', {\n        bucket: params.bucket,\n        path: params.path,\n        expiresIn: params.expiresIn,\n      });\n\n      const command = new PutObjectCommand({\n        Bucket: params.bucket,\n        Key: params.path,\n        ContentType: params.contentType ?? 'application/octet-stream',\n      });\n\n      const expiresIn = params.expiresIn ?? R2_ADAPTER_CONSTANTS.DEFAULT_SIGNED_URL_EXPIRY_SECONDS;\n      const url = await getSignedUrl(this.s3Client, command, { expiresIn });\n      const expiresAt = new Date(\n        Date.now() + expiresIn * R2_ADAPTER_CONSTANTS.MILLISECONDS_PER_SECOND\n      );\n\n      this.logger?.info('[CloudflareR2Adapter] Signed upload URL created', {\n        bucket: params.bucket,\n        path: params.path,\n      });\n\n      return {\n        url,\n        token: params.path, // Use path as token\n        expiresAt,\n      };\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] createSignedUploadUrl failed', {\n        bucket: params.bucket,\n        path: params.path,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'createSignedUploadUrl');\n    }\n  }\n\n  /**\n   * Get public URL for a file\n   */\n  async getPublicUrl(params: StoragePublicUrlParams): Promise<string> {\n    try {\n      this.logger?.debug('[CloudflareR2Adapter] Getting public URL', {\n        bucket: params.bucket,\n        path: params.path,\n      });\n\n      // Generate public URL using public domain or endpoint\n      const publicUrl = this.publicDomain\n        ? `${this.publicDomain}/${params.path}`\n        : `${this.endpoint}/${params.bucket}/${params.path}`;\n\n      this.logger?.info('[CloudflareR2Adapter] Public URL generated', {\n        bucket: params.bucket,\n        path: params.path,\n        url: publicUrl,\n      });\n\n      return publicUrl;\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] getPublicUrl failed', {\n        bucket: params.bucket,\n        path: params.path,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapS3Error(error, 'getPublicUrl');\n    }\n  }\n\n  // ============================================================================\n  // CHUNKED/MULTIPART UPLOAD METHODS\n  // ============================================================================\n\n  /**\n   * Initialize chunked/multipart upload\n   * Returns uploadId and presigned URLs for direct client uploads\n   */\n  /**\n   * Upload large file using chunked/multipart upload\n   * Handles entire chunked upload flow using S3 SDK\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  async uploadChunked(params: UploadParams): Promise<UploadResult> {\n    try {\n      if (!params.file || !Buffer.isBuffer(params.file)) {\n        throw new StoragePackageError(\n          'File must be a Buffer for chunked upload',\n          STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n        );\n      }\n\n      const fileBuffer = params.file;\n      const fileSize = fileBuffer.length;\n      const chunkSize = getStorageOptimalChunkSize(fileSize);\n      const totalChunks = Math.ceil(fileSize / chunkSize);\n\n      this.logger?.debug('[CloudflareR2Adapter] Starting chunked upload', {\n        filename: params.filename,\n        fileSize,\n        chunkSize,\n        totalChunks,\n      });\n\n      // Prepare upload (bucket + file key)\n      const { bucketName, fileKey, bucketPurpose } = await this.prepareUpload(params);\n      // Extract filename from fileKey (last segment) to ensure consistency with generated names\n      const filename = params.filename ?? fileKey.split('/').pop() ?? 'unknown';\n\n      // Prepare S3 metadata (same as regular upload)\n      const metadata: Record<string, string> = {};\n      if (params.entityType) metadata[R2_METADATA_KEYS.ENTITY_TYPE] = params.entityType;\n      if (params.entityId) metadata[R2_METADATA_KEYS.ENTITY_ID] = params.entityId;\n      if (params.category) metadata[R2_METADATA_KEYS.CATEGORY] = params.category;\n      if (params.accessLevel) metadata[R2_METADATA_KEYS.ACCESS_LEVEL] = params.accessLevel;\n      if (params.customMetadata?.uploadedBy)\n        metadata[R2_METADATA_KEYS.UPLOADED_BY] = String(params.customMetadata.uploadedBy);\n\n      const createCommand = new CreateMultipartUploadCommand({\n        Bucket: bucketName,\n        Key: fileKey,\n        ContentType: params.mimeType ?? 'application/octet-stream',\n        Metadata: metadata,\n      });\n\n      const { UploadId: uploadId } = await this.s3Client.send(createCommand);\n      if (!uploadId) {\n        throw new StoragePackageError(\n          'Failed to initialize multipart upload',\n          STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n        );\n      }\n\n      const parts: MultipartUploadPart[] = [];\n\n      try {\n        for (let i = 0; i < totalChunks; i++) {\n          this.checkUploadAborted(params, fileKey);\n\n          const partNumber = i + 1;\n          const { chunk, end } = this.extractChunk(fileBuffer, i, chunkSize, fileSize);\n\n          this.logger?.debug('[CloudflareR2Adapter] Uploading part', {\n            uploadId,\n            partNumber,\n            totalChunks,\n            chunkSize: chunk.length,\n          });\n\n          const uploadResult = await this.uploadChunkPart({\n            bucketName,\n            fileKey,\n            uploadId,\n            partNumber,\n            chunk,\n          });\n\n          parts.push({\n            PartNumber: partNumber,\n            ETag: uploadResult.ETag,\n          });\n\n          // Report progress (StorageService will enrich with speed/ETA calculations)\n          this.emitProgress(params, {\n            fileId: fileKey,\n            filename,\n            loaded: end,\n            total: fileSize,\n            percentage: Math.round((end / fileSize) * R2_ADAPTER_CONSTANTS.PERCENTAGE_MULTIPLIER),\n            currentChunk: partNumber,\n            totalChunks,\n            mimeType: params.mimeType,\n            entityType: params.entityType,\n            entityId: params.entityId,\n            adapter: this.name,\n          });\n        }\n\n        const completeCommand = new CompleteMultipartUploadCommand({\n          Bucket: bucketName,\n          Key: fileKey,\n          UploadId: uploadId,\n          MultipartUpload: { Parts: parts },\n        });\n\n        await this.s3Client.send(completeCommand);\n\n        this.logger?.info('[CloudflareR2Adapter] Chunked upload completed', {\n          UploadId: uploadId,\n          bucket: bucketName,\n          key: fileKey,\n          totalParts: parts.length,\n        });\n\n        // Generate file URL (same as regular upload)\n        const fileUrl = this.publicDomain\n          ? `${this.publicDomain}/${fileKey}`\n          : `${this.endpoint}/${bucketName}/${fileKey}`;\n\n        // Build file metadata\n        const fileMetadata = this.buildFileMetadata({\n          params,\n          fileKey,\n          bucketName,\n          bucketPurpose,\n          fileSize,\n        });\n\n        return {\n          metadata: fileMetadata,\n          url: fileUrl,\n        };\n      } catch (error) {\n        // Abort multipart upload on failure\n        this.logger?.error('[CloudflareR2Adapter] Chunked upload failed, aborting', {\n          UploadId: uploadId,\n          error: error instanceof Error ? error.message : String(error),\n        });\n\n        const abortCommand = new AbortMultipartUploadCommand({\n          Bucket: bucketName,\n          Key: fileKey,\n          UploadId: uploadId,\n        });\n\n        await this.s3Client.send(abortCommand).catch(() => {\n          // Ignore abort errors\n        });\n\n        throw error;\n      }\n    } catch (error) {\n      this.logger?.error('[CloudflareR2Adapter] uploadChunked failed', {\n        filename: params.filename,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.wrapError(error, 'uploadChunked');\n    }\n  }\n\n  /**\n   * Helper: Handle bucket creation error (ignore if already exists)\n   */\n  private handleBucketCreationError(createError: unknown): void {\n    const createErrorName = (createError as Error & { name?: string })?.name;\n    if (createErrorName !== 'BucketAlreadyOwnedByYou') {\n      throw createError;\n    }\n  }\n\n  /**\n   * Helper: Delete all objects from a bucket (batch operation)\n   */\n  private async deleteBucketObjects(\n    bucketName: string,\n    continuationToken: string | undefined\n  ): Promise<StorageBucketDeletionResult> {\n    try {\n      const listResponse: ListObjectsV2CommandOutput = await this.s3Client.send(\n        new ListObjectsV2Command({\n          Bucket: bucketName,\n          ContinuationToken: continuationToken,\n        })\n      );\n\n      if (listResponse.Contents && listResponse.Contents.length > 0) {\n        await this.deleteObjectsBatch(bucketName, listResponse.Contents);\n      }\n\n      return {\n        hasMore: listResponse.IsTruncated ?? false,\n        nextToken: listResponse.NextContinuationToken,\n      };\n    } catch (listError: unknown) {\n      // If bucket doesn't exist, stop deletion loop\n      const listErrorName = (listError as Error & { name?: string })?.name;\n      if (listErrorName === 'NoSuchBucket' || listErrorName === 'NotFound') {\n        return { hasMore: false, nextToken: undefined };\n      }\n      throw listError;\n    }\n  }\n\n  /**\n   * Helper: Delete a batch of objects from a bucket\n   */\n  private async deleteObjectsBatch(\n    bucketName: string,\n    contents: Array<{ Key?: string }>\n  ): Promise<void> {\n    const objectsToDelete = contents\n      .filter(obj => obj.Key)\n      .map(obj => ({\n        Key: obj.Key!,\n      }));\n\n    if (objectsToDelete.length === 0) {\n      return;\n    }\n\n    const deleteCommand = new DeleteObjectsCommand({\n      Bucket: bucketName,\n      Delete: {\n        Objects: objectsToDelete,\n        Quiet: true, // Don't return deleted object info\n      },\n    });\n    await this.s3Client.send(deleteCommand);\n  }\n\n  /**\n   * Helper: Check if upload was aborted\n   */\n  private checkUploadAborted(params: UploadParams, fileKey: string): void {\n    if (params.abortSignal?.aborted || this.adapterAbortSignal?.aborted) {\n      throw new StoragePackageError(\n        'Upload aborted by user',\n        STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED,\n        { context: { fileId: fileKey, reason: 'aborted' } }\n      );\n    }\n  }\n\n  /**\n   * Helper: Extract chunk from buffer\n   */\n  private extractChunk(\n    fileBuffer: Buffer,\n    chunkIndex: number,\n    chunkSize: number,\n    fileSize: number\n  ): StorageChunkExtractionResult {\n    const start = chunkIndex * chunkSize;\n    const end = Math.min(start + chunkSize, fileSize);\n    const chunk = fileBuffer.subarray(start, end);\n    return { chunk, end };\n  }\n\n  /**\n   * Helper: Upload a single chunk part\n   */\n  private async uploadChunkPart(options: {\n    bucketName: string;\n    fileKey: string;\n    uploadId: string;\n    partNumber: number;\n    chunk: Buffer;\n  }): Promise<StorageChunkUploadPartResult> {\n    const { bucketName, fileKey, uploadId, partNumber, chunk } = options;\n    const uploadPartCommand = new UploadPartCommand({\n      Bucket: bucketName,\n      Key: fileKey,\n      UploadId: uploadId,\n      PartNumber: partNumber,\n      Body: chunk,\n    });\n\n    const uploadResult = await this.s3Client.send(uploadPartCommand);\n\n    if (!uploadResult.ETag) {\n      throw new StoragePackageError(\n        `Failed to upload part ${partNumber}`,\n        STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n      );\n    }\n\n    return { ETag: uploadResult.ETag };\n  }\n\n  /**\n   * Get file size limit for bucket purpose\n   * Used by StorageService for validation\n   */\n  public getFileSizeLimit(purpose: BUCKET_PURPOSE): number | undefined {\n    const rules = getStorageValidationRulesForPurpose(purpose, this.validation);\n    return rules.maxFileSize;\n  }\n\n  /**\n   * Get allowed MIME types for bucket purpose\n   * Used by StorageService for validation\n   */\n  public getAllowedMimeTypes(purpose: BUCKET_PURPOSE): string[] | undefined {\n    const rules = getStorageValidationRulesForPurpose(purpose, this.validation);\n    return rules.allowedMimeTypes;\n  }\n}\n","/**\n * Supabase Storage Adapter\n * @module @plyaz/storage/adapters/supabase\n *\n * Production-ready storage adapter for Supabase Storage\n * Uses @supabase/supabase-js SDK for file operations\n *\n * Features:\n * - Upload files with metadata to Supabase buckets\n * - Download files as buffers\n * - Soft delete with grace period (60 days)\n * - Hard delete (permanent removal)\n * - File restoration from soft delete\n * - Presigned URLs for secure access\n * - Health monitoring\n * - Comprehensive error handling\n *\n * @example\n * ```typescript\n * const adapter = new SupabaseStorageAdapter({\n *   name: 'supabase-primary',\n *   type: STORAGE_ADAPTER_TYPE.SupabaseStorage,\n *   supabaseUrl: process.env.SUPABASE_URL!,\n *   serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY!,\n *   bucket: 'files',\n *   publicUrl: 'https://your-project.supabase.co/storage/v1/object/public',\n * });\n *\n * const result = await adapter.upload({\n *   fileId: 'file-123',\n *   filename: 'document.pdf',\n *   file: buffer,\n *   mimeType: 'application/pdf',\n *   size: 1024000,\n *   category: 'DOCUMENT' as FILE_CATEGORY,\n *   entityType: 'USER' as ENTITY_TYPE,\n *   entityId: 'user-123',\n *   accessLevel: FILE_ACCESS_LEVEL.PRIVATE,\n * });\n * ```\n */\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { createClient } from '@supabase/supabase-js';\nimport { BaseStorageAdapter } from '../base/BaseStorageAdapter';\nimport { StoragePackageError } from '@plyaz/errors';\nimport type {\n  SupabaseStorageConfig,\n  UploadParams,\n  UploadResult,\n  DownloadParams,\n  DownloadResult,\n  DeleteParams,\n  FileDeleteResult,\n  PresignedUrlOptions,\n  PresignedUrlResult,\n  AdapterHealthCheck,\n  FileMetadata,\n  BucketConfiguration,\n  StorageMoveFileParams,\n  StorageListFilesParams,\n  StorageListFilesResult,\n  StorageUpdateBucketParams,\n  StorageBucketInfo,\n  StorageListBucketsResult,\n  StoragePublicUrlParams,\n  StorageSignedUploadUrlParams,\n  StorageSignedUploadUrlResult,\n  StorageCopyFileParams,\n  StorageReplaceFileParams,\n  BucketDeletionResult,\n  FILE_CATEGORY,\n  ENTITY_TYPE,\n  StorageValidationConfig,\n} from '@plyaz/types/storage';\nimport {\n  ADAPTER_HEALTH_STATUS,\n  UPLOAD_STATUS,\n  FILE_ACCESS_LEVEL,\n  BUCKET_PURPOSE,\n  ORGANIZATION_TIER,\n} from '@plyaz/types/storage';\nimport { IdempotencyStoreService } from '../../idempotency/IdempotencyStoreService';\nimport { getStorageValidationRulesForPurpose } from '@plyaz/config';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types/errors';\n\n/**\n * Supabase Storage metadata keys\n * Stored as custom metadata in Supabase Storage objects\n */\n/**\n * Time conversion constants\n */\nconst TIME_CONSTANTS = {\n  MILLISECONDS_PER_SECOND: 1000,\n  SECONDS_PER_MINUTE: 60,\n  MINUTES_PER_HOUR: 60,\n  HOURS_PER_DAY: 24,\n} as const;\n\n/**\n * Supabase adapter defaults\n */\nconst SUPABASE_ADAPTER_DEFAULTS = {\n  DEFAULT_SIGNED_URL_EXPIRY_SECONDS: 3600, // 1 hour\n  DEFAULT_LIST_LIMIT: 100,\n  SOFT_DELETE_GRACE_PERIOD_DAYS: 60,\n  PATH_PARTS_CATEGORY_INDEX: 2, // Index of category in path structure: entity/entityId/category/filename\n  MIN_PATH_PARTS_FOR_CATEGORY: 3,\n} as const;\n\nconst SUPABASE_METADATA_KEYS = {\n  ENTITY_TYPE: 'entity-type',\n  ENTITY_ID: 'entity-id',\n  CATEGORY: 'category',\n  ACCESS_LEVEL: 'access-level',\n  FILE_ID: 'file-id',\n  FILENAME: 'filename',\n  MIME_TYPE: 'mime-type',\n  SIZE: 'size',\n  SOFT_DELETED: 'soft-deleted',\n  DELETED_AT: 'deleted-at',\n  GRACE_PERIOD_UNTIL: 'grace-period-until',\n} as const;\n\n/**\n * Supabase Storage constants\n */\nconst SUPABASE_CONSTANTS = {\n  CACHE_CONTROL_ONE_HOUR: '3600', // 1 hour in seconds\n  TTL_ONE_HOUR_MS: 3600000, // 1 hour in milliseconds\n  MAX_UPLOADS: 1000, // Max concurrent uploads to track\n} as const;\n\n/**\n * Supabase Storage Adapter\n * Implements storage operations using Supabase Storage backend\n */\nexport class SupabaseStorageAdapter extends BaseStorageAdapter {\n  private readonly supabaseClient: SupabaseClient;\n  private readonly bucket?: string; // Optional - uses dynamic buckets when undefined\n  private readonly publicUrl?: string;\n  private readonly validation?: StorageValidationConfig;\n\n  // Upload metadata storage (uses IdempotencyStoreService for Redis/in-memory support)\n  private readonly uploadMetadataStore: IdempotencyStoreService;\n\n  // eslint-disable-next-line complexity\n  constructor(config: SupabaseStorageConfig) {\n    const {\n      name,\n      type,\n      enabled = true,\n      priority = 50,\n      retry,\n      supabaseUrl,\n      serviceRoleKey,\n      bucket,\n      publicUrl,\n    } = config;\n\n    super({\n      name,\n      type,\n      enabled,\n      priority,\n      retry,\n      autoCreateBuckets: config.autoCreateBuckets,\n      defaultEnvironment: config.defaultEnvironment,\n      defaultRegion: config.defaultRegion,\n    });\n\n    if (!supabaseUrl) {\n      throw new StoragePackageError(\n        'Supabase URL is required',\n        STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID\n      );\n    }\n\n    if (!serviceRoleKey) {\n      throw new StoragePackageError(\n        'Supabase service role key is required',\n        STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID\n      );\n    }\n\n    // Bucket is required only if autoCreateBuckets is disabled\n    if (!bucket && !config.autoCreateBuckets) {\n      throw new StoragePackageError(\n        'Bucket name is required when autoCreateBuckets is disabled',\n        STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID\n      );\n    }\n\n    this.bucket = bucket; // undefined = dynamic buckets enabled\n    this.publicUrl = publicUrl;\n\n    // Initialize Supabase client with service role key (full access)\n    this.supabaseClient = createClient(supabaseUrl, serviceRoleKey, {\n      auth: {\n        autoRefreshToken: false,\n        persistSession: false,\n      },\n    });\n\n    // Initialize upload metadata store\n    this.uploadMetadataStore = new IdempotencyStoreService({\n      type: 'in-memory',\n      options: {\n        defaultTTL: SUPABASE_CONSTANTS.TTL_ONE_HOUR_MS,\n        maxKeys: SUPABASE_CONSTANTS.MAX_UPLOADS,\n      },\n    });\n\n    // Store validation config\n    this.validation = config.validation;\n\n    if (!bucket && config.autoCreateBuckets) {\n      this.logger?.info(\n        '[SupabaseStorageAdapter] Dynamic bucket mode enabled - buckets will be created based on content purpose'\n      );\n    }\n  }\n\n  /**\n   * Upload a file to Supabase Storage\n   *\n   * Uses signed URL with progress tracking for intermediate progress events.\n   * Falls back to SDK upload if signed URL approach fails.\n   */\n  // eslint-disable-next-line complexity, max-lines-per-function\n  async upload(params: UploadParams): Promise<UploadResult> {\n    try {\n      // Prepare upload (bucket + file key)\n      const { bucketName, fileKey, bucketPurpose } = await this.prepareUpload(params);\n\n      this.logger?.debug('[SupabaseStorageAdapter] Using bucket', {\n        bucketName,\n        bucketPurpose,\n      });\n\n      // Convert file to Buffer\n      const fileBuffer = await this.convertToBuffer(params.file);\n      const contentType = params.mimeType ?? 'application/octet-stream';\n      // Extract filename from fileKey (last segment) to ensure consistency with generated names\n      const filename = params.filename ?? fileKey.split('/').pop() ?? 'unknown';\n\n      // Prepare metadata for headers\n      const metadata: Record<string, string> = {\n        [SUPABASE_METADATA_KEYS.ENTITY_TYPE]: params.entityType,\n        [SUPABASE_METADATA_KEYS.ENTITY_ID]: params.entityId,\n        [SUPABASE_METADATA_KEYS.CATEGORY]: params.category,\n        [SUPABASE_METADATA_KEYS.FILE_ID]: fileKey,\n        [SUPABASE_METADATA_KEYS.SIZE]: fileBuffer.length.toString(),\n      };\n\n      if (params.accessLevel) {\n        metadata[SUPABASE_METADATA_KEYS.ACCESS_LEVEL] = params.accessLevel;\n      }\n      if (params.filename) {\n        metadata[SUPABASE_METADATA_KEYS.FILENAME] = params.filename;\n      }\n      if (params.mimeType) {\n        metadata[SUPABASE_METADATA_KEYS.MIME_TYPE] = params.mimeType;\n      }\n\n      // Try to use signed URL with progress tracking\n      // This provides intermediate progress events (not just 0% and 100%)\n      let uploadPath: string | undefined;\n\n      try {\n        // Get signed upload URL\n        const signedUrlResult = await this.createSignedUploadUrl({\n          bucket: bucketName,\n          path: fileKey,\n          upsert: false,\n        });\n\n        this.logger?.debug(\n          '[SupabaseStorageAdapter] Using signed URL upload with progress tracking',\n          {\n            bucket: bucketName,\n            path: fileKey,\n            fileSize: fileBuffer.length,\n          }\n        );\n\n        // Upload with progress tracking\n        await this.uploadBufferWithProgress({\n          url: signedUrlResult.url,\n          buffer: fileBuffer,\n          contentType,\n          params,\n          fileId: fileKey,\n          filename,\n          headers: {\n            'Cache-Control': SUPABASE_CONSTANTS.CACHE_CONTROL_ONE_HOUR,\n            // Supabase custom metadata headers\n            'x-upsert': 'false',\n          },\n          method: 'PUT',\n        });\n\n        uploadPath = fileKey;\n      } catch (signedUrlError) {\n        // Fall back to SDK upload if signed URL approach fails\n        this.logger?.warn(\n          '[SupabaseStorageAdapter] Signed URL upload failed, falling back to SDK',\n          {\n            error:\n              signedUrlError instanceof Error ? signedUrlError.message : String(signedUrlError),\n          }\n        );\n\n        // Emit initial progress (0%) for fallback\n        this.emitProgress(params, {\n          fileId: fileKey,\n          filename,\n          loaded: 0,\n          total: fileBuffer.length,\n          percentage: 0,\n          speed: undefined,\n          estimatedTimeRemaining: undefined,\n          mimeType: params.mimeType,\n          entityType: params.entityType,\n          entityId: params.entityId,\n          adapter: this.name,\n        });\n\n        // Upload file with SDK (no intermediate progress)\n        const { data, error } = await this.withRetry(\n          () =>\n            this.supabaseClient.storage.from(bucketName).upload(fileKey, fileBuffer, {\n              contentType,\n              cacheControl: SUPABASE_CONSTANTS.CACHE_CONTROL_ONE_HOUR,\n              upsert: false,\n              metadata,\n            }),\n          'upload'\n        );\n\n        if (error) {\n          throw this.mapSupabaseError(error, 'upload');\n        }\n\n        if (!data) {\n          throw new StoragePackageError(\n            'Upload succeeded but no data returned',\n            STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n          );\n        }\n\n        // Emit final progress (100%) for fallback\n        this.emitProgress(params, {\n          fileId: fileKey,\n          filename,\n          loaded: fileBuffer.length,\n          total: fileBuffer.length,\n          percentage: 100,\n          speed: undefined,\n          estimatedTimeRemaining: 0,\n          mimeType: params.mimeType,\n          entityType: params.entityType,\n          entityId: params.entityId,\n          adapter: this.name,\n        });\n\n        uploadPath = data.path;\n      }\n\n      // Generate public URL if applicable\n      let publicUrl: string | undefined;\n      if (params.accessLevel === FILE_ACCESS_LEVEL.PUBLIC && this.publicUrl) {\n        publicUrl = `${this.publicUrl}/${bucketName}/${fileKey}`;\n      }\n\n      // Build file metadata\n      const fileMetadata = this.buildFileMetadata({\n        params,\n        fileKey,\n        bucketName,\n        bucketPurpose,\n        fileSize: fileBuffer.length,\n        path: uploadPath,\n      });\n\n      return {\n        metadata: fileMetadata,\n        url: publicUrl,\n      };\n    } catch (error) {\n      throw this.wrapError(error, 'upload');\n    }\n  }\n\n  /**\n   * Download a file from Supabase Storage\n   */\n  async download(params: DownloadParams): Promise<DownloadResult> {\n    try {\n      const fileId = params.fileId;\n      const bucketName = params.bucket ?? this.bucket;\n\n      if (!bucketName) {\n        throw new StoragePackageError(\n          'Bucket name must be provided in params.bucket when using dynamic buckets. Store bucket info from upload metadata.',\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { fileId: params.fileId, adapter: this.name } }\n        );\n      }\n\n      // Get file metadata first to get the file path\n      const metadata = await this.getFileMetadata(fileId, bucketName);\n\n      // Download file with retry logic\n      const { data, error } = await this.withRetry(\n        () => this.supabaseClient.storage.from(bucketName).download(metadata.path),\n        'download'\n      );\n\n      if (error) {\n        throw this.mapSupabaseError(error, 'download');\n      }\n\n      if (!data) {\n        throw new StoragePackageError('File not found', STORAGE_ERROR_CODES.FILE_NOT_FOUND);\n      }\n\n      // Convert Blob to Buffer\n      const arrayBuffer = await data.arrayBuffer();\n      const buffer = Buffer.from(arrayBuffer);\n\n      return {\n        file: buffer,\n        metadata,\n      };\n    } catch (error) {\n      throw this.wrapError(error, 'download');\n    }\n  }\n\n  /**\n   * Delete a file from Supabase Storage\n   * Supports both soft delete (default) and hard delete\n   */\n  async delete(params: DeleteParams): Promise<FileDeleteResult> {\n    try {\n      const { fileId } = params;\n      const bucketName = params.bucket ?? this.bucket;\n\n      if (!bucketName) {\n        throw new StoragePackageError(\n          'Bucket name must be provided in params.bucket when using dynamic buckets. Store bucket info from upload metadata.',\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { fileId: params.fileId, adapter: this.name } }\n        );\n      }\n\n      // Check if this is a soft delete or hard delete\n      if (!params.permanent) {\n        // Soft delete: update metadata to mark as deleted\n        return await this.softDelete(\n          fileId,\n          params.softDeleteMetadata?.deletedBy ?? 'system',\n          bucketName\n        );\n      }\n\n      // Hard delete: permanently remove file\n      const metadata = await this.getFileMetadata(fileId, bucketName);\n\n      const { error } = await this.withRetry(\n        () => this.supabaseClient.storage.from(bucketName).remove([metadata.path]),\n        'delete'\n      );\n\n      if (error) {\n        throw this.mapSupabaseError(error, 'delete');\n      }\n\n      return {\n        success: true,\n        deletedAt: new Date(),\n        metadata: await this.getFileMetadata(fileId, bucketName).catch(() => undefined),\n      };\n    } catch (error) {\n      throw this.wrapError(error, 'delete');\n    }\n  }\n\n  /**\n   * Generate a presigned URL for secure file access\n   */\n  // eslint-disable-next-line complexity\n  async getSignedUrl(options: PresignedUrlOptions): Promise<PresignedUrlResult> {\n    try {\n      const { fileId, expiresIn = 3600, operation } = options;\n      const bucketName = options.bucket ?? this.bucket;\n\n      if (!fileId) {\n        throw new StoragePackageError(\n          'File ID is required for generating signed URL',\n          STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n        );\n      }\n\n      if (!bucketName) {\n        throw new StoragePackageError(\n          'Bucket name must be provided in options.bucket when using dynamic buckets. Store bucket info from upload metadata.',\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { fileId: options.fileId, adapter: this.name } }\n        );\n      }\n\n      // Get file metadata to get the file path\n      const metadata = await this.getFileMetadata(fileId, bucketName);\n\n      let signedUrl: string;\n\n      if (operation === 'upload') {\n        // Generate upload URL\n        const { data, error } = await this.withRetry(\n          () =>\n            this.supabaseClient.storage.from(bucketName).createSignedUploadUrl(metadata.path, {\n              upsert: true,\n            }),\n          'getSignedUrl'\n        );\n\n        if (error || !data) {\n          throw this.mapSupabaseError(error, 'getSignedUrl');\n        }\n\n        signedUrl = data.signedUrl;\n      } else {\n        // Generate download URL (for 'download' or 'get' operations)\n        const { data, error } = await this.withRetry(\n          () =>\n            this.supabaseClient.storage.from(bucketName).createSignedUrl(metadata.path, expiresIn),\n          'getSignedUrl'\n        );\n\n        if (error || !data) {\n          throw this.mapSupabaseError(error, 'getSignedUrl');\n        }\n\n        signedUrl = data.signedUrl;\n      }\n\n      return {\n        url: signedUrl,\n        id: fileId ?? `presigned-${Date.now()}`,\n        expiresAt: new Date(Date.now() + expiresIn * TIME_CONSTANTS.MILLISECONDS_PER_SECOND),\n      };\n    } catch (error) {\n      throw this.wrapError(error, 'getSignedUrl', { fileId: options.fileId });\n    }\n  }\n\n  /**\n   * Check if the adapter is available and properly configured\n   */\n  isAvailable(): boolean {\n    // Check if client is configured (bucket is optional when using dynamic buckets)\n    return !!this.supabaseClient;\n  }\n\n  /**\n   * Perform health check on the adapter\n   */\n  // eslint-disable-next-line complexity\n  async healthCheck(): Promise<AdapterHealthCheck> {\n    const startTime = Date.now();\n\n    try {\n      // If using dynamic buckets (no default bucket), list all buckets to verify connection\n      if (!this.bucket) {\n        const { data, error } = await this.supabaseClient.storage.listBuckets();\n        const responseTime = Date.now() - startTime;\n\n        if (error) {\n          return {\n            status: ADAPTER_HEALTH_STATUS.UNHEALTHY,\n            responseTime,\n            lastChecked: new Date(),\n            details: {\n              adapter: this.name,\n              bucket: 'dynamic (no default bucket)',\n              error: error.message ?? 'Failed to connect to Supabase',\n            },\n          };\n        }\n\n        return {\n          status: ADAPTER_HEALTH_STATUS.HEALTHY,\n          responseTime,\n          lastChecked: new Date(),\n          details: {\n            adapter: this.name,\n            bucket: 'dynamic (no default bucket)',\n            note: 'Using dynamic bucket mode',\n            bucketsAvailable: data?.length ?? 0,\n          },\n        };\n      }\n\n      // Try to list bucket contents\n      const { error } = await this.supabaseClient.storage.from(this.bucket).list('', {\n        limit: 1,\n      });\n\n      const responseTime = Date.now() - startTime;\n\n      if (error) {\n        return {\n          status: ADAPTER_HEALTH_STATUS.UNHEALTHY,\n          responseTime,\n          lastChecked: new Date(),\n          details: {\n            adapter: this.name,\n            bucket: this.bucket,\n            error: error.message,\n          },\n        };\n      }\n\n      return {\n        status: ADAPTER_HEALTH_STATUS.HEALTHY,\n        responseTime,\n        lastChecked: new Date(),\n        details: {\n          adapter: this.name,\n          bucket: this.bucket,\n          message: 'Supabase bucket accessible',\n        },\n      };\n    } catch (error) {\n      const responseTime = Date.now() - startTime;\n\n      return {\n        status: ADAPTER_HEALTH_STATUS.UNHEALTHY,\n        responseTime,\n        lastChecked: new Date(),\n        details: {\n          adapter: this.name,\n          bucket: this.bucket,\n          error: error instanceof Error ? error.message : 'Unknown error',\n        },\n      };\n    }\n  }\n\n  /**\n   * Get file metadata from Supabase Storage\n   */\n  // eslint-disable-next-line complexity\n  async getFileMetadata(fileId: string, bucket?: string): Promise<FileMetadata> {\n    try {\n      const bucketName = bucket ?? this.bucket;\n\n      if (!bucketName) {\n        throw new StoragePackageError(\n          'Bucket name must be provided when using dynamic buckets',\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { fileId, adapter: this.name } }\n        );\n      }\n\n      // Parse fileId to extract directory and filename\n      // fileId format: \"user/user-john-doe/invoice_document/invoice-5843.pdf\"\n      const lastSlash = fileId.lastIndexOf('/');\n      const directory = lastSlash > 0 ? fileId.substring(0, lastSlash) : '';\n      const filename = lastSlash > 0 ? fileId.substring(lastSlash + 1) : fileId;\n\n      // List files in the correct directory\n      // NOTE: Supabase list() doesn't return custom metadata - we parse category from path structure\n      const { data, error } = await this.supabaseClient.storage.from(bucketName).list(directory, {\n        limit: 1000,\n        search: filename,\n      });\n\n      if (error || !data) {\n        throw this.mapSupabaseError(error, 'getFileMetadata');\n      }\n\n      // Find exact file match by filename\n      const file = data.find(f => f.name === filename);\n\n      if (!file) {\n        throw new StoragePackageError('File not found', STORAGE_ERROR_CODES.FILE_NOT_FOUND, {\n          context: { fileId, bucket: bucketName, directory, filename },\n        });\n      }\n\n      // WORKAROUND: Supabase list() doesn't return custom metadata\n      // Parse category from the file path structure: entity/entityId/category/filename\n      const pathParts = fileId.split('/');\n      const categoryFromPath =\n        pathParts.length >= SUPABASE_ADAPTER_DEFAULTS.MIN_PATH_PARTS_FOR_CATEGORY\n          ? (pathParts[SUPABASE_ADAPTER_DEFAULTS.PATH_PARTS_CATEGORY_INDEX] as FILE_CATEGORY)\n          : undefined;\n\n      // Retrieve metadata from file's custom metadata (stored during upload)\n      const metadata: FileMetadata = {\n        fileId: fileId, // Use the full path as fileId\n        filename: file.name,\n        mimeType:\n          file.metadata?.mimetype ??\n          file.metadata?.[SUPABASE_METADATA_KEYS.MIME_TYPE] ??\n          'application/octet-stream',\n        size: file.metadata?.size ?? Number(file.metadata?.[SUPABASE_METADATA_KEYS.SIZE] ?? 0),\n        // Use category from path structure since Supabase list() doesn't return custom metadata\n        category:\n          categoryFromPath ??\n          (file.metadata?.[SUPABASE_METADATA_KEYS.CATEGORY] as FILE_CATEGORY) ??\n          ('ATTACHMENT' as FILE_CATEGORY),\n        entityType:\n          (file.metadata?.[SUPABASE_METADATA_KEYS.ENTITY_TYPE] as ENTITY_TYPE) ??\n          ('USER' as ENTITY_TYPE),\n        entityId: file.metadata?.[SUPABASE_METADATA_KEYS.ENTITY_ID] ?? 'unknown',\n        accessLevel:\n          (file.metadata?.[SUPABASE_METADATA_KEYS.ACCESS_LEVEL] as FILE_ACCESS_LEVEL) ??\n          FILE_ACCESS_LEVEL.PRIVATE,\n        path: fileId, // Full path for download\n        status: UPLOAD_STATUS.COMPLETED,\n        uploadedAt: new Date(file.created_at),\n        adapter: this.name,\n        bucket: bucketName,\n      };\n\n      // Check for soft delete metadata\n      if (file.metadata?.['soft-deleted'] === 'true') {\n        metadata.customMetadata = {\n          softDeleted: true,\n          deletedAt: file.metadata?.['deleted-at'] ?? null,\n          gracePeriodUntil: file.metadata?.['grace-period-until'] ?? null,\n        };\n      }\n\n      return metadata;\n    } catch (error) {\n      throw this.wrapError(error, 'getFileMetadata', { fileId });\n    }\n  }\n\n  /**\n   * Restore a soft-deleted file\n   */\n  // eslint-disable-next-line complexity\n  async restoreFile(fileId: string, bucket?: string): Promise<FileMetadata> {\n    try {\n      const bucketName = bucket ?? this.bucket;\n\n      if (!bucketName) {\n        throw new StoragePackageError(\n          'Bucket name must be provided when using dynamic buckets',\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { fileId, adapter: this.name } }\n        );\n      }\n\n      const metadata = await this.getFileMetadata(fileId, bucketName);\n\n      // Check if file is soft deleted\n      if (!metadata.customMetadata?.softDeleted) {\n        throw new StoragePackageError(\n          'File is not soft deleted',\n          STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n        );\n      }\n\n      // Update metadata to mark as restored\n      // Note: Supabase doesn't support updating metadata directly\n      // You need to re-upload the file or use a separate metadata database\n      // For now, we'll download and re-upload\n      const { data: fileData, error: downloadError } = await this.supabaseClient.storage\n        .from(bucketName)\n        .download(metadata.path);\n\n      if (downloadError || !fileData) {\n        throw this.mapSupabaseError(downloadError, 'restoreFile');\n      }\n\n      const arrayBuffer = await fileData.arrayBuffer();\n      const buffer = Buffer.from(arrayBuffer);\n\n      // Re-upload without soft delete metadata\n      const newMetadata: Record<string, string> = {\n        [SUPABASE_METADATA_KEYS.ENTITY_TYPE]: metadata.entityType,\n        [SUPABASE_METADATA_KEYS.ENTITY_ID]: metadata.entityId,\n        [SUPABASE_METADATA_KEYS.CATEGORY]: metadata.category,\n        [SUPABASE_METADATA_KEYS.ACCESS_LEVEL]: metadata.accessLevel,\n        [SUPABASE_METADATA_KEYS.FILE_ID]: metadata.fileId,\n        [SUPABASE_METADATA_KEYS.FILENAME]: metadata.filename,\n        [SUPABASE_METADATA_KEYS.MIME_TYPE]: metadata.mimeType,\n        [SUPABASE_METADATA_KEYS.SIZE]: metadata.size.toString(),\n      };\n\n      const { error: uploadError } = await this.supabaseClient.storage\n        .from(bucketName)\n        .upload(metadata.path, buffer, {\n          contentType: metadata.mimeType,\n          cacheControl: SUPABASE_CONSTANTS.CACHE_CONTROL_ONE_HOUR,\n          upsert: true,\n          metadata: newMetadata,\n        });\n\n      if (uploadError) {\n        throw this.mapSupabaseError(uploadError, 'restoreFile');\n      }\n\n      // Return updated metadata\n      return await this.getFileMetadata(fileId, bucketName);\n    } catch (error) {\n      throw this.wrapError(error, 'restoreFile', { fileId });\n    }\n  }\n\n  /**\n   * Soft delete a file by updating its metadata\n   * @private\n   */\n  private async softDelete(\n    fileId: string,\n    deletedBy: string,\n    bucket?: string\n  ): Promise<FileDeleteResult> {\n    try {\n      const bucketName = bucket ?? this.bucket;\n\n      if (!bucketName) {\n        throw new StoragePackageError(\n          'Bucket name must be provided when using dynamic buckets',\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { fileId, adapter: this.name } }\n        );\n      }\n\n      const metadata = await this.getFileMetadata(fileId, bucketName);\n\n      const now = new Date();\n      const gracePeriodUntil = new Date(\n        now.getTime() +\n          SUPABASE_ADAPTER_DEFAULTS.SOFT_DELETE_GRACE_PERIOD_DAYS *\n            TIME_CONSTANTS.HOURS_PER_DAY *\n            TIME_CONSTANTS.MINUTES_PER_HOUR *\n            TIME_CONSTANTS.SECONDS_PER_MINUTE *\n            TIME_CONSTANTS.MILLISECONDS_PER_SECOND\n      );\n\n      // Download file\n      const { data: fileData, error: downloadError } = await this.supabaseClient.storage\n        .from(bucketName)\n        .download(metadata.path);\n\n      if (downloadError || !fileData) {\n        throw this.mapSupabaseError(downloadError, 'softDelete');\n      }\n\n      const arrayBuffer = await fileData.arrayBuffer();\n      const buffer = Buffer.from(arrayBuffer);\n\n      // Re-upload with soft delete metadata\n      const softDeleteMetadata: Record<string, string> = {\n        [SUPABASE_METADATA_KEYS.ENTITY_TYPE]: metadata.entityType,\n        [SUPABASE_METADATA_KEYS.ENTITY_ID]: metadata.entityId,\n        [SUPABASE_METADATA_KEYS.CATEGORY]: metadata.category,\n        [SUPABASE_METADATA_KEYS.ACCESS_LEVEL]: metadata.accessLevel,\n        [SUPABASE_METADATA_KEYS.FILE_ID]: metadata.fileId,\n        [SUPABASE_METADATA_KEYS.FILENAME]: metadata.filename,\n        [SUPABASE_METADATA_KEYS.MIME_TYPE]: metadata.mimeType,\n        [SUPABASE_METADATA_KEYS.SIZE]: metadata.size.toString(),\n        [SUPABASE_METADATA_KEYS.SOFT_DELETED]: 'true',\n        [SUPABASE_METADATA_KEYS.DELETED_AT]: now.toISOString(),\n        [SUPABASE_METADATA_KEYS.GRACE_PERIOD_UNTIL]: gracePeriodUntil.toISOString(),\n      };\n\n      const { error: uploadError } = await this.supabaseClient.storage\n        .from(bucketName)\n        .upload(metadata.path, buffer, {\n          contentType: metadata.mimeType,\n          cacheControl: SUPABASE_CONSTANTS.CACHE_CONTROL_ONE_HOUR,\n          upsert: true,\n          metadata: softDeleteMetadata,\n        });\n\n      if (uploadError) {\n        throw this.mapSupabaseError(uploadError, 'softDelete');\n      }\n\n      const deletedAt = now;\n\n      return {\n        success: true,\n        deletedAt,\n        metadata: await this.getFileMetadata(fileId, bucketName),\n        softDelete: {\n          deletedBy,\n          deletedAt,\n          canRestore: true,\n          gracePeriodUntil,\n          gracePeriodDays: SUPABASE_ADAPTER_DEFAULTS.SOFT_DELETE_GRACE_PERIOD_DAYS,\n        },\n      };\n    } catch (error) {\n      throw this.wrapError(error, 'softDelete', { fileId });\n    }\n  }\n\n  /**\n   * Generate a file key/path for storage\n   */\n  protected generateFileKey(params: UploadParams): string {\n    // Generate path: entityType/entityId/category/filename\n    const parts: string[] = [];\n    if (params.entityType) parts.push(params.entityType);\n    if (params.entityId) parts.push(params.entityId);\n    if (params.category) parts.push(params.category);\n    parts.push(params.filename ?? `file-${Date.now()}`);\n\n    return parts.join('/');\n  }\n\n  /**\n  /**\n   * Map Supabase Storage errors to StoragePackageError\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private mapSupabaseError(error: Error | null, operation: string): StoragePackageError {\n    if (!error) {\n      return new StoragePackageError(\n        `${operation} operation failed`,\n        STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n      );\n    }\n\n    const errorMessage = error.message ?? 'Unknown Supabase error';\n\n    // Map common Supabase errors to appropriate error codes\n    if (errorMessage.includes('not found') || errorMessage.includes('does not exist')) {\n      return new StoragePackageError(errorMessage, STORAGE_ERROR_CODES.FILE_NOT_FOUND);\n    }\n\n    if (errorMessage.includes('already exists')) {\n      return new StoragePackageError(errorMessage, STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED);\n    }\n\n    if (errorMessage.includes('permission') || errorMessage.includes('unauthorized')) {\n      return new StoragePackageError(\n        errorMessage,\n        STORAGE_ERROR_CODES.ADAPTER_AUTHENTICATION_FAILED\n      );\n    }\n\n    if (errorMessage.includes('timeout') || errorMessage.includes('timed out')) {\n      return new StoragePackageError(errorMessage, STORAGE_ERROR_CODES.ADAPTER_TIMEOUT);\n    }\n\n    // Default to generic operation failure\n    return new StoragePackageError(errorMessage, STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED);\n  }\n\n  /**\n   * Translate bucket purpose to Supabase-specific bucket name\n   *\n   * Pattern: {purpose}\n   * Enterprise with org: {purpose}-{org}\n   *\n   * Examples:\n   * - COMPLIANCE → \"compliance\"\n   * - MEDIA_IMAGES → \"media-images\"\n   * - COMPLIANCE (enterprise, acme-corp) → \"compliance-acme-corp\"\n   *\n   * Note: Supabase projects handle environment separation, so no env prefix needed\n   */\n  translateBucketPurpose(purpose: BUCKET_PURPOSE, config: BucketConfiguration): string {\n    const parts: string[] = [];\n\n    // Purpose-specific name\n    const purposeName = this.getPurposeName(purpose);\n    parts.push(purposeName);\n\n    // Enterprise tier with organization\n    if (config.tier === ORGANIZATION_TIER.ENTERPRISE && config.organizationId) {\n      parts.push(this.sanitizeName(config.organizationId));\n    }\n\n    return parts.join('-');\n  }\n\n  /**\n   * Create Supabase bucket if it doesn't exist\n   * Idempotent: Returns success if bucket already exists\n   */\n  // eslint-disable-next-line complexity\n  async createBucket(bucketName: string, purpose: BUCKET_PURPOSE): Promise<void> {\n    try {\n      // Check if bucket exists\n      const { data: buckets, error: listError } = await this.supabaseClient.storage.listBuckets();\n\n      if (listError) {\n        throw listError;\n      }\n\n      const bucketExists = buckets?.some(b => b.name === bucketName);\n\n      if (bucketExists) {\n        this.logger?.debug('[SupabaseStorageAdapter] Bucket already exists', {\n          bucketName,\n          purpose,\n        });\n        return;\n      }\n\n      // Create bucket with appropriate settings\n      const isPublic = this.isPublicPurpose(purpose);\n      // eslint-disable-next-line no-unused-vars -- fileSizeLimit would cause Supabase error, reserved for future use\n      const fileSizeLimit = this.getFileSizeLimit(purpose);\n      const allowedMimeTypes = this.getAllowedMimeTypes(purpose);\n\n      // Create bucket with MIME type restrictions\n      // Note: fileSizeLimit causes \"object exceeded maximum allowed size\" error in Supabase\n      // so we only use public and allowedMimeTypes\n      const bucketOptions = {\n        public: isPublic,\n        ...(allowedMimeTypes && { allowedMimeTypes }),\n      };\n\n      const { error: createError } = await this.supabaseClient.storage.createBucket(\n        bucketName,\n        bucketOptions\n      );\n\n      if (createError) {\n        // Ignore if bucket was created by another process\n        if (createError.message.includes('already exists')) {\n          this.logger?.debug('[SupabaseStorageAdapter] Bucket created by another process', {\n            bucketName,\n            purpose,\n          });\n          return;\n        }\n        throw createError;\n      }\n\n      this.logger?.info('[SupabaseStorageAdapter] Bucket created', {\n        bucketName,\n        purpose,\n        isPublic,\n      });\n    } catch (error) {\n      this.logger?.error('[SupabaseStorageAdapter] Bucket creation failed', {\n        bucketName,\n        purpose,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.mapSupabaseError(error as Error, 'createBucket');\n    }\n  }\n\n  /**\n   * Delete buckets by name\n   * Useful for cleanup in tests or migrations\n   */\n  // eslint-disable-next-line complexity\n  async deleteBuckets(bucketNames: string[]): Promise<BucketDeletionResult> {\n    const deleted: string[] = [];\n    const failed: BucketDeletionResult['failed'] = [];\n\n    for (const bucketName of bucketNames) {\n      try {\n        // First, empty the bucket using Supabase's built-in method\n        // This removes all objects inside the bucket\n        const { error: emptyError } = await this.supabaseClient.storage.emptyBucket(bucketName);\n\n        if (emptyError && !emptyError.message.includes('not found')) {\n          this.logger?.warn('[SupabaseStorageAdapter] Failed to empty bucket', {\n            bucketName,\n            error: emptyError.message,\n          });\n          // Throw the error so bucket deletion doesn't proceed\n          throw emptyError;\n        }\n\n        // Now delete the bucket\n        const { error: deleteError } = await this.supabaseClient.storage.deleteBucket(bucketName);\n\n        if (deleteError) {\n          this.handleBucketDeleteError(deleteError, bucketName, deleted);\n        } else {\n          deleted.push(bucketName);\n          this.logger?.info('[SupabaseStorageAdapter] Bucket deleted', {\n            bucketName,\n          });\n        }\n      } catch (error) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        failed.push({ bucket: bucketName, error: errorMessage });\n        this.logger?.error('[SupabaseStorageAdapter] Failed to delete bucket', {\n          bucketName,\n          error: errorMessage,\n        });\n      }\n    }\n\n    return { deleted, failed };\n  }\n\n  /**\n   * Get purpose-specific bucket name\n   */\n  // eslint-disable-next-line complexity\n  private getPurposeName(purpose: BUCKET_PURPOSE): string {\n    switch (purpose) {\n      case BUCKET_PURPOSE.COMPLIANCE:\n        return 'compliance';\n      case BUCKET_PURPOSE.MediaImages:\n        return 'media-images';\n      case BUCKET_PURPOSE.MediaVideos:\n        return 'media-videos';\n      case BUCKET_PURPOSE.MediaStatic:\n        return 'media-static';\n      case BUCKET_PURPOSE.UserUploads:\n        return 'user-uploads';\n      case BUCKET_PURPOSE.TEMPORARY:\n        return 'temp';\n      case BUCKET_PURPOSE.ARCHIVES:\n        return 'archives';\n      case BUCKET_PURPOSE.BACKUPS:\n        return 'backups';\n      default:\n        return 'storage';\n    }\n  }\n\n  /**\n   * Check if purpose should use public bucket\n   */\n  private isPublicPurpose(purpose: BUCKET_PURPOSE): boolean {\n    return [\n      BUCKET_PURPOSE.MediaImages,\n      BUCKET_PURPOSE.MediaVideos,\n      BUCKET_PURPOSE.MediaStatic,\n    ].includes(purpose);\n  }\n\n  /**\n   * Get file size limit for bucket purpose\n   * Used by StorageService for validation\n   */\n  public getFileSizeLimit(purpose: BUCKET_PURPOSE): number | undefined {\n    const rules = getStorageValidationRulesForPurpose(purpose, this.validation);\n    return rules.maxFileSize;\n  }\n\n  /**\n   * Get allowed MIME types for bucket purpose\n   * Used by StorageService for validation\n   */\n  public getAllowedMimeTypes(purpose: BUCKET_PURPOSE): string[] | undefined {\n    const rules = getStorageValidationRulesForPurpose(purpose, this.validation);\n    return rules.allowedMimeTypes;\n  }\n\n  /**\n   * Sanitize name for bucket naming (lowercase, alphanumeric, hyphens)\n   */\n  private sanitizeName(name: string): string {\n    return name\n      .toLowerCase()\n      .normalize('NFD')\n      .replaceAll(/[\\u0300-\\u036f]/g, '') // Remove accents\n      .replaceAll(/[^a-z0-9-]/g, '-')\n      .replaceAll(/-+/g, '-')\n      .replaceAll(/^-|-$/g, '');\n  }\n\n  /**\n   * List all buckets\n   */\n  async listBuckets(): Promise<StorageListBucketsResult> {\n    try {\n      this.logger?.debug('[SupabaseStorageAdapter] Listing all buckets');\n\n      const { data, error } = await this.supabaseClient.storage.listBuckets();\n\n      if (error) {\n        throw this.mapSupabaseError(error, 'listBuckets');\n      }\n\n      if (!data) {\n        return { buckets: [], count: 0 };\n      }\n\n      const buckets = data.map(bucket => ({\n        name: bucket.name,\n        id: bucket.id,\n        public: bucket.public ?? false,\n        createdAt: new Date(bucket.created_at),\n        updatedAt: bucket.updated_at ? new Date(bucket.updated_at) : undefined,\n        fileSizeLimit: bucket.file_size_limit ?? undefined,\n        allowedMimeTypes: bucket.allowed_mime_types ?? undefined,\n      }));\n\n      this.logger?.info('[SupabaseStorageAdapter] Listed buckets', {\n        count: buckets.length,\n      });\n\n      return {\n        buckets,\n        count: buckets.length,\n      };\n    } catch (error) {\n      this.logger?.error('[SupabaseStorageAdapter] listBuckets failed', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.wrapError(error, 'listBuckets');\n    }\n  }\n\n  /**\n   * Get bucket details\n   */\n  // eslint-disable-next-line complexity\n  async getBucket(bucketName: string): Promise<StorageBucketInfo> {\n    try {\n      this.logger?.debug('[SupabaseStorageAdapter] Getting bucket details', {\n        bucketName,\n      });\n\n      const { data: buckets, error } = await this.supabaseClient.storage.listBuckets();\n\n      if (error) {\n        throw this.mapSupabaseError(error, 'getBucket');\n      }\n\n      const bucket = buckets?.find(b => b.name === bucketName);\n\n      if (!bucket) {\n        throw new StoragePackageError(\n          `Bucket '${bucketName}' not found`,\n          STORAGE_ERROR_CODES.FILE_NOT_FOUND,\n          { context: { bucketName } }\n        );\n      }\n\n      return {\n        name: bucket.name,\n        id: bucket.id,\n        public: bucket.public ?? false,\n        createdAt: new Date(bucket.created_at),\n        updatedAt: bucket.updated_at ? new Date(bucket.updated_at) : undefined,\n        fileSizeLimit: bucket.file_size_limit ?? undefined,\n        allowedMimeTypes: bucket.allowed_mime_types ?? undefined,\n      };\n    } catch (error) {\n      this.logger?.error('[SupabaseStorageAdapter] getBucket failed', {\n        bucketName,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.wrapError(error, 'getBucket', { bucketName });\n    }\n  }\n\n  /**\n   * Update bucket settings\n   */\n  // eslint-disable-next-line complexity\n  async updateBucket(params: StorageUpdateBucketParams): Promise<void> {\n    try {\n      this.logger?.debug('[SupabaseStorageAdapter] Updating bucket', {\n        bucketName: params.bucketName,\n      });\n\n      const updateOptions: Parameters<typeof this.supabaseClient.storage.updateBucket>[1] =\n        {} as Parameters<typeof this.supabaseClient.storage.updateBucket>[1];\n      if (params.public !== undefined) updateOptions.public = params.public;\n      if (params.fileSizeLimit !== undefined) updateOptions.fileSizeLimit = params.fileSizeLimit;\n      if (params.allowedMimeTypes !== undefined)\n        updateOptions.allowedMimeTypes = params.allowedMimeTypes;\n\n      const { error } = await this.supabaseClient.storage.updateBucket(\n        params.bucketName,\n        updateOptions\n      );\n\n      if (error) {\n        throw this.mapSupabaseError(error, 'updateBucket');\n      }\n\n      this.logger?.info('[SupabaseStorageAdapter] Bucket updated', {\n        bucketName: params.bucketName,\n      });\n    } catch (error) {\n      this.logger?.error('[SupabaseStorageAdapter] updateBucket failed', {\n        bucketName: params.bucketName,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.wrapError(error, 'updateBucket', { bucketName: params.bucketName });\n    }\n  }\n\n  /**\n   * List files in a bucket\n   */\n  // eslint-disable-next-line complexity\n  async listFiles(params: StorageListFilesParams): Promise<StorageListFilesResult> {\n    try {\n      this.logger?.debug('[SupabaseStorageAdapter] Listing files', {\n        bucket: params.bucket,\n        prefix: params.prefix,\n        limit: params.limit,\n      });\n\n      const options: {\n        limit: number;\n        offset: number;\n        sortBy?: { column: string; order: 'asc' | 'desc' };\n        search?: string;\n      } = {\n        limit: params.limit ?? SUPABASE_ADAPTER_DEFAULTS.DEFAULT_LIST_LIMIT,\n        offset: params.offset ?? 0,\n      };\n\n      if (params.sortBy) {\n        options.sortBy = { column: params.sortBy, order: params.sortOrder ?? 'asc' };\n      }\n\n      if (params.search) {\n        options.search = params.search;\n      }\n\n      const { data, error } = await this.supabaseClient.storage\n        .from(params.bucket)\n        .list(params.prefix ?? '', options);\n\n      if (error) {\n        throw this.mapSupabaseError(error, 'listFiles');\n      }\n\n      if (!data) {\n        return { files: [], count: 0, hasMore: false };\n      }\n\n      const files = data.map(file => ({\n        id: params.prefix ? `${params.prefix}/${file.name}` : file.name,\n        name: file.name,\n        size: file.metadata?.size ?? 0,\n        mimeType: file.metadata?.mimetype ?? 'application/octet-stream',\n        createdAt: new Date(file.created_at),\n        updatedAt: file.updated_at ? new Date(file.updated_at) : undefined,\n        metadata: file.metadata as Record<string, unknown> | undefined,\n      }));\n\n      const hasMore =\n        files.length === (params.limit ?? SUPABASE_ADAPTER_DEFAULTS.DEFAULT_LIST_LIMIT);\n      const nextOffset = hasMore ? (params.offset ?? 0) + files.length : undefined;\n\n      this.logger?.info('[SupabaseStorageAdapter] Files listed', {\n        bucket: params.bucket,\n        count: files.length,\n        hasMore,\n      });\n\n      return {\n        files,\n        count: files.length,\n        hasMore,\n        nextOffset,\n      };\n    } catch (error) {\n      this.logger?.error('[SupabaseStorageAdapter] listFiles failed', {\n        bucket: params.bucket,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.wrapError(error, 'listFiles', { bucket: params.bucket });\n    }\n  }\n\n  /**\n   * Move a file\n   */\n  async moveFile(params: StorageMoveFileParams): Promise<FileMetadata> {\n    try {\n      this.logger?.debug('[SupabaseStorageAdapter] Moving file', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n      });\n\n      const { error } = await this.supabaseClient.storage\n        .from(params.sourceBucket)\n        .move(params.sourcePath, params.destinationPath);\n\n      if (error) {\n        throw this.mapSupabaseError(error, 'moveFile');\n      }\n\n      // Get metadata of moved file\n      const metadata = await this.getFileMetadata(params.destinationPath, params.destinationBucket);\n\n      this.logger?.info('[SupabaseStorageAdapter] File moved', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n      });\n\n      return metadata;\n    } catch (error) {\n      this.logger?.error('[SupabaseStorageAdapter] moveFile failed', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.wrapError(error, 'moveFile');\n    }\n  }\n\n  /**\n   * Copy a file\n   */\n  async copyFile(params: StorageCopyFileParams): Promise<FileMetadata> {\n    try {\n      this.logger?.debug('[SupabaseStorageAdapter] Copying file', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n      });\n\n      const { error } = await this.supabaseClient.storage\n        .from(params.sourceBucket)\n        .copy(params.sourcePath, params.destinationPath);\n\n      if (error) {\n        throw this.mapSupabaseError(error, 'copyFile');\n      }\n\n      // Get metadata of copied file\n      const metadata = await this.getFileMetadata(params.destinationPath, params.destinationBucket);\n\n      this.logger?.info('[SupabaseStorageAdapter] File copied', {\n        from: `${params.sourceBucket}/${params.sourcePath}`,\n        to: `${params.destinationBucket}/${params.destinationPath}`,\n      });\n\n      return metadata;\n    } catch (error) {\n      this.logger?.error('[SupabaseStorageAdapter] copyFile failed', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.wrapError(error, 'copyFile');\n    }\n  }\n\n  /**\n   * Replace an existing file\n   */\n  // eslint-disable-next-line complexity\n  async replaceFile(params: StorageReplaceFileParams): Promise<FileMetadata> {\n    try {\n      const bucketName = params.bucket ?? this.bucket;\n\n      if (!bucketName) {\n        throw new StoragePackageError(\n          'Bucket name must be provided when using dynamic buckets',\n          STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID,\n          { context: { fileId: params.fileId } }\n        );\n      }\n\n      this.logger?.debug('[SupabaseStorageAdapter] Replacing file', {\n        fileId: params.fileId,\n        bucket: bucketName,\n      });\n\n      // Convert file to Buffer if needed\n      let fileBuffer: Buffer;\n      if (Buffer.isBuffer(params.file)) {\n        fileBuffer = params.file;\n      } else {\n        throw new StoragePackageError(\n          'File must be a Buffer for Supabase adapter',\n          STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n        );\n      }\n\n      // Upload with upsert=true to replace existing file\n      // eslint-disable-next-line no-unused-vars -- data not needed, only checking for errors\n      const { data, error } = await this.supabaseClient.storage\n        .from(bucketName)\n        .upload(params.fileId, fileBuffer, {\n          contentType: params.mimeType ?? 'application/octet-stream',\n          cacheControl: SUPABASE_CONSTANTS.CACHE_CONTROL_ONE_HOUR,\n          upsert: true, // This replaces the existing file\n          metadata: params.metadata as Record<string, string> | undefined,\n        });\n\n      if (error) {\n        throw this.mapSupabaseError(error, 'replaceFile');\n      }\n\n      // Get metadata of replaced file\n      const metadata = await this.getFileMetadata(params.fileId, bucketName);\n\n      this.logger?.info('[SupabaseStorageAdapter] File replaced', {\n        fileId: params.fileId,\n        bucket: bucketName,\n      });\n\n      return metadata;\n    } catch (error) {\n      this.logger?.error('[SupabaseStorageAdapter] replaceFile failed', {\n        fileId: params.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.wrapError(error, 'replaceFile', { fileId: params.fileId });\n    }\n  }\n\n  /**\n   * Create a signed upload URL\n   */\n  // eslint-disable-next-line complexity\n  async createSignedUploadUrl(\n    params: StorageSignedUploadUrlParams\n  ): Promise<StorageSignedUploadUrlResult> {\n    try {\n      this.logger?.debug('[SupabaseStorageAdapter] Creating signed upload URL', {\n        bucket: params.bucket,\n        path: params.path,\n        expiresIn: params.expiresIn,\n      });\n\n      const { data, error } = await this.supabaseClient.storage\n        .from(params.bucket)\n        .createSignedUploadUrl(params.path, {\n          upsert: params.upsert ?? false,\n        });\n\n      if (error || !data) {\n        throw this.mapSupabaseError(error, 'createSignedUploadUrl');\n      }\n\n      const expiresAt = new Date(\n        Date.now() +\n          (params.expiresIn ?? SUPABASE_ADAPTER_DEFAULTS.DEFAULT_SIGNED_URL_EXPIRY_SECONDS) *\n            TIME_CONSTANTS.MILLISECONDS_PER_SECOND\n      );\n\n      this.logger?.info('[SupabaseStorageAdapter] Signed upload URL created', {\n        bucket: params.bucket,\n        path: params.path,\n        token: data.token,\n      });\n\n      return {\n        url: data.signedUrl,\n        token: data.token,\n        expiresAt,\n      };\n    } catch (error) {\n      this.logger?.error('[SupabaseStorageAdapter] createSignedUploadUrl failed', {\n        bucket: params.bucket,\n        path: params.path,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.wrapError(error, 'createSignedUploadUrl', {\n        bucket: params.bucket,\n        path: params.path,\n      });\n    }\n  }\n\n  /**\n   * Get public URL for a file\n   */\n  async getPublicUrl(params: StoragePublicUrlParams): Promise<string> {\n    try {\n      this.logger?.debug('[SupabaseStorageAdapter] Getting public URL', {\n        bucket: params.bucket,\n        path: params.path,\n      });\n\n      const options: StoragePublicUrlParams = {} as StoragePublicUrlParams;\n      if (params.download) {\n        options.download = params.download;\n      }\n\n      const { data } = this.supabaseClient.storage\n        .from(params.bucket)\n        .getPublicUrl(params.path, options);\n\n      const publicUrl = data.publicUrl;\n\n      this.logger?.info('[SupabaseStorageAdapter] Public URL generated', {\n        bucket: params.bucket,\n        path: params.path,\n        url: publicUrl,\n      });\n\n      return publicUrl;\n    } catch (error) {\n      this.logger?.error('[SupabaseStorageAdapter] getPublicUrl failed', {\n        bucket: params.bucket,\n        path: params.path,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.wrapError(error, 'getPublicUrl', { bucket: params.bucket, path: params.path });\n    }\n  }\n\n  /**\n   * Upload large file using chunked/resumable upload\n   * Handles entire chunked upload flow using Supabase SDK\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  async uploadChunked(params: UploadParams): Promise<UploadResult> {\n    try {\n      if (!params.file || !Buffer.isBuffer(params.file)) {\n        throw new StoragePackageError(\n          'File must be a Buffer for chunked upload',\n          STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED\n        );\n      }\n\n      const fileBuffer = params.file;\n      const fileSize = fileBuffer.length;\n\n      this.logger?.debug('[SupabaseStorageAdapter] Starting chunked upload', {\n        filename: params.filename,\n        fileSize,\n      });\n\n      // Prepare upload (bucket + file key)\n      const { bucketName, fileKey, bucketPurpose } = await this.prepareUpload(params);\n\n      // Prepare metadata (same as regular upload)\n      const metadata: Record<string, string> = {\n        [SUPABASE_METADATA_KEYS.ENTITY_TYPE]: params.entityType,\n        [SUPABASE_METADATA_KEYS.ENTITY_ID]: params.entityId,\n        [SUPABASE_METADATA_KEYS.CATEGORY]: params.category,\n        [SUPABASE_METADATA_KEYS.FILE_ID]: fileKey,\n        [SUPABASE_METADATA_KEYS.SIZE]: fileSize.toString(),\n      };\n\n      if (params.accessLevel) {\n        metadata[SUPABASE_METADATA_KEYS.ACCESS_LEVEL] = params.accessLevel;\n      }\n      if (params.filename) {\n        metadata[SUPABASE_METADATA_KEYS.FILENAME] = params.filename;\n      }\n      if (params.mimeType) {\n        metadata[SUPABASE_METADATA_KEYS.MIME_TYPE] = params.mimeType;\n      }\n\n      // Check if upload was aborted before starting (per-upload or adapter-level)\n      if (params.abortSignal?.aborted || this.adapterAbortSignal?.aborted) {\n        throw new StoragePackageError(\n          'Upload aborted by user',\n          STORAGE_ERROR_CODES.ADAPTER_OPERATION_FAILED,\n          { context: { fileId: fileKey, reason: 'aborted' } }\n        );\n      }\n\n      const contentType = params.mimeType ?? 'application/octet-stream';\n      // Extract filename from fileKey (last segment) to ensure consistency with generated names\n      const filename = params.filename ?? fileKey.split('/').pop() ?? 'unknown';\n\n      // Try to use signed URL with progress tracking (same as regular upload)\n      try {\n        const signedUrlResult = await this.createSignedUploadUrl({\n          bucket: bucketName,\n          path: fileKey,\n          upsert: false,\n        });\n\n        this.logger?.debug(\n          '[SupabaseStorageAdapter] Using signed URL for chunked upload with progress tracking',\n          {\n            bucket: bucketName,\n            path: fileKey,\n            fileSize,\n          }\n        );\n\n        // Upload with progress tracking\n        await this.uploadBufferWithProgress({\n          url: signedUrlResult.url,\n          buffer: fileBuffer,\n          contentType,\n          params,\n          fileId: fileKey,\n          filename,\n          headers: {\n            'Cache-Control': SUPABASE_CONSTANTS.CACHE_CONTROL_ONE_HOUR,\n            'x-upsert': 'false',\n          },\n          method: 'PUT',\n        });\n      } catch (signedUrlError) {\n        // Fall back to SDK upload if signed URL approach fails\n        this.logger?.warn(\n          '[SupabaseStorageAdapter] Signed URL chunked upload failed, falling back to SDK',\n          {\n            error:\n              signedUrlError instanceof Error ? signedUrlError.message : String(signedUrlError),\n          }\n        );\n\n        // Initial progress report for fallback\n        this.emitProgress(params, {\n          fileId: fileKey,\n          filename,\n          loaded: 0,\n          total: fileSize,\n          percentage: 0,\n          mimeType: params.mimeType,\n          entityType: params.entityType,\n          entityId: params.entityId,\n          adapter: this.name,\n        });\n\n        // Upload using Supabase SDK (no intermediate progress)\n        const { error } = await this.supabaseClient.storage\n          .from(bucketName)\n          .upload(fileKey, fileBuffer, {\n            contentType,\n            cacheControl: SUPABASE_CONSTANTS.CACHE_CONTROL_ONE_HOUR,\n            upsert: false,\n            metadata,\n          });\n\n        if (error) {\n          throw this.mapSupabaseError(error, 'uploadChunked');\n        }\n\n        // Final progress report for fallback\n        this.emitProgress(params, {\n          fileId: fileKey,\n          filename,\n          loaded: fileSize,\n          total: fileSize,\n          percentage: 100,\n          mimeType: params.mimeType,\n          entityType: params.entityType,\n          entityId: params.entityId,\n          adapter: this.name,\n        });\n      }\n\n      this.logger?.info('[SupabaseStorageAdapter] Chunked upload completed', {\n        bucket: bucketName,\n        key: fileKey,\n      });\n\n      // Generate URL (same as regular upload)\n      const url = await this.getPublicUrl({\n        bucket: bucketName,\n        path: fileKey,\n      });\n\n      // Build file metadata\n      const fileMetadata = this.buildFileMetadata({\n        params,\n        fileKey,\n        bucketName,\n        bucketPurpose,\n        fileSize,\n      });\n\n      return {\n        metadata: fileMetadata,\n        url,\n      };\n    } catch (error) {\n      this.logger?.error('[SupabaseStorageAdapter] uploadChunked failed', {\n        filename: params.filename,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw this.wrapError(error, 'uploadChunked');\n    }\n  }\n\n  /**\n   * Helper: Handle bucket deletion error (idempotent delete)\n   */\n  private handleBucketDeleteError(deleteError: Error, bucketName: string, deleted: string[]): void {\n    // If bucket doesn't exist, consider it a success (idempotent)\n    if (\n      deleteError.message.includes('not found') ||\n      deleteError.message.includes('does not exist')\n    ) {\n      this.logger?.debug('[SupabaseStorageAdapter] Bucket already deleted or does not exist', {\n        bucketName,\n      });\n      deleted.push(bucketName);\n    } else {\n      throw deleteError;\n    }\n  }\n}\n","/**\n * Result Pattern Helpers\n *\n * Type-safe error handling without try-catch in happy path\n * Eliminates exceptions in normal flow and provides explicit success/failure states\n *\n * Usage:\n * ```typescript\n * const result = await storageService.uploadFile(params);\n * if (result.success) {\n *   console.log(result.data.metadata);\n * } else {\n *   console.error(result.error);\n * }\n * ```\n */\n\nimport type { StorageResult as Result } from '@plyaz/types/storage';\n\n/**\n * Create a successful result\n *\n * @param data - Success data\n * @returns Result object with success: true\n */\nexport function success<T>(data: T): Result<T> {\n  return { success: true, data };\n}\n\n/**\n * Create a failure result\n *\n * @param error - Error object\n * @returns Result object with success: false\n */\nexport function failure<E = Error>(error: E): Result<never, E> {\n  return { success: false, error };\n}\n\n/**\n * Check if result is successful\n * Type guard for narrowing Result type\n *\n * @param result - Result to check\n * @returns true if result is successful\n */\nexport function isSuccess<T, E = Error>(\n  result: Result<T, E>\n): result is { success: true; data: T } {\n  return result.success === true;\n}\n\n/**\n * Check if result is a failure\n * Type guard for narrowing Result type\n *\n * @param result - Result to check\n * @returns true if result is a failure\n */\nexport function isFailure<T, E = Error>(\n  result: Result<T, E>\n): result is { success: false; error: E } {\n  return result.success === false;\n}\n\n/**\n * Unwrap result data or throw error\n * Use when you want to convert Result back to throwing style\n *\n * @param result - Result to unwrap\n * @returns Data if successful\n * @throws Error if failed\n */\nexport function unwrap<T, E = Error>(result: Result<T, E>): T {\n  if (result.success) {\n    return result.data;\n  }\n  throw result.error;\n}\n\n/**\n * Unwrap result data or return default value\n *\n * @param result - Result to unwrap\n * @param defaultValue - Default value if failed\n * @returns Data if successful, defaultValue if failed\n */\nexport function unwrapOr<T, E = Error>(result: Result<T, E>, defaultValue: T): T {\n  if (result.success) {\n    return result.data;\n  }\n  return defaultValue;\n}\n\n/**\n * Map result data to a new value\n * Only applies function if result is successful\n *\n * @param result - Result to map\n * @param fn - Mapping function\n * @returns New result with mapped data\n */\nexport function map<T, U, E = Error>(result: Result<T, E>, fn: (data: T) => U): Result<U, E> {\n  if (result.success) {\n    return success(fn(result.data)) as Result<U, E>;\n  }\n  return result as Result<U, E>;\n}\n\n/**\n * Map result error to a new error\n * Only applies function if result is a failure\n *\n * @param result - Result to map\n * @param fn - Error mapping function\n * @returns New result with mapped error\n */\nexport function mapError<T, E = Error, F = Error>(\n  result: Result<T, E>,\n  fn: (error: E) => F\n): Result<T, F> {\n  if (result.success) {\n    return result;\n  }\n  return failure(fn(result.error));\n}\n\n/**\n * Chain async operations that return Results\n * FlatMap for Result (avoids Result<Result<T>>)\n *\n * @param result - Result to chain\n * @param fn - Function that returns a new Result\n * @returns Flattened result\n */\nexport async function chain<T, U, E = Error>(\n  result: Result<T, E>,\n  fn: (data: T) => Promise<Result<U, E>>\n): Promise<Result<U, E>> {\n  if (result.success) {\n    return await fn(result.data);\n  }\n  return result;\n}\n\n/**\n * Combine multiple Results into a single Result with an array\n * All must succeed for overall success\n *\n * @param results - Array of results\n * @returns Result with array of data if all succeeded, first error otherwise\n */\nexport function combine<T, E = Error>(results: Result<T, E>[]): Result<T[], E> {\n  const data: T[] = [];\n\n  for (const result of results) {\n    if (result.success) {\n      data.push(result.data);\n    } else {\n      // Return first error\n      return result as Result<T[], E>;\n    }\n  }\n\n  return success(data) as Result<T[], E>;\n}\n\n/**\n * Convert a Promise to a Result (catching exceptions)\n * Useful for wrapping third-party APIs that throw\n *\n * @param promise - Promise to convert\n * @returns Result (never throws)\n */\nexport async function fromPromise<T>(promise: Promise<T>): Promise<Result<T, Error>> {\n  try {\n    const data = await promise;\n    return success(data);\n  } catch (error) {\n    return failure(error instanceof Error ? error : new Error(String(error)));\n  }\n}\n\n/**\n * Convert a throwing function to a Result-returning function\n *\n * @param fn - Function that might throw\n * @returns Result (never throws)\n */\nexport function fromThrowable<T>(fn: () => T): Result<T, Error> {\n  try {\n    const data = fn();\n    return success(data);\n  } catch (error) {\n    return failure(error instanceof Error ? error : new Error(String(error)));\n  }\n}\n","/**\n * Signed URL Generator Utility\n *\n * Provides secure URL generation with:\n * - HMAC-based signatures for URL integrity\n * - Expiration time enforcement\n * - Optional IP address restrictions\n * - Optional permission restrictions (read/write/delete)\n * - URL verification\n *\n * Use Cases:\n * - Temporary download links\n * - Pre-signed upload URLs\n * - Secure file sharing\n * - Time-limited access control\n */\n\nimport * as crypto from 'node:crypto';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../errors';\nimport type {\n  StorageSignedUrlOptions,\n  StorageVerificationResult,\n  StorageHashAlgorithm,\n  StorageSignedUrlPermission,\n} from '@plyaz/types/storage';\n\n/**\n * Constants for signed URL operations\n */\nconst SIGNED_URL_CONSTANTS = {\n  MILLISECONDS_TO_SECONDS: 1000,\n  META_PREFIX_LENGTH: 5, // Length of \"meta_\" prefix\n  DEFAULT_RADIX: 10,\n  DEFAULT_EXPIRES_IN_SECONDS: 3600, // 1 hour default expiration\n} as const;\n\n/**\n * Signed URL Generator Class\n * Provides static methods for generating and verifying signed URLs\n */\nexport class SignedUrlGenerator {\n  /**\n   * Generate a signed URL with expiration and optional restrictions\n   *\n   * The signature is generated using HMAC-SHA256 with the following payload:\n   * - File path\n   * - Expiration timestamp\n   * - IP address (if restricted)\n   * - Permissions\n   * - Metadata (if provided)\n   *\n   * @param baseUrl - Base URL (e.g., \"https://storage.example.com\")\n   * @param filePath - File path or key (e.g., \"/files/document.pdf\")\n   * @param secret - Secret key for HMAC signing\n   * @param options - Signing options (expiration, IP, permissions)\n   * @returns Signed URL with query parameters\n   *\n   * @example\n   * ```typescript\n   * const url = SignedUrlGenerator.generateSignedUrl(\n   *   'https://cdn.example.com',\n   *   '/files/document.pdf',\n   *   'my-secret-key',\n   *   {\n   *     expiresIn: 3600, // 1 hour\n   *     ipAddress: '192.168.1.1',\n   *     permissions: ['read'],\n   *   }\n   * );\n   * // https://cdn.example.com/files/document.pdf?expires=1706745600&signature=abc123...&ip=192.168.1.1\n   * ```\n   */\n  static generateSignedUrl(\n    baseUrl: string,\n    filePath: string,\n    secret: string,\n    options: StorageSignedUrlOptions\n  ): string {\n    const {\n      expiresIn,\n      ipAddress,\n      permissions = ['read'],\n      metadata = {},\n      algorithm = 'sha256',\n    } = options;\n\n    // Calculate expiration timestamp (seconds since epoch)\n    const expiresAt =\n      Math.floor(Date.now() / SIGNED_URL_CONSTANTS.MILLISECONDS_TO_SECONDS) + expiresIn;\n\n    // Build signature payload\n    const payload = this.buildSignaturePayload({\n      filePath,\n      expiresAt,\n      ipAddress,\n      permissions,\n      metadata,\n    });\n\n    // Generate HMAC signature with specified algorithm\n    const signature = crypto.createHmac(algorithm, secret).update(payload).digest('base64url');\n\n    // Build and return signed URL\n    return this.buildSignedUrl({\n      baseUrl,\n      filePath,\n      expiresAt,\n      signature,\n      ipAddress,\n      permissions,\n      metadata,\n    });\n  }\n\n  /**\n   * Build signature payload from components\n   */\n  private static buildSignaturePayload(options: {\n    filePath: string;\n    expiresAt: number;\n    ipAddress: string | undefined;\n    permissions: StorageSignedUrlPermission[];\n    metadata: Record<string, string>;\n  }): string {\n    const { filePath, expiresAt, ipAddress, permissions, metadata } = options;\n    const payloadParts = [\n      filePath,\n      expiresAt.toString(),\n      ipAddress ?? '',\n      [...permissions].sort().join(','), // Sort for consistency\n    ];\n\n    // Add metadata to payload if present\n    if (Object.keys(metadata).length > 0) {\n      const metadataStr = Object.entries(metadata)\n        .sort(([keyA], [keyB]) => keyA.localeCompare(keyB)) // Sort for consistency\n        .map(([key, value]) => `${key}=${value}`)\n        .join('&');\n      payloadParts.push(metadataStr);\n    }\n\n    return payloadParts.join('|');\n  }\n\n  /**\n   * Build signed URL with all parameters\n   */\n  private static buildSignedUrl(options: {\n    baseUrl: string;\n    filePath: string;\n    expiresAt: number;\n    signature: string;\n    ipAddress: string | undefined;\n    permissions: StorageSignedUrlPermission[];\n    metadata: Record<string, string>;\n  }): string {\n    const { baseUrl, filePath, expiresAt, signature, ipAddress, permissions, metadata } = options;\n    const url = new URL(filePath, baseUrl);\n    url.searchParams.set('expires', expiresAt.toString());\n    url.searchParams.set('signature', signature);\n\n    if (ipAddress) {\n      url.searchParams.set('ip', ipAddress);\n    }\n\n    if (permissions.length > 0 && !permissions.includes('read')) {\n      // Only include permissions if non-default\n      url.searchParams.set('permissions', permissions.sort().join(','));\n    }\n\n    // Add metadata to URL params\n    for (const [key, value] of Object.entries(metadata)) {\n      url.searchParams.set(`meta_${key}`, value);\n    }\n\n    return url.toString();\n  }\n\n  /**\n   * Verify a signed URL\n   *\n   * Checks:\n   * 1. URL hasn't expired\n   * 2. IP address matches (if restricted)\n   * 3. Signature is valid (HMAC matches)\n   *\n   * @param signedUrl - The signed URL to verify\n   * @param secret - Secret key used for signing\n   * @param requestIp - IP address of the request (for IP restriction check)\n   * @param algorithm - Hash algorithm used for signing (default: 'sha256')\n   * @returns Verification result with valid flag and error message\n   *\n   * @example\n   * ```typescript\n   * const result = SignedUrlGenerator.verifySignedUrl(\n   *   'https://cdn.example.com/files/document.pdf?expires=1706745600&signature=abc123...',\n   *   'my-secret-key',\n   *   '192.168.1.1',\n   *   'sha256'\n   * );\n   *\n   * if (result.valid) {\n   *   console.log('URL is valid, expires at:', result.expiresAt);\n   *   console.log('Permissions:', result.permissions);\n   * } else {\n   *   console.error('URL is invalid:', result.error);\n   * }\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  static verifySignedUrl(\n    signedUrl: string,\n    secret: string,\n    requestIp?: string,\n    algorithm: StorageHashAlgorithm = 'sha256'\n  ): StorageVerificationResult {\n    try {\n      const url = new URL(signedUrl);\n\n      // Extract and parse URL parameters\n      const params = this.extractUrlParameters(url);\n      if (!params.expiresAt || !params.signature) {\n        return { valid: false, error: 'Missing required parameters (expires or signature)' };\n      }\n\n      // Check expiration\n      const expirationCheck = this.checkExpiration(params.expiresAt);\n      if (!expirationCheck.valid) {\n        return expirationCheck;\n      }\n\n      // Check IP restriction\n      const ipCheck = this.checkIpRestriction(params.allowedIp, requestIp);\n      if (!ipCheck.valid) {\n        return ipCheck;\n      }\n\n      // Verify signature\n      const signatureCheck = this.verifySignature({\n        pathname: url.pathname,\n        expiresAt: params.expiresAt,\n        allowedIp: params.allowedIp,\n        permissions: params.permissions,\n        metadata: params.metadata,\n        signature: params.signature,\n        secret,\n        algorithm,\n      });\n      if (!signatureCheck.valid) {\n        return signatureCheck;\n      }\n\n      return {\n        valid: true,\n        permissions: params.permissions,\n        expiresAt: params.expiresAt,\n      };\n    } catch (error) {\n      return {\n        valid: false,\n        error: error instanceof Error ? error.message : 'Invalid URL format',\n      };\n    }\n  }\n\n  /**\n   * Extract parameters from signed URL\n   */\n  private static extractUrlParameters(url: URL): {\n    expiresAt: number;\n    signature: string | null;\n    allowedIp: string | null;\n    permissions: StorageSignedUrlPermission[];\n    metadata: Record<string, string>;\n  } {\n    const expiresAt = Number.parseInt(\n      url.searchParams.get('expires') ?? '0',\n      SIGNED_URL_CONSTANTS.DEFAULT_RADIX\n    );\n    const signature = url.searchParams.get('signature');\n    const allowedIp = url.searchParams.get('ip');\n    const permissionsStr = url.searchParams.get('permissions') ?? 'read';\n    const permissions = permissionsStr.split(',') as StorageSignedUrlPermission[];\n\n    // Extract metadata from URL params\n    const metadata: Record<string, string> = {};\n    for (const [key, value] of url.searchParams.entries()) {\n      if (key.startsWith('meta_')) {\n        metadata[key.substring(SIGNED_URL_CONSTANTS.META_PREFIX_LENGTH)] = value;\n      }\n    }\n\n    return { expiresAt, signature, allowedIp, permissions, metadata };\n  }\n\n  /**\n   * Check if URL has expired\n   */\n  private static checkExpiration(expiresAt: number): StorageVerificationResult {\n    const nowSeconds = Math.floor(Date.now() / SIGNED_URL_CONSTANTS.MILLISECONDS_TO_SECONDS);\n    if (nowSeconds > expiresAt) {\n      return {\n        valid: false,\n        error: `URL expired at ${new Date(expiresAt * SIGNED_URL_CONSTANTS.MILLISECONDS_TO_SECONDS).toISOString()}`,\n      };\n    }\n    return { valid: true };\n  }\n\n  /**\n   * Check IP address restriction\n   */\n  private static checkIpRestriction(\n    allowedIp: string | null,\n    requestIp: string | undefined\n  ): StorageVerificationResult {\n    if (allowedIp && allowedIp !== requestIp) {\n      return {\n        valid: false,\n        error: `IP address mismatch (expected: ${allowedIp}, got: ${requestIp})`,\n      };\n    }\n    return { valid: true };\n  }\n\n  /**\n   * Verify signature matches expected value\n   */\n  private static verifySignature(options: {\n    pathname: string;\n    expiresAt: number;\n    allowedIp: string | null;\n    permissions: StorageSignedUrlPermission[];\n    metadata: Record<string, string>;\n    signature: string;\n    secret: string;\n    algorithm: StorageHashAlgorithm;\n  }): StorageVerificationResult {\n    const { pathname, expiresAt, allowedIp, permissions, metadata, signature, secret, algorithm } =\n      options;\n    // Reconstruct payload for verification\n    const payload = this.buildSignaturePayload({\n      filePath: pathname,\n      expiresAt,\n      ipAddress: allowedIp ?? undefined,\n      permissions,\n      metadata,\n    });\n\n    // Generate expected signature with specified algorithm\n    const expectedSignature = crypto\n      .createHmac(algorithm, secret)\n      .update(payload)\n      .digest('base64url');\n\n    // Verify signature (timing-safe comparison)\n    if (!this.timingSafeEqual(signature, expectedSignature)) {\n      return { valid: false, error: 'Invalid signature' };\n    }\n\n    return { valid: true };\n  }\n\n  /**\n   * Generate a pre-signed upload URL\n   * Allows clients to upload directly to storage without going through the server\n   *\n   * @param baseUrl - Base URL for uploads\n   * @param uploadPath - Path where file will be uploaded\n   * @param secret - Secret key for signing\n   * @param options - Upload options (expiration, max file size)\n   * @returns Signed upload URL\n   */\n  static generateUploadUrl(\n    baseUrl: string,\n    uploadPath: string,\n    secret: string,\n    options: StorageSignedUrlOptions & { maxFileSize?: number }\n  ): string {\n    const uploadOptions: StorageSignedUrlOptions = {\n      ...options,\n      permissions: ['write'],\n      metadata: {\n        ...options.metadata,\n        ...(options.maxFileSize ? { maxFileSize: options.maxFileSize.toString() } : {}),\n      },\n    };\n\n    return this.generateSignedUrl(baseUrl, uploadPath, secret, uploadOptions);\n  }\n\n  /**\n   * Generate a temporary download URL with expiration\n   * Common use case for file sharing\n   *\n   * @param baseUrl - Base URL for downloads\n   * @param filePath - Path to file\n   * @param secret - Secret key for signing\n   * @param expiresIn - Expiration time in seconds (default: 3600 = 1 hour)\n   * @returns Signed download URL\n   */\n  static generateDownloadUrl(\n    baseUrl: string,\n    filePath: string,\n    secret: string,\n    expiresIn: number = SIGNED_URL_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS\n  ): string {\n    return this.generateSignedUrl(baseUrl, filePath, secret, {\n      expiresIn,\n      permissions: ['read'],\n    });\n  }\n\n  /**\n   * Parse signed URL and extract information without verification\n   * Useful for debugging or logging\n   *\n   * @param signedUrl - Signed URL to parse\n   * @returns Parsed URL information\n   */\n  static parseSignedUrl(signedUrl: string): {\n    filePath: string;\n    expiresAt: number | null;\n    ipAddress: string | null;\n    permissions: StorageSignedUrlPermission[];\n    isExpired: boolean;\n    metadata: Record<string, string>;\n  } {\n    try {\n      const url = new URL(signedUrl);\n      const expiresAt =\n        Number.parseInt(\n          url.searchParams.get('expires') ?? '0',\n          SIGNED_URL_CONSTANTS.DEFAULT_RADIX\n        ) || null;\n      const ipAddress = url.searchParams.get('ip');\n      const permissionsStr = url.searchParams.get('permissions') ?? 'read';\n      const permissions = permissionsStr.split(',') as StorageSignedUrlPermission[];\n\n      // Extract metadata\n      const metadata = this.extractMetadataFromUrl(url);\n\n      const isExpired = this.isUrlExpired(expiresAt);\n\n      return {\n        filePath: url.pathname,\n        expiresAt,\n        ipAddress,\n        permissions,\n        isExpired,\n        metadata,\n      };\n    } catch (error) {\n      throw new StoragePackageError(\n        `Failed to parse signed URL: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        STORAGE_ERROR_CODES.PRESIGNED_URL_INVALID,\n        { context: { error } }\n      );\n    }\n  }\n\n  /**\n   * Extract metadata from URL search params\n   */\n  private static extractMetadataFromUrl(url: URL): Record<string, string> {\n    const metadata: Record<string, string> = {};\n    for (const [key, value] of url.searchParams.entries()) {\n      if (key.startsWith('meta_')) {\n        metadata[key.substring(SIGNED_URL_CONSTANTS.META_PREFIX_LENGTH)] = value;\n      }\n    }\n    return metadata;\n  }\n\n  /**\n   * Check if URL is expired\n   */\n  private static isUrlExpired(expiresAt: number | null): boolean {\n    if (!expiresAt) {\n      return false;\n    }\n    return Math.floor(Date.now() / SIGNED_URL_CONSTANTS.MILLISECONDS_TO_SECONDS) > expiresAt;\n  }\n\n  /**\n   * Timing-safe string comparison to prevent timing attacks\n   *\n   * @param a - First string\n   * @param b - Second string\n   * @returns true if strings are equal\n   */\n  private static timingSafeEqual(a: string, b: string): boolean {\n    if (a.length !== b.length) {\n      return false;\n    }\n\n    const bufA = Buffer.from(a);\n    const bufB = Buffer.from(b);\n\n    return crypto.timingSafeEqual(bufA, bufB);\n  }\n}\n\n/**\n * Generate a signed download URL (convenience function)\n *\n * @param baseUrl - Base URL\n * @param filePath - File path\n * @param secret - Secret key\n * @param expiresIn - Expiration in seconds (default: 3600)\n * @returns Signed URL\n */\nexport function generateSignedDownloadUrl(\n  baseUrl: string,\n  filePath: string,\n  secret: string,\n  expiresIn: number = SIGNED_URL_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS\n): string {\n  return SignedUrlGenerator.generateDownloadUrl(baseUrl, filePath, secret, expiresIn);\n}\n\n/**\n * Generate a signed upload URL (convenience function)\n *\n * @param baseUrl - Base URL\n * @param uploadPath - Upload path\n * @param secret - Secret key\n * @param options - Upload options\n * @returns Signed URL\n */\nexport function generateSignedUploadUrl(\n  baseUrl: string,\n  uploadPath: string,\n  secret: string,\n  options: StorageSignedUrlOptions & { maxFileSize?: number }\n): string {\n  return SignedUrlGenerator.generateUploadUrl(baseUrl, uploadPath, secret, options);\n}\n\n/**\n * Verify a signed URL (convenience function)\n *\n * @param signedUrl - Signed URL\n * @param secret - Secret key\n * @param requestIp - Request IP address\n * @param algorithm - Hash algorithm (default: 'sha256')\n * @returns Verification result\n */\nexport function verifySignedUrl(\n  signedUrl: string,\n  secret: string,\n  requestIp?: string,\n  algorithm?: StorageHashAlgorithm\n): StorageVerificationResult {\n  return SignedUrlGenerator.verifySignedUrl(signedUrl, secret, requestIp, algorithm);\n}\n","/**\n * Simple Logger - Temporary implementation\n * TODO: Replace with @plyaz/logger post-MVP\n *\n * This is a minimal console-based logger for MVP.\n * Later we'll swap this with the full @plyaz/logger package.\n */\n\nimport type { LoggerInterface, LoggerMethodTypes as LogLevel } from '@plyaz/types';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../errors';\n\n// Import production logger\nimport { StorageLogger } from '@plyaz/logger';\n\nexport { StorageLogger };\n\n/**\n * Console-based logger implementation\n * Mimics @plyaz/logger interface for easy swap later\n */\nexport class ConsoleLogger implements LoggerInterface {\n  constructor(\n    private context?: string,\n    private minLevel: LogLevel = 'info'\n  ) {}\n\n  private shouldLog(level: LogLevel): boolean {\n    const levels: Array<LogLevel> = ['debug', 'info', 'warn', 'error', 'fatal'];\n    const minLevelIndex = levels.indexOf(this.minLevel);\n    const currentLevelIndex = levels.indexOf(level);\n    return currentLevelIndex >= minLevelIndex;\n  }\n\n  private formatMessage(level: LogLevel, message: string, meta?: Record<string, unknown>): string {\n    const timestamp = new Date().toISOString();\n    const contextStr = this.context ? `[${this.context}]` : '';\n    const metaStr = meta ? ` ${JSON.stringify(meta)}` : '';\n    return `${timestamp} ${level.toUpperCase()} ${contextStr} ${message}${metaStr}`;\n  }\n\n  debug(message: string, meta?: Record<string, unknown>): void {\n    if (this.shouldLog('debug')) {\n      console.debug(this.formatMessage('debug', message, meta));\n    }\n  }\n\n  info(message: string, meta?: Record<string, unknown>): void {\n    if (this.shouldLog('info')) {\n      console.info(this.formatMessage('info', message, meta));\n    }\n  }\n\n  warn(message: string, meta?: Record<string, unknown>): void {\n    if (this.shouldLog('warn')) {\n      console.warn(this.formatMessage('warn', message, meta));\n    }\n  }\n\n  error(message: string, meta?: Record<string, unknown>): void {\n    if (this.shouldLog('error')) {\n      console.error(this.formatMessage('error', message, meta));\n    }\n  }\n\n  fatal(message: string, meta?: Record<string, unknown>): void {\n    // Fatal logs always output, marked as FATAL\n    console.error(this.formatMessage('fatal', `FATAL: ${message}`, meta));\n  }\n\n  group(label?: string): void {\n    if (typeof console !== 'undefined' && typeof console.group === 'function') {\n      console.group(label);\n    }\n  }\n\n  groupCollapsed(label?: string): void {\n    if (typeof console !== 'undefined' && typeof console.groupCollapsed === 'function') {\n      console.groupCollapsed(label);\n    }\n  }\n\n  groupEnd(): void {\n    if (typeof console !== 'undefined' && typeof console.groupEnd === 'function') {\n      console.groupEnd();\n    }\n  }\n}\n\n/**\n * Create a logger instance (synchronous)\n *\n * @param options - Logger configuration\n * @param options.service - Service/module name\n * @param options.level - Minimum log level\n * @returns ConsoleLogger instance\n *\n * @example\n * ```ts\n * // Simple console logger\n * const logger = createLogger({ service: 'CloudflareR2Adapter' });\n * logger.info('File uploaded', { fileId: '123' });\n * ```\n */\nexport function createLogger(options?: { service?: string; level?: LogLevel }): LoggerInterface {\n  return new ConsoleLogger(options?.service, options?.level);\n}\n\n/**\n * Create a production logger instance\n *\n * Uses @plyaz/logger's StorageLogger with structured logging,\n * PII redaction, and correlation IDs.\n *\n * @param options - Logger configuration\n * @param options.service - Service/module name\n * @param options.level - Minimum log level\n * @returns StorageLogger instance\n * @throws {StoragePackageError} If initialization fails\n *\n * @example\n * ```ts\n * // Production logger with structured logging\n * const logger = createProductionLogger({\n *   service: 'CloudflareR2Adapter',\n *   level: 'info'\n * });\n *\n * // Use specialized methods\n * logger.adapterInfo('File uploaded', {\n *   adapter: 'cloudflare-r2',\n *   fileId: '123',\n *   filename: 'profile.jpg',\n *   size: 2048576\n * });\n * ```\n */\nexport function createProductionLogger(options?: {\n  service?: string;\n  level?: LogLevel;\n}): LoggerInterface {\n  try {\n    return new StorageLogger({\n      service: options?.service,\n      minLevel: options?.level,\n    });\n  } catch (error) {\n    // Throw proper error if initialization fails\n    throw new StoragePackageError(\n      'Failed to initialize StorageLogger. Ensure @plyaz/logger is properly built.',\n      STORAGE_ERROR_CODES.INITIALIZATION_FAILED,\n      {\n        context: {\n          service: options?.service,\n          requestedLevel: options?.level,\n          originalError: error instanceof Error ? error.message : String(error),\n        },\n      }\n    );\n  }\n}\n","/**\n * LayoutEngine\n *\n * Manages document layouts (headers, footers, wrappers) for PDF/document generation.\n *\n * Features:\n * - Load layouts from filesystem (JSON format)\n * - Locale-based layout resolution with fallback\n * - Header/footer/wrapper support\n * - Handlebars variable support in layouts\n * - Layout caching for performance\n * - Integrates with TemplateEngine\n *\n * Layout Structure:\n * ```\n * templates/layouts/\n *   ├── en/\n *   │   ├── headers/\n *   │   │   ├── default.html\n *   │   │   └── invoice.html\n *   │   ├── footers/\n *   │   │   ├── default.html\n *   │   │   └── invoice.html\n *   │   ├── wrappers/\n *   │   │   ├── default.html\n *   │   │   └── invoice.html\n *   │   ├── default.html (shorthand for full layout)\n *   │   └── invoice.md (can be .md or .html)\n * ```\n *\n * Template Frontmatter Options:\n * ```yaml\n * # Option 1: Full wrapper layout\n * layout: invoice  # Uses templates/layouts/{locale}/invoice.html\n *\n * # Option 2: Separate header/footer\n * header: invoice  # Uses templates/layouts/{locale}/headers/invoice.html\n * footer: default  # Uses templates/layouts/{locale}/footers/default.html\n *\n * # Option 3: Custom wrapper with header/footer\n * wrapper: custom  # Uses templates/layouts/{locale}/wrappers/custom.html\n * header: invoice\n * footer: invoice\n *\n * # Option 4: Mix and match\n * header: invoice\n * footer: default\n * # No wrapper, just header + content + footer\n * ```\n */\n\nimport { readFile, access } from 'fs/promises';\nimport { join } from 'path';\nimport Handlebars, { type TemplateDelegate as HandlebarsTemplateDelegate } from 'handlebars';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../errors';\nimport type { StorageLayoutEngineConfig, StorageAppliedLayout } from '@plyaz/types/storage';\nimport type { LoggerInterface } from '@plyaz/types';\n\n/**\n * Layout component cache entry\n * Used for caching compiled layout components (headers, footers, wrappers, full layouts)\n */\ninterface LayoutComponentCacheEntry {\n  /** Raw content (HTML or Markdown) */\n  content: string;\n  /** Compiled Handlebars template */\n  compiled: HandlebarsTemplateDelegate;\n  /** File type (.html or .md) */\n  fileType: 'html' | 'md';\n  /** Cached timestamp */\n  cachedAt: number;\n  /** Time to live */\n  ttl: number;\n}\n\n/**\n * Layout component type\n */\ntype LayoutComponentType = 'layout' | 'header' | 'footer' | 'wrapper';\n\n/**\n * Layout Engine constants\n */\nconst LAYOUT_ENGINE_CONSTANTS = {\n  DEFAULT_CACHE_TTL_MS: 300000, // 5 minutes\n} as const;\n\n/**\n * LayoutEngine\n *\n * Manages document layouts (headers, footers, wrappers).\n *\n * @example\n * ```typescript\n * const layoutEngine = new LayoutEngine({\n *   basePath: './layouts',\n *   defaultLocale: 'en',\n * });\n *\n * // Apply layout to content\n * const result = await layoutEngine.applyLayout(\n *   htmlContent,\n *   'invoice',\n *   { companyName: 'Acme Corp', pageNumber: 1 },\n *   'en'\n * );\n * ```\n */\nexport class LayoutEngine {\n  private readonly basePath: string;\n  private readonly defaultLocale: string;\n  private readonly cacheEnabled: boolean;\n  private readonly cacheTTL: number;\n  private readonly logger?: LoggerInterface;\n  private readonly layoutCache: Map<string, LayoutComponentCacheEntry> = new Map();\n\n  // eslint-disable-next-line complexity\n  constructor(config?: StorageLayoutEngineConfig) {\n    this.basePath = config?.basePath ?? join(process.cwd(), 'templates', 'layouts');\n    this.defaultLocale = config?.defaultLocale ?? 'en';\n    this.cacheEnabled = config?.cacheEnabled ?? true;\n    this.cacheTTL = config?.cacheTTL ?? LAYOUT_ENGINE_CONSTANTS.DEFAULT_CACHE_TTL_MS; // 5 minutes\n    this.logger = config?.logger;\n\n    this.logger?.info('[LayoutEngine] Initialized', {\n      basePath: this.basePath,\n      defaultLocale: this.defaultLocale,\n      cacheEnabled: this.cacheEnabled,\n      cacheTTL: this.cacheTTL,\n    });\n  }\n\n  /**\n   * Apply layout to content\n   *\n   * @param content - HTML content to wrap\n   * @param layoutName - Layout name (e.g., 'invoice', 'default')\n   * @param data - Data for Handlebars variables\n   * @param locale - Locale for layout resolution (default: engine's defaultLocale)\n   * @returns Applied layout result\n   */\n  async applyLayout(\n    content: string,\n    layoutName: string,\n    data: Record<string, unknown> = {},\n    locale?: string\n  ): Promise<StorageAppliedLayout> {\n    const resolvedLocale = locale ?? this.defaultLocale;\n\n    this.logger?.debug('[LayoutEngine] Applying layout', {\n      layoutName,\n      locale: resolvedLocale,\n      contentLength: content.length,\n    });\n\n    // Load layout\n    const layoutEntry = await this.loadLayout(layoutName, resolvedLocale);\n\n    // Prepare data with content\n    const layoutData = {\n      ...data,\n      content, // Available as {{{content}}} in the layout template\n    };\n\n    // Apply layout template\n    const html = layoutEntry.compiled(layoutData);\n\n    this.logger?.debug('[LayoutEngine] Layout applied', {\n      layoutName,\n      locale: resolvedLocale,\n      originalLength: content.length,\n      resultLength: html.length,\n    });\n\n    return {\n      html,\n      layoutName,\n      locale: resolvedLocale,\n    };\n  }\n\n  /**\n   * Apply layout from template frontmatter (flexible mode)\n   *\n   * Supports multiple layout modes:\n   * 1. layout: Full wrapper template\n   * 2. header + footer: Separate components\n   * 3. wrapper + header + footer: All three\n   * 4. wrapper only: Just wrap content\n   *\n   * @param content - HTML content to wrap\n   * @param frontmatter - Template frontmatter with layout specifications\n   * @param data - Data for Handlebars variables\n   * @param locale - Locale for layout resolution\n   * @returns Applied layout result\n   */\n  // eslint-disable-next-line complexity\n  async applyLayoutFromFrontmatter(\n    content: string,\n    frontmatter: {\n      layout?: string;\n      header?: string;\n      footer?: string;\n      wrapper?: string;\n      styling?: Record<string, string>;\n      css?: string;\n      [key: string]: unknown;\n    },\n    data: Record<string, unknown> = {},\n    locale?: string\n  ): Promise<StorageAppliedLayout> {\n    const resolvedLocale = locale ?? this.defaultLocale;\n    const { layout, header, footer, wrapper, styling, css, ...otherFrontmatter } = frontmatter;\n\n    // Merge styling and other frontmatter fields into data for layout templates\n    // This enables CSS variables like {{#if styling.primaryColor}}{{styling.primaryColor}}{{else}}#2563eb{{/if}}\n    const mergedData = {\n      ...data,\n      styling,\n      css,\n      ...otherFrontmatter,\n    };\n\n    this.logger?.debug('[LayoutEngine] Applying layout from frontmatter', {\n      layout,\n      header,\n      footer,\n      wrapper,\n      hasStyling: !!styling,\n      locale: resolvedLocale,\n    });\n\n    // Priority 1: Full layout template (shorthand)\n    if (layout) {\n      const result = await this.applyLayout(content, layout, mergedData, resolvedLocale);\n      const html = this.injectCustomCSS(result.html, css);\n      return html !== result.html ? { ...result, html } : result;\n    }\n\n    // Priority 2: Build from components\n    let html = content;\n    const layoutData = { ...mergedData, content };\n    const componentsUsed: string[] = [];\n\n    // Apply wrapper first if specified\n    if (wrapper) {\n      const wrapperComponent = await this.loadLayoutComponent(wrapper, 'wrapper', resolvedLocale);\n      html = wrapperComponent.compiled(layoutData);\n      componentsUsed.push(`wrapper:${wrapper}`);\n      this.logger?.debug('[LayoutEngine] Wrapper applied', { wrapper });\n    }\n\n    // Apply header (if no wrapper, or if wrapper expects separate header/footer)\n    if (header && !wrapper) {\n      const headerComponent = await this.loadLayoutComponent(header, 'header', resolvedLocale);\n      const headerHtml = headerComponent.compiled(mergedData);\n      html = headerHtml + '\\n' + html;\n      componentsUsed.push(`header:${header}`);\n      this.logger?.debug('[LayoutEngine] Header applied', { header });\n    }\n\n    // Apply footer (if no wrapper, or if wrapper expects separate header/footer)\n    if (footer && !wrapper) {\n      const footerComponent = await this.loadLayoutComponent(footer, 'footer', resolvedLocale);\n      const footerHtml = footerComponent.compiled(mergedData);\n      html = html + '\\n' + footerHtml;\n      componentsUsed.push(`footer:${footer}`);\n      this.logger?.debug('[LayoutEngine] Footer applied', { footer });\n    }\n\n    const layoutName = componentsUsed.join('+') ?? 'none';\n\n    // Inject custom CSS from frontmatter if present\n    html = this.injectCustomCSS(html, css);\n\n    this.logger?.debug('[LayoutEngine] Layout from frontmatter applied', {\n      layoutName,\n      locale: resolvedLocale,\n      resultLength: html.length,\n    });\n\n    return {\n      html,\n      layoutName,\n      locale: resolvedLocale,\n    };\n  }\n\n  /**\n   * Load layout component from filesystem with caching\n   *\n   * Supports both .html and .md files\n   * Tries: {locale}/{type}/{name}.html then {locale}/{type}/{name}.md\n   * Falls back to base locale and default locale\n   *\n   * @param componentName - Component name\n   * @param componentType - Component type (header/footer/wrapper)\n   * @param locale - Locale\n   * @returns Cached layout component\n   * @private\n   */\n  private async loadLayoutComponent(\n    componentName: string,\n    componentType: LayoutComponentType,\n    locale: string\n  ): Promise<LayoutComponentCacheEntry> {\n    const cacheKey = `${locale}:${componentType}:${componentName}`;\n\n    // Check cache\n    if (this.cacheEnabled) {\n      const cached = this.layoutCache.get(cacheKey);\n      if (cached && Date.now() - cached.cachedAt < cached.ttl) {\n        this.logger?.debug('[LayoutEngine] Component loaded from cache', { cacheKey });\n        return cached;\n      }\n    }\n\n    // Resolve component path with locale fallback (tries .html then .md)\n    const { path: componentPath, fileType } = await this.resolveLayoutComponentPath(\n      componentName,\n      componentType,\n      locale\n    );\n\n    this.logger?.debug('[LayoutEngine] Loading component from filesystem', {\n      componentName,\n      componentType,\n      locale,\n      path: componentPath,\n      fileType,\n    });\n\n    // Load component content\n    const content = await this.readLayoutFile(componentPath);\n\n    // Compile Handlebars template\n    const compiled = Handlebars.compile(content);\n\n    // Create cache entry\n    const entry: LayoutComponentCacheEntry = {\n      content,\n      compiled,\n      fileType,\n      cachedAt: Date.now(),\n      ttl: this.cacheTTL,\n    };\n\n    // Cache it\n    if (this.cacheEnabled) {\n      this.layoutCache.set(cacheKey, entry);\n      this.logger?.debug('[LayoutEngine] Component cached', {\n        cacheKey,\n        cacheSize: this.layoutCache.size,\n      });\n    }\n\n    return entry;\n  }\n\n  /**\n   * Load layout from filesystem with caching (for full layout templates)\n   *\n   * @param layoutName - Layout name\n   * @param locale - Locale\n   * @returns Cached layout entry\n   * @private\n   */\n  private async loadLayout(layoutName: string, locale: string): Promise<LayoutComponentCacheEntry> {\n    const cacheKey = `${locale}:${layoutName}`;\n\n    // Check cache\n    if (this.cacheEnabled) {\n      const cached = this.layoutCache.get(cacheKey);\n      if (cached && Date.now() - cached.cachedAt < cached.ttl) {\n        this.logger?.debug('[LayoutEngine] Layout loaded from cache', { cacheKey });\n        return cached;\n      }\n    }\n\n    // Resolve layout path with locale fallback (tries .html then .md)\n    const { path: layoutPath, fileType } = await this.resolveLayoutComponentPath(\n      layoutName,\n      'layout',\n      locale\n    );\n\n    this.logger?.debug('[LayoutEngine] Loading layout from filesystem', {\n      layoutName,\n      locale,\n      path: layoutPath,\n      fileType,\n    });\n\n    // Load layout content\n    const content = await this.readLayoutFile(layoutPath);\n\n    // Compile Handlebars template\n    const compiled = Handlebars.compile(content);\n\n    // Create cache entry\n    const entry: LayoutComponentCacheEntry = {\n      content,\n      compiled,\n      fileType,\n      cachedAt: Date.now(),\n      ttl: this.cacheTTL,\n    };\n\n    // Cache it\n    if (this.cacheEnabled) {\n      this.layoutCache.set(cacheKey, entry);\n      this.logger?.debug('[LayoutEngine] Layout cached', {\n        cacheKey,\n        cacheSize: this.layoutCache.size,\n      });\n    }\n\n    return entry;\n  }\n\n  /**\n   * Resolve layout component path with locale fallback\n   *\n   * Supports both .html and .md files\n   * Tries in order:\n   * 1. Exact locale with .html (e.g., en-US/headers/invoice.html)\n   * 2. Exact locale with .md (e.g., en-US/headers/invoice.md)\n   * 3. Base locale with .html (e.g., en/headers/invoice.html)\n   * 4. Base locale with .md\n   * 5. Default locale with .html\n   * 6. Default locale with .md\n   *\n   * @param componentName - Component name\n   * @param componentType - Component type (layout/header/footer/wrapper)\n   * @param locale - Requested locale\n   * @returns Resolved path and file type\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private async resolveLayoutComponentPath(\n    componentName: string,\n    componentType: LayoutComponentType,\n    locale: string\n  ): Promise<{ path: string; fileType: 'html' | 'md' }> {\n    const baseLocale = locale.split('-')[0];\n    const fileTypes: ('html' | 'md')[] = ['html', 'md'];\n\n    // Determine subdirectory based on component type\n    const subdir = componentType === 'layout' ? '' : `${componentType}s`; // headers, footers, wrappers\n\n    // Build search paths for locale resolution\n    const locales = [\n      locale,\n      ...(baseLocale !== locale ? [baseLocale] : []),\n      ...(locale !== this.defaultLocale && baseLocale !== this.defaultLocale\n        ? [this.defaultLocale]\n        : []),\n    ];\n\n    const searchedPaths: string[] = [];\n\n    // Try each locale + file type combination\n    for (const loc of locales) {\n      for (const fileType of fileTypes) {\n        const fileName = `${componentName}.${fileType}`;\n        const componentPath = subdir\n          ? join(this.basePath, loc, subdir, fileName)\n          : join(this.basePath, loc, fileName);\n\n        searchedPaths.push(componentPath);\n\n        if (await this.fileExists(componentPath)) {\n          this.logLocaleFallback(loc, locale, componentType, componentName);\n          return { path: componentPath, fileType };\n        }\n      }\n    }\n\n    // Component not found\n    throw new StoragePackageError(\n      `Layout component not found: ${componentType}/${componentName} (locale: ${locale})`,\n      STORAGE_ERROR_CODES.TEMPLATE_NOT_FOUND,\n      {\n        context: {\n          componentName,\n          componentType,\n          locale,\n          searchedPaths,\n        },\n      }\n    );\n  }\n\n  /**\n   * Read layout file from filesystem\n   *\n   * @param path - Absolute path to layout file\n   * @returns Layout JSON content\n   * @private\n   */\n  private async readLayoutFile(path: string): Promise<string> {\n    try {\n      return await readFile(path, 'utf-8');\n    } catch (error) {\n      throw new StoragePackageError(\n        `Failed to read layout file: ${path}`,\n        STORAGE_ERROR_CODES.TEMPLATE_NOT_FOUND,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: { path },\n        }\n      );\n    }\n  }\n\n  /**\n   * Check if file exists\n   *\n   * @param path - File path\n   * @returns True if file exists\n   * @private\n   */\n  private async fileExists(path: string): Promise<boolean> {\n    try {\n      await access(path);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Clear layout cache\n   */\n  clearCache(): void {\n    const size = this.layoutCache.size;\n    this.layoutCache.clear();\n    this.logger?.info('[LayoutEngine] Cache cleared', { entriesCleared: size });\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getCacheStats(): { size: number; entries: string[] } {\n    return {\n      size: this.layoutCache.size,\n      entries: Array.from(this.layoutCache.keys()),\n    };\n  }\n\n  /**\n   * Helper: Log locale fallback when using different locale than requested\n   */\n  private logLocaleFallback(\n    loc: string,\n    locale: string,\n    componentType: string,\n    componentName: string\n  ): void {\n    if (loc !== locale) {\n      this.logger?.debug('[LayoutEngine] Falling back to different locale', {\n        requestedLocale: locale,\n        foundLocale: loc,\n        componentType,\n        componentName,\n      });\n    }\n  }\n\n  /**\n   * Inject custom CSS from frontmatter into HTML\n   *\n   * Inserts CSS block before </head>, before <body>, or prepends to content\n   *\n   * @param html - HTML content\n   * @param css - CSS string from frontmatter\n   * @returns HTML with injected CSS (or original if no CSS)\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private injectCustomCSS(html: string, css: string | undefined): string {\n    if (!css || typeof css !== 'string' || !css.trim()) {\n      return html;\n    }\n\n    const cssBlock = `\\n<style type=\"text/css\">\\n/* Custom CSS from frontmatter */\\n${css.trim()}\\n</style>\\n`;\n\n    if (html.includes('</head>')) {\n      this.logger?.debug('[LayoutEngine] Custom CSS injected before </head>', {\n        cssLength: css.length,\n      });\n      return html.replace('</head>', `${cssBlock}</head>`);\n    }\n\n    if (html.includes('<body>')) {\n      this.logger?.debug('[LayoutEngine] Custom CSS injected before <body>', {\n        cssLength: css.length,\n      });\n      return html.replace('<body>', `${cssBlock}<body>`);\n    }\n\n    this.logger?.debug('[LayoutEngine] Custom CSS prepended to content', {\n      cssLength: css.length,\n    });\n    return cssBlock + html;\n  }\n}\n","/**\n * Base Storage Plugin\n * @module @plyaz/storage/plugins\n *\n * Abstract base class for all storage plugins.\n * Provides default implementations and helper methods.\n */\n\nimport type {\n  StoragePlugin,\n  STORAGE_PLUGIN_TYPE,\n  StoragePluginContext,\n  StoragePluginFile,\n  StoragePluginUploadResult,\n  StoragePluginDeleteResult,\n  StoragePluginAccessEvent,\n  StoragePluginHealth,\n  BeforeUploadResult,\n  BeforeDeleteResult,\n  FileMetadata,\n  BasePluginConfig,\n} from '@plyaz/types/storage';\nimport type { StorageLogger } from '../../core/logger';\nimport type { BaseStorageAdapter } from '../../adapters/base/BaseStorageAdapter';\nimport { createApiClient, setDefaultApiClient } from '@plyaz/api';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types';\nimport { StoragePackageError } from '@plyaz/errors';\n\n/**\n * BasePlugin constants\n */\nconst BASE_PLUGIN_CONSTANTS = {\n  DEFAULT_PRIORITY: 50, // Middle priority\n} as const;\n\n/**\n * Abstract Base Plugin\n *\n * Provides common functionality for all storage plugins:\n * - Default implementations for optional hooks\n * - Helper methods for context creation\n * - Health check support\n * - Lifecycle management\n *\n * @example\n * ```typescript\n * class VirusScanPlugin extends BasePlugin {\n *   constructor(config: VirusScanConfig) {\n *     super({\n *       name: 'virus-scan',\n *       type: STORAGE_PLUGIN_TYPE.SECURITY,\n *       priority: 10, // Run first\n *       version: '1.0.0',\n *       description: 'Scans files for viruses before upload',\n *     });\n *   }\n *\n *   async beforeUpload(file: StoragePluginFile, context: StoragePluginContext): Promise<BeforeUploadResult> {\n *     const result = await this.scanFile(file.buffer);\n *     if (result.infected) {\n *       return { allowed: false, reason: `Virus detected: ${result.virusName}` };\n *     }\n *     return { allowed: true };\n *   }\n * }\n * ```\n */\nexport abstract class BasePlugin implements StoragePlugin {\n  readonly name: string;\n  readonly type: STORAGE_PLUGIN_TYPE;\n  readonly priority: number;\n  readonly version?: string;\n  readonly description?: string;\n  enabled: boolean;\n\n  protected readonly logger?: StorageLogger;\n  protected initialized = false;\n\n  // Storage adapter for file operations (can be updated dynamically)\n  protected storageAdapter?: BaseStorageAdapter;\n\n  // API client for REST API-based plugins (optional)\n  private apiClient: Awaited<ReturnType<typeof createApiClient>> | null = null;\n  private clientInitPromise: Promise<void> | null = null;\n  private readonly apiClientConfig?: BasePluginConfig['apiClientConfig'];\n\n  constructor(config: BasePluginConfig) {\n    this.name = config.name;\n    this.type = config.type;\n    this.priority = config.priority ?? BASE_PLUGIN_CONSTANTS.DEFAULT_PRIORITY;\n    this.version = config.version;\n    this.description = config.description;\n    this.enabled = config.enabled ?? true;\n    this.logger = config.logger as StorageLogger | undefined;\n    this.apiClientConfig = config.apiClientConfig;\n\n    // Initialize API client if config provided\n    if (this.apiClientConfig) {\n      this.initializeApiClient();\n    }\n  }\n\n  /**\n   * Initialize the plugin\n   * Override to perform setup (connections, validation, etc.)\n   */\n  async initialize(): Promise<void> {\n    if (this.initialized) {\n      this.logger?.warn(`Plugin ${this.name} already initialized`);\n      return;\n    }\n\n    this.logger?.info(`Initializing plugin: ${this.name}`, {\n      type: this.type,\n      priority: this.priority,\n      version: this.version,\n    });\n\n    this.initialized = true;\n  }\n\n  /**\n   * Cleanup the plugin\n   * Override to release resources (close connections, etc.)\n   */\n  async destroy(): Promise<void> {\n    if (!this.initialized) {\n      return;\n    }\n\n    this.logger?.info(`Destroying plugin: ${this.name}`);\n    this.initialized = false;\n  }\n\n  /**\n   * Set the storage adapter for file operations\n   * Called by PluginRegistry when adapter is registered or updated\n   *\n   * @param adapter - Storage adapter instance\n   */\n  setStorageAdapter(adapter: BaseStorageAdapter): void {\n    this.storageAdapter = adapter;\n    this.logger?.debug(`Storage adapter set for plugin: ${this.name}`);\n  }\n\n  /**\n   * Get the current storage adapter\n   * Prefer using context.storageAdapter in hooks as it may be operation-specific\n   *\n   * @returns Current storage adapter or undefined if not set\n   */\n  protected getStorageAdapter(): BaseStorageAdapter | undefined {\n    return this.storageAdapter;\n  }\n\n  /**\n   * Initialize API client for REST API-based plugins\n   * SDK-based plugins do NOT need this\n   */\n  private initializeApiClient(): void {\n    if (this.clientInitPromise || !this.apiClientConfig) {\n      return;\n    }\n\n    this.clientInitPromise = (async () => {\n      try {\n        this.apiClient = await createApiClient(this.apiClientConfig!);\n        setDefaultApiClient(this.apiClient);\n\n        this.logger?.debug('API client initialized', {\n          plugin: this.name,\n          baseURL: this.apiClientConfig!.baseURL,\n        });\n      } catch (error) {\n        this.logger?.error('Failed to initialize API client', {\n          plugin: this.name,\n          error: error instanceof Error ? error.message : String(error),\n        });\n        throw error;\n      }\n    })();\n  }\n\n  /**\n   * Ensure API client is initialized (for REST API plugins)\n   * Call this before making API requests\n   */\n  protected async ensureApiClientInitialized(): Promise<void> {\n    if (this.clientInitPromise) {\n      await this.clientInitPromise;\n    }\n    if (this.apiClientConfig && !this.apiClient) {\n      throw new StoragePackageError(\n        'API client initialization timeout',\n        STORAGE_ERROR_CODES.ADAPTER_TIMEOUT,\n        {\n          context: { plugin: this.name },\n        }\n      );\n    }\n  }\n\n  /**\n   * Get API client for making HTTP requests\n   * Returns null if API client not configured\n   * Subclasses can use this for REST API calls\n   */\n  protected getApiClient(): Awaited<ReturnType<typeof createApiClient>> | null {\n    return this.apiClient;\n  }\n\n  /**\n   * Check plugin health\n   * Override to provide custom health checks\n   */\n  async healthCheck(): Promise<StoragePluginHealth> {\n    return {\n      plugin: this.name,\n      healthy: this.initialized && this.enabled,\n      message:\n        this.initialized && this.enabled\n          ? 'Plugin is healthy'\n          : 'Plugin is not initialized or disabled',\n      lastCheck: new Date(),\n    };\n  }\n\n  /**\n   * PRE-UPLOAD HOOK (BLOCKING)\n   * Override to implement custom logic\n   * Default: Allow all uploads\n   */\n  async beforeUpload?(\n    file: StoragePluginFile,\n    context: StoragePluginContext\n  ): Promise<BeforeUploadResult>;\n\n  /**\n   * POST-UPLOAD HOOK (ASYNC)\n   * Override to implement custom logic\n   * Default: No action\n   */\n  async afterUpload?(\n    result: StoragePluginUploadResult,\n    context: StoragePluginContext\n  ): Promise<void>;\n\n  /**\n   * PRE-DELETE HOOK (BLOCKING)\n   * Override to implement custom logic\n   * Default: Allow all deletions\n   */\n  async beforeDelete?(\n    fileId: string,\n    metadata: FileMetadata | undefined,\n    context: StoragePluginContext\n  ): Promise<BeforeDeleteResult>;\n\n  /**\n   * POST-DELETE HOOK (ASYNC)\n   * Override to implement custom logic\n   * Default: No action\n   */\n  async afterDelete?(\n    result: StoragePluginDeleteResult,\n    context: StoragePluginContext\n  ): Promise<void>;\n\n  /**\n   * ON-ACCESS HOOK (ASYNC)\n   * Override to implement custom logic\n   * Default: No action\n   */\n  async onAccess?(event: StoragePluginAccessEvent, context: StoragePluginContext): Promise<void>;\n\n  /**\n   * Helper: Create plugin context\n   */\n  protected createContext(\n    operation: 'upload' | 'delete' | 'access' | 'update',\n    storageAdapter: BaseStorageAdapter,\n    options?: {\n      userId?: string;\n      correlationId?: string;\n      metadata?: Record<string, unknown>;\n    }\n  ): StoragePluginContext {\n    return {\n      operation,\n      timestamp: new Date(),\n      userId: options?.userId,\n      correlationId: options?.correlationId,\n      metadata: options?.metadata,\n      storageAdapter,\n    };\n  }\n\n  /**\n   * Helper: Check if plugin should execute\n   */\n  protected shouldExecute(): boolean {\n    return this.enabled && this.initialized;\n  }\n\n  /**\n   * Helper: Log with plugin context\n   */\n  // eslint-disable-next-line complexity\n  protected log(\n    level: 'debug' | 'info' | 'warn' | 'error',\n    message: string,\n    meta?: Record<string, unknown>\n  ): void {\n    const logData = {\n      plugin: this.name,\n      type: this.type,\n      ...meta,\n    };\n\n    switch (level) {\n      case 'debug':\n        this.logger?.debug(message, logData);\n        break;\n      case 'info':\n        this.logger?.info(message, logData);\n        break;\n      case 'warn':\n        this.logger?.warn(message, logData);\n        break;\n      case 'error':\n        this.logger?.error(message, logData);\n        break;\n    }\n  }\n}\n","/**\n * Base Virus Scan Provider\n * Abstract class providing common functionality for virus scan providers\n */\n\nimport type {\n  VirusScanProvider,\n  VirusScanResult,\n  VirusScanProviderConfig,\n} from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../../../../errors';\nimport type { createApiClient } from '@plyaz/api';\n\n/**\n * Base Virus Scan Provider constants\n */\nconst BASE_VIRUS_SCAN_CONSTANTS = {\n  DEFAULT_TIMEOUT_MS: 30000,\n  BYTES_PER_KB: 1024,\n  KB_PER_MB: 1024,\n  DEFAULT_MAX_FILE_SIZE_MB: 650,\n  MIN_TIMEOUT_MS: 1000,\n  MB_DIVISOR: 2,\n} as const;\n\nconst MB_IN_BYTES = BASE_VIRUS_SCAN_CONSTANTS.BYTES_PER_KB * BASE_VIRUS_SCAN_CONSTANTS.KB_PER_MB;\n\n/**\n * Abstract base class for virus scan providers\n * Provides common functionality like validation, error handling, and statistics\n */\nexport abstract class BaseVirusScanProvider implements VirusScanProvider {\n  abstract readonly providerName: string;\n\n  protected readonly config: VirusScanProviderConfig;\n  protected scansPerformed: number = 0;\n  protected threatsDetected: number = 0;\n  protected totalScanTime: number = 0;\n\n  // API client getter (provided by plugin)\n  protected apiClientGetter?: () => Awaited<ReturnType<typeof createApiClient>> | null;\n\n  constructor(config: VirusScanProviderConfig = {}) {\n    this.config = {\n      timeout: BASE_VIRUS_SCAN_CONSTANTS.DEFAULT_TIMEOUT_MS, // 30 seconds default\n      maxFileSize: BASE_VIRUS_SCAN_CONSTANTS.DEFAULT_MAX_FILE_SIZE_MB * MB_IN_BYTES, // 650 MB default (VirusTotal free limit)\n      verbose: false,\n      ...config,\n    };\n\n    // Validate configuration\n    this.validateConfig();\n  }\n\n  /**\n   * Set API client getter (called by plugin after provider creation)\n   * Allows provider to access the plugin's API client\n   */\n  setApiClientGetter(getter: () => Awaited<ReturnType<typeof createApiClient>> | null): void {\n    this.apiClientGetter = getter;\n  }\n\n  /**\n   * Validate provider configuration\n   * Override in subclasses for provider-specific validation\n   */\n  protected validateConfig(): void {\n    if (this.config.timeout && this.config.timeout < BASE_VIRUS_SCAN_CONSTANTS.MIN_TIMEOUT_MS) {\n      throw new StoragePackageError(\n        `Timeout must be at least ${BASE_VIRUS_SCAN_CONSTANTS.MIN_TIMEOUT_MS}ms`,\n        STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID\n      );\n    }\n\n    if (this.config.maxFileSize && this.config.maxFileSize < 1) {\n      throw new StoragePackageError(\n        'Max file size must be positive',\n        STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID\n      );\n    }\n  }\n\n  /**\n   * Get API client for making HTTP requests\n   * Returns null if API client not configured or not set by plugin\n   * Subclasses should call this to get the API client\n   */\n  protected getApiClient(): Awaited<ReturnType<typeof createApiClient>> | null {\n    if (!this.apiClientGetter) {\n      return null;\n    }\n    return this.apiClientGetter();\n  }\n\n  /**\n   * Scan a file for viruses/malware\n   * Template method that handles validation and calls provider-specific scan\n   */\n  // eslint-disable-next-line complexity\n  async scan(file: Buffer, filename: string): Promise<VirusScanResult> {\n    const startTime = Date.now();\n\n    try {\n      // Validate file size\n      if (this.config.maxFileSize && file.length > this.config.maxFileSize) {\n        const fileSizeMB =\n          file.length /\n          BASE_VIRUS_SCAN_CONSTANTS.BYTES_PER_KB /\n          BASE_VIRUS_SCAN_CONSTANTS.KB_PER_MB;\n        const maxSizeMB =\n          this.config.maxFileSize /\n          BASE_VIRUS_SCAN_CONSTANTS.BYTES_PER_KB /\n          BASE_VIRUS_SCAN_CONSTANTS.KB_PER_MB;\n        throw new StoragePackageError(\n          `File size ${fileSizeMB.toFixed(BASE_VIRUS_SCAN_CONSTANTS.MB_DIVISOR)}MB exceeds maximum ${maxSizeMB.toFixed(BASE_VIRUS_SCAN_CONSTANTS.MB_DIVISOR)}MB`,\n          STORAGE_ERROR_CODES.FILE_TOO_LARGE\n        );\n      }\n\n      // Validate file is not empty\n      if (file.length === 0) {\n        throw new StoragePackageError(\n          'Cannot scan empty file',\n          STORAGE_ERROR_CODES.INVALID_FILE_CONTENT\n        );\n      }\n\n      // Perform provider-specific scan\n      const result = await this.scanFile(file, filename);\n\n      // Update statistics\n      const scanTime = Date.now() - startTime;\n      this.scansPerformed++;\n      this.totalScanTime += scanTime;\n\n      if (result.infected) {\n        this.threatsDetected++;\n      }\n\n      // Log if verbose\n      if (this.config.verbose) {\n        console.log(`[${this.providerName}] Scanned ${filename}:`, {\n          clean: result.clean,\n          infected: result.infected,\n          scanTime: `${scanTime}ms`,\n          threats: result.threats?.length ?? 0,\n        });\n      }\n\n      return {\n        ...result,\n        scanTime,\n        scanDate: new Date(),\n      };\n    } catch (error) {\n      // Re-throw StoragePackageError as-is\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n\n      // Wrap other errors\n      throw new StoragePackageError(\n        `Virus scan failed: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n        {\n          context: {\n            provider: this.providerName,\n            filename,\n            fileSize: file.length,\n          },\n        }\n      );\n    }\n  }\n\n  /**\n   * Provider-specific scan implementation\n   * Must be implemented by subclasses\n   */\n  protected abstract scanFile(file: Buffer, filename: string): Promise<VirusScanResult>;\n\n  /**\n   * Check if provider is available and healthy\n   * Override in subclasses for provider-specific health checks\n   */\n  async isAvailable(): Promise<boolean> {\n    return true;\n  }\n\n  /**\n   * Get provider statistics\n   */\n  async getStatistics(): Promise<{\n    scansPerformed: number;\n    threatsDetected: number;\n    averageScanTime: number;\n  }> {\n    return {\n      scansPerformed: this.scansPerformed,\n      threatsDetected: this.threatsDetected,\n      averageScanTime:\n        this.scansPerformed > 0 ? Math.round(this.totalScanTime / this.scansPerformed) : 0,\n    };\n  }\n\n  /**\n   * Reset statistics\n   */\n  resetStatistics(): void {\n    this.scansPerformed = 0;\n    this.threatsDetected = 0;\n    this.totalScanTime = 0;\n  }\n}\n","/**\n * Virus Scan Plugin\n * Scans files for viruses/malware before upload to storage\n * Supports multiple providers (VirusTotal, ClamAV, etc.)\n */\n\nimport { BasePlugin } from '../../base/BasePlugin';\nimport type {\n  StoragePluginFile,\n  StoragePluginContext,\n  BeforeUploadResult,\n  StoragePluginHealth,\n  STORAGE_PLUGIN_TYPE,\n  VirusScanProvider,\n  VirusScanPluginConfig,\n} from '@plyaz/types/storage';\nimport { BaseVirusScanProvider } from './base/BaseVirusScanProvider';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../../../errors';\n\n/**\n * Virus Scan Plugin constants\n */\nconst VIRUS_SCAN_CONSTANTS = {\n  DEFAULT_PRIORITY: 90,\n  DEFAULT_TIMEOUT_MS: 60000,\n} as const;\n\n/**\n * Virus Scan Plugin\n * Scans files for malware before upload using configurable providers\n *\n * @example\n * ```typescript\n * import { VirusScanPlugin, VirusTotalProvider } from '@plyaz/storage/plugins';\n *\n * const plugin = new VirusScanPlugin({\n *   provider: new VirusTotalProvider(),\n *   // API configuration for REST-based providers (managed by plugin)\n *   apiKey: process.env.VIRUSTOTAL_API_KEY!,\n *   apiEndpoint: 'https://www.virustotal.com/api/v3',\n *   priority: 90, // Run after size validation\n * });\n *\n * const service = new StorageService({\n *   adapters: [adapter],\n *   plugins: [plugin],\n * });\n * ```\n */\nexport class VirusScanPlugin extends BasePlugin {\n  private readonly provider: VirusScanProvider;\n  private readonly rejectOnError: boolean;\n  private readonly skipAboveSize?: number;\n  private readonly skipExtensions: Set<string>;\n\n  constructor(config: VirusScanPluginConfig) {\n    // Build API client config for REST-based providers (like VirusTotal)\n    const apiClientConfig =\n      config.apiKey && config.apiEndpoint\n        ? {\n            baseURL: config.apiEndpoint,\n            headers: {\n              'x-apikey': config.apiKey,\n            },\n            timeout: VIRUS_SCAN_CONSTANTS.DEFAULT_TIMEOUT_MS,\n          }\n        : undefined;\n\n    super({\n      name: 'virus-scan',\n      type: 'security' as STORAGE_PLUGIN_TYPE,\n      priority: config.priority ?? VIRUS_SCAN_CONSTANTS.DEFAULT_PRIORITY, // Default high priority for security\n      version: config.version,\n      description: config.description ?? `Virus scanning using ${config.provider.providerName}`,\n      enabled: config.enabled,\n      apiClientConfig, // Pass to BasePlugin for REST-based providers\n    });\n\n    this.provider = config.provider;\n\n    // Give provider access to plugin's API client (for REST-based providers)\n    if (this.provider instanceof BaseVirusScanProvider) {\n      this.provider.setApiClientGetter(() => this.getApiClient());\n    }\n\n    this.rejectOnError = config.rejectOnError ?? true;\n    this.skipAboveSize = config.skipAboveSize;\n    this.skipExtensions = new Set((config.skipExtensions ?? []).map(ext => ext.toLowerCase()));\n  }\n\n  /**\n   * Initialize the plugin\n   * Validates provider is available\n   */\n  async initialize(): Promise<void> {\n    this.log('info', 'Initializing virus scan plugin', {\n      provider: this.provider.providerName,\n      rejectOnError: this.rejectOnError,\n    });\n\n    // Check provider availability\n    const available = await this.provider.isAvailable();\n    if (!available) {\n      this.log('warn', `Provider ${this.provider.providerName} is not available`);\n\n      if (this.rejectOnError) {\n        throw new StoragePackageError(\n          `Virus scan provider ${this.provider.providerName} is not available`,\n          STORAGE_ERROR_CODES.PLUGIN_INITIALIZATION_FAILED\n        );\n      }\n    }\n\n    this.log('info', 'Virus scan plugin initialized successfully');\n  }\n\n  /**\n   * Scan file before upload (BLOCKING)\n   * Rejects upload if file is infected\n   */\n  // eslint-disable-next-line complexity\n  async beforeUpload(\n    file: StoragePluginFile,\n    _context: StoragePluginContext // eslint-disable-line no-unused-vars\n  ): Promise<BeforeUploadResult> {\n    // Check if we should skip this file\n    if (this.shouldSkipFile(file)) {\n      this.log('debug', `Skipping virus scan for ${file.filename}`);\n      return { allowed: true };\n    }\n\n    try {\n      this.log('info', `Scanning file ${file.filename} for viruses`, {\n        size: file.size,\n        mimeType: file.mimeType,\n        provider: this.provider.providerName,\n      });\n\n      // Perform virus scan\n      const scanResult = await this.provider.scan(file.buffer, file.filename);\n\n      // Log scan result\n      this.log('info', `Scan completed for ${file.filename}`, {\n        clean: scanResult.clean,\n        infected: scanResult.infected,\n        virusName: scanResult.virusName,\n        scanTime: scanResult.scanTime,\n        threats: scanResult.threats?.length ?? 0,\n      });\n\n      // Reject if infected\n      if (scanResult.infected) {\n        this.log('warn', `File ${file.filename} is infected`, {\n          virus: scanResult.virusName,\n          threats: scanResult.threats,\n        });\n\n        return {\n          allowed: false,\n          reason: `File rejected: ${scanResult.virusName ?? 'Malware detected'}`,\n          pluginData: {\n            virusScan: {\n              provider: this.provider.providerName,\n              infected: true,\n              virusName: scanResult.virusName,\n              threats: scanResult.threats,\n              scanId: scanResult.scanId,\n            },\n          },\n        };\n      }\n\n      // File is clean, add scan metadata\n      return {\n        allowed: true,\n        modifiedMetadata: {\n          customMetadata: {\n            virusScan: {\n              provider: this.provider.providerName,\n              scannedAt: scanResult.scanDate.toISOString(),\n              clean: true,\n              scanId: scanResult.scanId,\n              confidence: scanResult.confidence,\n            },\n          },\n        },\n      };\n    } catch (error) {\n      this.log('error', `Virus scan failed for ${file.filename}`, {\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      // Reject upload if configured to reject on error\n      if (this.rejectOnError) {\n        return {\n          allowed: false,\n          reason: `Virus scan failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n          pluginData: {\n            virusScan: {\n              error: error instanceof Error ? error.message : String(error),\n              provider: this.provider.providerName,\n            },\n          },\n        };\n      }\n\n      // Allow upload but log warning\n      this.log('warn', `Allowing upload despite scan failure (rejectOnError=false)`);\n      return {\n        allowed: true,\n        modifiedMetadata: {\n          customMetadata: {\n            virusScan: {\n              scannedAt: new Date().toISOString(),\n              error: 'Scan failed',\n              provider: this.provider.providerName,\n            },\n          },\n        },\n      };\n    }\n  }\n\n  /**\n   * Check if file should be skipped\n   */\n  private shouldSkipFile(file: StoragePluginFile): boolean {\n    // Skip if file is above size limit\n    if (this.skipAboveSize && file.size > this.skipAboveSize) {\n      return true;\n    }\n\n    // Skip if extension is in skip list\n    const extension = this.getFileExtension(file.filename);\n    if (extension && this.skipExtensions.has(extension.toLowerCase())) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Get file extension from filename\n   */\n  private getFileExtension(filename: string): string | null {\n    const lastDot = filename.lastIndexOf('.');\n    if (lastDot === -1) return null;\n    return filename.slice(lastDot);\n  }\n\n  /**\n   * Health check\n   */\n  async healthCheck(): Promise<StoragePluginHealth> {\n    try {\n      const available = await this.provider.isAvailable();\n\n      if (!available) {\n        return {\n          plugin: this.name,\n          healthy: false,\n          message: `Provider ${this.provider.providerName} is not available`,\n          lastCheck: new Date(),\n        };\n      }\n\n      // Get provider statistics if available\n      const stats = this.provider.getStatistics ? await this.provider.getStatistics() : undefined;\n\n      return {\n        plugin: this.name,\n        healthy: true,\n        message: stats\n          ? `Provider ${this.provider.providerName} is operational (scans: ${stats.scansPerformed}, threats: ${stats.threatsDetected})`\n          : `Provider ${this.provider.providerName} is operational`,\n        lastCheck: new Date(),\n      };\n    } catch (error) {\n      return {\n        plugin: this.name,\n        healthy: false,\n        message: 'Health check failed',\n        lastCheck: new Date(),\n        error: {\n          code: 'HEALTH_CHECK_FAILED',\n          message: error instanceof Error ? error.message : String(error),\n        },\n      };\n    }\n  }\n}\n","/**\n * VirusTotal Provider\n * Cloud-based virus scanning using VirusTotal API v3\n * Free tier: 500 requests/day, 650MB file size limit\n * Premium: Unlimited requests, larger files\n */\n\nimport type { VirusScanResult, VirusTotalProviderConfig } from '@plyaz/types/storage';\nimport { BaseVirusScanProvider } from '../base/BaseVirusScanProvider';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../../../../errors';\nimport { uploadFileForScanning, getAnalysisResult } from '@plyaz/api';\nimport type {\n  VirusTotalEngineResult,\n  VirusTotalGetAnalysisResponse,\n  VirusTotalUploadFileResponse,\n} from '@plyaz/types/api';\n\n/**\n * VirusTotal Provider constants\n */\nconst VIRUSTOTAL_CONSTANTS = {\n  DEFAULT_TIMEOUT_MS: 60000,\n  DEFAULT_MAX_FILE_SIZE_MB: 650,\n  BYTES_PER_KB: 1024,\n  KB_PER_MB: 1024,\n  DEFAULT_MAX_WAIT_TIME_MS: 60000,\n  DEFAULT_POLL_INTERVAL_MS: 5000,\n  PERCENTAGE_MULTIPLIER: 100,\n} as const;\n\nconst MB_IN_BYTES = VIRUSTOTAL_CONSTANTS.BYTES_PER_KB * VIRUSTOTAL_CONSTANTS.KB_PER_MB;\n\n/**\n * VirusTotal virus scan provider\n * Uses VirusTotal API v3 for cloud-based malware scanning\n */\nexport class VirusTotalProvider extends BaseVirusScanProvider {\n  readonly providerName = 'VirusTotal';\n\n  private readonly waitForResult: boolean;\n  private readonly maxWaitTime: number;\n  private readonly pollInterval: number;\n\n  constructor(config: VirusTotalProviderConfig = {}) {\n    super({\n      timeout: VIRUSTOTAL_CONSTANTS.DEFAULT_TIMEOUT_MS, // 60 seconds for API requests\n      maxFileSize: VIRUSTOTAL_CONSTANTS.DEFAULT_MAX_FILE_SIZE_MB * MB_IN_BYTES, // 650 MB (free tier limit)\n      ...config,\n    });\n\n    this.waitForResult = config.waitForResult ?? true;\n    this.maxWaitTime = config.maxWaitTime ?? VIRUSTOTAL_CONSTANTS.DEFAULT_MAX_WAIT_TIME_MS; // 1 minute default\n    this.pollInterval = config.pollInterval ?? VIRUSTOTAL_CONSTANTS.DEFAULT_POLL_INTERVAL_MS; // 5 seconds default\n  }\n\n  /**\n   * Scan a file using VirusTotal API\n   */\n  protected async scanFile(file: Buffer, filename: string): Promise<VirusScanResult> {\n    try {\n      const uploadResponse = await this.uploadFile(file, filename);\n      const analysisId = uploadResponse.data.id;\n\n      if (this.waitForResult) {\n        const analysis = await this.waitForAnalysis(analysisId);\n        return this.parseAnalysisResult(analysis, analysisId);\n      }\n\n      return {\n        clean: false, // Unknown until scan completes\n        infected: false,\n        scanTime: 0,\n        scanDate: new Date(),\n        scanId: analysisId,\n        metadata: {\n          status: 'queued',\n          message: 'Scan queued, check status with scanId',\n        },\n      };\n    } catch (error) {\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n\n      throw new StoragePackageError(\n        `VirusTotal scan failed: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n        {\n          context: {\n            provider: this.providerName,\n            filename,\n          },\n        }\n      );\n    }\n  }\n\n  /**\n   * Upload file to VirusTotal\n   */\n  private async uploadFile(file: Buffer, filename: string): Promise<VirusTotalUploadFileResponse> {\n    const apiClient = this.getApiClient();\n\n    if (!apiClient) {\n      throw new StoragePackageError(\n        'API client not initialized - plugin must call setApiClientGetter()',\n        STORAGE_ERROR_CODES.ADAPTER_INITIALIZATION_FAILED\n      );\n    }\n\n    try {\n      const response = await uploadFileForScanning(\n        {\n          file,\n          filename,\n        },\n        {\n          apiClient,\n        }\n      );\n      return response.data as VirusTotalUploadFileResponse;\n    } catch (error) {\n      throw new StoragePackageError(\n        `VirusTotal upload failed: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED\n      );\n    }\n  }\n\n  /**\n   * Wait for analysis to complete\n   */\n  private async waitForAnalysis(analysisId: string): Promise<VirusTotalGetAnalysisResponse> {\n    const startTime = Date.now();\n\n    while (Date.now() - startTime < this.maxWaitTime) {\n      const analysis = await this.getAnalysis(analysisId);\n\n      if (analysis.data.attributes.status === 'completed') {\n        return analysis;\n      }\n\n      // Wait before polling again\n      await this.sleep(this.pollInterval);\n    }\n\n    throw new StoragePackageError(\n      `VirusTotal scan timed out after ${this.maxWaitTime}ms`,\n      STORAGE_ERROR_CODES.TIMEOUT\n    );\n  }\n\n  /**\n   * Get analysis result from VirusTotal\n   */\n  private async getAnalysis(analysisId: string): Promise<VirusTotalGetAnalysisResponse> {\n    const apiClient = this.getApiClient();\n\n    if (!apiClient) {\n      throw new StoragePackageError(\n        'API client not initialized - plugin must call setApiClientGetter()',\n        STORAGE_ERROR_CODES.ADAPTER_INITIALIZATION_FAILED\n      );\n    }\n\n    try {\n      const response = await getAnalysisResult(\n        {\n          analysisId,\n        },\n        {\n          apiClient,\n        }\n      );\n      return response.data as VirusTotalGetAnalysisResponse;\n    } catch (error) {\n      throw new StoragePackageError(\n        `VirusTotal analysis fetch failed: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED\n      );\n    }\n  }\n\n  /**\n   * Parse VirusTotal analysis result\n   */\n  private parseAnalysisResult(\n    analysis: VirusTotalGetAnalysisResponse,\n    scanId: string\n  ): VirusScanResult {\n    const stats = analysis.data.attributes.stats;\n    const results = analysis.data.attributes.results ?? {};\n\n    // File is infected if any engine detected it as malicious or suspicious\n    const infected = stats.malicious > 0 || stats.suspicious > 0;\n    const clean = !infected;\n\n    // Extract threat details\n    const threats = Object.entries(results)\n      .filter(\n        ([, result]: [string, VirusTotalEngineResult]) =>\n          result.category === 'malicious' || result.category === 'suspicious'\n      )\n      .map(([engineName, result]: [string, VirusTotalEngineResult]) => ({\n        name: result.result ?? 'Unknown',\n        type: result.category,\n        severity: result.category === 'malicious' ? ('high' as const) : ('medium' as const),\n        engine: engineName,\n      }));\n\n    // Get primary virus name (most detected)\n    const virusName = threats[0]?.name;\n\n    return {\n      clean,\n      infected,\n      virusName,\n      scanTime: 0, // Will be set by base class\n      scanDate: new Date(),\n      scanId,\n      confidence: this.calculateConfidence(stats),\n      threats,\n      metadata: {\n        stats,\n        totalEngines: Object.keys(results).length,\n        maliciousEngines: stats.malicious,\n        suspiciousEngines: stats.suspicious,\n        harmlessEngines: stats.harmless,\n      },\n    };\n  }\n\n  /**\n   * Calculate confidence score based on detection stats\n   */\n  private calculateConfidence(\n    stats: VirusTotalGetAnalysisResponse['data']['attributes']['stats']\n  ): number {\n    const total = stats.malicious + stats.suspicious + stats.harmless + stats.undetected;\n\n    if (total === 0) return 0;\n\n    // If clean, confidence is based on clean votes\n    if (stats.malicious === 0 && stats.suspicious === 0) {\n      return Math.round(\n        ((stats.harmless + stats.undetected) / total) * VIRUSTOTAL_CONSTANTS.PERCENTAGE_MULTIPLIER\n      );\n    }\n\n    // If infected, confidence is based on malicious/suspicious votes\n    return Math.round(\n      ((stats.malicious + stats.suspicious) / total) * VIRUSTOTAL_CONSTANTS.PERCENTAGE_MULTIPLIER\n    );\n  }\n\n  /**\n   * Check if VirusTotal API is available\n   */\n  async isAvailable(): Promise<boolean> {\n    try {\n      const apiClient = this.getApiClient();\n\n      if (!apiClient) {\n        return false;\n      }\n\n      // Simple API health check\n      await apiClient.getApiVersion();\n      return true;\n    } catch {\n      return false;\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 * ClamAV Provider for Virus Scanning\n * Production-ready virus scanning using ClamAV daemon\n *\n * @module @plyaz/storage/plugins/virus-scan/providers\n *\n * @example\n * ```typescript\n * import { VirusScanPlugin, ClamAVProvider } from '@plyaz/storage/plugins';\n *\n * const clamavProvider = new ClamAVProvider({\n *   host: process.env.CLAMAV_HOST ?? 'localhost',\n *   port: Number.parseInt(process.env.CLAMAV_PORT ?? '3310'),\n *   timeout: 30000,\n *   enableQuarantine: true,\n *   quarantinePath: './quarantine',\n * });\n *\n * const virusScanPlugin = new VirusScanPlugin({\n *   provider: clamavProvider,\n *   priority: 100,\n * });\n * ```\n */\n\nimport { BaseVirusScanProvider } from '../base/BaseVirusScanProvider';\nimport type { VirusScanResult, ClamAVProviderConfig } from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../../../../errors';\n\nimport { writeFile, unlink, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport * as net from 'node:net';\n\n/**\n * ClamAV Provider constants\n */\nconst CLAMAV_CONSTANTS = {\n  DEFAULT_TIMEOUT_MS: 60000,\n  DEFAULT_MAX_FILE_SIZE_MB: 100,\n  BYTES_PER_KB: 1024,\n  KB_PER_MB: 1024,\n  DEFAULT_PORT: 3310,\n  CHUNK_MULTIPLIER: 64,\n  SIZE_HEADER_LENGTH: 4,\n  RESPONSE_CHUNK_SIZE: 1024,\n  SOCKET_RECONNECT_DELAY_MS: 5000,\n  MB_DIVISOR: 2,\n} as const;\n\nconst MB_IN_BYTES = CLAMAV_CONSTANTS.BYTES_PER_KB * CLAMAV_CONSTANTS.KB_PER_MB;\n\n/**\n * ClamAV scan response\n */\ninterface ClamAVResponse {\n  isInfected: boolean;\n  viruses: string[];\n  file?: string;\n}\n\n/**\n * ClamAV Provider\n * Production virus scanning using ClamAV daemon (clamd)\n *\n * Requirements:\n * - ClamAV daemon (clamd) running and accessible\n * - Updated virus signature database (run freshclam)\n *\n * Features:\n * - Fast streaming scans\n * - Quarantine support for infected files\n * - Health checks (daemon availability)\n * - Comprehensive threat detection\n * - Production-ready error handling\n */\nexport class ClamAVProvider extends BaseVirusScanProvider {\n  readonly providerName = 'ClamAV';\n\n  private readonly host: string;\n  private readonly port: number;\n  private readonly socketPath?: string;\n  private readonly enableQuarantine: boolean;\n  private readonly quarantinePath: string;\n  private readonly streamScan: boolean;\n\n  // eslint-disable-next-line complexity\n  constructor(config: ClamAVProviderConfig = {}) {\n    super({\n      timeout: config.timeout ?? CLAMAV_CONSTANTS.DEFAULT_TIMEOUT_MS, // 60s default for ClamAV\n      maxFileSize: config.maxFileSize ?? CLAMAV_CONSTANTS.DEFAULT_MAX_FILE_SIZE_MB * MB_IN_BYTES, // 100MB default\n      verbose: config.verbose ?? false,\n      ...config,\n    });\n\n    this.host = config.host ?? 'localhost';\n    this.port = config.port ?? CLAMAV_CONSTANTS.DEFAULT_PORT;\n    this.socketPath = config.socketPath;\n    this.enableQuarantine = config.enableQuarantine ?? false;\n    this.quarantinePath = config.quarantinePath ?? './quarantine';\n    this.streamScan = config.streamScan ?? true;\n\n    // Create quarantine directory if enabled\n    if (this.enableQuarantine) {\n      this.ensureQuarantineDirectory().catch(error => {\n        console.error('[ClamAV] Failed to create quarantine directory:', error);\n      });\n    }\n  }\n\n  /**\n   * Ensure quarantine directory exists\n   */\n  private async ensureQuarantineDirectory(): Promise<void> {\n    if (!existsSync(this.quarantinePath)) {\n      await mkdir(this.quarantinePath, { recursive: true });\n      if (this.config.verbose) {\n        console.log(`[ClamAV] Created quarantine directory: ${this.quarantinePath}`);\n      }\n    }\n  }\n\n  /**\n   * Scan a file using ClamAV daemon\n   */\n  // eslint-disable-next-line complexity\n  protected async scanFile(file: Buffer, filename: string): Promise<VirusScanResult> {\n    try {\n      const scanResult = this.streamScan\n        ? await this.scanStream(file)\n        : await this.scanBuffer(file, filename);\n\n      // Quarantine infected files if enabled\n      if (scanResult.isInfected && this.enableQuarantine) {\n        await this.quarantineFile(file, filename, scanResult.viruses);\n      }\n\n      return {\n        clean: !scanResult.isInfected,\n        infected: scanResult.isInfected,\n        virusName: scanResult.viruses.join(', '),\n        scanTime: 0, // Will be set by base class\n        scanDate: new Date(),\n        threats: scanResult.viruses.map(virus => ({\n          name: virus,\n          type: this.classifyThreat(virus),\n          severity: this.assessSeverity(virus),\n          engine: 'ClamAV',\n        })),\n        metadata: {\n          provider: this.providerName,\n          scanMode: this.streamScan ? 'stream' : 'buffer',\n          quarantined: scanResult.isInfected && this.enableQuarantine,\n        },\n      };\n    } catch (error) {\n      // Re-throw StoragePackageError as-is\n      if (error instanceof StoragePackageError) {\n        throw error;\n      }\n\n      throw new StoragePackageError(\n        `ClamAV scan failed: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n        {\n          context: {\n            provider: this.providerName,\n            filename,\n            error: error instanceof Error ? error.message : String(error),\n          },\n        }\n      );\n    }\n  }\n\n  /**\n   * Scan file using streaming mode (recommended for better performance)\n   */\n  private async scanStream(buffer: Buffer): Promise<ClamAVResponse> {\n    return new Promise((resolve, reject) => {\n      const socket = this.createSocket();\n      const chunks: Buffer[] = [];\n      let response = '';\n\n      socket.on('data', (data: Buffer) => {\n        chunks.push(data);\n        response += data.toString();\n      });\n\n      socket.on('end', () => {\n        socket.destroy();\n        const result = this.parseResponse(response);\n        resolve(result);\n      });\n\n      socket.on('error', error => {\n        socket.destroy();\n        reject(\n          new StoragePackageError(\n            `ClamAV connection error: ${error.message}`,\n            STORAGE_ERROR_CODES.ADAPTER_CONNECTION_FAILED,\n            { context: { host: this.host, port: this.port } }\n          )\n        );\n      });\n\n      socket.on('timeout', () => {\n        socket.destroy();\n        reject(\n          new StoragePackageError('ClamAV scan timeout', STORAGE_ERROR_CODES.ADAPTER_TIMEOUT, {\n            context: { timeout: this.config.timeout },\n          })\n        );\n      });\n\n      // Set timeout\n      if (this.config.timeout) {\n        socket.setTimeout(this.config.timeout);\n      }\n\n      // Send INSTREAM command\n      socket.write('zINSTREAM\\0');\n\n      // Send file in chunks\n      const chunkSize = 2048;\n      for (let i = 0; i < buffer.length; i += chunkSize) {\n        const chunk = buffer.slice(i, Math.min(i + chunkSize, buffer.length));\n        const sizeBuffer = Buffer.alloc(CLAMAV_CONSTANTS.SIZE_HEADER_LENGTH);\n        sizeBuffer.writeUInt32BE(chunk.length, 0);\n        socket.write(sizeBuffer);\n        socket.write(chunk);\n      }\n\n      // Send terminator (zero-length chunk)\n      const terminator = Buffer.alloc(CLAMAV_CONSTANTS.SIZE_HEADER_LENGTH);\n      terminator.writeUInt32BE(0, 0);\n      socket.write(terminator);\n    });\n  }\n\n  /**\n   * Scan file using buffer mode (fallback method)\n   */\n  private async scanBuffer(buffer: Buffer, filename: string): Promise<ClamAVResponse> {\n    // For buffer mode, we need to write to a temp file\n    // ClamAV scans files, not buffers directly (except in stream mode)\n    const tempPath = join('/tmp', `clamscan-${Date.now()}-${filename}`);\n\n    try {\n      await writeFile(tempPath, buffer);\n\n      return new Promise((resolve, reject) => {\n        const socket = this.createSocket();\n        let response = '';\n\n        socket.on('data', (data: Buffer) => {\n          response += data.toString();\n        });\n\n        socket.on('end', async () => {\n          socket.destroy();\n          // Clean up temp file\n          try {\n            await unlink(tempPath);\n          } catch {\n            // Ignore cleanup errors\n          }\n          const result = this.parseResponse(response);\n          resolve(result);\n        });\n\n        socket.on('error', async error => {\n          socket.destroy();\n          // Clean up temp file\n          try {\n            await unlink(tempPath);\n          } catch {\n            // Ignore cleanup errors\n          }\n          reject(error);\n        });\n\n        // Send SCAN command with file path\n        socket.write(`SCAN ${tempPath}\\n`);\n      });\n    } catch (error) {\n      // Clean up temp file on error\n      try {\n        await unlink(tempPath);\n      } catch {\n        // Ignore cleanup errors\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Create socket connection to ClamAV daemon\n   */\n  private createSocket(): net.Socket {\n    if (this.socketPath) {\n      return net.createConnection(this.socketPath);\n    }\n    return net.createConnection(this.port, this.host);\n  }\n\n  /**\n   * Parse ClamAV response\n   */\n  private parseResponse(response: string): ClamAVResponse {\n    const result: ClamAVResponse = {\n      isInfected: false,\n      viruses: [],\n    };\n\n    // ClamAV response format: \"stream: <virus_name> FOUND\" or \"stream: OK\"\n    const lines = response.trim().split('\\n');\n\n    for (const line of lines) {\n      if (line.includes('FOUND')) {\n        result.isInfected = true;\n        // Extract virus name between \":\" and \"FOUND\"\n        const match = line.match(/:\\s*(.+?)\\s+FOUND/);\n        if (match?.[1]) {\n          result.viruses.push(match[1].trim());\n        }\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Quarantine infected file\n   */\n  private async quarantineFile(buffer: Buffer, filename: string, viruses: string[]): Promise<void> {\n    try {\n      await this.ensureQuarantineDirectory();\n\n      const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n      const quarantineFilename = `${timestamp}_${filename}`;\n      const quarantinePath = join(this.quarantinePath, quarantineFilename);\n\n      await writeFile(quarantinePath, buffer);\n\n      // Write metadata file\n      const metadataPath = `${quarantinePath}.meta.json`;\n      const metadata = {\n        originalFilename: filename,\n        quarantinedAt: new Date().toISOString(),\n        viruses,\n        fileSize: buffer.length,\n      };\n      await writeFile(metadataPath, JSON.stringify(metadata, null, CLAMAV_CONSTANTS.MB_DIVISOR));\n\n      if (this.config.verbose) {\n        console.log(`[ClamAV] Quarantined infected file: ${quarantineFilename}`);\n      }\n    } catch (error) {\n      console.error('[ClamAV] Failed to quarantine file:', error);\n      // Don't fail the scan if quarantine fails\n    }\n  }\n\n  /**\n   * Classify threat type based on virus name\n   */\n  private classifyThreat(virusName: string): string {\n    const name = virusName.toLowerCase();\n\n    if (name.includes('trojan')) return 'trojan';\n    if (name.includes('ransom')) return 'ransomware';\n    if (name.includes('worm')) return 'worm';\n    if (name.includes('adware')) return 'adware';\n    if (name.includes('spyware')) return 'spyware';\n    if (name.includes('rootkit')) return 'rootkit';\n    if (name.includes('backdoor')) return 'backdoor';\n\n    return 'virus';\n  }\n\n  /**\n   * Assess threat severity\n   */\n  private assessSeverity(virusName: string): 'low' | 'medium' | 'high' | 'critical' {\n    const name = virusName.toLowerCase();\n\n    // Critical threats\n    if (name.includes('ransom') || name.includes('rootkit')) {\n      return 'critical';\n    }\n\n    // High severity\n    if (name.includes('trojan') || name.includes('backdoor') || name.includes('worm')) {\n      return 'high';\n    }\n\n    // Medium severity\n    if (name.includes('spyware') || name.includes('keylog')) {\n      return 'medium';\n    }\n\n    // Default to medium\n    return 'medium';\n  }\n\n  /**\n   * Check if ClamAV daemon is available\n   */\n  async isAvailable(): Promise<boolean> {\n    return new Promise(resolve => {\n      const socket = this.createSocket();\n      // eslint-disable-next-line no-unused-vars -- connected reserved for future connection state tracking\n      let connected = false;\n\n      socket.on('connect', () => {\n        connected = true;\n        socket.write('PING\\n');\n      });\n\n      socket.on('data', (data: Buffer) => {\n        const response = data.toString().trim();\n        socket.destroy();\n        // ClamAV responds with \"PONG\" to PING command\n        resolve(response === 'PONG');\n      });\n\n      socket.on('error', () => {\n        socket.destroy();\n        resolve(false);\n      });\n\n      socket.on('timeout', () => {\n        socket.destroy();\n        resolve(false);\n      });\n\n      // Set connection timeout\n      socket.setTimeout(CLAMAV_CONSTANTS.SOCKET_RECONNECT_DELAY_MS); // 5 seconds for health check\n    });\n  }\n}\n","/**\n * Sharp Image Processing Plugin\n * Automatically resize, optimize, and generate thumbnails for uploaded images\n *\n * @module @plyaz/storage/plugins/image-processing\n *\n * @example\n * ```typescript\n * import { SharpImagePlugin } from '@plyaz/storage/plugins';\n *\n * const imagePlugin = new SharpImagePlugin({\n *   variants: [\n *     { name: 'thumbnail', width: 150, height: 150, fit: 'cover' },\n *     { name: 'medium', width: 800, height: 600, fit: 'inside' },\n *     { name: 'large', width: 1920, height: 1080, fit: 'inside' },\n *   ],\n *   formats: ['webp', 'jpeg'],\n *   quality: 85,\n *   stripMetadata: true,\n *   priority: 50,\n * });\n *\n * const service = new StorageService({\n *   adapters: [adapter],\n *   plugins: [imagePlugin],\n * });\n * ```\n */\n\nimport { BasePlugin } from '../../base/BasePlugin';\nimport type {\n  StoragePluginUploadResult,\n  StoragePluginContext,\n  StoragePluginHealth,\n  ImageVariant,\n  WatermarkConfig,\n  SharpImagePluginConfig,\n  StorageImageProcessingPluginStatistics,\n  PluginStorageAdapterInterface,\n} from '@plyaz/types/storage';\nimport { STORAGE_PLUGIN_TYPE } from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../../../errors';\nimport { readFile } from 'node:fs/promises';\nimport sharp, { type Sharp } from 'sharp';\n\n/**\n * Sharp Image Plugin constants\n */\nconst SHARP_IMAGE_CONSTANTS = {\n  DEFAULT_PRIORITY: 50,\n  DEFAULT_QUALITY: 85,\n  THUMBNAIL_WIDTH: 100,\n  THUMBNAIL_HEIGHT: 100,\n  WATERMARK_OPACITY: 20,\n  WATERMARK_SCALE_FACTOR: 100,\n  WATERMARK_PADDING_PX: 20,\n  DIMENSION_DIVISOR: 2,\n  PERCENTAGE_MULTIPLIER: 100,\n} as const;\n\n/**\n * Sharp Image Processing Plugin\n * Production-ready image processing using Sharp library\n *\n * Features:\n * - Multiple variant generation (thumbnail, medium, large)\n * - Format conversion (JPEG, PNG, WEBP, AVIF)\n * - Quality optimization\n * - Watermark overlay\n * - Metadata stripping for privacy\n * - High-performance processing\n */\nexport class SharpImagePlugin extends BasePlugin {\n  private readonly variants: ImageVariant[];\n  private readonly formats: Array<'jpeg' | 'png' | 'webp' | 'avif'>;\n  private readonly quality: number;\n  private readonly stripMetadata: boolean;\n  private readonly watermark?: WatermarkConfig;\n  private readonly supportedMimeTypes: Set<string>;\n  private readonly uploadVariants: boolean;\n  private readonly preserveOriginal: boolean;\n\n  private watermarkBuffer?: Buffer;\n  private imagesProcessed: number = 0;\n  private variantsGenerated: number = 0;\n\n  // eslint-disable-next-line complexity\n  constructor(config: SharpImagePluginConfig = {}) {\n    super({\n      name: 'sharp-image-processor',\n      type: STORAGE_PLUGIN_TYPE.PROCESSING,\n      priority: config.priority ?? SHARP_IMAGE_CONSTANTS.DEFAULT_PRIORITY,\n      version: config.version ?? '1.0.0',\n      description:\n        config.description ?? 'Automatic image resizing, optimization, and thumbnail generation',\n      enabled: config.enabled ?? true,\n      logger: config.logger,\n    });\n\n    this.variants = config.variants ?? [\n      { name: 'thumbnail', width: 150, height: 150, fit: 'cover' },\n      { name: 'medium', width: 800, height: 600, fit: 'inside' },\n    ];\n\n    this.formats = config.formats ?? ['webp', 'jpeg'];\n    this.quality = config.quality ?? SHARP_IMAGE_CONSTANTS.DEFAULT_QUALITY;\n    this.stripMetadata = config.stripMetadata ?? true;\n    this.watermark = config.watermark;\n    this.uploadVariants = config.uploadVariants ?? true;\n    this.preserveOriginal = config.preserveOriginal ?? true;\n\n    // Default supported MIME types\n    this.supportedMimeTypes = new Set(\n      config.supportedMimeTypes ?? [\n        'image/jpeg',\n        'image/png',\n        'image/webp',\n        'image/gif',\n        'image/tiff',\n        'image/avif',\n      ]\n    );\n  }\n\n  /**\n   * Initialize the plugin - load watermark if configured\n   */\n  async initialize(): Promise<void> {\n    await super.initialize();\n\n    try {\n      this.log('info', 'Sharp Image Plugin initialized');\n\n      // Load watermark if configured\n      if (this.watermark?.enabled) {\n        await this.loadWatermark();\n      }\n    } catch (error) {\n      throw new StoragePackageError(\n        `Failed to initialize Sharp Image Plugin: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PLUGIN_INITIALIZATION_FAILED,\n        {\n          context: {\n            plugin: this.name,\n            error: error instanceof Error ? error.message : String(error),\n          },\n        }\n      );\n    }\n  }\n\n  /**\n   * Load watermark image\n   */\n  private async loadWatermark(): Promise<void> {\n    if (!this.watermark?.enabled) {\n      return;\n    }\n\n    try {\n      if (this.watermark.imageBuffer) {\n        this.watermarkBuffer = this.watermark.imageBuffer;\n      } else if (this.watermark.imagePath) {\n        this.watermarkBuffer = await readFile(this.watermark.imagePath);\n      }\n\n      if (this.watermarkBuffer) {\n        this.log('info', 'Watermark loaded successfully');\n      }\n    } catch (error) {\n      this.log('error', 'Failed to load watermark image', {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  /**\n   * Process image after upload - generate variants\n   */\n  // eslint-disable-next-line complexity\n  async afterUpload(\n    result: StoragePluginUploadResult,\n    context: StoragePluginContext\n  ): Promise<void> {\n    if (!this.shouldExecute()) {\n      return;\n    }\n\n    // Only process image files\n    if (!this.isImageFile(result.metadata.mimeType)) {\n      this.log('debug', 'Skipping non-image file', {\n        fileId: result.fileId,\n        mimeType: result.metadata.mimeType,\n      });\n      return;\n    }\n\n    try {\n      this.log('info', 'Processing image', {\n        fileId: result.fileId,\n        filename: result.metadata.filename,\n      });\n\n      const startTime = Date.now();\n\n      // Get storage adapter to download original file\n      const storageAdapter = context.storageAdapter;\n      if (!storageAdapter) {\n        throw new StoragePackageError(\n          'Storage adapter not available in context',\n          STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n          { context: { fileId: result.fileId } }\n        );\n      }\n\n      // Download original file\n      const downloadResult = await storageAdapter.download({ fileId: result.fileId });\n      const originalBuffer = downloadResult.file!;\n\n      // Generate all variants\n      const generatedVariants = await this.generateVariants(\n        originalBuffer,\n        result.metadata.filename ?? 'image'\n      );\n\n      // Upload variants if enabled\n      if (this.uploadVariants && generatedVariants.length > 0) {\n        await this.uploadVariantsToStorage(generatedVariants, result, storageAdapter, context);\n      }\n\n      // Update statistics\n      this.imagesProcessed++;\n      this.variantsGenerated += generatedVariants.length;\n\n      const duration = Date.now() - startTime;\n      this.log('info', 'Image processed successfully', {\n        fileId: result.fileId,\n        variantsGenerated: generatedVariants.length,\n        duration: `${duration}ms`,\n      });\n    } catch (error) {\n      this.log('error', 'Failed to process image', {\n        fileId: result.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      // Don't throw - image processing failures shouldn't fail the upload\n    }\n  }\n\n  /**\n   * Generate all configured variants\n   */\n  private async generateVariants(\n    buffer: Buffer,\n    _filename: string // eslint-disable-line no-unused-vars\n  ): Promise<Array<{ name: string; format: string; buffer: Buffer }>> {\n    const variants: Array<{ name: string; format: string; buffer: Buffer }> = [];\n\n    for (const variant of this.variants) {\n      for (const format of this.formats) {\n        try {\n          const processedBuffer = await this.processVariant(buffer, variant, format);\n          variants.push({\n            name: variant.name,\n            format,\n            buffer: processedBuffer,\n          });\n        } catch (error) {\n          this.log('error', 'Failed to generate variant', {\n            variant: variant.name,\n            format,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      }\n    }\n\n    return variants;\n  }\n\n  /**\n   * Process a single variant\n   */\n  // eslint-disable-next-line complexity\n  private async processVariant(\n    buffer: Buffer,\n    variant: ImageVariant,\n    format: 'jpeg' | 'png' | 'webp' | 'avif'\n  ): Promise<Buffer> {\n    let pipeline = sharp(buffer);\n\n    // Strip metadata if configured\n    if (this.stripMetadata) {\n      pipeline = pipeline.withMetadata({\n        exif: {},\n        icc: undefined,\n      });\n    }\n\n    // Resize\n    if (variant.width || variant.height) {\n      pipeline = pipeline.resize({\n        width: variant.width,\n        height: variant.height,\n        fit: variant.fit ?? 'inside',\n        position: variant.position ?? 'center',\n      });\n    }\n\n    // Apply watermark if configured\n    if (this.watermark?.enabled && this.watermarkBuffer) {\n      pipeline = await this.applyWatermark(pipeline, variant);\n    }\n\n    // Convert to output format\n    const quality = variant.quality ?? this.quality;\n    switch (format) {\n      case 'jpeg':\n        pipeline = pipeline.jpeg({ quality });\n        break;\n      case 'png':\n        pipeline = pipeline.png({ quality });\n        break;\n      case 'webp':\n        pipeline = pipeline.webp({ quality });\n        break;\n      case 'avif':\n        pipeline = pipeline.avif({ quality });\n        break;\n    }\n\n    return pipeline.toBuffer();\n  }\n\n  /**\n   * Apply watermark to image\n   */\n  private async applyWatermark(\n    pipeline: Sharp,\n    _variant: ImageVariant // eslint-disable-line no-unused-vars\n  ): Promise<Sharp> {\n    if (!this.watermarkBuffer || !this.watermark) {\n      return pipeline;\n    }\n\n    // Get image metadata to calculate watermark size and position\n    const metadata = await pipeline.metadata();\n    const imageWidth = metadata.width || SHARP_IMAGE_CONSTANTS.THUMBNAIL_WIDTH;\n    const imageHeight = metadata.height || SHARP_IMAGE_CONSTANTS.THUMBNAIL_HEIGHT;\n\n    // Resize watermark to percentage of image size\n    const watermarkSize = this.watermark.size ?? SHARP_IMAGE_CONSTANTS.WATERMARK_OPACITY;\n    const watermarkWidth = Math.floor(\n      (imageWidth * watermarkSize) / SHARP_IMAGE_CONSTANTS.WATERMARK_SCALE_FACTOR\n    );\n\n    const watermarkPipeline = sharp(this.watermarkBuffer).resize({\n      width: watermarkWidth,\n      withoutEnlargement: true,\n    });\n\n    // Calculate position\n    const position = this.calculateWatermarkPosition(\n      this.watermark.position ?? 'bottom-right',\n      imageWidth,\n      imageHeight,\n      watermarkWidth\n    );\n\n    // Composite watermark\n    return pipeline.composite([\n      {\n        input: await watermarkPipeline.toBuffer(),\n        top: position.top,\n        left: position.left,\n        blend: 'over',\n      },\n    ]);\n  }\n\n  /**\n   * Calculate watermark position\n   */\n  private calculateWatermarkPosition(\n    position: string,\n    imageWidth: number,\n    imageHeight: number,\n    watermarkWidth: number\n  ): { top: number; left: number } {\n    const padding = SHARP_IMAGE_CONSTANTS.WATERMARK_PADDING_PX; // 20px padding from edges\n\n    switch (position) {\n      case 'top-left':\n        return { top: padding, left: padding };\n      case 'top-right':\n        return { top: padding, left: imageWidth - watermarkWidth - padding };\n      case 'bottom-left':\n        return { top: imageHeight - watermarkWidth - padding, left: padding };\n      case 'bottom-right':\n        return {\n          top: imageHeight - watermarkWidth - padding,\n          left: imageWidth - watermarkWidth - padding,\n        };\n      case 'center':\n        return {\n          top: Math.floor((imageHeight - watermarkWidth) / SHARP_IMAGE_CONSTANTS.DIMENSION_DIVISOR),\n          left: Math.floor((imageWidth - watermarkWidth) / SHARP_IMAGE_CONSTANTS.DIMENSION_DIVISOR),\n        };\n      default:\n        return { top: padding, left: padding };\n    }\n  }\n\n  /**\n   * Upload variants back to storage\n   */\n  private async uploadVariantsToStorage(\n    variants: Array<{ name: string; format: string; buffer: Buffer }>,\n    originalResult: StoragePluginUploadResult,\n    storageAdapter: PluginStorageAdapterInterface,\n    _context: StoragePluginContext // eslint-disable-line no-unused-vars\n  ): Promise<void> {\n    const uploadedVariants: unknown[] = [];\n\n    for (const variant of variants) {\n      try {\n        const variantFilename = this.generateVariantFilename(\n          originalResult.metadata.filename ?? 'image',\n          variant.name,\n          variant.format\n        );\n\n        const uploadResult = await storageAdapter.upload({\n          file: variant.buffer,\n          filename: variantFilename,\n          mimeType: `image/${variant.format}`,\n          category: originalResult.metadata.category,\n          entityId: originalResult.metadata.entityId,\n          entityType: originalResult.metadata.entityType,\n          customMetadata: {\n            originalFileId: originalResult.fileId,\n            variant: variant.name,\n            format: variant.format,\n            generatedBy: this.name,\n          },\n        });\n\n        uploadedVariants.push({\n          variant: variant.name,\n          format: variant.format,\n          fileId: uploadResult.metadata.fileId,\n          url: uploadResult.url,\n        });\n\n        this.log('debug', 'Variant uploaded', {\n          variant: variant.name,\n          format: variant.format,\n          fileId: uploadResult.metadata.fileId,\n        });\n      } catch (error) {\n        this.log('error', 'Failed to upload variant', {\n          variant: variant.name,\n          format: variant.format,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    }\n\n    // Add variants to original file metadata (if storage adapter supports metadata updates)\n    if (uploadedVariants.length > 0) {\n      this.log('info', 'All variants uploaded', {\n        originalFileId: originalResult.fileId,\n        variantCount: uploadedVariants.length,\n      });\n    }\n  }\n\n  /**\n   * Generate variant filename\n   */\n  private generateVariantFilename(\n    originalFilename: string,\n    variantName: string,\n    format: string\n  ): string {\n    const nameWithoutExt = originalFilename.replace(/\\.[^/.]+$/, '');\n    return `${nameWithoutExt}_${variantName}.${format}`;\n  }\n\n  /**\n   * Check if file is an image\n   */\n  private isImageFile(mimeType: string): boolean {\n    return this.supportedMimeTypes.has(mimeType);\n  }\n\n  /**\n   * Health check\n   */\n  async healthCheck(): Promise<StoragePluginHealth> {\n    const baseHealth = await super.healthCheck();\n\n    return {\n      ...baseHealth,\n      message: `Sharp library ready - Processed ${this.imagesProcessed} images, generated ${this.variantsGenerated} variants`,\n    };\n  }\n\n  /**\n   * Get processing statistics\n   */\n  getStatistics(): StorageImageProcessingPluginStatistics {\n    return {\n      imagesProcessed: this.imagesProcessed,\n      variantsGenerated: this.variantsGenerated,\n      averageVariantsPerImage:\n        this.imagesProcessed > 0\n          ? Math.round(\n              (this.variantsGenerated / this.imagesProcessed) *\n                SHARP_IMAGE_CONSTANTS.PERCENTAGE_MULTIPLIER\n            ) / SHARP_IMAGE_CONSTANTS.PERCENTAGE_MULTIPLIER\n          : 0,\n    };\n  }\n}\n","/**\n * FFmpeg Wrapper - Direct FFmpeg/FFprobe execution via child_process\n * Replaces deprecated fluent-ffmpeg package\n *\n * @module @plyaz/storage/utils/ffmpegWrapper\n */\n\nimport { spawn } from 'node:child_process';\nimport type {\n  FFprobeData,\n  FFmpegProgress,\n  FFmpegOptions,\n  ScreenshotOptions,\n} from '@plyaz/types/storage';\n\n/**\n * Time conversion constants\n */\nconst SECONDS_PER_HOUR = 3600;\nconst SECONDS_PER_MINUTE = 60;\nconst DEFAULT_HLS_SEGMENT_DURATION = 10;\n\n/**\n * FFmpeg wrapper class - provides fluent-ffmpeg-like API using child_process\n */\nexport class FFmpegWrapper {\n  private ffmpegPath: string = 'ffmpeg';\n  private ffprobePath: string = 'ffprobe';\n\n  /**\n   * Set FFmpeg binary path\n   */\n  setFfmpegPath(path: string): void {\n    this.ffmpegPath = path;\n  }\n\n  /**\n   * Set FFprobe binary path\n   */\n  setFfprobePath(path: string): void {\n    this.ffprobePath = path;\n  }\n\n  /**\n   * Extract metadata using ffprobe\n   */\n  async ffprobe(inputPath: string): Promise<FFprobeData> {\n    return new Promise((resolve, reject) => {\n      const args = [\n        '-v',\n        'error',\n        '-print_format',\n        'json',\n        '-show_format',\n        '-show_streams',\n        inputPath,\n      ];\n\n      const process = spawn(this.ffprobePath, args);\n      let stdout = '';\n      let stderr = '';\n\n      process.stdout.on('data', (data: Buffer) => {\n        stdout += data.toString();\n      });\n\n      process.stderr.on('data', (data: Buffer) => {\n        stderr += data.toString();\n      });\n\n      process.on('close', code => {\n        if (code !== 0) {\n          reject(new Error(`ffprobe failed with code ${code}: ${stderr}`));\n          return;\n        }\n\n        try {\n          const data = JSON.parse(stdout) as FFprobeData;\n          resolve(data);\n        } catch (error) {\n          reject(\n            new Error(\n              `Failed to parse ffprobe output: ${error instanceof Error ? error.message : String(error)}`\n            )\n          );\n        }\n      });\n\n      process.on('error', error => {\n        reject(new Error(`Failed to spawn ffprobe: ${error.message}`));\n      });\n    });\n  }\n\n  /**\n   * Execute FFmpeg command\n   */\n  async execute(options: FFmpegOptions): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const args = ['-i', options.input, ...options.args, options.output];\n\n      if (options.onStart) {\n        options.onStart(`${this.ffmpegPath} ${args.join(' ')}`);\n      }\n\n      const process = spawn(this.ffmpegPath, args);\n      let stderr = '';\n\n      process.stderr.on('data', (data: Buffer) => {\n        const output = data.toString();\n        stderr += output;\n\n        // Parse progress from FFmpeg output\n        if (options.onProgress) {\n          const timeMatch = /time=(\\d{2}):(\\d{2}):(\\d{2}\\.\\d{2})/.exec(output);\n          if (timeMatch) {\n            const hours = Number.parseInt(timeMatch[1], 10);\n            const minutes = Number.parseInt(timeMatch[2], 10);\n            const seconds = Number.parseFloat(timeMatch[3]);\n            const currentTime = hours * SECONDS_PER_HOUR + minutes * SECONDS_PER_MINUTE + seconds;\n\n            options.onProgress({\n              currentTime,\n              timemark: timeMatch[0],\n            });\n          }\n        }\n      });\n\n      process.on('close', code => {\n        if (code !== 0) {\n          reject(new Error(`FFmpeg failed with code ${code}: ${stderr}`));\n          return;\n        }\n        resolve();\n      });\n\n      process.on('error', error => {\n        reject(new Error(`Failed to spawn FFmpeg: ${error.message}`));\n      });\n    });\n  }\n\n  /**\n   * Generate screenshots/thumbnails\n   */\n  async screenshots(inputPath: string, options: ScreenshotOptions): Promise<void> {\n    const promises = options.timestamps.map((timestamp: number, index: number) => {\n      const outputPath = `${options.folder}/${options.filename}`.replace('%i', String(index));\n\n      const args = ['-ss', String(timestamp), '-vframes', '1'];\n\n      if (options.size) {\n        args.push('-s', options.size);\n      }\n\n      return this.execute({\n        input: inputPath,\n        output: outputPath,\n        args,\n      });\n    });\n\n    await Promise.all(promises);\n  }\n\n  /**\n   * Transcode video\n   */\n  async transcode(options: {\n    input: string;\n    output: string;\n    size?: string;\n    videoBitrate?: string;\n    videoCodec?: string;\n    audioCodec?: string;\n    audioBitrate?: string;\n    format?: string;\n    onProgress?: (progress: FFmpegProgress) => void;\n    onStart?: (command: string) => void;\n  }): Promise<void> {\n    const args: string[] = [];\n\n    if (options.size) {\n      args.push('-s', options.size);\n    }\n    if (options.videoBitrate) {\n      args.push('-b:v', options.videoBitrate);\n    }\n    if (options.videoCodec) {\n      args.push('-c:v', options.videoCodec);\n    }\n    if (options.audioCodec) {\n      args.push('-c:a', options.audioCodec);\n    }\n    if (options.audioBitrate) {\n      args.push('-b:a', options.audioBitrate);\n    }\n    if (options.format) {\n      args.push('-f', options.format);\n    }\n\n    return this.execute({\n      input: options.input,\n      output: options.output,\n      args,\n      onProgress: options.onProgress,\n      onStart: options.onStart,\n    });\n  }\n\n  /**\n   * Generate HLS stream\n   */\n  async generateHLS(options: {\n    input: string;\n    output: string;\n    segmentDuration?: number;\n    onStart?: (command: string) => void;\n  }): Promise<void> {\n    const args = [\n      '-codec:',\n      'copy',\n      '-start_number',\n      '0',\n      '-hls_time',\n      String(options.segmentDuration ?? DEFAULT_HLS_SEGMENT_DURATION),\n      '-hls_list_size',\n      '0',\n      '-f',\n      'hls',\n    ];\n\n    return this.execute({\n      input: options.input,\n      output: options.output,\n      args,\n      onStart: options.onStart,\n    });\n  }\n}\n\n/**\n * Global FFmpeg wrapper instance\n */\nexport const ffmpegWrapper: FFmpegWrapper = new FFmpegWrapper();\n\n/**\n * Set FFmpeg binary path\n */\nexport function setFfmpegPath(path: string): void {\n  ffmpegWrapper.setFfmpegPath(path);\n}\n\n/**\n * Set FFprobe binary path\n */\nexport function setFfprobePath(path: string): void {\n  ffmpegWrapper.setFfprobePath(path);\n}\n\n/**\n * Execute ffprobe\n */\nexport function ffprobe(inputPath: string): Promise<FFprobeData> {\n  return ffmpegWrapper.ffprobe(inputPath);\n}\n","/**\n * FFmpeg Video Processing Plugin\n * Transcode videos, generate thumbnails, create HLS streams, and extract metadata\n *\n * @module @plyaz/storage/plugins/video-processing\n *\n * @example\n * ```typescript\n * import { FFmpegVideoPlugin } from '@plyaz/storage/plugins';\n *\n * const videoPlugin = new FFmpegVideoPlugin({\n *   ffmpegPath: '/usr/bin/ffmpeg',\n *   ffprobePath: '/usr/bin/ffprobe',\n *   resolutions: [\n *     { name: '480p', width: 854, height: 480, bitrate: '1000k' },\n *     { name: '720p', width: 1280, height: 720, bitrate: '2500k' },\n *     { name: '1080p', width: 1920, height: 1080, bitrate: '5000k' },\n *   ],\n *   thumbnails: {\n *     count: 5,\n *     timestamps: [0.1, 0.25, 0.5, 0.75, 0.9],\n *   },\n *   useQueue: true,\n * });\n * ```\n */\n\nimport { BasePlugin } from '../../base/BasePlugin';\nimport type {\n  StoragePluginUploadResult,\n  StoragePluginContext,\n  StoragePluginHealth,\n  VideoResolution,\n  ThumbnailConfig,\n  HLSConfig,\n  FFmpegVideoPluginConfig,\n  StorageVideoProcessingPluginStatistics,\n} from '@plyaz/types/storage';\nimport { STORAGE_PLUGIN_TYPE } from '@plyaz/types/storage';\nimport { StoragePackageError, STORAGE_ERROR_CODES } from '../../../errors';\nimport {\n  ffmpegWrapper,\n  setFfmpegPath,\n  setFfprobePath,\n  ffprobe,\n} from '../../../utils/ffmpegWrapper';\nimport type { FFprobeData, FFprobeStream } from '@plyaz/types/storage';\nimport { writeFile, unlink, mkdir, readFile, readdir, rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { randomBytes } from 'node:crypto';\n\n/**\n * FFmpeg Video Plugin constants\n */\nconst FFMPEG_VIDEO_CONSTANTS = {\n  DEFAULT_PRIORITY: 40,\n  VIDEO_CODEC_LIBX264: 'libx264',\n  AUDIO_CODEC_AAC: 'aac',\n  HEX_RADIX: 16,\n  DECIMAL_RADIX: 10,\n  VIDEO_QUALITY_CRF: 23,\n  AUDIO_SAMPLE_RATE: 44100,\n  AUDIO_CHANNELS: 2,\n  HLS_SEGMENT_TIME: 10,\n  RANDOM_BYTES_LENGTH: 8,\n  PERCENTAGE_MULTIPLIER: 100,\n} as const;\n\n/**\n * FFmpeg Video Processing Plugin\n * Production-ready video processing using FFmpeg\n *\n * Features:\n * - Video transcoding to multiple resolutions\n * - Thumbnail generation at intervals\n * - HLS adaptive streaming\n * - Metadata extraction (duration, resolution, codec)\n * - Background queue processing\n */\nexport class FFmpegVideoPlugin extends BasePlugin {\n  private readonly ffmpegPath: string;\n  private readonly ffprobePath: string;\n  private readonly resolutions: VideoResolution[];\n  private readonly thumbnails?: ThumbnailConfig;\n  private readonly hls?: HLSConfig;\n  private readonly useQueue: boolean;\n  private readonly supportedMimeTypes: Set<string>;\n  private readonly uploadVariants: boolean;\n  private readonly tempDir: string;\n\n  private videosProcessed: number = 0;\n  private variantsGenerated: number = 0;\n\n  // eslint-disable-next-line complexity\n  constructor(config: FFmpegVideoPluginConfig = {}) {\n    super({\n      name: 'ffmpeg-video-processor',\n      type: STORAGE_PLUGIN_TYPE.PROCESSING,\n      priority: config.priority ?? FFMPEG_VIDEO_CONSTANTS.DEFAULT_PRIORITY,\n      version: config.version ?? '1.0.0',\n      description: config.description ?? 'Video transcoding, thumbnails, and HLS streaming',\n      enabled: config.enabled ?? true,\n      logger: config.logger,\n    });\n\n    this.ffmpegPath = config.ffmpegPath ?? 'ffmpeg';\n    this.ffprobePath = config.ffprobePath ?? 'ffprobe';\n\n    this.resolutions = config.resolutions ?? [\n      { name: '480p', width: 854, height: 480, bitrate: '1000k' },\n      { name: '720p', width: 1280, height: 720, bitrate: '2500k' },\n    ];\n\n    this.thumbnails = config.thumbnails;\n    this.hls = config.hls;\n    this.useQueue = config.useQueue ?? true;\n    this.uploadVariants = config.uploadVariants ?? true;\n\n    this.supportedMimeTypes = new Set(\n      config.supportedMimeTypes ?? [\n        'video/mp4',\n        'video/mpeg',\n        'video/quicktime',\n        'video/x-msvideo',\n        'video/webm',\n      ]\n    );\n\n    this.tempDir = join('/tmp', 'ffmpeg-video-processing');\n  }\n\n  /**\n   * Initialize the plugin - set FFmpeg paths\n   */\n  async initialize(): Promise<void> {\n    await super.initialize();\n\n    try {\n      // Set FFmpeg and FFprobe paths\n      setFfmpegPath(this.ffmpegPath);\n      setFfprobePath(this.ffprobePath);\n\n      // Create temp directory\n      if (!existsSync(this.tempDir)) {\n        await mkdir(this.tempDir, { recursive: true });\n      }\n\n      this.log('info', 'FFmpeg plugin initialized', {\n        ffmpegPath: this.ffmpegPath,\n        ffprobePath: this.ffprobePath,\n        tempDir: this.tempDir,\n      });\n    } catch (error) {\n      throw new StoragePackageError(\n        `Failed to initialize FFmpeg plugin: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PLUGIN_INITIALIZATION_FAILED,\n        {\n          context: {\n            plugin: this.name,\n            error: error instanceof Error ? error.message : String(error),\n          },\n        }\n      );\n    }\n  }\n\n  /**\n   * Process video after upload\n   */\n  async afterUpload(\n    result: StoragePluginUploadResult,\n    context: StoragePluginContext\n  ): Promise<void> {\n    if (!this.shouldExecute()) {\n      return;\n    }\n\n    // Only process video files\n    if (!this.isVideoFile(result.metadata.mimeType)) {\n      this.log('debug', 'Skipping non-video file', {\n        fileId: result.fileId,\n        mimeType: result.metadata.mimeType,\n      });\n      return;\n    }\n\n    try {\n      this.log('info', 'Processing video', {\n        fileId: result.fileId,\n        filename: result.metadata.filename,\n        useQueue: this.useQueue,\n      });\n\n      if (this.useQueue) {\n        // Queue system not yet integrated - process immediately for now\n        this.log(\n          'info',\n          'Queue mode enabled, processing video immediately (queue system pending)',\n          {\n            fileId: result.fileId,\n          }\n        );\n        await this.processVideo(result, context);\n      } else {\n        // Process immediately\n        await this.processVideo(result, context);\n      }\n    } catch (error) {\n      this.log('error', 'Failed to process video', {\n        fileId: result.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  /**\n   * Process video - transcode and generate thumbnails\n   */\n  private async processVideo(\n    result: StoragePluginUploadResult,\n    context: StoragePluginContext\n  ): Promise<void> {\n    const startTime = Date.now();\n\n    // Extract metadata first\n    const metadata = await this.extractMetadata(result.fileId, context);\n\n    this.log('info', 'Video metadata extracted', {\n      fileId: result.fileId,\n      duration: metadata.duration,\n      resolution: `${metadata.width}x${metadata.height}`,\n      codec: metadata.codec,\n    });\n\n    // Generate thumbnails if configured\n    if (this.thumbnails) {\n      await this.generateThumbnails(result, metadata.duration ?? 0, context);\n    }\n\n    // Generate HLS segments if configured\n    if (this.hls?.enabled) {\n      await this.generateHLS(result, context);\n    }\n\n    // Transcode to different resolutions\n    for (const resolution of this.resolutions) {\n      try {\n        await this.transcodeVideo(result, resolution, context);\n        this.variantsGenerated++;\n      } catch (error) {\n        this.log('error', 'Failed to transcode video', {\n          fileId: result.fileId,\n          resolution: resolution.name,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    }\n\n    this.videosProcessed++;\n\n    const duration = Date.now() - startTime;\n    this.log('info', 'Video processed successfully', {\n      fileId: result.fileId,\n      variants: this.resolutions.length,\n      duration: `${duration}ms`,\n    });\n  }\n\n  /**\n   * Extract video metadata using ffprobe\n   */\n  // eslint-disable-next-line complexity\n  private async extractMetadata(\n    fileId: string,\n    context: StoragePluginContext\n  ): Promise<{\n    duration: number | null;\n    width: number | null;\n    height: number | null;\n    codec: string | null;\n    bitrate: number | null;\n  }> {\n    let tempPath: string | null = null;\n\n    try {\n      // Download file to temp location\n      tempPath = join(\n        this.tempDir,\n        `${fileId}-${randomBytes(FFMPEG_VIDEO_CONSTANTS.RANDOM_BYTES_LENGTH).toString('hex')}`\n      );\n      const fileBuffer = await context.storageAdapter.download({\n        fileId,\n      });\n\n      await writeFile(tempPath, fileBuffer.file!);\n\n      // Extract metadata using ffprobe\n      const metadata: FFprobeData = await ffprobe(tempPath);\n\n      const videoStream = metadata.streams.find(\n        (stream: FFprobeStream) => stream.codec_type === 'video'\n      );\n\n      const bitRate = metadata.format.bit_rate;\n      const parsedBitrate = bitRate\n        ? typeof bitRate === 'string'\n          ? Number.parseInt(bitRate, FFMPEG_VIDEO_CONSTANTS.DECIMAL_RADIX)\n          : bitRate\n        : null;\n\n      return {\n        duration: metadata.format.duration ?? null,\n        width: videoStream?.width ?? null,\n        height: videoStream?.height ?? null,\n        codec: videoStream?.codec_name ?? null,\n        bitrate: parsedBitrate,\n      };\n    } catch (error) {\n      this.log('error', 'Failed to extract metadata', {\n        fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw new StoragePackageError(\n        `Failed to extract video metadata: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n        {\n          context: {\n            plugin: this.name,\n            fileId,\n          },\n        }\n      );\n    } finally {\n      // Clean up temp file\n      if (tempPath && existsSync(tempPath)) {\n        try {\n          await unlink(tempPath);\n        } catch {\n          // Ignore cleanup errors\n        }\n      }\n    }\n  }\n\n  /**\n   * Generate video thumbnails\n   */\n  // eslint-disable-next-line complexity\n  private async generateThumbnails(\n    result: StoragePluginUploadResult,\n    duration: number,\n    context: StoragePluginContext\n  ): Promise<void> {\n    if (!this.thumbnails) {\n      return;\n    }\n\n    this.log('info', 'Generating thumbnails', {\n      fileId: result.fileId,\n      count: this.thumbnails.count,\n    });\n\n    let inputPath: string | null = null;\n    const outputPaths: string[] = [];\n\n    try {\n      // Download original video\n      inputPath = join(\n        this.tempDir,\n        `${result.fileId}-thumb-input-${randomBytes(FFMPEG_VIDEO_CONSTANTS.RANDOM_BYTES_LENGTH).toString('hex')}.mp4`\n      );\n      const fileBuffer = await context.storageAdapter.download({\n        fileId: result.fileId,\n      });\n\n      await writeFile(inputPath, fileBuffer.file!);\n\n      // Calculate timestamps if not provided\n      const timestamps =\n        this.thumbnails.timestamps ?? this.calculateTimestamps(duration, this.thumbnails.count);\n\n      // Generate thumbnails at each timestamp\n      for (let i = 0; i < timestamps.length; i++) {\n        const timestamp = timestamps[i];\n        const timeInSeconds = duration * timestamp; // Convert fraction to seconds\n\n        const outputFilename = `${result.metadata.filename ?? 'video'}-thumb-${i + 1}.${this.thumbnails.format ?? 'jpg'}`;\n        const outputPath = join(\n          this.tempDir,\n          `${result.fileId}-thumb-${i}-${randomBytes(FFMPEG_VIDEO_CONSTANTS.RANDOM_BYTES_LENGTH).toString('hex')}.${this.thumbnails.format ?? 'jpg'}`\n        );\n        outputPaths.push(outputPath);\n\n        // Generate thumbnail\n        try {\n          await ffmpegWrapper.screenshots(inputPath!, {\n            timestamps: [timeInSeconds],\n            filename: outputPath.split('/').pop()!,\n            folder: this.tempDir,\n            size: this.thumbnails!.size\n              ? `${this.thumbnails!.size.width}x${this.thumbnails!.size.height}`\n              : '320x240',\n          });\n\n          this.log('debug', 'Thumbnail generated', {\n            fileId: result.fileId,\n            index: i + 1,\n            timestamp: timeInSeconds,\n          });\n        } catch (err) {\n          this.log('error', 'Thumbnail generation failed', {\n            fileId: result.fileId,\n            index: i + 1,\n            error: err instanceof Error ? err.message : String(err),\n          });\n          throw err;\n        }\n\n        // Upload thumbnail if exists\n        if (existsSync(outputPath)) {\n          const thumbnailBuffer = await readFile(outputPath);\n\n          const uploadResult = await context.storageAdapter.upload({\n            file: thumbnailBuffer,\n            filename: outputFilename,\n            mimeType: `image/${this.thumbnails.format ?? 'jpeg'}`,\n            category: result.metadata.category,\n            entityType: result.metadata.entityType,\n            entityId: result.metadata.entityId,\n            accessLevel: result.metadata.accessLevel,\n            customMetadata: {\n              originalFileId: result.fileId,\n              thumbnailIndex: i + 1,\n              timestamp: timeInSeconds,\n              thumbnail: true,\n              userId: context.userId,\n            },\n          });\n\n          this.log('info', 'Thumbnail uploaded', {\n            originalFileId: result.fileId,\n            thumbnailFileId: uploadResult.metadata.fileId,\n            index: i + 1,\n          });\n        }\n      }\n    } catch (error) {\n      throw new StoragePackageError(\n        `Failed to generate thumbnails: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n        {\n          context: {\n            plugin: this.name,\n            fileId: result.fileId,\n          },\n        }\n      );\n    } finally {\n      // Clean up temp files\n      await this.cleanupInputPath(inputPath);\n      await this.cleanupOutputPaths(outputPaths);\n    }\n  }\n\n  /**\n   * Calculate evenly distributed timestamps for thumbnails\n   */\n  private calculateTimestamps(duration: number, count: number): number[] {\n    const timestamps: number[] = [];\n    const interval = 1 / (count + 1);\n\n    for (let i = 1; i <= count; i++) {\n      timestamps.push(interval * i);\n    }\n\n    return timestamps;\n  }\n\n  /**\n   * Generate HLS (HTTP Live Streaming) segments and playlists\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  private async generateHLS(\n    result: StoragePluginUploadResult,\n    context: StoragePluginContext\n  ): Promise<void> {\n    if (!this.hls?.enabled) {\n      return;\n    }\n\n    this.log('info', 'Generating HLS segments', {\n      fileId: result.fileId,\n      segmentDuration: this.hls.segmentDuration,\n    });\n\n    let inputPath: string | null = null;\n    const outputDir = join(\n      this.tempDir,\n      `${result.fileId}-hls-${randomBytes(FFMPEG_VIDEO_CONSTANTS.RANDOM_BYTES_LENGTH).toString('hex')}`\n    );\n    const segmentFiles: string[] = [];\n\n    try {\n      // Create HLS output directory\n      if (!existsSync(outputDir)) {\n        await mkdir(outputDir, { recursive: true });\n      }\n\n      // Download original video\n      inputPath = join(\n        this.tempDir,\n        `${result.fileId}-hls-input-${randomBytes(FFMPEG_VIDEO_CONSTANTS.RANDOM_BYTES_LENGTH).toString('hex')}.mp4`\n      );\n      const fileBuffer = await context.storageAdapter.download({\n        fileId: result.fileId,\n      });\n\n      await writeFile(inputPath, fileBuffer.file!);\n\n      const segmentDuration = this.hls.segmentDuration ?? FFMPEG_VIDEO_CONSTANTS.HLS_SEGMENT_TIME; // Default 10 seconds\n      const playlistFilename = 'playlist.m3u8';\n      // eslint-disable-next-line no-unused-vars -- segmentPattern reserved for future ffmpeg customization\n      const segmentPattern = 'segment%03d.ts';\n      const playlistPath = join(outputDir, playlistFilename);\n\n      // Generate HLS segments\n      try {\n        await ffmpegWrapper.generateHLS({\n          input: inputPath!,\n          output: playlistPath,\n          segmentDuration,\n          onStart: commandLine => {\n            this.log('debug', 'HLS FFmpeg command', { commandLine });\n          },\n        });\n\n        this.log('info', 'HLS segments generated', {\n          fileId: result.fileId,\n        });\n      } catch (err) {\n        this.log('error', 'HLS generation failed', {\n          fileId: result.fileId,\n          error: err instanceof Error ? err.message : String(err),\n        });\n        throw err;\n      }\n\n      // Read generated segment files from directory\n      const files = await readdir(outputDir);\n      segmentFiles.push(...files.map(f => join(outputDir, f)));\n\n      // Upload playlist and segments\n      for (const file of files) {\n        const filePath = join(outputDir, file);\n        const fileBuffer = await readFile(filePath);\n        const isPlaylist = file.endsWith('.m3u8');\n\n        const uploadResult = await context.storageAdapter.upload({\n          file: fileBuffer,\n          filename: `${result.fileId}-hls/${file}`,\n          mimeType: isPlaylist ? 'application/vnd.apple.mpegurl' : 'video/MP2T',\n          category: result.metadata.category,\n          entityType: result.metadata.entityType,\n          entityId: result.metadata.entityId,\n          accessLevel: result.metadata.accessLevel,\n          customMetadata: {\n            originalFileId: result.fileId,\n            hlsFile: true,\n            isPlaylist,\n            userId: context.userId,\n          },\n        });\n\n        this.log('debug', 'HLS file uploaded', {\n          originalFileId: result.fileId,\n          hlsFileId: uploadResult.metadata.fileId,\n          filename: file,\n          isPlaylist,\n        });\n      }\n\n      this.log('info', 'HLS stream generated successfully', {\n        fileId: result.fileId,\n        segmentCount: files.filter(f => f.endsWith('.ts')).length,\n        playlistUploaded: files.some(f => f.endsWith('.m3u8')),\n      });\n    } catch (error) {\n      throw new StoragePackageError(\n        `Failed to generate HLS stream: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n        {\n          context: {\n            plugin: this.name,\n            fileId: result.fileId,\n          },\n        }\n      );\n    } finally {\n      // Clean up temp files\n      if (inputPath && existsSync(inputPath)) {\n        try {\n          await unlink(inputPath);\n        } catch {\n          // Ignore cleanup errors\n        }\n      }\n\n      // Clean up HLS directory\n      if (existsSync(outputDir)) {\n        try {\n          await rm(outputDir, { recursive: true, force: true });\n        } catch {\n          // Ignore cleanup errors\n        }\n      }\n    }\n  }\n\n  /**\n   * Transcode video to different resolution\n   */\n  // eslint-disable-next-line max-lines-per-function, complexity\n  private async transcodeVideo(\n    result: StoragePluginUploadResult,\n    resolution: VideoResolution,\n    context: StoragePluginContext\n  ): Promise<void> {\n    this.log('info', 'Transcoding video', {\n      fileId: result.fileId,\n      resolution: resolution.name,\n      bitrate: resolution.bitrate,\n    });\n\n    let inputPath: string | null = null;\n    let outputPath: string | null = null;\n\n    try {\n      // Download original video\n      inputPath = join(\n        this.tempDir,\n        `${result.fileId}-input-${randomBytes(FFMPEG_VIDEO_CONSTANTS.RANDOM_BYTES_LENGTH).toString('hex')}.mp4`\n      );\n      const fileBuffer = await context.storageAdapter.download({\n        fileId: result.fileId,\n      });\n\n      await writeFile(inputPath, fileBuffer.file!);\n\n      // Prepare output path\n      const originalFilename = result.metadata.filename ?? 'video';\n      const nameWithoutExt = originalFilename.replace(/\\.[^/.]+$/, '');\n      const outputFilename = `${nameWithoutExt}-${resolution.name}.mp4`;\n      outputPath = join(\n        this.tempDir,\n        `${result.fileId}-output-${randomBytes(FFMPEG_VIDEO_CONSTANTS.RANDOM_BYTES_LENGTH).toString('hex')}.mp4`\n      );\n\n      // Transcode video\n      try {\n        await ffmpegWrapper.transcode({\n          input: inputPath!,\n          output: outputPath!,\n          size: `${resolution.width}x${resolution.height}`,\n          videoBitrate: resolution.bitrate,\n          videoCodec: resolution.codec ?? 'libx264',\n          audioCodec: resolution.audioCodec ?? 'aac',\n          audioBitrate: resolution.audioBitrate ?? '128k',\n          format: 'mp4',\n          onStart: commandLine => {\n            this.log('debug', 'FFmpeg command', { commandLine });\n          },\n          onProgress: progress => {\n            this.log('debug', 'Transcoding progress', {\n              fileId: result.fileId,\n              resolution: resolution.name,\n              currentTime: progress.currentTime,\n            });\n          },\n        });\n\n        this.log('info', 'Transcoding completed', {\n          fileId: result.fileId,\n          resolution: resolution.name,\n        });\n      } catch (err) {\n        this.log('error', 'Transcoding failed', {\n          fileId: result.fileId,\n          resolution: resolution.name,\n          error: err instanceof Error ? err.message : String(err),\n        });\n        throw err;\n      }\n\n      // Upload transcoded variant if enabled\n      if (this.uploadVariants && outputPath && existsSync(outputPath)) {\n        const transcodedBuffer = await readFile(outputPath);\n\n        const uploadResult = await context.storageAdapter.upload({\n          file: transcodedBuffer,\n          filename: outputFilename,\n          mimeType: 'video/mp4',\n          category: result.metadata.category,\n          entityType: result.metadata.entityType,\n          entityId: result.metadata.entityId,\n          accessLevel: result.metadata.accessLevel,\n          customMetadata: {\n            originalFileId: result.fileId,\n            resolution: resolution.name,\n            variant: true,\n            userId: context.userId,\n          },\n        });\n\n        this.log('info', 'Transcoded variant uploaded', {\n          originalFileId: result.fileId,\n          variantFileId: uploadResult.metadata.fileId,\n          resolution: resolution.name,\n        });\n      }\n    } catch (error) {\n      throw new StoragePackageError(\n        `Failed to transcode video: ${error instanceof Error ? error.message : String(error)}`,\n        STORAGE_ERROR_CODES.PLUGIN_EXECUTION_FAILED,\n        {\n          context: {\n            plugin: this.name,\n            fileId: result.fileId,\n            resolution: resolution.name,\n          },\n        }\n      );\n    } finally {\n      // Clean up temp files\n      if (inputPath && existsSync(inputPath)) {\n        try {\n          await unlink(inputPath);\n        } catch {\n          // Ignore cleanup errors\n        }\n      }\n      if (outputPath && existsSync(outputPath)) {\n        try {\n          await unlink(outputPath);\n        } catch {\n          // Ignore cleanup errors\n        }\n      }\n    }\n  }\n\n  /**\n   * Check if file is a video\n   */\n  private isVideoFile(mimeType: string): boolean {\n    return this.supportedMimeTypes.has(mimeType);\n  }\n\n  /**\n   * Health check\n   */\n  async healthCheck(): Promise<StoragePluginHealth> {\n    const baseHealth = await super.healthCheck();\n\n    return {\n      ...baseHealth,\n      message: `FFmpeg ready - Processed ${this.videosProcessed} videos, generated ${this.variantsGenerated} variants`,\n    };\n  }\n\n  /**\n   * Get processing statistics\n   */\n  getStatistics(): StorageVideoProcessingPluginStatistics {\n    return {\n      videosProcessed: this.videosProcessed,\n      variantsGenerated: this.variantsGenerated,\n      averageVariantsPerVideo:\n        this.videosProcessed > 0\n          ? Math.round(\n              (this.variantsGenerated / this.videosProcessed) *\n                FFMPEG_VIDEO_CONSTANTS.PERCENTAGE_MULTIPLIER\n            ) / FFMPEG_VIDEO_CONSTANTS.PERCENTAGE_MULTIPLIER\n          : 0,\n    };\n  }\n\n  /**\n   * Helper: Clean up input temp file\n   */\n  private async cleanupInputPath(inputPath: string | null): Promise<void> {\n    if (inputPath && existsSync(inputPath)) {\n      try {\n        await unlink(inputPath);\n      } catch {\n        // Ignore cleanup errors\n      }\n    }\n  }\n\n  /**\n   * Helper: Clean up output temp files\n   */\n  private async cleanupOutputPaths(outputPaths: string[]): Promise<void> {\n    for (const outputPath of outputPaths) {\n      if (existsSync(outputPath)) {\n        try {\n          await unlink(outputPath);\n        } catch {\n          // Ignore cleanup errors\n        }\n      }\n    }\n  }\n}\n","/**\n * Metadata Extraction Plugin\n * Extract comprehensive metadata from various file types\n *\n * @module @plyaz/storage/plugins/metadata-extraction\n *\n * @example\n * ```typescript\n * import { MetadataExtractionPlugin } from '@plyaz/storage/plugins';\n *\n * const metadataPlugin = new MetadataExtractionPlugin({\n *   extractExif: true,\n *   extractId3: true,\n *   extractVideoMeta: true,\n *   extractDocMeta: true,\n *   stripSensitiveData: true,\n *   priority: 30,\n * });\n * ```\n */\n\nimport { BasePlugin } from '../../base/BasePlugin';\nimport type {\n  StoragePluginContext,\n  StoragePluginHealth,\n  BeforeUploadResult,\n  StoragePluginFile,\n  MetadataExtractionPluginConfig,\n  ExtractedMetadata,\n  StorageMetadataExtractionPluginStatistics,\n} from '@plyaz/types/storage';\nimport { STORAGE_PLUGIN_TYPE } from '@plyaz/types/storage';\nimport * as exifr from 'exifr';\nimport { parseBuffer } from 'music-metadata';\nimport { ffprobe } from '../../../utils/ffmpegWrapper';\nimport type { FFprobeData, FFprobeStream } from '@plyaz/types/storage';\nimport { PDFParse } from 'pdf-parse';\nimport { writeFile, unlink } from 'fs/promises';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\n\n/**\n * Metadata Extraction Plugin constants\n */\nconst METADATA_EXTRACTION_CONSTANTS = {\n  DEFAULT_PRIORITY: 30,\n  PERCENTAGE_MULTIPLIER: 100,\n  FRAME_RATE_PARTS_COUNT: 2,\n} as const;\n\n/**\n * Metadata Extraction Plugin\n * Extract comprehensive metadata from various file types\n *\n * Features:\n * - Image EXIF data (camera, location, date)\n * - Audio ID3 tags (artist, album, genre)\n * - Video metadata (codec, resolution, duration, fps)\n * - Document properties (author, title, page count)\n * - Privacy features (strip GPS, serial numbers)\n */\nexport class MetadataExtractionPlugin extends BasePlugin {\n  private readonly extractExif: boolean;\n  private readonly extractId3: boolean;\n  private readonly extractVideoMeta: boolean;\n  private readonly extractDocMeta: boolean;\n  private readonly stripSensitiveData: boolean;\n  private readonly preserveOriginal: boolean;\n  private readonly supportedMimeTypes: Set<string>;\n\n  private filesProcessed: number = 0;\n  private metadataExtracted: number = 0;\n\n  // eslint-disable-next-line complexity\n  constructor(config: MetadataExtractionPluginConfig = {}) {\n    super({\n      name: 'metadata-extractor',\n      type: STORAGE_PLUGIN_TYPE.PROCESSING,\n      priority: config.priority ?? METADATA_EXTRACTION_CONSTANTS.DEFAULT_PRIORITY,\n      version: config.version ?? '1.0.0',\n      description:\n        config.description ?? 'Extract metadata from images, audio, video, and documents',\n      enabled: config.enabled ?? true,\n      logger: config.logger,\n    });\n\n    this.extractExif = config.extractExif ?? true;\n    this.extractId3 = config.extractId3 ?? true;\n    this.extractVideoMeta = config.extractVideoMeta ?? true;\n    this.extractDocMeta = config.extractDocMeta ?? true;\n    this.stripSensitiveData = config.stripSensitiveData ?? true;\n    this.preserveOriginal = config.preserveOriginal ?? false;\n\n    this.supportedMimeTypes = new Set(\n      config.supportedMimeTypes ?? [\n        // Images\n        'image/jpeg',\n        'image/png',\n        'image/tiff',\n        'image/webp',\n        // Audio\n        'audio/mpeg',\n        'audio/mp3',\n        'audio/wav',\n        'audio/flac',\n        'audio/ogg',\n        // Video\n        'video/mp4',\n        'video/quicktime',\n        'video/x-msvideo',\n        'video/webm',\n        // Documents\n        'application/pdf',\n      ]\n    );\n  }\n\n  /**\n   * Extract metadata before upload\n   */\n  async beforeUpload(\n    file: StoragePluginFile,\n    _context: StoragePluginContext // eslint-disable-line no-unused-vars\n  ): Promise<BeforeUploadResult> {\n    if (!this.shouldExecute()) {\n      return { allowed: true, file };\n    }\n\n    // Only process supported file types\n    if (!this.supportedMimeTypes.has(file.mimeType)) {\n      return { allowed: true, file };\n    }\n\n    try {\n      this.log('info', 'Extracting metadata', {\n        filename: file.filename,\n        mimeType: file.mimeType,\n      });\n\n      const metadata = await this.extractMetadata(file);\n\n      if (metadata) {\n        this.metadataExtracted++;\n\n        // Add extracted metadata to file customMetadata\n        file.customMetadata = {\n          ...file.customMetadata,\n          extractedMetadata: metadata,\n        };\n\n        this.log('debug', 'Metadata extracted', {\n          filename: file.filename,\n          category: metadata.category,\n          hasExif: !!metadata.exif,\n          hasId3: !!metadata.id3,\n          hasVideo: !!metadata.video,\n          hasDocument: !!metadata.document,\n        });\n      }\n\n      this.filesProcessed++;\n\n      return { allowed: true, file };\n    } catch (error) {\n      this.log('error', 'Failed to extract metadata', {\n        filename: file.filename,\n        error: error instanceof Error ? error.message : String(error),\n      });\n\n      // Don't fail the upload if metadata extraction fails\n      return { allowed: true, file };\n    }\n  }\n\n  /**\n   * Extract metadata from file based on mime type\n   */\n  // eslint-disable-next-line complexity\n  private async extractMetadata(file: StoragePluginFile): Promise<ExtractedMetadata | null> {\n    const mimeType = file.mimeType;\n\n    // Determine file category\n    const category = this.categorizeFile(mimeType);\n\n    const metadata: ExtractedMetadata = {\n      category,\n    };\n\n    try {\n      // Extract based on file type\n      if (category === 'image' && this.extractExif) {\n        metadata.exif = await this.extractExifData(file);\n      } else if (category === 'audio' && this.extractId3) {\n        metadata.id3 = await this.extractId3Data(file);\n      } else if (category === 'video' && this.extractVideoMeta) {\n        metadata.video = await this.extractVideoMetadata(file);\n      } else if (category === 'document' && this.extractDocMeta) {\n        metadata.document = await this.extractDocumentMetadata(file);\n      }\n\n      // Strip sensitive data if configured\n      if (this.stripSensitiveData) {\n        this.stripSensitiveMetadata(metadata);\n      }\n\n      return metadata;\n    } catch (error) {\n      this.log('error', 'Metadata extraction failed', {\n        filename: file.filename,\n        category,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      return null;\n    }\n  }\n\n  /**\n   * Categorize file based on mime type\n   */\n  private categorizeFile(mimeType: string): 'image' | 'audio' | 'video' | 'document' | 'other' {\n    if (mimeType.startsWith('image/')) return 'image';\n    if (mimeType.startsWith('audio/')) return 'audio';\n    if (mimeType.startsWith('video/')) return 'video';\n    if (mimeType === 'application/pdf' || mimeType.includes('document')) return 'document';\n    return 'other';\n  }\n\n  /**\n   * Extract EXIF data from images\n   * Uses exifr to extract metadata from images\n   */\n  // eslint-disable-next-line complexity\n  private async extractExifData(\n    file: StoragePluginFile\n  ): Promise<ExtractedMetadata['exif'] | undefined> {\n    try {\n      const buffer = Buffer.isBuffer(file.buffer) ? file.buffer : Buffer.from(file.buffer);\n\n      // exifr works with multiple image formats\n      const result = await exifr.parse(buffer, {\n        tiff: true,\n        exif: true,\n        gps: true,\n      });\n\n      if (!result) {\n        return undefined;\n      }\n\n      const exifData: ExtractedMetadata['exif'] = {\n        make: result.Make,\n        model: result.Model,\n        software: result.Software,\n        dateTime: result.DateTime\n          ? new Date(result.DateTime).toISOString()\n          : result.DateTimeOriginal\n            ? new Date(result.DateTimeOriginal).toISOString()\n            : undefined,\n        orientation: result.Orientation,\n        xResolution: result.XResolution,\n        yResolution: result.YResolution,\n        resolutionUnit: result.ResolutionUnit,\n        exposureTime: result.ExposureTime,\n        fNumber: result.FNumber,\n        iso: result.ISO,\n        focalLength: result.FocalLength,\n        flash: result.Flash,\n        whiteBalance: result.WhiteBalance,\n      };\n\n      // Extract GPS data if available\n      if (result.latitude !== undefined && result.longitude !== undefined) {\n        exifData.gps = {\n          latitude: result.latitude,\n          longitude: result.longitude,\n          altitude: result.altitude,\n        };\n      }\n\n      this.log('debug', 'EXIF data extracted successfully', {\n        filename: file.filename,\n        hasGPS: !!exifData.gps,\n      });\n\n      return exifData;\n    } catch (error) {\n      this.log('warn', 'EXIF extraction failed', {\n        filename: file.filename,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      return undefined;\n    }\n  }\n\n  /**\n   * Extract ID3 tags from audio files\n   * Uses music-metadata to extract tags from various audio formats\n  // eslint-disable-next-line complexity\n   */\n  // eslint-disable-next-line complexity\n  private async extractId3Data(\n    file: StoragePluginFile\n  ): Promise<ExtractedMetadata['id3'] | undefined> {\n    try {\n      const buffer = Buffer.isBuffer(file.buffer) ? file.buffer : Buffer.from(file.buffer);\n\n      const metadata = await parseBuffer(buffer, file.mimeType);\n\n      if (!metadata.common) {\n        return undefined;\n      }\n\n      const id3Data: ExtractedMetadata['id3'] = {\n        title: metadata.common.title,\n        artist: metadata.common.artist,\n        album: metadata.common.album,\n        year: metadata.common.year,\n        genre: metadata.common.genre?.[0],\n        trackNumber: metadata.common.track?.no ?? undefined,\n        albumArtist: metadata.common.albumartist,\n        composer: metadata.common.composer?.[0],\n        duration: metadata.format.duration,\n        bitrate: metadata.format.bitrate,\n        sampleRate: metadata.format.sampleRate,\n        codec: metadata.format.codec,\n      };\n\n      this.log('debug', 'ID3 tags extracted successfully', {\n        filename: file.filename,\n        title: id3Data?.title,\n        artist: id3Data?.artist,\n      });\n\n      return id3Data;\n    } catch (error) {\n      this.log('warn', 'ID3 extraction failed', {\n        filename: file.filename,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      return undefined;\n    }\n  }\n\n  /**\n   * Extract metadata from video files\n  // eslint-disable-next-line complexity\n   * Uses fluent-ffmpeg to extract video metadata via ffprobe\n   */\n  // eslint-disable-next-line complexity\n  private async extractVideoMetadata(\n    file: StoragePluginFile\n  ): Promise<ExtractedMetadata['video'] | undefined> {\n    try {\n      const buffer = Buffer.isBuffer(file.buffer) ? file.buffer : Buffer.from(file.buffer);\n\n      // Create temp file (ffmpeg needs file path)\n      const tempDir = tmpdir();\n      const tempFilePath = join(tempDir, `temp-${Date.now()}-${file.filename}`);\n\n      try {\n        await writeFile(tempFilePath, buffer);\n\n        // Get metadata using ffprobe\n        const metadata: FFprobeData = await ffprobe(tempFilePath);\n\n        const videoStream = metadata.streams?.find((s: FFprobeStream) => s.codec_type === 'video');\n        const audioStream = metadata.streams?.find((s: FFprobeStream) => s.codec_type === 'audio');\n\n        const videoData: ExtractedMetadata['video'] = {\n          codec: videoStream?.codec_name,\n          width: videoStream?.width,\n          height: videoStream?.height,\n          duration: metadata.format?.duration,\n          bitrate:\n            typeof metadata.format?.bit_rate === 'string'\n              ? Number.parseInt(metadata.format.bit_rate, 10)\n              : metadata.format?.bit_rate,\n          fps: videoStream?.r_frame_rate\n            ? this.parseFrameRate(videoStream.r_frame_rate) // Convert \"30/1\" to 30\n            : undefined,\n          audioCodec: audioStream?.codec_name,\n          format: metadata.format?.format_name,\n        };\n\n        this.log('debug', 'Video metadata extracted successfully', {\n          filename: file.filename,\n          codec: videoData?.codec,\n          resolution:\n            videoData?.width && videoData?.height\n              ? `${videoData.width}x${videoData.height}`\n              : undefined,\n        });\n\n        return videoData;\n      } finally {\n        // Clean up temp file\n        await unlink(tempFilePath).catch(() => {\n          /* ignore cleanup errors */\n        });\n      }\n    } catch (error) {\n      this.log('warn', 'Video metadata extraction failed', {\n        filename: file.filename,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      return undefined;\n    }\n  }\n\n  /**\n  // eslint-disable-next-line complexity\n   * Extract metadata from documents\n   * Uses pdf-parse to extract metadata from PDF files\n   */\n  // eslint-disable-next-line complexity\n  private async extractDocumentMetadata(\n    file: StoragePluginFile\n  ): Promise<ExtractedMetadata['document'] | undefined> {\n    try {\n      // Only handle PDFs for now\n      if (file.mimeType !== 'application/pdf') {\n        return undefined;\n      }\n\n      const buffer = Buffer.isBuffer(file.buffer) ? file.buffer : Buffer.from(file.buffer);\n\n      const data = await new PDFParse(buffer).getInfo();\n\n      const documentData: ExtractedMetadata['document'] = {\n        title: data.info?.Title,\n        author: data.info?.Author,\n        subject: data.info?.Subject,\n        creator: data.info?.Creator,\n        producer: data.info?.Producer,\n        creationDate: data.info?.CreationDate,\n        modificationDate: data.info?.ModDate,\n        pageCount: data.pages.length,\n      };\n\n      this.log('debug', 'Document metadata extracted successfully', {\n        filename: file.filename,\n        pageCount: documentData?.pageCount,\n        author: documentData?.author,\n      });\n\n      return documentData;\n    } catch (error) {\n      this.log('warn', 'Document metadata extraction failed', {\n        filename: file.filename,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      return undefined;\n    }\n  }\n\n  /**\n   * Parse frame rate string (e.g., \"30/1\" -> 30)\n   */\n  private parseFrameRate(frameRate: string): number | undefined {\n    try {\n      if (typeof frameRate !== 'string') return undefined;\n\n      const parts = frameRate.split('/');\n      if (parts.length !== METADATA_EXTRACTION_CONSTANTS.FRAME_RATE_PARTS_COUNT)\n        return Number.parseFloat(frameRate);\n\n      const numerator = Number.parseFloat(parts[0]);\n      const denominator = Number.parseFloat(parts[1]);\n\n      if (isNaN(numerator) || isNaN(denominator) || denominator === 0) {\n        return undefined;\n      }\n\n      return numerator / denominator;\n    } catch {\n      return undefined;\n    }\n  }\n\n  /**\n   * Strip sensitive metadata (GPS coordinates, serial numbers)\n   */\n  private stripSensitiveMetadata(metadata: ExtractedMetadata): void {\n    if (metadata.exif?.gps) {\n      this.log('debug', 'Stripping GPS data from EXIF');\n      delete metadata.exif.gps;\n    }\n\n    // Remove other sensitive fields as needed\n    // e.g., camera serial numbers, owner names, etc.\n  }\n\n  /**\n   * Health check\n   */\n  async healthCheck(): Promise<StoragePluginHealth> {\n    const baseHealth = await super.healthCheck();\n\n    return {\n      ...baseHealth,\n      message: `Metadata extractor ready - Processed ${this.filesProcessed} files, extracted ${this.metadataExtracted} metadata`,\n    };\n  }\n\n  /**\n   * Get processing statistics\n   */\n  getStatistics(): StorageMetadataExtractionPluginStatistics {\n    return {\n      filesProcessed: this.filesProcessed,\n      metadataExtracted: this.metadataExtracted,\n      successRate:\n        this.filesProcessed > 0\n          ? Math.round(\n              (this.metadataExtracted / this.filesProcessed) *\n                METADATA_EXTRACTION_CONSTANTS.PERCENTAGE_MULTIPLIER\n            )\n          : 0,\n    };\n  }\n}\n","/**\n * Cloudflare CDN Plugin\n * Automatically invalidates Cloudflare CDN cache when files are deleted or updated\n *\n * @module @plyaz/storage/plugins/cloudflare-cdn\n *\n * @example\n * ```typescript\n * import { CloudflareCDNPlugin } from '@plyaz/storage/plugins';\n *\n * const plugin = new CloudflareCDNPlugin({\n *   zoneId: process.env.CLOUDFLARE_ZONE_ID!,\n *   apiToken: process.env.CLOUDFLARE_API_TOKEN!,\n *   baseUrl: 'https://cdn.example.com',\n *   priority: 20,\n * });\n * ```\n */\n\nimport { BasePlugin } from '../../../base/BasePlugin';\nimport type {\n  StoragePluginUploadResult,\n  StoragePluginContext,\n  StoragePluginHealth,\n  StoragePluginDeleteResult,\n  CloudflareCDNPluginConfig,\n  StorageCDNPluginStatistics,\n} from '@plyaz/types/storage';\nimport { STORAGE_PLUGIN_TYPE } from '@plyaz/types/storage';\nimport { cloudflarePurgeCache } from '@plyaz/api';\n\n/**\n * Cloudflare CDN Plugin constants\n */\nconst CLOUDFLARE_CDN_CONSTANTS = {\n  DEFAULT_PRIORITY: 20,\n  DEFAULT_BATCH_SIZE: 30, // Cloudflare max per request\n  DEFAULT_RETRY_ATTEMPTS: 3,\n  DEFAULT_RETRY_DELAY_MS: 1000,\n  BATCH_DELAY_MS: 5000,\n  PERCENTAGE_MULTIPLIER: 100,\n} as const;\n\n/**\n * Cloudflare CDN Plugin\n * Automatically purges Cloudflare CDN cache when files change\n *\n * Features:\n * - Automatic cache purging on delete/update\n * - Batch processing (up to 30 URLs per request)\n * - Retry logic for failed purges\n * - Health monitoring\n */\nexport class CloudflareCDNPlugin extends BasePlugin {\n  private readonly zoneId: string;\n  private readonly apiToken: string;\n  private readonly baseUrl?: string;\n  private readonly invalidateOnDelete: boolean;\n  private readonly invalidateOnUpdate: boolean;\n  private readonly batchSize: number;\n  private readonly retryAttempts: number;\n  private readonly retryDelay: number;\n  private readonly urlGenerator?: (fileId: string, filename: string) => string[];\n\n  private invalidationsPerformed: number = 0;\n  private invalidationsFailed: number = 0;\n  private urlsInvalidated: number = 0;\n\n  // Queue for batching\n  private readonly invalidationQueue: Set<string> = new Set();\n  private flushTimer: globalThis.NodeJS.Timeout | null = null;\n\n  // eslint-disable-next-line complexity\n  constructor(config: CloudflareCDNPluginConfig) {\n    super({\n      name: 'cloudflare-cdn',\n      type: STORAGE_PLUGIN_TYPE.MONITORING,\n      priority: config.priority ?? CLOUDFLARE_CDN_CONSTANTS.DEFAULT_PRIORITY,\n      version: config.version ?? '1.0.0',\n      description: config.description ?? 'Cloudflare CDN cache invalidation',\n      enabled: config.enabled ?? true,\n      logger: config.logger,\n    });\n\n    this.zoneId = config.zoneId;\n    this.apiToken = config.apiToken;\n    this.baseUrl = config.baseUrl;\n    this.batchSize = config.batchSize ?? CLOUDFLARE_CDN_CONSTANTS.DEFAULT_BATCH_SIZE;\n    this.retryAttempts = config.retryAttempts ?? CLOUDFLARE_CDN_CONSTANTS.DEFAULT_RETRY_ATTEMPTS;\n    this.retryDelay = config.retryDelay ?? CLOUDFLARE_CDN_CONSTANTS.DEFAULT_RETRY_DELAY_MS;\n    this.invalidateOnDelete = config.invalidateOnDelete ?? true;\n    this.invalidateOnUpdate = config.invalidateOnUpdate ?? true;\n    this.urlGenerator = config.urlGenerator;\n  }\n\n  /**\n   * Invalidate cache after file deletion\n   */\n\n  async afterDelete(\n    result: StoragePluginDeleteResult,\n    _context: StoragePluginContext // eslint-disable-line no-unused-vars\n  ): Promise<void> {\n    if (!this.shouldExecute() || !this.invalidateOnDelete) {\n      return;\n    }\n\n    try {\n      const urls = this.generateUrls(result.fileId, result.metadata?.filename ?? 'unknown');\n      await this.queueInvalidation(urls);\n    } catch (error) {\n      this.log('error', 'Cloudflare invalidation failed', {\n        fileId: result.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  /**\n   * Invalidate cache after file upload/update\n   */\n\n  async afterUpload(\n    result: StoragePluginUploadResult,\n    _context: StoragePluginContext // eslint-disable-line no-unused-vars\n  ): Promise<void> {\n    if (!this.shouldExecute() || !this.invalidateOnUpdate) {\n      return;\n    }\n\n    try {\n      const urls = this.generateUrls(result.fileId, result.metadata.filename);\n      await this.queueInvalidation(urls);\n    } catch (error) {\n      this.log('error', 'Cloudflare invalidation failed', {\n        fileId: result.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  /**\n   * Generate URLs to invalidate\n   */\n  private generateUrls(fileId: string, filename: string): string[] {\n    if (this.urlGenerator) {\n      return this.urlGenerator(fileId, filename);\n    }\n\n    if (this.baseUrl) {\n      return [`${this.baseUrl}/${fileId}`, `${this.baseUrl}/${filename}`];\n    }\n\n    return [];\n  }\n\n  /**\n   * Queue URLs for batch invalidation\n   */\n  private async queueInvalidation(urls: string[]): Promise<void> {\n    for (const url of urls) {\n      this.invalidationQueue.add(url);\n    }\n\n    // Flush immediately if batch size reached\n    if (this.invalidationQueue.size >= this.batchSize) {\n      await this.flushQueue();\n    } else {\n      // Schedule flush after delay if not already scheduled\n      this.flushTimer ??= setTimeout(() => {\n        this.flushQueue().catch(error => {\n          this.log('error', 'Failed to flush Cloudflare invalidation queue', {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        });\n      }, CLOUDFLARE_CDN_CONSTANTS.BATCH_DELAY_MS);\n    }\n  }\n\n  /**\n   * Flush invalidation queue\n   */\n  private async flushQueue(): Promise<void> {\n    if (this.flushTimer) {\n      clearTimeout(this.flushTimer);\n      this.flushTimer = null;\n    }\n\n    if (this.invalidationQueue.size === 0) {\n      return;\n    }\n\n    const urls = Array.from(this.invalidationQueue);\n    this.invalidationQueue.clear();\n\n    this.log('info', 'Flushing Cloudflare CDN invalidations', {\n      urlCount: urls.length,\n    });\n\n    let lastError: Error | undefined;\n\n    for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {\n      try {\n        await cloudflarePurgeCache({\n          zoneId: this.zoneId,\n          apiToken: this.apiToken,\n          files: urls,\n        });\n\n        this.invalidationsPerformed++;\n        this.urlsInvalidated += urls.length;\n\n        this.log('info', 'Cloudflare cache purged successfully', {\n          urls: urls.length,\n        });\n\n        return;\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error(String(error));\n\n        if (attempt < this.retryAttempts) {\n          this.log('warn', 'Cloudflare invalidation failed, retrying', {\n            attempt: attempt + 1,\n            maxAttempts: this.retryAttempts,\n            error: lastError.message,\n          });\n\n          await this.sleep(this.retryDelay * (attempt + 1)); // Exponential backoff\n        }\n      }\n    }\n\n    this.invalidationsFailed++;\n    this.log('error', 'Cloudflare invalidation failed after retries', {\n      urls: urls.length,\n      error: lastError?.message,\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   * Cleanup when plugin is destroyed\n   */\n  async destroy(): Promise<void> {\n    await this.flushQueue();\n    await super.destroy();\n  }\n\n  /**\n   * Health check\n   */\n  async healthCheck(): Promise<StoragePluginHealth> {\n    const baseHealth = await super.healthCheck();\n\n    const successRate =\n      this.invalidationsPerformed + this.invalidationsFailed > 0\n        ? Math.round(\n            (this.invalidationsPerformed /\n              (this.invalidationsPerformed + this.invalidationsFailed)) *\n              CLOUDFLARE_CDN_CONSTANTS.PERCENTAGE_MULTIPLIER\n          )\n        : CLOUDFLARE_CDN_CONSTANTS.PERCENTAGE_MULTIPLIER;\n\n    return {\n      ...baseHealth,\n      message: `Cloudflare CDN ready - ${this.invalidationsPerformed} successful, ${this.invalidationsFailed} failed (${successRate}% success rate)`,\n    };\n  }\n\n  /**\n   * Get statistics\n   */\n  getStatistics(): StorageCDNPluginStatistics {\n    return {\n      invalidationsPerformed: this.invalidationsPerformed,\n      invalidationsFailed: this.invalidationsFailed,\n      urlsInvalidated: this.urlsInvalidated,\n      queuedUrls: this.invalidationQueue.size,\n    };\n  }\n}\n","/**\n * AWS CloudFront CDN Plugin\n * Automatically invalidates CloudFront CDN cache when files are deleted or updated\n *\n * @module @plyaz/storage/plugins/cloudfront-cdn\n *\n * @example\n * ```typescript\n * import { CloudFrontCDNPlugin } from '@plyaz/storage/plugins';\n *\n * const plugin = new CloudFrontCDNPlugin({\n *   distributionId: process.env.CLOUDFRONT_DISTRIBUTION_ID!,\n *   accessKeyId: process.env.AWS_ACCESS_KEY_ID!,\n *   secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,\n *   region: 'us-east-1',\n *   baseUrl: 'https://cdn.example.com',\n *   priority: 20,\n * });\n * ```\n */\n\nimport { BasePlugin } from '../../../base/BasePlugin';\nimport type {\n  StoragePluginUploadResult,\n  StoragePluginContext,\n  StoragePluginHealth,\n  StoragePluginDeleteResult,\n  CloudFrontCDNPluginConfig,\n  StorageCDNPluginStatistics,\n} from '@plyaz/types/storage';\nimport { STORAGE_PLUGIN_TYPE } from '@plyaz/types/storage';\nimport { cloudFrontCreateInvalidation } from '@plyaz/api';\n\n/**\n * CloudFront CDN Plugin constants\n */\nconst CLOUDFRONT_CDN_CONSTANTS = {\n  DEFAULT_PRIORITY: 20,\n  DEFAULT_BATCH_SIZE: 1000, // CloudFront max per invalidation\n  DEFAULT_RETRY_ATTEMPTS: 3,\n  DEFAULT_RETRY_DELAY_MS: 1000,\n  BATCH_DELAY_MS: 5000,\n  PERCENTAGE_MULTIPLIER: 100,\n} as const;\n\n/**\n * CloudFront CDN Plugin\n * Automatically creates CloudFront invalidations when files change\n *\n * Features:\n * - Automatic invalidation on delete/update\n * - Batch processing (up to 1000 paths per invalidation)\n * - Retry logic\n * - Health monitoring\n */\nexport class CloudFrontCDNPlugin extends BasePlugin {\n  private readonly distributionId: string;\n  private readonly accessKeyId: string;\n  private readonly secretAccessKey: string;\n  private readonly region?: string;\n  private readonly baseUrl?: string;\n  private readonly invalidateOnDelete: boolean;\n  private readonly invalidateOnUpdate: boolean;\n  private readonly batchSize: number;\n  private readonly retryAttempts: number;\n  private readonly retryDelay: number;\n  private readonly pathGenerator?: (fileId: string, filename: string) => string[];\n\n  private invalidationsPerformed: number = 0;\n  private invalidationsFailed: number = 0;\n  private pathsInvalidated: number = 0;\n\n  // Queue for batching\n  private readonly invalidationQueue: Set<string> = new Set();\n  private flushTimer: globalThis.NodeJS.Timeout | null = null;\n\n  // eslint-disable-next-line complexity\n  constructor(config: CloudFrontCDNPluginConfig) {\n    super({\n      name: 'cloudfront-cdn',\n      type: STORAGE_PLUGIN_TYPE.MONITORING,\n      priority: config.priority ?? CLOUDFRONT_CDN_CONSTANTS.DEFAULT_PRIORITY,\n      version: config.version ?? '1.0.0',\n      description: config.description ?? 'AWS CloudFront CDN cache invalidation',\n      enabled: config.enabled ?? true,\n      logger: config.logger,\n    });\n\n    this.distributionId = config.distributionId;\n    this.accessKeyId = config.accessKeyId;\n    this.secretAccessKey = config.secretAccessKey;\n    this.region = config.region;\n    this.baseUrl = config.baseUrl;\n    this.batchSize = config.batchSize ?? CLOUDFRONT_CDN_CONSTANTS.DEFAULT_BATCH_SIZE;\n    this.retryAttempts = config.retryAttempts ?? CLOUDFRONT_CDN_CONSTANTS.DEFAULT_RETRY_ATTEMPTS;\n    this.retryDelay = config.retryDelay ?? CLOUDFRONT_CDN_CONSTANTS.DEFAULT_RETRY_DELAY_MS;\n    this.invalidateOnDelete = config.invalidateOnDelete ?? true;\n    this.invalidateOnUpdate = config.invalidateOnUpdate ?? true;\n    this.pathGenerator = config.pathGenerator;\n  }\n\n  async afterDelete(\n    result: StoragePluginDeleteResult,\n    _context: StoragePluginContext // eslint-disable-line no-unused-vars\n  ): Promise<void> {\n    if (!this.shouldExecute() || !this.invalidateOnDelete) {\n      return;\n    }\n\n    try {\n      const paths = this.generatePaths(result.fileId, result.metadata?.filename ?? 'unknown');\n      await this.queueInvalidation(paths);\n    } catch (error) {\n      this.log('error', 'CloudFront invalidation failed', {\n        fileId: result.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  async afterUpload(\n    result: StoragePluginUploadResult,\n    _context: StoragePluginContext // eslint-disable-line no-unused-vars\n  ): Promise<void> {\n    if (!this.shouldExecute() || !this.invalidateOnUpdate) {\n      return;\n    }\n\n    try {\n      const paths = this.generatePaths(result.fileId, result.metadata.filename);\n      await this.queueInvalidation(paths);\n    } catch (error) {\n      this.log('error', 'CloudFront invalidation failed', {\n        fileId: result.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private generatePaths(fileId: string, filename: string): string[] {\n    if (this.pathGenerator) {\n      return this.pathGenerator(fileId, filename);\n    }\n\n    return [`/${fileId}`, `/${filename}`];\n  }\n\n  private async queueInvalidation(paths: string[]): Promise<void> {\n    for (const path of paths) {\n      this.invalidationQueue.add(path);\n    }\n\n    if (this.invalidationQueue.size >= this.batchSize) {\n      await this.flushQueue();\n    } else\n      this.flushTimer ??= setTimeout(() => {\n        this.flushQueue().catch(error => {\n          this.log('error', 'Failed to flush CloudFront invalidation queue', {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        });\n      }, CLOUDFRONT_CDN_CONSTANTS.BATCH_DELAY_MS);\n  }\n\n  private async flushQueue(): Promise<void> {\n    if (this.flushTimer) {\n      clearTimeout(this.flushTimer);\n      this.flushTimer = null;\n    }\n\n    if (this.invalidationQueue.size === 0) {\n      return;\n    }\n\n    const paths = Array.from(this.invalidationQueue);\n    this.invalidationQueue.clear();\n\n    this.log('info', 'Flushing CloudFront invalidations', {\n      pathCount: paths.length,\n    });\n\n    let lastError: Error | undefined;\n\n    for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {\n      try {\n        await cloudFrontCreateInvalidation({\n          distributionId: this.distributionId,\n          accessKeyId: this.accessKeyId,\n          secretAccessKey: this.secretAccessKey,\n          region: this.region,\n          paths,\n        });\n\n        this.invalidationsPerformed++;\n        this.pathsInvalidated += paths.length;\n\n        this.log('info', 'CloudFront invalidation created successfully', {\n          paths: paths.length,\n        });\n\n        return;\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error(String(error));\n\n        if (attempt < this.retryAttempts) {\n          this.log('warn', 'CloudFront invalidation failed, retrying', {\n            attempt: attempt + 1,\n            maxAttempts: this.retryAttempts,\n            error: lastError.message,\n          });\n\n          await this.sleep(this.retryDelay * (attempt + 1));\n        }\n      }\n    }\n\n    this.invalidationsFailed++;\n    this.log('error', 'CloudFront invalidation failed after retries', {\n      paths: paths.length,\n      error: lastError?.message,\n    });\n  }\n\n  private sleep(ms: number): Promise<void> {\n    return new Promise(resolve => setTimeout(resolve, ms));\n  }\n\n  async destroy(): Promise<void> {\n    await this.flushQueue();\n    await super.destroy();\n  }\n\n  async healthCheck(): Promise<StoragePluginHealth> {\n    const baseHealth = await super.healthCheck();\n\n    const successRate =\n      this.invalidationsPerformed + this.invalidationsFailed > 0\n        ? Math.round(\n            (this.invalidationsPerformed /\n              (this.invalidationsPerformed + this.invalidationsFailed)) *\n              CLOUDFRONT_CDN_CONSTANTS.PERCENTAGE_MULTIPLIER\n          )\n        : CLOUDFRONT_CDN_CONSTANTS.PERCENTAGE_MULTIPLIER;\n\n    return {\n      ...baseHealth,\n      message: `CloudFront CDN ready - ${this.invalidationsPerformed} successful, ${this.invalidationsFailed} failed (${successRate}% success rate)`,\n    };\n  }\n\n  getStatistics(): StorageCDNPluginStatistics {\n    return {\n      invalidationsPerformed: this.invalidationsPerformed,\n      invalidationsFailed: this.invalidationsFailed,\n      pathsInvalidated: this.pathsInvalidated,\n      queuedPaths: this.invalidationQueue.size,\n    };\n  }\n}\n","/**\n * Fastly CDN Plugin\n * Automatically invalidates Fastly CDN cache when files are deleted or updated\n *\n * @module @plyaz/storage/plugins/fastly-cdn\n *\n * @example\n * ```typescript\n * import { FastlyCDNPlugin } from '@plyaz/storage/plugins';\n *\n * const plugin = new FastlyCDNPlugin({\n *   serviceId: process.env.FASTLY_SERVICE_ID!,\n *   apiToken: process.env.FASTLY_API_TOKEN!,\n *   baseUrl: 'https://cdn.example.com',\n *   priority: 20,\n * });\n * ```\n */\n\nimport { BasePlugin } from '../../../base/BasePlugin';\nimport type {\n  StoragePluginUploadResult,\n  StoragePluginContext,\n  StoragePluginHealth,\n  StoragePluginDeleteResult,\n  FastlyCDNPluginConfig,\n  StorageCDNPluginStatistics,\n} from '@plyaz/types/storage';\nimport { STORAGE_PLUGIN_TYPE } from '@plyaz/types/storage';\nimport { fastlyPurgeUrl } from '@plyaz/api';\n\n/**\n * Fastly CDN Plugin constants\n */\nconst FASTLY_CDN_CONSTANTS = {\n  DEFAULT_PRIORITY: 20,\n  DEFAULT_RETRY_ATTEMPTS: 3,\n  DEFAULT_RETRY_DELAY_MS: 1000,\n  PERCENTAGE_MULTIPLIER: 100,\n} as const;\n\n/**\n * Fastly CDN Plugin\n * Automatically purges Fastly CDN cache when files change\n *\n * Features:\n * - Automatic cache purging on delete/update\n * - Individual URL purging (Fastly purges one URL at a time)\n * - Retry logic\n * - Health monitoring\n *\n * Note: Fastly purges URLs individually, not in batches\n */\nexport class FastlyCDNPlugin extends BasePlugin {\n  private readonly serviceId: string;\n  private readonly apiToken: string;\n  private readonly baseUrl?: string;\n  private readonly invalidateOnDelete: boolean;\n  private readonly invalidateOnUpdate: boolean;\n  private readonly retryAttempts: number;\n  private readonly retryDelay: number;\n  private readonly urlGenerator?: (fileId: string, filename: string) => string[];\n\n  private invalidationsPerformed: number = 0;\n  private invalidationsFailed: number = 0;\n  private urlsInvalidated: number = 0;\n\n  // eslint-disable-next-line complexity\n  constructor(config: FastlyCDNPluginConfig) {\n    super({\n      name: 'fastly-cdn',\n      type: STORAGE_PLUGIN_TYPE.MONITORING,\n      priority: config.priority ?? FASTLY_CDN_CONSTANTS.DEFAULT_PRIORITY,\n      version: config.version ?? '1.0.0',\n      description: config.description ?? 'Fastly CDN cache invalidation',\n      enabled: config.enabled ?? true,\n      logger: config.logger,\n    });\n\n    this.serviceId = config.serviceId;\n    this.apiToken = config.apiToken;\n    this.baseUrl = config.baseUrl;\n    this.retryAttempts = config.retryAttempts ?? FASTLY_CDN_CONSTANTS.DEFAULT_RETRY_ATTEMPTS;\n    this.retryDelay = config.retryDelay ?? FASTLY_CDN_CONSTANTS.DEFAULT_RETRY_DELAY_MS;\n    this.invalidateOnDelete = config.invalidateOnDelete ?? true;\n    this.invalidateOnUpdate = config.invalidateOnUpdate ?? true;\n    this.urlGenerator = config.urlGenerator;\n  }\n\n  async afterDelete(\n    result: StoragePluginDeleteResult,\n    _context: StoragePluginContext // eslint-disable-line no-unused-vars\n  ): Promise<void> {\n    if (!this.shouldExecute() || !this.invalidateOnDelete) {\n      return;\n    }\n\n    try {\n      const urls = this.generateUrls(result.fileId, result.metadata?.filename ?? 'unknown');\n      await this.purgeUrls(urls);\n    } catch (error) {\n      this.log('error', 'Fastly invalidation failed', {\n        fileId: result.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  async afterUpload(\n    result: StoragePluginUploadResult,\n    _context: StoragePluginContext // eslint-disable-line no-unused-vars\n  ): Promise<void> {\n    if (!this.shouldExecute() || !this.invalidateOnUpdate) {\n      return;\n    }\n\n    try {\n      const urls = this.generateUrls(result.fileId, result.metadata.filename);\n      await this.purgeUrls(urls);\n    } catch (error) {\n      this.log('error', 'Fastly invalidation failed', {\n        fileId: result.fileId,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private generateUrls(fileId: string, filename: string): string[] {\n    if (this.urlGenerator) {\n      return this.urlGenerator(fileId, filename);\n    }\n\n    if (this.baseUrl) {\n      return [`${this.baseUrl}/${fileId}`, `${this.baseUrl}/${filename}`];\n    }\n\n    return [];\n  }\n\n  /**\n   * Purge URLs individually (Fastly purges one at a time)\n   */\n  private async purgeUrls(urls: string[]): Promise<void> {\n    this.log('info', 'Purging Fastly CDN URLs', {\n      urlCount: urls.length,\n    });\n\n    // Purge all URLs in parallel (they're independent operations)\n    const results = await Promise.allSettled(urls.map(url => this.purgeUrlWithRetry(url)));\n\n    const successful = results.filter(r => r.status === 'fulfilled').length;\n    const failed = results.filter(r => r.status === 'rejected').length;\n\n    this.invalidationsPerformed += successful;\n    this.invalidationsFailed += failed;\n    this.urlsInvalidated += successful;\n\n    if (failed > 0) {\n      this.log('warn', 'Some Fastly purges failed', {\n        successful,\n        failed,\n      });\n    } else {\n      this.log('info', 'All Fastly purges successful', {\n        urlCount: successful,\n      });\n    }\n  }\n\n  /**\n   * Purge single URL with retry logic\n   */\n  private async purgeUrlWithRetry(url: string): Promise<void> {\n    let lastError: Error | undefined;\n\n    for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {\n      try {\n        await fastlyPurgeUrl({\n          serviceId: this.serviceId,\n          apiToken: this.apiToken,\n          url,\n        });\n\n        return; // Success\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error(String(error));\n\n        if (attempt < this.retryAttempts) {\n          this.log('warn', 'Fastly purge failed, retrying', {\n            url,\n            attempt: attempt + 1,\n            maxAttempts: this.retryAttempts,\n            error: lastError.message,\n          });\n\n          await this.sleep(this.retryDelay * (attempt + 1));\n        }\n      }\n    }\n\n    this.log('error', 'Fastly purge failed after retries', {\n      url,\n      error: lastError?.message,\n    });\n\n    throw lastError ?? new Error('Fastly purge failed');\n  }\n\n  private sleep(ms: number): Promise<void> {\n    return new Promise(resolve => setTimeout(resolve, ms));\n  }\n\n  async healthCheck(): Promise<StoragePluginHealth> {\n    const baseHealth = await super.healthCheck();\n\n    const successRate =\n      this.invalidationsPerformed + this.invalidationsFailed > 0\n        ? Math.round(\n            (this.invalidationsPerformed /\n              (this.invalidationsPerformed + this.invalidationsFailed)) *\n              FASTLY_CDN_CONSTANTS.PERCENTAGE_MULTIPLIER\n          )\n        : FASTLY_CDN_CONSTANTS.PERCENTAGE_MULTIPLIER;\n\n    return {\n      ...baseHealth,\n      message: `Fastly CDN ready - ${this.invalidationsPerformed} successful, ${this.invalidationsFailed} failed (${successRate}% success rate)`,\n    };\n  }\n\n  getStatistics(): StorageCDNPluginStatistics {\n    return {\n      invalidationsPerformed: this.invalidationsPerformed,\n      invalidationsFailed: this.invalidationsFailed,\n      urlsInvalidated: this.urlsInvalidated,\n    };\n  }\n}\n","/**\n * Base Webhook Adapter for Storage\n *\n * Abstract base class for storage webhook adapters providing common functionality:\n * - Signature verification utilities (HMAC, AWS Signature V4)\n * - Error handling\n * - Logging\n * - Idempotency key generation\n * - Compliance integration\n * - Security helpers (IP verification, timestamp validation)\n */\n\nimport crypto from 'node:crypto';\n\n// Timestamp conversion constants\nconst TIMESTAMP_SECONDS_MS_THRESHOLD = 10000000000; // Threshold to detect seconds vs milliseconds\nconst MS_PER_SECOND = 1000;\nconst DEFAULT_TIMESTAMP_TOLERANCE_MS = 300000; // 5 minutes\n\n// CIDR network matching constants\nconst CIDR_CONSTANTS = {\n  CIDR_SLASH_24: 24, // /24 network (class C)\n  CIDR_SLASH_16: 16, // /16 network (class B)\n  OCTETS_FOR_24: 3, // First 3 octets for /24\n  OCTETS_FOR_16: 2, // First 2 octets for /16\n  DEFAULT_RADIX: 10,\n} as const;\n\n// Webhook adapter constants\nconst WEBHOOK_ADAPTER_CONSTANTS = {\n  PAYLOAD_SAMPLE_LENGTH: 200, // Length for truncated payload in error logs\n} as const;\n\nimport type {\n  StorageWebhookAdapter,\n  StorageWebhookPayload,\n  StorageWebhookVerificationResult,\n  ProcessedStorageWebhookEvent,\n  StorageBaseWebhookAdapterConfig,\n} from '@plyaz/types/storage';\nimport type { LoggerInterface } from '@plyaz/types';\nimport { STORAGE_SIGNATURE_METHOD } from '@plyaz/types/storage';\nimport {\n  type SchemaValidationResult,\n  type InternalValidationSchema,\n  STORAGE_ERROR_CODES,\n} from '@plyaz/types/errors';\nimport { StoragePackageError, ValidateAndFormatErrors } from '@plyaz/errors';\n\n/**\n * Abstract Base Webhook Adapter for Storage\n *\n * Provides common functionality for all storage webhook adapters\n *\n * @template TPayload - Provider-specific payload type\n * @template TSchema - Schema type (internal validation implementation)\n */\nexport abstract class BaseWebhookAdapter<\n  TPayload = unknown,\n  TSchema extends InternalValidationSchema<TPayload> = InternalValidationSchema<TPayload>,\n> implements StorageWebhookAdapter<TPayload, TSchema>\n{\n  abstract readonly providerName: string;\n  abstract readonly eventType: string;\n  abstract readonly schema: TSchema;\n\n  readonly priority: number = 100;\n\n  protected readonly secret: string;\n  protected readonly signatureMethod: STORAGE_SIGNATURE_METHOD;\n  protected readonly signatureHeader: string;\n  protected readonly timestampHeader?: string;\n  protected readonly timestampTolerance: number;\n  protected readonly allowedIPs?: string[];\n  protected readonly logger?: LoggerInterface;\n\n  constructor(config: StorageBaseWebhookAdapterConfig) {\n    this.secret = config.secret;\n    this.signatureMethod = config.signatureMethod ?? STORAGE_SIGNATURE_METHOD.HmacSha256;\n    this.signatureHeader = config.signatureHeader ?? 'x-webhook-signature';\n    this.timestampHeader = config.timestampHeader;\n    this.timestampTolerance = config.timestampTolerance ?? DEFAULT_TIMESTAMP_TOLERANCE_MS;\n    this.allowedIPs = config.allowedIPs;\n    this.logger = config.logger as LoggerInterface | undefined;\n\n    if (!this.secret) {\n      throw new StoragePackageError(\n        'Webhook adapter requires a secret',\n        STORAGE_ERROR_CODES.ADAPTER_CONFIGURATION_INVALID\n      );\n    }\n  }\n\n  /**\n   * Verify webhook signature and security checks\n   * Default implementation - can be overridden by subclasses\n   */\n  // eslint-disable-next-line complexity\n  verify(payload: StorageWebhookPayload<unknown>): StorageWebhookVerificationResult {\n    try {\n      // Check IP whitelist if configured\n      if (this.allowedIPs && this.allowedIPs.length > 0) {\n        const sourceIP = this.extractSourceIP(payload);\n        if (sourceIP && !this.isIPAllowed(sourceIP)) {\n          this.logger?.warn('Webhook from unauthorized IP', {\n            provider: this.providerName,\n            sourceIP,\n            allowedIPs: this.allowedIPs,\n          });\n\n          return {\n            valid: false,\n            error: `Source IP ${sourceIP} not in allowlist`,\n          };\n        }\n      }\n\n      // Check timestamp if configured (replay attack prevention)\n      if (this.timestampHeader) {\n        const timestamp = this.extractTimestampFromHeaders(payload);\n        if (timestamp && !this.isTimestampValid(timestamp)) {\n          this.logger?.warn('Webhook timestamp outside tolerance', {\n            provider: this.providerName,\n            timestamp,\n            tolerance: this.timestampTolerance,\n          });\n\n          return {\n            valid: false,\n            error: 'Timestamp outside acceptable range (possible replay attack)',\n          };\n        }\n      }\n\n      // Verify signature\n      const signature = this.getSignature(payload);\n\n      if (!signature) {\n        this.logger?.warn('No signature found in webhook payload', {\n          provider: this.providerName,\n          headers: Object.keys(payload.headers),\n        });\n\n        return {\n          valid: false,\n          error: `Missing signature header: ${this.signatureHeader}`,\n        };\n      }\n\n      const expectedSignature = this.computeSignature(payload);\n      const valid = this.compareSignatures(signature, expectedSignature);\n\n      if (!valid) {\n        this.logger?.error('Webhook signature verification failed', {\n          provider: this.providerName,\n          signatureMethod: this.signatureMethod,\n        });\n      }\n\n      return {\n        valid,\n        error: valid ? undefined : 'Signature verification failed',\n        details: {\n          method: this.signatureMethod,\n          header: this.signatureHeader,\n        },\n      };\n    } catch (error) {\n      this.logger?.error('Error verifying webhook signature', {\n        provider: this.providerName,\n        error,\n      });\n\n      return {\n        valid: false,\n        error: error instanceof Error ? error.message : 'Unknown verification error',\n      };\n    }\n  }\n\n  /**\n   * Process webhook payload\n   * Must be implemented by subclasses\n   */\n  abstract process(\n    payload: StorageWebhookPayload<TPayload>\n  ): ProcessedStorageWebhookEvent[] | Promise<ProcessedStorageWebhookEvent[]>;\n\n  /**\n   * Generate idempotency key from payload\n   * Default implementation - can be overridden\n   */\n  getIdempotencyKey(payload: StorageWebhookPayload<TPayload>): string {\n    // Default: hash the entire payload\n    const payloadString = JSON.stringify(payload.body);\n    return crypto.createHash('sha256').update(payloadString).digest('hex');\n  }\n\n  /**\n   * Check if this adapter should process the webhook\n   * Default: always process (can be overridden for multi-adapter scenarios)\n   */\n  // eslint-disable-next-line no-unused-vars -- intentionally unused parameter for subclass override\n  shouldProcess(_payload?: StorageWebhookPayload<unknown>): boolean {\n    return true;\n  }\n\n  /**\n   * Handle errors\n   * Default implementation - can be overridden\n   */\n  handleError(error: Error, payload: StorageWebhookPayload<unknown>): void {\n    this.logger?.error('Webhook processing error', {\n      provider: this.providerName,\n      error: error.message,\n      stack: error.stack,\n      payloadSample: JSON.stringify(payload.body).substring(\n        0,\n        WEBHOOK_ADAPTER_CONSTANTS.PAYLOAD_SAMPLE_LENGTH\n      ),\n    });\n  }\n\n  /**\n   * Get signature from headers\n   */\n  protected getSignature(payload: StorageWebhookPayload<unknown>): string | undefined {\n    const signature = payload.headers[this.signatureHeader];\n    return Array.isArray(signature) ? signature[0] : signature;\n  }\n\n  /**\n   * Compute expected signature\n   * Can be overridden for custom signature schemes (e.g., AWS Signature V4)\n   */\n  protected computeSignature(payload: StorageWebhookPayload<unknown>): string {\n    const payloadString = this.getSignaturePayload(payload);\n\n    switch (this.signatureMethod) {\n      case STORAGE_SIGNATURE_METHOD.HmacSha256:\n        return this.computeHMAC(payloadString, 'sha256');\n\n      case STORAGE_SIGNATURE_METHOD.HmacSha512:\n        return this.computeHMAC(payloadString, 'sha512');\n\n      case STORAGE_SIGNATURE_METHOD.AwsSignatureV4:\n      case STORAGE_SIGNATURE_METHOD.Custom:\n        // Subclass must override computeSignature for custom methods\n        throw new StoragePackageError(\n          `${this.signatureMethod} signature method must be implemented by subclass`,\n          STORAGE_ERROR_CODES.FEATURE_NOT_IMPLEMENTED,\n          { context: { signatureMethod: this.signatureMethod } }\n        );\n\n      default:\n        throw new StoragePackageError(\n          `Unsupported signature method: ${this.signatureMethod}`,\n          STORAGE_ERROR_CODES.INVALID_OPERATION,\n          { context: { signatureMethod: this.signatureMethod } }\n        );\n    }\n  }\n\n  /**\n   * Get the payload string to sign\n   * Can be overridden for custom payload formats\n   */\n  protected getSignaturePayload(payload: StorageWebhookPayload<unknown>): string {\n    // Use rawBody if available (important for some providers)\n    return payload.rawBody ?? JSON.stringify(payload.body);\n  }\n\n  /**\n   * Compute HMAC signature\n   */\n  protected computeHMAC(data: string, algorithm: 'sha256' | 'sha512'): string {\n    return crypto.createHmac(algorithm, this.secret).update(data).digest('hex');\n  }\n\n  /**\n   * Compute HMAC signature in base64\n   */\n  protected computeHMACBase64(data: string, algorithm: 'sha256' | 'sha512'): string {\n    return crypto.createHmac(algorithm, this.secret).update(data).digest('base64');\n  }\n\n  /**\n   * Compare signatures (timing-safe)\n   */\n  protected compareSignatures(signature: string, expected: string): boolean {\n    try {\n      // Use timing-safe comparison to prevent timing attacks\n      return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));\n    } catch {\n      // Fallback if lengths don't match\n      return signature === expected;\n    }\n  }\n\n  /**\n   * Validate payload against Zod schema\n   * Throws StoragePackageError if validation fails\n   */\n  protected validatePayload<T = TPayload>(payload: T): TPayload {\n    const result = ValidateAndFormatErrors<TPayload>(this.schema, payload);\n\n    if (!result.success) {\n      throw new StoragePackageError(\n        'Webhook payload validation failed',\n        STORAGE_ERROR_CODES.WEBHOOK_PAYLOAD_INVALID,\n        {\n          context: {\n            provider: this.providerName,\n            validationErrors: result.errors,\n          },\n        }\n      );\n    }\n\n    return result.data;\n  }\n\n  /**\n   * Safe payload validation with error handling\n   * Returns result object instead of throwing\n   */\n  protected safeValidatePayload<T = TPayload>(payload: T): SchemaValidationResult<TPayload> {\n    const result = ValidateAndFormatErrors<TPayload>(this.schema, payload);\n\n    if (!result.success) {\n      this.logger?.error('Webhook payload validation failed', {\n        provider: this.providerName,\n        errors: result.errors,\n      });\n    }\n\n    return result;\n  }\n\n  /**\n   * Extract object key from event\n   * Must be implemented by subclasses\n   */\n  protected abstract extractObjectKey(event: TPayload): string;\n\n  /**\n   * Extract bucket name from event\n   * Can be overridden by subclasses\n   */\n  protected extractBucket(event: TPayload): string | undefined {\n    const e = event as Record<string, unknown>;\n    return (e.bucket ?? e.bucketName ?? e.container) as string | undefined;\n  }\n\n  /**\n   * Extract timestamp from event\n   * Default implementation - can be overridden\n   */\n  protected extractTimestamp(event: TPayload): Date {\n    // Try common timestamp fields\n    const e = event as Record<string, unknown>;\n    const timestamp = e.timestamp ?? e.eventTime ?? e.createdAt ?? e.date ?? e.time;\n\n    if (typeof timestamp === 'number') {\n      // Unix timestamp (seconds or milliseconds)\n      return timestamp > TIMESTAMP_SECONDS_MS_THRESHOLD\n        ? new Date(timestamp)\n        : new Date(timestamp * MS_PER_SECOND);\n    }\n\n    if (typeof timestamp === 'string') {\n      return new Date(timestamp);\n    }\n\n    // Default to now\n    return new Date();\n  }\n\n  /**\n   * Extract timestamp from headers (for replay attack prevention)\n   */\n  protected extractTimestampFromHeaders(payload: StorageWebhookPayload<unknown>): Date | undefined {\n    if (!this.timestampHeader) {\n      return undefined;\n    }\n\n    const timestamp = payload.headers[this.timestampHeader];\n    const timestampValue = Array.isArray(timestamp) ? timestamp[0] : timestamp;\n\n    if (!timestampValue) {\n      return undefined;\n    }\n\n    // Try parsing as number (Unix timestamp)\n    const numericTimestamp = Number(timestampValue);\n    if (!isNaN(numericTimestamp)) {\n      return numericTimestamp > TIMESTAMP_SECONDS_MS_THRESHOLD\n        ? new Date(numericTimestamp)\n        : new Date(numericTimestamp * MS_PER_SECOND);\n    }\n\n    // Try parsing as ISO string\n    return new Date(timestampValue);\n  }\n\n  /**\n   * Check if timestamp is within acceptable range\n   */\n  protected isTimestampValid(timestamp: Date): boolean {\n    const now = Date.now();\n    const diff = Math.abs(now - timestamp.getTime());\n    return diff <= this.timestampTolerance;\n  }\n\n  /**\n   * Extract source IP from payload\n   */\n  protected extractSourceIP(payload: StorageWebhookPayload<unknown>): string | undefined {\n    // Try common headers\n    const headers = payload.headers;\n    const ip =\n      headers['x-forwarded-for'] ??\n      headers['x-real-ip'] ??\n      headers['cf-connecting-ip'] ?? // Cloudflare\n      headers['x-client-ip'];\n\n    return this.extractFirstIP(ip);\n  }\n\n  /**\n   * Extract first IP from header value (handles arrays and comma-separated strings)\n   */\n  private extractFirstIP(ip: string | string[] | undefined): string | undefined {\n    if (Array.isArray(ip)) {\n      // x-forwarded-for can be comma-separated list\n      return ip[0]?.split(',')[0]?.trim();\n    }\n\n    if (typeof ip === 'string') {\n      return ip.split(',')[0]?.trim();\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Check if IP is in allowlist\n   */\n  protected isIPAllowed(ip: string): boolean {\n    if (!this.allowedIPs || this.allowedIPs.length === 0) {\n      return true;\n    }\n\n    // Support CIDR ranges (basic implementation)\n    return this.allowedIPs.some(allowedIP => {\n      // Exact match\n      if (allowedIP === ip) {\n        return true;\n      }\n\n      // CIDR match (simplified - only /24 and /16 support)\n      if (allowedIP.includes('/')) {\n        const [network, bits] = allowedIP.split('/');\n        const bitsNum = Number.parseInt(bits!, CIDR_CONSTANTS.DEFAULT_RADIX);\n\n        if (bitsNum === CIDR_CONSTANTS.CIDR_SLASH_24) {\n          // Match first 3 octets\n          const networkPrefix = network!\n            .split('.')\n            .slice(0, CIDR_CONSTANTS.OCTETS_FOR_24)\n            .join('.');\n          const ipPrefix = ip.split('.').slice(0, CIDR_CONSTANTS.OCTETS_FOR_24).join('.');\n          return networkPrefix === ipPrefix;\n        }\n\n        if (bitsNum === CIDR_CONSTANTS.CIDR_SLASH_16) {\n          // Match first 2 octets\n          const networkPrefix = network!\n            .split('.')\n            .slice(0, CIDR_CONSTANTS.OCTETS_FOR_16)\n            .join('.');\n          const ipPrefix = ip.split('.').slice(0, CIDR_CONSTANTS.OCTETS_FOR_16).join('.');\n          return networkPrefix === ipPrefix;\n        }\n      }\n\n      return false;\n    });\n  }\n\n  /**\n   * Extract file size from event\n   */\n  protected extractFileSize(event: TPayload): number | undefined {\n    const e = event as Record<string, unknown>;\n    const size = e.size ?? e.fileSize ?? e.contentLength;\n    return typeof size === 'number' ? size : undefined;\n  }\n\n  /**\n   * Extract content type from event\n   */\n  protected extractContentType(event: TPayload): string | undefined {\n    const e = event as Record<string, unknown>;\n    return (e.contentType ?? e.mimeType ?? e.type) as string | undefined;\n  }\n\n  /**\n   * Extract etag from event\n   */\n  protected extractETag(event: TPayload): string | undefined {\n    const e = event as Record<string, unknown>;\n    return (e.etag ?? e.eTag) as string | undefined;\n  }\n}\n","/**\n * Media Processing Webhook Adapter\n *\n * Example webhook adapter for external media processing services\n * (e.g., AWS MediaConvert, Cloudinary, Mux, etc.)\n *\n * This adapter handles webhooks from external transcoding/processing services\n * and emits appropriate storage events when processing completes.\n *\n * @example\n * ```ts\n * const adapter = new MediaProcessingWebhook({\n *   secret: process.env.MEDIA_PROCESSING_SECRET!,\n *   signatureMethod: STORAGE_SIGNATURE_METHOD.HmacSha256,\n *   signatureHeader: 'x-processing-signature',\n *   logger,\n * });\n *\n * webhookManager.registerAdapter(adapter);\n * ```\n */\n\nimport { BaseWebhookAdapter } from '../base/BaseWebhookAdapter';\nimport type {\n  StorageWebhookPayload,\n  ProcessedStorageWebhookEvent,\n  StorageMediaProcessingWebhookConfig,\n  StorageMediaProcessingPayload,\n} from '@plyaz/types/storage';\nimport {\n  STORAGE_WEBHOOK_EVENT_TYPE,\n  STORAGE_OPERATION,\n  STORAGE_PROCESSING_STATUS,\n  StorageMediaProcessingPayloadSchema,\n} from '@plyaz/types/storage';\n\n/**\n * Media Processing Webhook Adapter\n *\n * Handles webhooks from external media processing services\n */\nexport class MediaProcessingWebhook extends BaseWebhookAdapter<\n  StorageMediaProcessingPayload,\n  typeof StorageMediaProcessingPayloadSchema\n> {\n  readonly providerName: string;\n  readonly eventType: string = STORAGE_WEBHOOK_EVENT_TYPE.TranscodeComplete;\n  readonly schema: typeof StorageMediaProcessingPayloadSchema = StorageMediaProcessingPayloadSchema;\n\n  constructor(config: StorageMediaProcessingWebhookConfig) {\n    super(config);\n    this.providerName = config.providerName ?? 'media-processing';\n  }\n\n  /**\n   * Process media processing webhook\n   */\n  async process(\n    payload: StorageWebhookPayload<StorageMediaProcessingPayload>\n  ): Promise<ProcessedStorageWebhookEvent[]> {\n    // Validate payload - throws StoragePackageError if invalid\n    const data = this.validatePayload<unknown>(payload.body);\n    const events: ProcessedStorageWebhookEvent[] = [];\n\n    // Map processing status to storage events\n    switch (data.status) {\n      case STORAGE_PROCESSING_STATUS.Completed:\n        events.push(this.createCompletedEvent(data));\n\n        // If thumbnail was generated, emit separate event\n        if (data.output?.thumbnail) {\n          events.push(this.createThumbnailEvent(data));\n        }\n        break;\n\n      case STORAGE_PROCESSING_STATUS.Failed:\n        events.push(this.createFailedEvent(data));\n        break;\n\n      case STORAGE_PROCESSING_STATUS.Processing:\n        events.push(this.createProgressEvent(data));\n        break;\n\n      default:\n        this.logger?.warn('Unhandled processing status', {\n          status: data.status,\n          jobId: data.jobId,\n        });\n    }\n\n    return events;\n  }\n\n  /**\n   * Create transcode completed event\n   */\n  private createCompletedEvent(data: StorageMediaProcessingPayload): ProcessedStorageWebhookEvent {\n    return {\n      eventType: STORAGE_WEBHOOK_EVENT_TYPE.TranscodeComplete,\n      objectKey: data.input.objectKey,\n      bucket: data.input.bucket,\n      operation: STORAGE_OPERATION.UPDATE,\n      timestamp: this.parseTimestamp(data.timestamp),\n      provider: data.provider ?? this.providerName,\n      metadata: {\n        jobId: data.jobId,\n        inputUrl: data.input.url,\n        output: data.output,\n        duration: data.metadata?.duration,\n        format: data.metadata?.format,\n        codec: data.metadata?.codec,\n        width: data.metadata?.width,\n        height: data.metadata?.height,\n      },\n    };\n  }\n\n  /**\n   * Create transcode failed event\n   */\n  private createFailedEvent(data: StorageMediaProcessingPayload): ProcessedStorageWebhookEvent {\n    return {\n      eventType: STORAGE_WEBHOOK_EVENT_TYPE.TranscodeFailed,\n      objectKey: data.input.objectKey,\n      bucket: data.input.bucket,\n      operation: STORAGE_OPERATION.UPDATE,\n      timestamp: this.parseTimestamp(data.timestamp),\n      provider: data.provider ?? this.providerName,\n      metadata: {\n        jobId: data.jobId,\n        inputUrl: data.input.url,\n        error: data.error,\n      },\n    };\n  }\n\n  /**\n   * Create transcode progress event\n   */\n  private createProgressEvent(data: StorageMediaProcessingPayload): ProcessedStorageWebhookEvent {\n    return {\n      eventType: STORAGE_WEBHOOK_EVENT_TYPE.TranscodeProgress,\n      objectKey: data.input.objectKey,\n      bucket: data.input.bucket,\n      operation: STORAGE_OPERATION.UPDATE,\n      timestamp: this.parseTimestamp(data.timestamp),\n      provider: data.provider ?? this.providerName,\n      metadata: {\n        jobId: data.jobId,\n        progress: data.progress ?? 0,\n        inputUrl: data.input.url,\n      },\n    };\n  }\n\n  /**\n   * Create thumbnail generated event\n   */\n  private createThumbnailEvent(data: StorageMediaProcessingPayload): ProcessedStorageWebhookEvent {\n    return {\n      eventType: STORAGE_WEBHOOK_EVENT_TYPE.ThumbnailComplete,\n      objectKey: data.input.objectKey,\n      bucket: data.input.bucket,\n      operation: STORAGE_OPERATION.UPDATE,\n      timestamp: this.parseTimestamp(data.timestamp),\n      provider: data.provider ?? this.providerName,\n      metadata: {\n        jobId: data.jobId,\n        thumbnail: data.output?.thumbnail,\n        inputUrl: data.input.url,\n      },\n    };\n  }\n\n  /**\n   * Parse timestamp from string or number\n   */\n  private parseTimestamp(timestamp: string | number): Date {\n    if (typeof timestamp === 'number') {\n      // Unix timestamp in seconds or milliseconds\n      // Threshold to distinguish between seconds (< 10^10) and milliseconds (>= 10^10)\n      const MILLISECONDS_TO_SECONDS = 1000;\n      const TIMESTAMP_THRESHOLD = 10000000000;\n      return timestamp > TIMESTAMP_THRESHOLD\n        ? new Date(timestamp)\n        : new Date(timestamp * MILLISECONDS_TO_SECONDS);\n    }\n\n    return new Date(timestamp);\n  }\n\n  /**\n   * Extract object key from event (required by BaseWebhookAdapter)\n   */\n  protected extractObjectKey(event: StorageMediaProcessingPayload): string {\n    return event.input.objectKey;\n  }\n\n  /**\n   * Extract bucket from event\n   */\n  protected extractBucket(event: StorageMediaProcessingPayload): string | undefined {\n    return event.input.bucket;\n  }\n\n  /**\n   * Generate idempotency key from job ID\n   * Override default implementation to use job ID for deduplication\n   */\n  getIdempotencyKey(payload: StorageWebhookPayload<StorageMediaProcessingPayload>): string {\n    // Use job ID + status for idempotency\n    // This allows multiple events per job (progress, complete, etc.)\n    const jobId = payload.body.jobId;\n    const status = payload.body.status;\n    return `media-processing:${jobId}:${status}`;\n  }\n\n  /**\n   * Check if adapter should process this webhook\n   * Override to handle multiple event types\n   */\n  shouldProcess(payload: StorageWebhookPayload<unknown>): boolean {\n    // Check if payload has required fields\n    const body = payload.body as Record<string, unknown>;\n    return (\n      typeof body.jobId === 'string' &&\n      typeof body.status === 'string' &&\n      typeof body.input === 'object' &&\n      body.input !== null\n    );\n  }\n}\n","/**\n * Cloudflare R2 Webhook Adapter\n *\n * Handles S3-compatible event notifications from Cloudflare R2 Storage\n *\n * R2 sends notifications for:\n * - s3:ObjectCreated:Put\n * - s3:ObjectCreated:Post\n * - s3:ObjectCreated:Copy\n * - s3:ObjectRemoved:Delete\n *\n * @example\n * ```ts\n * const adapter = new CloudflareR2Webhook({\n *   secret: process.env.R2_WEBHOOK_SECRET!,\n *   signatureMethod: STORAGE_SIGNATURE_METHOD.HmacSha256,\n *   signatureHeader: 'x-r2-signature',\n *   logger,\n * });\n *\n * webhookManager.registerAdapter(adapter);\n * ```\n */\n\nimport { BaseWebhookAdapter } from '../base/BaseWebhookAdapter';\nimport type {\n  StorageWebhookPayload,\n  ProcessedStorageWebhookEvent,\n  R2WebhookPayload,\n  R2EventRecord,\n  CloudflareR2WebhookConfig,\n} from '@plyaz/types/storage';\nimport {\n  STORAGE_WEBHOOK_EVENT_TYPE,\n  STORAGE_OPERATION,\n  STORAGE_SIGNATURE_METHOD,\n  R2WebhookPayloadSchema,\n} from '@plyaz/types/storage';\n\n/**\n * Cloudflare R2 Webhook Adapter\n *\n * Handles S3-compatible event notifications from Cloudflare R2\n */\nexport class CloudflareR2Webhook extends BaseWebhookAdapter<\n  R2WebhookPayload,\n  typeof R2WebhookPayloadSchema\n> {\n  readonly providerName: string;\n  readonly eventType: string = STORAGE_WEBHOOK_EVENT_TYPE.ObjectCreated;\n  readonly schema: typeof R2WebhookPayloadSchema = R2WebhookPayloadSchema;\n\n  constructor(config: CloudflareR2WebhookConfig) {\n    super({\n      ...config,\n      // R2 typically uses HMAC-SHA256 for webhook signatures\n      signatureMethod: config.signatureMethod ?? STORAGE_SIGNATURE_METHOD.HmacSha256,\n      signatureHeader: config.signatureHeader ?? 'x-r2-signature',\n    });\n    this.providerName = config.providerName ?? 'cloudflare-r2';\n  }\n\n  /**\n   * Process R2 webhook payload\n   * R2 sends an array of records (S3-compatible format)\n   */\n  async process(\n    payload: StorageWebhookPayload<R2WebhookPayload>\n  ): Promise<ProcessedStorageWebhookEvent[]> {\n    // Validate payload\n    const data = this.validatePayload<unknown>(payload.body);\n    const events: ProcessedStorageWebhookEvent[] = [];\n\n    // Process each record in the notification\n    for (const record of data.Records) {\n      const event = this.processRecord(record);\n      if (event) {\n        events.push(event);\n      }\n    }\n\n    return events;\n  }\n\n  /**\n   * Process a single R2 event record\n   */\n  private processRecord(record: R2EventRecord): ProcessedStorageWebhookEvent | null {\n    const eventName = record.eventName;\n    const s3 = record.s3;\n\n    // Determine operation from event name\n    let eventType: STORAGE_WEBHOOK_EVENT_TYPE;\n    let operation: STORAGE_OPERATION;\n\n    if (eventName.startsWith('ObjectCreated:')) {\n      eventType = STORAGE_WEBHOOK_EVENT_TYPE.ObjectCreated;\n      operation = STORAGE_OPERATION.UPLOAD;\n    } else if (eventName.startsWith('ObjectRemoved:')) {\n      eventType = STORAGE_WEBHOOK_EVENT_TYPE.ObjectDeleted;\n      operation = STORAGE_OPERATION.DELETE;\n    } else {\n      this.logger?.warn('Unhandled R2 event type', { eventName });\n      return null;\n    }\n\n    return {\n      eventType,\n      objectKey: s3.object.key,\n      fileId: s3.object.key, // Tests expect fileId to match objectKey\n      bucket: s3.bucket.name,\n      operation,\n      timestamp: new Date(record.eventTime),\n      provider: this.providerName,\n      fileSize: s3.object.size,\n      metadata: {\n        eventName,\n        eTag: s3.object.eTag,\n        versionId: s3.object.versionId,\n        sequencer: s3.object.sequencer,\n        sourceIP: record.requestParameters?.sourceIPAddress,\n        principalId: record.userIdentity?.principalId,\n        requestId: record.responseElements?.['x-amz-request-id'],\n        bucket: s3.bucket.name, // Also in metadata for backwards compatibility\n        size: s3.object.size,\n        etag: s3.object.eTag,\n      },\n    };\n  }\n\n  /**\n   * Extract object key from event\n   */\n  protected extractObjectKey(event: R2WebhookPayload): string {\n    // Return the first record's object key\n    return event.Records[0]?.s3.object.key ?? '';\n  }\n\n  /**\n   * Extract bucket from event\n   */\n  protected extractBucket(event: R2WebhookPayload): string | undefined {\n    return event.Records[0]?.s3.bucket.name;\n  }\n\n  /**\n   * Generate idempotency key\n   * Use bucket + object key + eTag for uniqueness\n   */\n  getIdempotencyKey(payload: StorageWebhookPayload<R2WebhookPayload>): string {\n    const record = payload.body.Records[0];\n    if (!record) {\n      return 'r2:empty';\n    }\n\n    const bucket = record.s3.bucket.name;\n    const key = record.s3.object.key;\n    const eTag = record.s3.object.eTag ?? 'no-etag';\n    const eventName = record.eventName;\n\n    // Include event name to allow same object to be created/deleted\n    return `r2:${bucket}:${key}:${eventName}:${eTag}`;\n  }\n\n  /**\n   * Check if adapter should process this webhook\n   */\n  shouldProcess(payload: StorageWebhookPayload<unknown>): boolean {\n    const body = payload.body as Record<string, unknown>;\n\n    // Check for Records array (S3 format)\n    if (!Array.isArray(body.Records) || body.Records.length === 0) {\n      return false;\n    }\n\n    // Check first record has required S3 structure\n    const firstRecord = body.Records[0] as Record<string, unknown>;\n    return (\n      typeof firstRecord === 'object' &&\n      firstRecord !== null &&\n      typeof firstRecord.eventName === 'string' &&\n      typeof firstRecord.s3 === 'object' &&\n      firstRecord.s3 !== null\n    );\n  }\n}\n","/**\n * Supabase Storage Webhook Adapter\n *\n * Handles webhook events from Supabase Storage\n *\n * Supabase Storage emits events via Database Webhooks for:\n * - INSERT on storage.objects table (object created)\n * - UPDATE on storage.objects table (object updated)\n * - DELETE on storage.objects table (object deleted)\n *\n * @example\n * ```ts\n * const adapter = new SupabaseStorageWebhook({\n *   secret: process.env.SUPABASE_WEBHOOK_SECRET!,\n *   signatureMethod: STORAGE_SIGNATURE_METHOD.HmacSha256,\n *   signatureHeader: 'x-supabase-signature',\n *   logger,\n * });\n *\n * webhookManager.registerAdapter(adapter);\n * ```\n */\n\nimport { BaseWebhookAdapter } from '../base/BaseWebhookAdapter';\nimport type {\n  StorageWebhookPayload,\n  ProcessedStorageWebhookEvent,\n  SupabaseWebhookPayload,\n  SupabaseStorageWebhookConfig,\n} from '@plyaz/types/storage';\nimport {\n  STORAGE_WEBHOOK_EVENT_TYPE,\n  STORAGE_OPERATION,\n  STORAGE_SIGNATURE_METHOD,\n  SupabaseWebhookPayloadSchema,\n} from '@plyaz/types/storage';\n\n/**\n * Supabase Storage Webhook Adapter\n *\n * Handles database webhooks from Supabase Storage (storage.objects table)\n */\nexport class SupabaseStorageWebhook extends BaseWebhookAdapter<\n  SupabaseWebhookPayload,\n  typeof SupabaseWebhookPayloadSchema\n> {\n  readonly providerName: string;\n  readonly eventType: string = STORAGE_WEBHOOK_EVENT_TYPE.ObjectCreated;\n  readonly schema: typeof SupabaseWebhookPayloadSchema = SupabaseWebhookPayloadSchema;\n\n  constructor(config: SupabaseStorageWebhookConfig) {\n    super({\n      ...config,\n      // Supabase uses HMAC-SHA256 for webhook signatures\n      signatureMethod: config.signatureMethod ?? STORAGE_SIGNATURE_METHOD.HmacSha256,\n      signatureHeader: config.signatureHeader ?? 'x-supabase-signature',\n    });\n    this.providerName = config.providerName ?? 'supabase-storage';\n  }\n\n  /**\n   * Process Supabase webhook payload\n   */\n  async process(\n    payload: StorageWebhookPayload<SupabaseWebhookPayload>\n  ): Promise<ProcessedStorageWebhookEvent[]> {\n    // Validate payload\n    const data = this.validatePayload<unknown>(payload.body);\n\n    // Process based on event type\n    const event = this.processEvent(data);\n    return event ? [event] : [];\n  }\n\n  /**\n   * Process a single Supabase event\n   */\n  // eslint-disable-next-line complexity\n  private processEvent(data: SupabaseWebhookPayload): ProcessedStorageWebhookEvent | null {\n    const type = data.type;\n\n    // Determine which record to use\n    const record = data.record ?? data.old_record;\n    if (!record) {\n      this.logger?.warn('Supabase webhook missing record data', { type });\n      return null;\n    }\n\n    // Map database event to storage event\n    const mapping = this.mapEventType(type);\n    if (!mapping) {\n      this.logger?.warn('Unhandled Supabase event type', { type });\n      return null;\n    }\n\n    const { eventType, operation } = mapping;\n\n    return {\n      eventType,\n      objectKey: record.name,\n      fileId: record.id, // Use object ID as fileId\n      bucket: record.bucket_id,\n      operation,\n      timestamp: new Date(record.updated_at ?? record.created_at),\n      provider: this.providerName,\n      fileSize: record.metadata?.size as number,\n      contentType: record.metadata?.mimetype as string,\n      metadata: {\n        objectId: record.id,\n        bucket: record.bucket_id, // Also in metadata\n        filename: record.name, // Also in metadata\n        size: record.metadata?.size,\n        mimeType: record.metadata?.mimetype,\n        owner: record.owner,\n        ownerId: record.owner_id,\n        version: record.version,\n        createdAt: record.created_at,\n        updatedAt: record.updated_at,\n        lastAccessedAt: record.last_accessed_at,\n        customMetadata: record.metadata,\n        databaseEventType: type,\n      },\n    };\n  }\n\n  /**\n   * Map Supabase event type to storage event and operation\n   */\n  private mapEventType(\n    type: string\n  ): { eventType: STORAGE_WEBHOOK_EVENT_TYPE; operation: STORAGE_OPERATION } | null {\n    switch (type) {\n      case 'INSERT':\n        return {\n          eventType: STORAGE_WEBHOOK_EVENT_TYPE.ObjectCreated,\n          operation: STORAGE_OPERATION.UPLOAD,\n        };\n\n      case 'UPDATE':\n        return {\n          eventType: STORAGE_WEBHOOK_EVENT_TYPE.ObjectUpdated,\n          operation: STORAGE_OPERATION.UPDATE,\n        };\n\n      case 'DELETE':\n        return {\n          eventType: STORAGE_WEBHOOK_EVENT_TYPE.ObjectDeleted,\n          operation: STORAGE_OPERATION.DELETE,\n        };\n\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Extract object key from event\n   */\n  protected extractObjectKey(event: SupabaseWebhookPayload): string {\n    return event.record?.name ?? event.old_record?.name ?? '';\n  }\n\n  /**\n   * Extract bucket from event\n   */\n  protected extractBucket(event: SupabaseWebhookPayload): string | undefined {\n    return event.record?.bucket_id ?? event.old_record?.bucket_id;\n  }\n\n  /**\n   * Generate idempotency key\n   * Use object ID + event type for uniqueness\n   */\n  getIdempotencyKey(payload: StorageWebhookPayload<SupabaseWebhookPayload>): string {\n    const data = payload.body;\n    const record = data.record ?? data.old_record;\n\n    if (!record) {\n      return 'supabase:empty';\n    }\n\n    const objectId = record.id;\n    const eventType = data.type;\n    const timestamp = record.updated_at ?? record.created_at;\n\n    // Include timestamp to allow multiple updates to same object\n    return `supabase:${objectId}:${eventType}:${timestamp}`;\n  }\n\n  /**\n   * Check if adapter should process this webhook\n   */\n  shouldProcess(payload: StorageWebhookPayload<unknown>): boolean {\n    const body = payload.body as Record<string, unknown>;\n\n    // Check for Supabase webhook structure\n    return (\n      typeof body.type === 'string' &&\n      body.table === 'objects' &&\n      body.schema === 'storage' &&\n      (typeof body.record === 'object' || typeof body.old_record === 'object')\n    );\n  }\n}\n"]}