{"version":3,"sources":["../../../src/config/constants.ts","../../../src/config/defaults.ts","../../../src/core/asset-loader.ts","../../../src/utils/cache-helpers.ts","../../../src/utils/hash-generator.ts","../../../src/core/cache-manager.ts","../../../src/config/index.ts","../../../src/core/register-sw.ts","../../../src/core/errors.ts","../../../src/core/version-manager.ts","../../../src/integrations/next/preload.ts"],"names":[],"mappings":"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","file":"preload.mjs","sourcesContent":["/**\n * Constants for the asset caching module\n * This file contains all constant values used throughout the asset cache system\n */\n\n// ============================================================================\n// CACHE CONFIGURATION CONSTANTS\n// ============================================================================\n\n/**\n * Default cache name for the Cache Storage API\n */\nexport const DEFAULT_CACHE_NAME = \"asset-cache-v1\";\n\n/**\n * Default time to live for cached assets (in seconds)\n * 7 days\n */\nexport const DEFAULT_CACHE_TTL = 7 * 24 * 60 * 60;\n\n/**\n * Maximum size for cacheable assets (in bytes)\n * 50MB\n */\nexport const MAX_CACHEABLE_SIZE = 50 * 1024 * 1024;\n\n/**\n * Path to the cache manifest file\n */\nexport const CACHE_MANIFEST_PATH = \"/manifest.json\";\n\n// ============================================================================\n// SERVICE WORKER CONSTANTS\n// ============================================================================\n\n/**\n * Default service worker scope\n */\nexport const DEFAULT_SW_SCOPE = \"/\";\n\n// ============================================================================\n// CACHE STRATEGY MAPPINGS\n// ============================================================================\n\n/**\n * Asset types that should use a cache-first strategy\n * These are typically static assets that don't change frequently\n */\nexport const CACHE_FIRST_TYPES = [\n  \"image/jpeg\",\n  \"image/png\",\n  \"image/webp\",\n  \"image/gif\",\n  \"image/svg+xml\",\n  \"font/woff\",\n  \"font/woff2\",\n  \"font/ttf\",\n  \"font/otf\",\n];\n\n/**\n * Asset types that should use a network-first strategy\n * These are typically large media files that benefit from fresh content\n */\nexport const NETWORK_FIRST_TYPES = [\n  \"video/mp4\",\n  \"video/webm\",\n  \"audio/mpeg\",\n  \"audio/ogg\",\n];\n\n/**\n * Asset types that should use a stale-while-revalidate strategy\n * These are assets that can be served stale while being updated in background\n */\nexport const STALE_WHILE_REVALIDATE_TYPES = [\n  \"application/javascript\",\n  \"text/css\",\n  \"application/json\",\n];\n\n// ============================================================================\n// FILE TYPE MAPPINGS\n// ============================================================================\n\n/**\n * File extensions to MIME type mapping\n * Used to determine the correct content type for cached assets\n */\nexport const FILE_EXTENSION_TO_ASSET_TYPE: Record<string, string> = {\n  // Images\n  jpg: \"image/jpeg\",\n  jpeg: \"image/jpeg\",\n  png: \"image/png\",\n  gif: \"image/gif\",\n  webp: \"image/webp\",\n  svg: \"image/svg+xml\",\n  ico: \"image/x-icon\",\n  avif: \"image/avif\",\n  bmp: \"image/bmp\",\n\n  // Fonts\n  woff: \"font/woff\",\n  woff2: \"font/woff2\",\n  ttf: \"font/ttf\",\n  otf: \"font/otf\",\n  eot: \"application/vnd.ms-fontobject\",\n\n  // Videos\n  mp4: \"video/mp4\",\n  webm: \"video/webm\",\n  ogg: \"video/ogg\",\n  avi: \"video/x-msvideo\",\n  mov: \"video/quicktime\",\n\n  // Audio\n  mp3: \"audio/mpeg\",\n  wav: \"audio/wav\",\n  oga: \"audio/ogg\",\n  flac: \"audio/flac\",\n  aac: \"audio/aac\",\n\n  // Scripts and Styles\n  js: \"application/javascript\",\n  mjs: \"application/javascript\",\n  css: \"text/css\",\n  json: \"application/json\",\n\n  // Documents\n  pdf: \"application/pdf\",\n  txt: \"text/plain\",\n  html: \"text/html\",\n  xml: \"application/xml\",\n};\n","/**\n * Asset Cache Default Configuration\n * This file contains default configuration values for the simplified asset cache system\n */\n\nimport {\n  DEFAULT_CACHE_NAME,\n  DEFAULT_CACHE_TTL,\n  MAX_CACHEABLE_SIZE,\n} from \"./constants\";\nimport type { AssetCacheConfig } from \"./types\";\n\n// ============================================================================\n// DEFAULT CONFIGURATION VALUES\n// ============================================================================\n\n/**\n * Get default asset cache configuration\n * This provides sensible defaults for all implemented configuration options\n */\nexport function getDefaultAssetCacheConfig(): Required<AssetCacheConfig> {\n  return {\n    enabled: true,\n    version: \"1.0.0\",\n    debug: false,\n    storageName: DEFAULT_CACHE_NAME,\n    maxSize: MAX_CACHEABLE_SIZE, // 50 MB\n    maxAge: DEFAULT_CACHE_TTL, // 7 days\n    serviceWorkerEnabled: true,\n    serviceWorkerPath: \"/sw.js\",\n    manifestPath: \"/manifest.json\",\n  };\n}\n","/**\n * Asset loader module\n *\n * This module:\n * - Provides methods for loading assets with caching\n * - Handles preloading of assets\n * - Manages cache invalidation\n */\nimport {\n  AssetLoaderConfig,\n  AssetType,\n  CacheEntry,\n  CacheOptions,\n  CacheResult,\n  ServiceWorkerMessageType,\n} from \"../config/types\";\nimport {\n  DEFAULT_CACHE_NAME,\n  DEFAULT_CACHE_TTL,\n  MAX_CACHEABLE_SIZE,\n} from \"../config/constants\";\nimport {\n  createCacheEntry,\n  debugLog,\n  hasExpired,\n  shouldCacheAsset,\n} from \"../utils/cache-helpers\";\nimport { generateCacheKey, generateContentHash } from \"../utils/hash-generator\";\nimport { CacheManager, CacheManagerState } from \"./cache-manager\";\nimport { VersionManager } from \"./version-manager\";\nimport { isServiceWorkerActive, sendMessageToSW } from \"./register-sw\";\nimport {\n  CacheError,\n  CacheErrorCode,\n  CacheNotInitializedError,\n  AssetFetchFailedError,\n  AssetTooLargeError,\n  AssetNotCachedError,\n  AssetExpiredError,\n  wrapError,\n  isQuotaExceededError,\n  StorageQuotaExceededError,\n} from \"./errors\";\n\n/**\n * Asset loader state\n */\nexport enum AssetLoaderState {\n  UNINITIALIZED = \"UNINITIALIZED\",\n  INITIALIZING = \"INITIALIZING\",\n  READY = \"READY\",\n  ERROR = \"ERROR\",\n  CACHE_UNAVAILABLE = \"CACHE_UNAVAILABLE\",\n}\n\n/**\n * Asset loader initialization result\n */\nexport interface AssetLoaderInitResult {\n  success: boolean;\n  state: AssetLoaderState;\n  cacheManagerState: CacheManagerState;\n  error?: CacheError;\n}\n\n/**\n * Asset loader class\n */\nexport class AssetLoader {\n  private static state: AssetLoaderState = AssetLoaderState.UNINITIALIZED;\n  private static lastError: CacheError | null = null;\n  private static initPromise: Promise<AssetLoaderInitResult> | null = null;\n  private static config: AssetLoaderConfig = {\n    cacheName: DEFAULT_CACHE_NAME,\n    defaultTTL: DEFAULT_CACHE_TTL,\n    maxSize: MAX_CACHEABLE_SIZE,\n    enableServiceWorker: true,\n    debug: false,\n  };\n\n  /**\n   * Get the current state of the asset loader\n   */\n  static getState(): AssetLoaderState {\n    return this.state;\n  }\n\n  /**\n   * Get the last error that occurred\n   */\n  static getLastError(): CacheError | null {\n    return this.lastError;\n  }\n\n  /**\n   * Check if the asset loader is ready\n   */\n  static isReady(): boolean {\n    return this.state === AssetLoaderState.READY;\n  }\n\n  /**\n   * Check if caching is available (even if degraded)\n   */\n  static isCacheAvailable(): boolean {\n    return (\n      this.state === AssetLoaderState.READY ||\n      CacheManager.getState() === CacheManagerState.READY\n    );\n  }\n\n  /**\n   * Initialize the asset loader\n   * @param config Configuration options\n   * @returns Initialization result with state information\n   */\n  static async init(\n    config?: Partial<AssetLoaderConfig>\n  ): Promise<AssetLoaderInitResult> {\n    // Return existing promise if already initializing\n    if (this.initPromise) {\n      return this.initPromise;\n    }\n\n    // Already initialized - return current state\n    if (this.state === AssetLoaderState.READY) {\n      return {\n        success: true,\n        state: this.state,\n        cacheManagerState: CacheManager.getState(),\n      };\n    }\n\n    // Cache unavailable - don't retry\n    if (this.state === AssetLoaderState.CACHE_UNAVAILABLE) {\n      return {\n        success: false,\n        state: this.state,\n        cacheManagerState: CacheManager.getState(),\n        error: this.lastError || undefined,\n      };\n    }\n\n    this.initPromise = this.performInit(config);\n    return this.initPromise;\n  }\n\n  /**\n   * Perform the actual initialization\n   */\n  private static async performInit(\n    config?: Partial<AssetLoaderConfig>\n  ): Promise<AssetLoaderInitResult> {\n    this.state = AssetLoaderState.INITIALIZING;\n\n    try {\n      // Merge config with defaults\n      this.config = {\n        ...this.config,\n        ...config,\n      };\n\n      debugLog(\"Initializing asset loader with config:\", this.config);\n\n      // Initialize the cache manager\n      const cacheResult = await CacheManager.init(this.config.cacheName);\n\n      if (!cacheResult.success) {\n        // CacheManager failed to initialize\n        if (cacheResult.state === CacheManagerState.UNSUPPORTED) {\n          this.state = AssetLoaderState.CACHE_UNAVAILABLE;\n          this.lastError = cacheResult.error || null;\n          debugLog(\n            \"Asset loader: Cache API not supported, caching disabled\",\n            cacheResult.error\n          );\n        } else {\n          this.state = AssetLoaderState.ERROR;\n          this.lastError = cacheResult.error || null;\n          debugLog(\n            \"Asset loader: CacheManager initialization failed\",\n            cacheResult.error\n          );\n        }\n\n        return {\n          success: false,\n          state: this.state,\n          cacheManagerState: cacheResult.state,\n          error: cacheResult.error,\n        };\n      }\n\n      this.state = AssetLoaderState.READY;\n      this.lastError = null;\n      debugLog(\"Asset loader initialized successfully\");\n\n      return {\n        success: true,\n        state: this.state,\n        cacheManagerState: cacheResult.state,\n      };\n    } catch (error) {\n      const cacheError = wrapError(error, \"AssetLoader initialization failed\");\n      this.state = AssetLoaderState.ERROR;\n      this.lastError = cacheError;\n      debugLog(\"Asset loader initialization error:\", cacheError);\n\n      return {\n        success: false,\n        state: this.state,\n        cacheManagerState: CacheManager.getState(),\n        error: cacheError,\n      };\n    } finally {\n      this.initPromise = null;\n    }\n  }\n\n  /**\n   * Reset the asset loader state (primarily for testing)\n   */\n  static reset(): void {\n    this.state = AssetLoaderState.UNINITIALIZED;\n    this.lastError = null;\n    this.initPromise = null;\n    this.config = {\n      cacheName: DEFAULT_CACHE_NAME,\n      defaultTTL: DEFAULT_CACHE_TTL,\n      maxSize: MAX_CACHEABLE_SIZE,\n      enableServiceWorker: true,\n      debug: false,\n    };\n    CacheManager.reset();\n  }\n\n  /**\n   * Attempt to recover from an error state\n   * @param config Configuration options\n   * @returns Recovery result\n   */\n  static async recover(\n    config?: Partial<AssetLoaderConfig>\n  ): Promise<AssetLoaderInitResult> {\n    // Can't recover from CACHE_UNAVAILABLE - browser doesn't support Cache API\n    if (this.state === AssetLoaderState.CACHE_UNAVAILABLE) {\n      return {\n        success: false,\n        state: this.state,\n        cacheManagerState: CacheManager.getState(),\n        error: this.lastError || undefined,\n      };\n    }\n\n    // Try to recover CacheManager first\n    const cacheRecovery = await CacheManager.recover(this.config.cacheName);\n    if (!cacheRecovery.success) {\n      this.state = AssetLoaderState.ERROR;\n      this.lastError = cacheRecovery.error || null;\n      return {\n        success: false,\n        state: this.state,\n        cacheManagerState: cacheRecovery.state,\n        error: cacheRecovery.error,\n      };\n    }\n\n    // Reset state and re-initialize\n    this.state = AssetLoaderState.UNINITIALIZED;\n    this.lastError = null;\n    this.initPromise = null;\n\n    return this.init(config);\n  }\n\n  /**\n   * Ensure the asset loader is initialized\n   * @throws {CacheNotInitializedError} If initialization fails\n   */\n  private static async ensureInitialized(): Promise<void> {\n    if (this.state === AssetLoaderState.READY) {\n      return;\n    }\n\n    if (this.state === AssetLoaderState.CACHE_UNAVAILABLE) {\n      throw new CacheNotInitializedError(\n        \"Cache API not supported in this browser\"\n      );\n    }\n\n    const result = await this.init();\n    if (!result.success) {\n      throw (\n        result.error ||\n        new CacheNotInitializedError(\"AssetLoader initialization failed\")\n      );\n    }\n  }\n\n  /**\n   * Preload an asset\n   * @param url URL of the asset to preload\n   * @param options Caching options\n   * @throws {CacheError} If preloading fails\n   */\n  static async preload(url: string, options?: CacheOptions): Promise<void> {\n    await this.ensureInitialized();\n\n    try {\n      debugLog(`Preloading asset: ${url}`);\n\n      // Check if already cached\n      const isCached = await this.isCached(url);\n      if (isCached) {\n        debugLog(`Asset already cached: ${url}`);\n        return;\n      }\n\n      // Fetch the asset\n      let response: Response;\n      try {\n        response = await fetch(url);\n      } catch (fetchError) {\n        throw new AssetFetchFailedError(\n          url,\n          undefined,\n          undefined,\n          fetchError instanceof Error ? fetchError : undefined\n        );\n      }\n\n      if (!response.ok) {\n        throw new AssetFetchFailedError(url, response.status, response.statusText);\n      }\n\n      // Get the content type and size\n      const contentType = response.headers.get(\"content-type\");\n      const contentLength = response.headers.get(\"content-length\");\n      const size = contentLength ? parseInt(contentLength, 10) : 0;\n\n      // Check if the asset is too large\n      const maxSize = this.config.maxSize ?? MAX_CACHEABLE_SIZE;\n      if (size > 0 && size > maxSize) {\n        throw new AssetTooLargeError(url, size, maxSize);\n      }\n\n      // Check if the asset should be cached\n      if (\n        !shouldCacheAsset(\n          url,\n          size,\n          contentType || undefined,\n          this.config.maxSize\n        )\n      ) {\n        debugLog(`Asset not suitable for caching: ${url}`);\n        return;\n      }\n\n      // Clone the response to avoid consuming it\n      const responseClone = response.clone();\n\n      // Get the asset data as a blob\n      const blob = await responseClone.blob();\n\n      // Generate a content hash for versioning\n      const contentHash = await generateContentHash(blob);\n      const version = options?.tags?.length\n        ? `${contentHash}-${options.tags.join(\"-\")}`\n        : contentHash;\n\n      // Create a cache entry\n      const entry = createCacheEntry<Blob>(\n        blob,\n        url,\n        contentType || undefined,\n        {\n          ttl: options?.ttl || this.config.defaultTTL,\n          tags: options?.tags,\n          version,\n        }\n      );\n\n      // Store in the cache\n      await this.storeInCache(url, entry);\n\n      // If service worker is active, cache in the service worker too\n      if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n        await sendMessageToSW(ServiceWorkerMessageType.CACHE_ASSET, {\n          url,\n          version,\n          tags: options?.tags,\n        });\n      }\n\n      debugLog(`Asset preloaded: ${url}`);\n    } catch (error) {\n      debugLog(`Failed to preload asset: ${url}`, error);\n      // Re-throw CacheErrors as-is, wrap others\n      if (error instanceof CacheError) {\n        throw error;\n      }\n      throw wrapError(error, `Failed to preload asset: ${url}`);\n    }\n  }\n\n  /**\n   * Load an asset with caching\n   * @param url URL of the asset to load\n   * @param options Caching options\n   * @returns Promise resolving to the asset data with typed error information\n   */\n  static async load<T = Blob>(\n    url: string,\n    options?: CacheOptions\n  ): Promise<CacheResult<T>> {\n    // Try to initialize if not ready\n    if (this.state !== AssetLoaderState.READY) {\n      const initResult = await this.init();\n      if (!initResult.success) {\n        // Return error result if initialization fails\n        return {\n          success: false,\n          fromCache: false,\n          error:\n            initResult.error ||\n            new CacheNotInitializedError(\"AssetLoader not initialized\"),\n        };\n      }\n    }\n\n    try {\n      debugLog(`Loading asset: ${url}`);\n\n      // Try to get from cache first\n      const cachedEntry = await this.getFromCache<T>(url);\n\n      if (cachedEntry) {\n        // Check if expired\n        if (hasExpired(cachedEntry)) {\n          debugLog(`Cached asset expired: ${url}`);\n          // Remove from cache\n          await this.removeFromCache(url);\n        } else {\n          debugLog(`Asset loaded from cache: ${url}`);\n          // If revalidate is enabled, update the cache in the background\n          if (options?.revalidate) {\n            this.revalidateInBackground(url, options);\n          }\n          return {\n            success: true,\n            data: cachedEntry.data,\n            fromCache: true,\n          };\n        }\n      }\n\n      // Not in cache or expired, fetch from network\n      debugLog(`Fetching asset from network: ${url}`);\n\n      // Create a versioned URL if needed\n      const versionedUrl = VersionManager.hasVersion(url)\n        ? url\n        : VersionManager.createVersionedUrl(url);\n\n      // Fetch the asset\n      let response: Response;\n      try {\n        response = await fetch(versionedUrl);\n      } catch (fetchError) {\n        const error = new AssetFetchFailedError(\n          url,\n          undefined,\n          undefined,\n          fetchError instanceof Error ? fetchError : undefined\n        );\n        return {\n          success: false,\n          fromCache: false,\n          error,\n        };\n      }\n\n      if (!response.ok) {\n        const error = new AssetFetchFailedError(\n          url,\n          response.status,\n          response.statusText\n        );\n        return {\n          success: false,\n          fromCache: false,\n          error,\n        };\n      }\n\n      // Get the content type and size\n      const contentType = response.headers.get(\"content-type\");\n      const contentLength = response.headers.get(\"content-length\");\n      const size = contentLength ? parseInt(contentLength, 10) : 0;\n\n      // Get the asset data\n      const data = (await response.blob()) as unknown as T;\n\n      // Check if the asset should be cached\n      if (\n        shouldCacheAsset(\n          url,\n          size,\n          contentType || undefined,\n          this.config.maxSize\n        )\n      ) {\n        try {\n          // Generate a content hash for versioning\n          const contentHash = await generateContentHash(\n            data as unknown as Blob\n          );\n          const version = options?.tags?.length\n            ? `${contentHash}-${options.tags.join(\"-\")}`\n            : contentHash;\n\n          // Create a cache entry\n          const entry = createCacheEntry<T>(\n            data,\n            url,\n            contentType || undefined,\n            {\n              ttl: options?.ttl || this.config.defaultTTL,\n              tags: options?.tags,\n              version,\n            }\n          );\n\n          // Store in the cache\n          await this.storeInCache(url, entry);\n\n          // If service worker is active, cache in the service worker too\n          if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n            await sendMessageToSW(ServiceWorkerMessageType.CACHE_ASSET, {\n              url,\n              version,\n              tags: options?.tags,\n            });\n          }\n        } catch (cacheError) {\n          // Log cache errors but don't fail the load - we still have the data\n          debugLog(`Failed to cache asset (non-fatal): ${url}`, cacheError);\n          // If quota exceeded, clear old entries and try again\n          if (isQuotaExceededError(cacheError)) {\n            debugLog(\"Storage quota exceeded, attempting cleanup...\");\n            // Don't throw - we have the data, just couldn't cache it\n          }\n        }\n      }\n\n      return {\n        success: true,\n        data,\n        fromCache: false,\n      };\n    } catch (error) {\n      debugLog(`Failed to load asset: ${url}`, error);\n      const cacheError =\n        error instanceof CacheError\n          ? error\n          : wrapError(error, `Failed to load asset: ${url}`);\n      return {\n        success: false,\n        fromCache: false,\n        error: cacheError,\n      };\n    }\n  }\n\n  /**\n   * Check if an asset is cached\n   * @param url URL of the asset\n   * @returns Whether the asset is cached\n   */\n  static async isCached(url: string): Promise<boolean> {\n    await this.ensureInitialized();\n\n    try {\n      // Check in-memory cache\n      const cachedEntry = await this.getFromCache(url);\n      if (cachedEntry && !hasExpired(cachedEntry)) {\n        return true;\n      }\n\n      // If service worker is active, check service worker cache\n      if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n        const result = await sendMessageToSW<{ cached: boolean }>(\n          ServiceWorkerMessageType.CHECK_ASSET,\n          { url }\n        );\n        return result?.cached || false;\n      }\n\n      return false;\n    } catch (error) {\n      debugLog(`Failed to check if asset is cached: ${url}`, error);\n      return false;\n    }\n  }\n\n  /**\n   * Invalidate a cached asset\n   * @param url URL of the asset to invalidate\n   * @throws {CacheError} If invalidation fails\n   */\n  static async invalidate(url: string): Promise<void> {\n    await this.ensureInitialized();\n\n    try {\n      debugLog(`Invalidating asset: ${url}`);\n\n      // Remove from cache\n      await this.removeFromCache(url);\n\n      // If service worker is active, invalidate in the service worker too\n      if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n        await sendMessageToSW(ServiceWorkerMessageType.INVALIDATE_ASSET, {\n          url,\n        });\n      }\n\n      debugLog(`Asset invalidated: ${url}`);\n    } catch (error) {\n      debugLog(`Failed to invalidate asset: ${url}`, error);\n      if (error instanceof CacheError) {\n        throw error;\n      }\n      throw wrapError(error, `Failed to invalidate asset: ${url}`);\n    }\n  }\n\n  /**\n   * Invalidate cached assets by tag\n   * @param tag Tag to invalidate\n   * @throws {CacheError} If invalidation fails\n   */\n  static async invalidateByTag(tag: string): Promise<void> {\n    await this.ensureInitialized();\n\n    try {\n      debugLog(`Invalidating assets with tag: ${tag}`);\n\n      // Get assets with the tag\n      const assets = await CacheManager.getAssetsByTag(tag);\n\n      // Invalidate each asset\n      for (const asset of assets) {\n        await this.removeFromCache(asset.url);\n      }\n\n      // If service worker is active, invalidate in the service worker too\n      if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n        await sendMessageToSW(ServiceWorkerMessageType.INVALIDATE_TAG, {\n          tag,\n        });\n      }\n\n      debugLog(`Assets with tag invalidated: ${tag}`);\n    } catch (error) {\n      debugLog(`Failed to invalidate assets with tag: ${tag}`, error);\n      if (error instanceof CacheError) {\n        throw error;\n      }\n      throw wrapError(error, `Failed to invalidate assets with tag: ${tag}`);\n    }\n  }\n\n  /**\n   * Store an asset in the cache\n   * @param url URL of the asset\n   * @param entry Cache entry\n   * @throws {CacheError} If storage fails (e.g., quota exceeded)\n   */\n  private static async storeInCache<T>(\n    url: string,\n    entry: CacheEntry<T>\n  ): Promise<void> {\n    try {\n      // Generate a cache key\n      const cacheKey = generateCacheKey(url);\n\n      // Create a response from the blob\n      const response = new Response(entry.data as unknown as Blob, {\n        headers: {\n          \"Content-Type\":\n            entry.type === AssetType.OTHER\n              ? \"application/octet-stream\"\n              : `${entry.type}/*`,\n        },\n      });\n\n      // Get the cache\n      const cache = await caches.open(\n        this.config.cacheName || DEFAULT_CACHE_NAME\n      );\n\n      // Store in the cache\n      await cache.put(cacheKey, response);\n\n      // Add to the manifest\n      await CacheManager.addToManifest(url, {\n        type: entry.type,\n        version: entry.version || Date.now().toString(36),\n        lastModified: new Date().toISOString(),\n        size: entry.data instanceof Blob ? entry.data.size : 0,\n        tags: entry.tags,\n      });\n\n      debugLog(`Asset stored in cache: ${url}`);\n    } catch (error) {\n      debugLog(`Failed to store asset in cache: ${url}`, error);\n      // Check for quota exceeded error\n      if (isQuotaExceededError(error)) {\n        throw new StorageQuotaExceededError(\n          error instanceof Error ? error : undefined\n        );\n      }\n      if (error instanceof CacheError) {\n        throw error;\n      }\n      throw wrapError(error, `Failed to store asset in cache: ${url}`);\n    }\n  }\n\n  /**\n   * Get an asset from the cache\n   * @param url URL of the asset\n   * @returns Cache entry or null if not found\n   */\n  private static async getFromCache<T>(\n    url: string\n  ): Promise<CacheEntry<T> | null> {\n    try {\n      // Generate a cache key\n      const cacheKey = generateCacheKey(url);\n\n      // Get the cache\n      const cache = await caches.open(\n        this.config.cacheName || DEFAULT_CACHE_NAME\n      );\n\n      // Try to get from cache\n      const response = await cache.match(cacheKey);\n      if (!response) {\n        return null;\n      }\n\n      // Get the asset metadata\n      const metadata = await CacheManager.getAssetMetadata(url);\n      if (!metadata) {\n        return null;\n      }\n\n      // Get the blob from the response\n      const blob = await response.blob();\n\n      // Create a cache entry\n      return {\n        data: blob as unknown as T,\n        timestamp: new Date(metadata.lastModified).getTime(),\n        expires: metadata.lastModified\n          ? new Date(metadata.lastModified).getTime() +\n            (this.config.defaultTTL || DEFAULT_CACHE_TTL) * 1000\n          : undefined,\n        type: metadata.type,\n        tags: metadata.tags,\n        version: metadata.version,\n      };\n    } catch (error) {\n      debugLog(`Failed to get asset from cache: ${url}`, error);\n      return null;\n    }\n  }\n\n  /**\n   * Remove an asset from the cache\n   * @param url URL of the asset\n   * @throws {CacheError} If removal fails\n   */\n  private static async removeFromCache(url: string): Promise<void> {\n    try {\n      // Generate a cache key\n      const cacheKey = generateCacheKey(url);\n\n      // Get the cache\n      const cache = await caches.open(\n        this.config.cacheName || DEFAULT_CACHE_NAME\n      );\n\n      // Remove from cache\n      await cache.delete(cacheKey);\n\n      // Remove from manifest\n      await CacheManager.removeFromManifest(url);\n\n      debugLog(`Asset removed from cache: ${url}`);\n    } catch (error) {\n      debugLog(`Failed to remove asset from cache: ${url}`, error);\n      if (error instanceof CacheError) {\n        throw error;\n      }\n      throw wrapError(error, `Failed to remove asset from cache: ${url}`);\n    }\n  }\n\n  /**\n   * Revalidate an asset in the background\n   * Background revalidation errors are logged but not thrown\n   * @param url URL of the asset\n   * @param options Caching options\n   */\n  private static async revalidateInBackground(\n    url: string,\n    options?: CacheOptions\n  ): Promise<void> {\n    try {\n      debugLog(`Revalidating asset in background: ${url}`);\n\n      // Create a versioned URL if needed\n      const versionedUrl = VersionManager.hasVersion(url)\n        ? url\n        : VersionManager.createVersionedUrl(url || \"\");\n\n      // Fetch the asset\n      let response: Response;\n      try {\n        response = await fetch(versionedUrl);\n      } catch (fetchError) {\n        debugLog(\n          `Background revalidation fetch failed: ${url}`,\n          fetchError\n        );\n        return; // Don't throw in background operation\n      }\n\n      if (!response.ok) {\n        debugLog(\n          `Background revalidation received non-ok response: ${url} (${response.status})`\n        );\n        return; // Don't throw in background operation\n      }\n\n      // Get the content type and size\n      const contentType = response.headers.get(\"content-type\");\n      const contentLength = response.headers.get(\"content-length\") || undefined;\n      const size = contentLength ? parseInt(contentLength, 10) : 0;\n\n      // Check if the asset should be cached\n      if (\n        !shouldCacheAsset(\n          url,\n          size,\n          contentType || undefined,\n          this.config.maxSize\n        )\n      ) {\n        debugLog(`Asset not suitable for caching: ${url}`);\n        return;\n      }\n\n      // Get the asset data\n      const blob = await response.blob();\n\n      // Generate a content hash for versioning\n      const contentHash = await generateContentHash(blob);\n      const version = options?.tags?.length\n        ? `${contentHash}-${options.tags.join(\"-\")}`\n        : contentHash;\n\n      // Get the current version from the cache\n      const metadata = await CacheManager.getAssetMetadata(url);\n      if (metadata && metadata.version === version) {\n        debugLog(`Asset unchanged, no need to update cache: ${url}`);\n        return;\n      }\n\n      // Create a cache entry\n      const entry = createCacheEntry<Blob>(\n        blob,\n        url,\n        contentType || undefined,\n        {\n          ttl: options?.ttl || this.config.defaultTTL,\n          tags: options?.tags,\n          version,\n        }\n      );\n\n      // Store in the cache\n      await this.storeInCache(url, entry);\n\n      // If service worker is active, cache in the service worker too\n      if (this.config.enableServiceWorker && isServiceWorkerActive()) {\n        await sendMessageToSW(ServiceWorkerMessageType.CACHE_ASSET, {\n          url,\n          version,\n          tags: options?.tags,\n        });\n      }\n\n      debugLog(`Asset revalidated: ${url}`);\n    } catch (error) {\n      // Log but don't throw - this is a background operation\n      debugLog(`Failed to revalidate asset (background): ${url}`, error);\n    }\n  }\n}\n","/**\n * Utility functions for cache operations\n */\n\nimport { FILE_EXTENSION_TO_ASSET_TYPE } from \"../config/constants\";\nimport { AssetType, CacheEntry } from \"../config/types\";\n\n/**\n * Determine the asset type from a URL or content type\n * @param url URL of the asset\n * @param contentType Optional content type\n * @returns Asset type\n */\nexport function determineAssetType(\n  url: string,\n  contentType?: string\n): AssetType {\n  // If content type is provided, use it to determine asset type\n  if (contentType) {\n    if (contentType.startsWith(\"image/\")) {\n      return AssetType.IMAGE;\n    } else if (contentType.startsWith(\"video/\")) {\n      return AssetType.VIDEO;\n    } else if (\n      contentType.startsWith(\"font/\") ||\n      contentType === \"application/font-woff\" ||\n      contentType === \"application/font-woff2\"\n    ) {\n      return AssetType.FONT;\n    } else if (contentType.startsWith(\"audio/\")) {\n      return AssetType.AUDIO;\n    }\n  }\n\n  // Otherwise, determine from URL extension\n  const extension = url.split(\".\").pop()?.toLowerCase();\n  if (!extension) {\n    return AssetType.OTHER;\n  }\n\n  const mimeType = FILE_EXTENSION_TO_ASSET_TYPE[extension];\n  if (!mimeType) {\n    return AssetType.OTHER;\n  }\n\n  if (mimeType.startsWith(\"image/\")) {\n    return AssetType.IMAGE;\n  } else if (mimeType.startsWith(\"video/\")) {\n    return AssetType.VIDEO;\n  } else if (mimeType.startsWith(\"font/\")) {\n    return AssetType.FONT;\n  } else if (mimeType.startsWith(\"audio/\")) {\n    return AssetType.AUDIO;\n  }\n\n  return AssetType.OTHER;\n}\n\n/**\n * Check if an asset should be cached based on its type and size\n * @param url URL of the asset\n * @param size Size of the asset in bytes\n * @param contentType Optional content type\n * @param maxSize Maximum size for cacheable assets\n * @returns Whether the asset should be cached\n */\nexport function shouldCacheAsset(\n  url: string,\n  size: number,\n  contentType?: string,\n  maxSize = Infinity\n): boolean {\n  // Don't cache assets that are too large\n  if (size > maxSize) {\n    return false;\n  }\n\n  // Don't cache assets from external domains unless explicitly allowed\n  try {\n    const urlObj = new URL(url, window.location.origin);\n    if (urlObj.origin !== window.location.origin) {\n      // Check if the domain is in the allowed list\n      // This would be implemented based on your configuration\n      // For now, we'll allow all domains\n      // return isAllowedExternalDomain(urlObj.hostname);\n    }\n  } catch (error) {\n    return false;\n  }\n\n  // Determine asset type\n  const assetType = determineAssetType(url, contentType);\n\n  // Cache based on asset type\n  switch (assetType) {\n    case AssetType.IMAGE:\n    case AssetType.FONT:\n      return true;\n    case AssetType.VIDEO:\n    case AssetType.AUDIO:\n      // Only cache videos and audio if they're not too large\n      return size < maxSize / 2;\n    case AssetType.OTHER:\n    default:\n      // Don't cache other asset types by default\n      return false;\n  }\n}\n\n/**\n * Create a cache entry for an asset\n * @param data Asset data\n * @param url URL of the asset\n * @param contentType Optional content type\n * @param options Cache options\n * @returns Cache entry\n */\nexport function createCacheEntry<T>(\n  data: T,\n  url: string,\n  contentType?: string,\n  options?: {\n    ttl?: number;\n    tags?: string[];\n    version?: string;\n  }\n): CacheEntry<T> {\n  const now = Date.now();\n  const assetType = determineAssetType(url, contentType);\n\n  return {\n    data,\n    timestamp: now,\n    expires: options?.ttl ? now + options.ttl * 1000 : undefined,\n    type: assetType,\n    tags: options?.tags,\n    version: options?.version,\n  };\n}\n\n/**\n * Check if a cache entry has expired\n * @param entry Cache entry\n * @returns Whether the entry has expired\n */\nexport function hasExpired(entry: CacheEntry<any>): boolean {\n  return !!entry.expires && entry.expires < Date.now();\n}\n\n/**\n * Format a size in bytes to a human-readable string\n * @param bytes Size in bytes\n * @returns Human-readable size string\n */\nexport function formatSize(bytes: number): string {\n  if (bytes < 1024) {\n    return `${bytes} B`;\n  } else if (bytes < 1024 * 1024) {\n    return `${(bytes / 1024).toFixed(2)} KB`;\n  } else if (bytes < 1024 * 1024 * 1024) {\n    return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n  } else {\n    return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n  }\n}\n\n/**\n * Log a debug message if debug mode is enabled\n * @param message Message to log\n * @param args Additional arguments\n */\nexport function debugLog(message: string, ...args: any[]): void {\n  // Simple debug logging - can be controlled by the configuration\n  // In development, you can enable it via localStorage for debugging\n  if (\n    typeof localStorage !== \"undefined\" &&\n    localStorage.getItem(\"DEBUG_ASSET_CACHE\") === \"true\"\n  ) {\n    console.log(`[AssetCache] ${message}`, ...args);\n  }\n}\n","/**\n * Utility functions for generating content hashes\n */\n\n/**\n * Generate a simple hash from a string\n * @param str String to hash\n * @returns Hash string\n */\nexport function generateSimpleHash(str: string): string {\n  let hash = 0;\n  if (str.length === 0) return hash.toString(16);\n\n  for (let i = 0; i < str.length; i++) {\n    const char = str.charCodeAt(i);\n    hash = (hash << 5) - hash + char;\n    hash = hash & hash; // Convert to 32bit integer\n  }\n\n  return Math.abs(hash).toString(16);\n}\n\n/**\n * Generate a content hash from a Blob or File\n * @param content Blob or File to hash\n * @returns Promise resolving to hash string\n */\nexport async function generateContentHash(content: Blob): Promise<string> {\n  // Use the Web Crypto API if available\n  if (typeof crypto !== \"undefined\" && crypto.subtle) {\n    try {\n      const buffer = await content.arrayBuffer();\n      const hashBuffer = await crypto.subtle.digest(\"SHA-256\", buffer);\n      const hashArray = Array.from(new Uint8Array(hashBuffer));\n      const hashHex = hashArray\n        .map((b) => b.toString(16).padStart(2, \"0\"))\n        .join(\"\");\n      return hashHex;\n    } catch (error) {\n      console.error(\"Error generating content hash:\", error);\n      // Fall back to simple hash\n      return generateSimpleHashFromBlob(content);\n    }\n  }\n\n  // Fall back to simple hash if Web Crypto API is not available\n  return generateSimpleHashFromBlob(content);\n}\n\n/**\n * Generate a simple hash from a Blob or File\n * @param content Blob or File to hash\n * @returns Promise resolving to hash string\n */\nasync function generateSimpleHashFromBlob(content: Blob): Promise<string> {\n  return new Promise((resolve) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      const result = reader.result as string;\n      resolve(generateSimpleHash(result));\n    };\n    reader.readAsText(content);\n  });\n}\n\n/**\n * Generate a version string for a URL\n * @param url URL to version\n * @param version Version string\n * @returns Versioned URL\n */\nexport function addVersionToUrl(url: string, version: string): string {\n  const urlObj = new URL(url, window.location.origin);\n  urlObj.searchParams.set(\"v\", version);\n  return urlObj.toString();\n}\n\n/**\n * Extract version from a URL\n * @param url URL with version\n * @returns Version string or null if not found\n */\nexport function extractVersionFromUrl(url: string): string | null {\n  try {\n    const urlObj = new URL(url, window.location.origin);\n    return urlObj.searchParams.get(\"v\");\n  } catch (error) {\n    return null;\n  }\n}\n\n/**\n * Generate a cache key from a URL\n * @param url URL to generate key for\n * @returns Cache key\n */\nexport function generateCacheKey(url: string): string {\n  // Remove version parameter if present\n  const urlObj = new URL(url, window.location.origin);\n  urlObj.searchParams.delete(\"v\");\n  return urlObj.toString();\n}\n","/**\n * Cache manager module\n *\n * This module:\n * - Manages cache operations\n * - Handles cache invalidation\n * - Provides utilities for working with the cache\n * - Handles all error states with typed errors\n */\nimport {\n  CacheManifest,\n  AssetMetadata,\n  AssetType,\n  ServiceWorkerMessageType,\n} from \"../config/types\";\nimport {\n  DEFAULT_CACHE_NAME,\n  DEFAULT_CACHE_TTL,\n  CACHE_MANIFEST_PATH,\n} from \"../config/constants\";\nimport {\n  debugLog,\n  determineAssetType,\n  formatSize,\n} from \"../utils/cache-helpers\";\nimport { generateCacheKey } from \"../utils/hash-generator\";\nimport { sendMessageToSW, isServiceWorkerActive } from \"./register-sw\";\nimport {\n  CacheError,\n  CacheErrorCode,\n  CacheAPINotSupportedError,\n  CacheNotInitializedError,\n  CacheOpenFailedError,\n  ManifestParseError,\n  ManifestSaveFailedError,\n  StorageQuotaExceededError,\n  StorageAccessDeniedError,\n  isQuotaExceededError,\n  isStorageAccessDeniedError,\n  wrapError,\n} from \"./errors\";\n\n/**\n * Initialization state of the cache manager\n */\nexport enum CacheManagerState {\n  UNINITIALIZED = \"UNINITIALIZED\",\n  INITIALIZING = \"INITIALIZING\",\n  READY = \"READY\",\n  ERROR = \"ERROR\",\n  UNSUPPORTED = \"UNSUPPORTED\",\n}\n\n/**\n * Result of initialization attempt\n */\nexport interface InitResult {\n  success: boolean;\n  state: CacheManagerState;\n  error?: CacheError;\n}\n\n/**\n * Cache manager class with proper error handling\n */\nexport class CacheManager {\n  private static cache: Cache | null = null;\n  private static manifest: CacheManifest | null = null;\n  private static state: CacheManagerState = CacheManagerState.UNINITIALIZED;\n  private static lastError: CacheError | null = null;\n  private static initPromise: Promise<InitResult> | null = null;\n\n  /**\n   * Get the current state of the cache manager\n   */\n  static getState(): CacheManagerState {\n    return this.state;\n  }\n\n  /**\n   * Get the last error that occurred\n   */\n  static getLastError(): CacheError | null {\n    return this.lastError;\n  }\n\n  /**\n   * Check if the cache manager is ready for operations\n   */\n  static isReady(): boolean {\n    return this.state === CacheManagerState.READY;\n  }\n\n  /**\n   * Check if caching is supported in the current environment\n   */\n  static isSupported(): boolean {\n    return typeof window !== \"undefined\" && \"caches\" in window;\n  }\n\n  /**\n   * Initialize the cache manager\n   * @param cacheName Name of the cache to use\n   * @returns Promise resolving to initialization result\n   */\n  static async init(cacheName: string = DEFAULT_CACHE_NAME): Promise<InitResult> {\n    // Return existing promise if initialization is in progress\n    if (this.initPromise) {\n      return this.initPromise;\n    }\n\n    // Already initialized successfully\n    if (this.state === CacheManagerState.READY) {\n      return { success: true, state: this.state };\n    }\n\n    // Already determined to be unsupported\n    if (this.state === CacheManagerState.UNSUPPORTED) {\n      const error = new CacheAPINotSupportedError();\n      return { success: false, state: this.state, error };\n    }\n\n    this.initPromise = this.performInit(cacheName);\n    const result = await this.initPromise;\n    this.initPromise = null;\n    return result;\n  }\n\n  /**\n   * Perform the actual initialization\n   */\n  private static async performInit(cacheName: string): Promise<InitResult> {\n    this.state = CacheManagerState.INITIALIZING;\n    this.lastError = null;\n\n    // Check for Cache API support\n    if (!this.isSupported()) {\n      const error = new CacheAPINotSupportedError();\n      this.lastError = error;\n      this.state = CacheManagerState.UNSUPPORTED;\n      debugLog(\"Cache API not supported in this browser\");\n      return { success: false, state: this.state, error };\n    }\n\n    try {\n      // Open the cache\n      this.cache = await caches.open(cacheName);\n      debugLog(\"Cache opened:\", cacheName);\n\n      // Load the manifest\n      await this.loadManifest();\n\n      this.state = CacheManagerState.READY;\n      debugLog(\"Cache manager initialized successfully\");\n      return { success: true, state: this.state };\n    } catch (error) {\n      const cacheError = this.handleInitError(error, cacheName);\n      this.lastError = cacheError;\n      this.state = CacheManagerState.ERROR;\n      debugLog(\"Failed to initialize cache manager:\", cacheError);\n      return { success: false, state: this.state, error: cacheError };\n    }\n  }\n\n  /**\n   * Handle initialization errors and convert to typed errors\n   */\n  private static handleInitError(error: unknown, cacheName: string): CacheError {\n    if (isStorageAccessDeniedError(error)) {\n      return new StorageAccessDeniedError(error as Error);\n    }\n    if (isQuotaExceededError(error)) {\n      return new StorageQuotaExceededError(error as Error);\n    }\n    return new CacheOpenFailedError(\n      cacheName,\n      error instanceof Error ? error : undefined\n    );\n  }\n\n  /**\n   * Reset the cache manager (useful for recovery or testing)\n   */\n  static reset(): void {\n    this.cache = null;\n    this.manifest = null;\n    this.state = CacheManagerState.UNINITIALIZED;\n    this.lastError = null;\n    this.initPromise = null;\n    debugLog(\"Cache manager reset\");\n  }\n\n  /**\n   * Attempt to recover from an error state\n   * @param cacheName Name of the cache to use\n   */\n  static async recover(cacheName: string = DEFAULT_CACHE_NAME): Promise<InitResult> {\n    if (this.state === CacheManagerState.UNSUPPORTED) {\n      // Cannot recover from unsupported state\n      return {\n        success: false,\n        state: this.state,\n        error: new CacheAPINotSupportedError(),\n      };\n    }\n\n    this.reset();\n    return this.init(cacheName);\n  }\n\n  /**\n   * Load the cache manifest\n   */\n  static async loadManifest(): Promise<void> {\n    try {\n      if (!this.cache) {\n        const result = await this.init();\n        if (!result.success) {\n          throw result.error || new CacheNotInitializedError(\"loadManifest\");\n        }\n      }\n\n      if (!this.cache) {\n        throw new CacheNotInitializedError(\"loadManifest\");\n      }\n\n      // Try to get the manifest from the cache\n      const manifestResponse = await this.cache.match(CACHE_MANIFEST_PATH);\n\n      if (manifestResponse) {\n        try {\n          this.manifest = await manifestResponse.json();\n          debugLog(\"Cache manifest loaded:\", this.manifest);\n        } catch (parseError) {\n          // Handle JSON parse errors\n          debugLog(\"Failed to parse manifest, creating new one:\", parseError);\n          this.manifest = this.createNewManifest();\n        }\n      } else {\n        // Create a new manifest\n        this.manifest = this.createNewManifest();\n        debugLog(\"New cache manifest created\");\n      }\n    } catch (error) {\n      debugLog(\"Failed to load cache manifest:\", error);\n\n      // Create a new manifest as fallback\n      this.manifest = this.createNewManifest();\n\n      // Re-throw if it's a critical error\n      if (error instanceof CacheError && !error.recoverable) {\n        throw error;\n      }\n    }\n  }\n\n  /**\n   * Create a new empty manifest\n   */\n  private static createNewManifest(): CacheManifest {\n    return {\n      version: \"1\",\n      generatedAt: new Date().toISOString(),\n      assets: {},\n    };\n  }\n\n  /**\n   * Ensure the cache manager is initialized\n   */\n  private static async ensureInitialized(): Promise<void> {\n    if (this.state === CacheManagerState.UNSUPPORTED) {\n      throw new CacheAPINotSupportedError();\n    }\n\n    if (this.state !== CacheManagerState.READY) {\n      const result = await this.init();\n      if (!result.success) {\n        throw result.error || new CacheNotInitializedError();\n      }\n    }\n  }\n\n  /**\n   * Save the cache manifest\n   */\n  static async saveManifest(): Promise<void> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.cache || !this.manifest) {\n        throw new CacheNotInitializedError(\"saveManifest\");\n      }\n\n      // Create a response with the manifest\n      const manifestResponse = new Response(JSON.stringify(this.manifest), {\n        headers: { \"Content-Type\": \"application/json\" },\n      });\n\n      // Store in the cache\n      await this.cache.put(CACHE_MANIFEST_PATH, manifestResponse);\n\n      // If service worker is active, update it too\n      if (isServiceWorkerActive()) {\n        try {\n          await sendMessageToSW(ServiceWorkerMessageType.UPDATE_MANIFEST, {\n            manifest: this.manifest,\n          });\n        } catch (swError) {\n          // Log but don't fail - SW sync is best-effort\n          debugLog(\"Failed to sync manifest with service worker:\", swError);\n        }\n      }\n\n      debugLog(\"Cache manifest saved\");\n    } catch (error) {\n      if (error instanceof CacheError) {\n        this.lastError = error;\n        throw error;\n      }\n\n      const cacheError = new ManifestSaveFailedError(\n        error instanceof Error ? error : undefined\n      );\n      this.lastError = cacheError;\n      debugLog(\"Failed to save cache manifest:\", cacheError);\n      throw cacheError;\n    }\n  }\n\n  /**\n   * Add an asset to the manifest\n   * @param url URL of the asset\n   * @param metadata Asset metadata\n   */\n  static async addToManifest(\n    url: string,\n    metadata: Partial<AssetMetadata>\n  ): Promise<void> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        throw new CacheNotInitializedError(\"addToManifest\");\n      }\n\n      // Create or update the asset entry\n      const cacheKey = generateCacheKey(url);\n\n      this.manifest.assets[cacheKey] = {\n        url,\n        type: metadata.type || determineAssetType(url),\n        version: metadata.version || Date.now().toString(36),\n        lastModified: metadata.lastModified || new Date().toISOString(),\n        size: metadata.size,\n        tags: metadata.tags,\n      };\n\n      // Save the manifest\n      await this.saveManifest();\n    } catch (error) {\n      const cacheError = wrapError(error, \"Failed to add asset to manifest\");\n      this.lastError = cacheError;\n      debugLog(\"Failed to add asset to manifest:\", cacheError);\n      // Don't throw - this is a non-critical operation\n    }\n  }\n\n  /**\n   * Remove an asset from the manifest\n   * @param url URL of the asset\n   */\n  static async removeFromManifest(url: string): Promise<void> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        throw new CacheNotInitializedError(\"removeFromManifest\");\n      }\n\n      // Remove the asset entry\n      const cacheKey = generateCacheKey(url);\n\n      if (this.manifest.assets[cacheKey]) {\n        delete this.manifest.assets[cacheKey];\n\n        // Save the manifest\n        await this.saveManifest();\n      }\n    } catch (error) {\n      const cacheError = wrapError(error, \"Failed to remove asset from manifest\");\n      this.lastError = cacheError;\n      debugLog(\"Failed to remove asset from manifest:\", cacheError);\n      // Don't throw - this is a non-critical operation\n    }\n  }\n\n  /**\n   * Get asset metadata from the manifest\n   * @param url URL of the asset\n   * @returns Asset metadata or null if not found\n   */\n  static async getAssetMetadata(url: string): Promise<AssetMetadata | null> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        return null;\n      }\n\n      const cacheKey = generateCacheKey(url);\n      return this.manifest.assets[cacheKey] || null;\n    } catch (error) {\n      debugLog(\"Failed to get asset metadata:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Get all assets of a specific type\n   * @param type Asset type\n   * @returns Array of asset metadata\n   */\n  static async getAssetsByType(type: AssetType): Promise<AssetMetadata[]> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        return [];\n      }\n\n      return Object.values(this.manifest.assets).filter(\n        (asset) => asset.type === type\n      );\n    } catch (error) {\n      debugLog(\"Failed to get assets by type:\", error);\n      return [];\n    }\n  }\n\n  /**\n   * Get all assets with a specific tag\n   * @param tag Tag to filter by\n   * @returns Array of asset metadata\n   */\n  static async getAssetsByTag(tag: string): Promise<AssetMetadata[]> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        return [];\n      }\n\n      return Object.values(this.manifest.assets).filter((asset) =>\n        asset.tags?.includes(tag)\n      );\n    } catch (error) {\n      debugLog(\"Failed to get assets by tag:\", error);\n      return [];\n    }\n  }\n\n  /**\n   * Get cache statistics\n   * @returns Cache statistics\n   */\n  static async getStats(): Promise<{\n    totalAssets: number;\n    totalSize: number;\n    assetsByType: Record<AssetType, number>;\n    formattedSize: string;\n    state: CacheManagerState;\n    lastError: CacheError | null;\n  }> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.manifest) {\n        await this.loadManifest();\n      }\n\n      if (!this.manifest) {\n        return this.getEmptyStats();\n      }\n\n      const assets = Object.values(this.manifest.assets);\n      const totalAssets = assets.length;\n      const totalSize = assets.reduce(\n        (sum, asset) => sum + (asset.size || 0),\n        0\n      );\n\n      // Count assets by type\n      const assetsByType = assets.reduce(\n        (counts, asset) => {\n          counts[asset.type] = (counts[asset.type] || 0) + 1;\n          return counts;\n        },\n        {} as Record<AssetType, number>\n      );\n\n      return {\n        totalAssets,\n        totalSize,\n        assetsByType,\n        formattedSize: formatSize(totalSize),\n        state: this.state,\n        lastError: this.lastError,\n      };\n    } catch (error) {\n      debugLog(\"Failed to get cache stats:\", error);\n      return this.getEmptyStats();\n    }\n  }\n\n  /**\n   * Get empty stats object\n   */\n  private static getEmptyStats(): {\n    totalAssets: number;\n    totalSize: number;\n    assetsByType: Record<AssetType, number>;\n    formattedSize: string;\n    state: CacheManagerState;\n    lastError: CacheError | null;\n  } {\n    return {\n      totalAssets: 0,\n      totalSize: 0,\n      assetsByType: {} as Record<AssetType, number>,\n      formattedSize: \"0 B\",\n      state: this.state,\n      lastError: this.lastError,\n    };\n  }\n\n  /**\n   * Clear the cache and manifest\n   */\n  static async clear(): Promise<void> {\n    try {\n      if (!this.isSupported()) {\n        return;\n      }\n\n      // Delete the cache\n      await caches.delete(DEFAULT_CACHE_NAME);\n\n      // Reset the manifest\n      this.manifest = this.createNewManifest();\n\n      // Reset the cache reference\n      this.cache = null;\n\n      // Reset state (but keep as READY since clear was successful)\n      if (this.state === CacheManagerState.READY) {\n        // Will need to re-init on next operation\n        this.state = CacheManagerState.UNINITIALIZED;\n      }\n\n      debugLog(\"Cache and manifest cleared\");\n    } catch (error) {\n      const cacheError = wrapError(error, \"Failed to clear cache and manifest\");\n      this.lastError = cacheError;\n      debugLog(\"Failed to clear cache and manifest:\", cacheError);\n      // Don't throw - clearing is best-effort\n    }\n  }\n\n  /**\n   * Purge expired assets from the cache\n   * @returns Number of assets purged\n   */\n  static async purgeExpired(): Promise<number> {\n    try {\n      await this.ensureInitialized();\n\n      if (!this.cache || !this.manifest) {\n        return 0;\n      }\n\n      const now = Date.now();\n      const expiredAssets: string[] = [];\n\n      // Find expired assets\n      for (const [cacheKey, metadata] of Object.entries(this.manifest.assets)) {\n        // Check if the asset has an expiration time\n        if (metadata.lastModified) {\n          const lastModifiedTime = new Date(metadata.lastModified).getTime();\n          const age = now - lastModifiedTime;\n\n          // If older than the default TTL, consider it expired\n          if (age > DEFAULT_CACHE_TTL * 1000) {\n            expiredAssets.push(cacheKey);\n          }\n        }\n      }\n\n      // Remove expired assets\n      for (const cacheKey of expiredAssets) {\n        try {\n          await this.cache.delete(cacheKey);\n          delete this.manifest.assets[cacheKey];\n        } catch (deleteError) {\n          debugLog(`Failed to delete expired asset ${cacheKey}:`, deleteError);\n          // Continue with other assets\n        }\n      }\n\n      // Save the manifest if any assets were removed\n      if (expiredAssets.length > 0) {\n        await this.saveManifest();\n        debugLog(`Purged ${expiredAssets.length} expired assets`);\n      }\n\n      return expiredAssets.length;\n    } catch (error) {\n      const cacheError = wrapError(error, \"Failed to purge expired assets\");\n      this.lastError = cacheError;\n      debugLog(\"Failed to purge expired assets:\", cacheError);\n      return 0;\n    }\n  }\n}\n","/**\n * Asset Cache Configuration Module\n * Centralized exports for all configuration-related functionality\n */\n\n// ============================================================================\n// TYPE DEFINITIONS\n// ============================================================================\n\nexport * from \"./types\";\n\n// ============================================================================\n// CONFIGURATION INTERFACES AND FUNCTIONS\n// ============================================================================\n\nexport * from \"./config\";\n\n// ============================================================================\n// DEFAULT CONFIGURATIONS AND PRESETS\n// ============================================================================\n\nexport * from \"./defaults\";\n\n// ============================================================================\n// CONSTANTS AND MAPPINGS\n// ============================================================================\n\nexport * from \"./constants\";\n\n// ============================================================================\n// EXPLICIT TYPE EXPORTS (for better IDE support)\n// ============================================================================\n\nexport type {\n  AssetCacheConfig,\n  // Core types\n  AssetType,\n\n  // Cache operation types\n  CacheOptions,\n  CacheEntry,\n  CacheResult,\n  AssetMetadata,\n  CacheManifest,\n\n  // Service worker types\n  ServiceWorkerMessageType,\n\n  // Asset loader configuration\n  AssetLoaderConfig,\n} from \"./types\";\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\nexport { mergeAssetCacheConfig, validateAssetCacheConfig } from \"./config\";\n\nexport { getDefaultAssetCacheConfig } from \"./defaults\";\n","/**\n * Service worker registration\n *\n * This module:\n * - Registers the service worker\n * - Handles service worker updates\n * - Provides methods to communicate with the service worker\n */\nimport { DEFAULT_SW_SCOPE } from \"../config\";\nimport { ServiceWorkerMessageType } from \"../config/types\";\nimport { debugLog } from \"../utils/cache-helpers\";\n\n/**\n * Options for service worker registration\n */\ninterface RegisterOptions {\n  scope?: string;\n  updateViaCache?: ServiceWorkerUpdateViaCache;\n  immediate?: boolean;\n  onSuccess?: () => void;\n  onError?: (error: Error) => void;\n  onUpdate?: (registration: ServiceWorkerRegistration) => void;\n}\n\n/**\n * Register the service worker\n * @param swPath Path to the service worker file\n * @param options Registration options\n * @returns Promise resolving to the service worker registration\n */\nexport async function registerServiceWorker(\n  swPath: string = \"/service-worker.js\",\n  options: RegisterOptions = {}\n): Promise<ServiceWorkerRegistration | null> {\n  // Check if service workers are supported\n  if (!(\"serviceWorker\" in navigator)) {\n    debugLog(\"Service workers are not supported in this browser\");\n    return null;\n  }\n\n  try {\n    // Register the service worker\n    const registration = await navigator.serviceWorker.register(swPath, {\n      scope: options.scope || DEFAULT_SW_SCOPE,\n      updateViaCache: options.updateViaCache || \"none\",\n    });\n\n    debugLog(\"Service worker registered:\", registration);\n\n    // Call success callback if provided\n    if (options.onSuccess) {\n      options.onSuccess();\n    }\n\n    // Handle updates\n    if (options.immediate) {\n      await forceUpdate(registration);\n    }\n\n    // Set up update detection\n    setupUpdateDetection(registration, options.onUpdate);\n\n    return registration;\n  } catch (error) {\n    debugLog(\"Service worker registration failed:\", error);\n\n    // Call error callback if provided\n    if (options.onError && error instanceof Error) {\n      options.onError(error);\n    }\n\n    return null;\n  }\n}\n\n/**\n * Force update of the service worker\n * @param registration Service worker registration\n */\nexport async function forceUpdate(\n  registration: ServiceWorkerRegistration\n): Promise<void> {\n  try {\n    await registration.update();\n    debugLog(\"Service worker updated\");\n\n    if (registration.waiting) {\n      // If there's a waiting service worker, activate it\n      debugLog(\"New service worker waiting, activating...\");\n      registration.waiting.postMessage({ type: \"SKIP_WAITING\" });\n    }\n  } catch (error) {\n    debugLog(\"Service worker update failed:\", error);\n  }\n}\n\n/**\n * Set up detection for service worker updates\n * @param registration Service worker registration\n * @param callback Callback to call when an update is available\n */\nfunction setupUpdateDetection(\n  registration: ServiceWorkerRegistration,\n  callback?: (registration: ServiceWorkerRegistration) => void\n): void {\n  // Check for updates on page load\n  if (registration.waiting) {\n    debugLog(\"New service worker waiting\");\n    if (callback) {\n      callback(registration);\n    }\n    return;\n  }\n\n  // Listen for new installing workers\n  const handleUpdate = () => {\n    if (registration.installing) {\n      // Track progress\n      registration.installing.addEventListener(\"statechange\", () => {\n        if (registration.waiting) {\n          debugLog(\"New service worker installed and waiting\");\n          if (callback) {\n            callback(registration);\n          }\n        }\n      });\n    }\n  };\n\n  // Initial check\n  handleUpdate();\n\n  // Listen for future updates\n  registration.addEventListener(\"updatefound\", handleUpdate);\n}\n\n/**\n * Send a message to the service worker\n * @param type Message type\n * @param payload Message payload\n * @returns Promise resolving to the response\n */\nexport async function sendMessageToSW<T = any>(\n  type: ServiceWorkerMessageType,\n  payload?: any\n): Promise<T | null> {\n  if (!(\"serviceWorker\" in navigator) || !navigator.serviceWorker.controller) {\n    debugLog(\"No active service worker found\");\n    return null;\n  }\n\n  try {\n    // Create a message channel for the response\n    const messageChannel = new MessageChannel();\n\n    // Create a promise that will resolve with the response\n    const responsePromise = new Promise<T>((resolve) => {\n      messageChannel.port1.onmessage = (event) => {\n        resolve(event.data);\n      };\n    });\n\n    // Send the message\n    navigator.serviceWorker.controller.postMessage({ type, payload }, [\n      messageChannel.port2,\n    ]);\n\n    // Wait for the response with a timeout\n    const timeoutPromise = new Promise<null>((resolve) => {\n      setTimeout(() => resolve(null), 3000);\n    });\n\n    return Promise.race([responsePromise, timeoutPromise]);\n  } catch (error) {\n    debugLog(\"Error sending message to service worker:\", error);\n    return null;\n  }\n}\n\n/**\n * Check if the service worker is active\n * @returns Whether the service worker is active\n */\nexport function isServiceWorkerActive(): boolean {\n  return !!(\"serviceWorker\" in navigator && navigator.serviceWorker.controller);\n}\n\n/**\n * Unregister all service workers\n * @returns Promise resolving when all service workers are unregistered\n */\nexport async function unregisterAllServiceWorkers(): Promise<void> {\n  if (!(\"serviceWorker\" in navigator)) {\n    return;\n  }\n\n  try {\n    const registrations = await navigator.serviceWorker.getRegistrations();\n\n    await Promise.all(\n      registrations.map(async (registration) => {\n        const result = await registration.unregister();\n        debugLog(`Service worker unregistered:`, result ? \"success\" : \"failed\");\n      })\n    );\n  } catch (error) {\n    debugLog(\"Error unregistering service workers:\", error);\n  }\n}\n","/**\n * Asset Cache Error Types\n *\n * Provides typed error handling for all cache operations.\n * Each error type corresponds to a specific failure mode in the caching system.\n */\n\n/**\n * Error codes for cache operations\n */\nexport enum CacheErrorCode {\n  // Initialization errors\n  CACHE_API_NOT_SUPPORTED = \"CACHE_API_NOT_SUPPORTED\",\n  CACHE_NOT_INITIALIZED = \"CACHE_NOT_INITIALIZED\",\n  CACHE_OPEN_FAILED = \"CACHE_OPEN_FAILED\",\n\n  // Manifest errors\n  MANIFEST_NOT_FOUND = \"MANIFEST_NOT_FOUND\",\n  MANIFEST_PARSE_ERROR = \"MANIFEST_PARSE_ERROR\",\n  MANIFEST_SAVE_FAILED = \"MANIFEST_SAVE_FAILED\",\n\n  // Asset errors\n  ASSET_NOT_CACHED = \"ASSET_NOT_CACHED\",\n  ASSET_EXPIRED = \"ASSET_EXPIRED\",\n  ASSET_FETCH_FAILED = \"ASSET_FETCH_FAILED\",\n  ASSET_TOO_LARGE = \"ASSET_TOO_LARGE\",\n  ASSET_INVALID_RESPONSE = \"ASSET_INVALID_RESPONSE\",\n\n  // Service Worker errors\n  SERVICE_WORKER_NOT_SUPPORTED = \"SERVICE_WORKER_NOT_SUPPORTED\",\n  SERVICE_WORKER_REGISTRATION_FAILED = \"SERVICE_WORKER_REGISTRATION_FAILED\",\n  SERVICE_WORKER_COMMUNICATION_FAILED = \"SERVICE_WORKER_COMMUNICATION_FAILED\",\n\n  // Storage errors\n  STORAGE_QUOTA_EXCEEDED = \"STORAGE_QUOTA_EXCEEDED\",\n  STORAGE_ACCESS_DENIED = \"STORAGE_ACCESS_DENIED\",\n\n  // Generic errors\n  UNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\n/**\n * Base class for all cache-related errors\n */\nexport class CacheError extends Error {\n  public readonly code: CacheErrorCode;\n  public readonly recoverable: boolean;\n  public readonly details?: Record<string, unknown>;\n  public readonly originalCause?: Error;\n\n  constructor(\n    code: CacheErrorCode,\n    message: string,\n    options?: {\n      recoverable?: boolean;\n      details?: Record<string, unknown>;\n      cause?: Error;\n    }\n  ) {\n    super(message);\n    this.name = \"CacheError\";\n    this.code = code;\n    this.recoverable = options?.recoverable ?? false;\n    this.details = options?.details;\n    this.originalCause = options?.cause;\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, CacheError);\n    }\n  }\n\n  /**\n   * Convert error to JSON for logging/serialization\n   */\n  toJSON(): Record<string, unknown> {\n    return {\n      name: this.name,\n      code: this.code,\n      message: this.message,\n      recoverable: this.recoverable,\n      details: this.details,\n      stack: this.stack,\n    };\n  }\n}\n\n// ============================================================================\n// INITIALIZATION ERRORS\n// ============================================================================\n\n/**\n * Error thrown when Cache API is not supported in the browser\n */\nexport class CacheAPINotSupportedError extends CacheError {\n  constructor() {\n    super(\n      CacheErrorCode.CACHE_API_NOT_SUPPORTED,\n      \"Cache API is not supported in this browser. Asset caching will be disabled.\",\n      { recoverable: false }\n    );\n    this.name = \"CacheAPINotSupportedError\";\n  }\n}\n\n/**\n * Error thrown when cache operations are attempted before initialization\n */\nexport class CacheNotInitializedError extends CacheError {\n  constructor(operation?: string) {\n    super(\n      CacheErrorCode.CACHE_NOT_INITIALIZED,\n      `Cache is not initialized${operation ? `. Cannot perform: ${operation}` : \"\"}. Call init() first.`,\n      { recoverable: true, details: { operation } }\n    );\n    this.name = \"CacheNotInitializedError\";\n  }\n}\n\n/**\n * Error thrown when opening the cache fails\n */\nexport class CacheOpenFailedError extends CacheError {\n  constructor(cacheName: string, cause?: Error) {\n    super(\n      CacheErrorCode.CACHE_OPEN_FAILED,\n      `Failed to open cache: ${cacheName}`,\n      { recoverable: true, details: { cacheName }, cause }\n    );\n    this.name = \"CacheOpenFailedError\";\n  }\n}\n\n// ============================================================================\n// MANIFEST ERRORS\n// ============================================================================\n\n/**\n * Error thrown when manifest is not found in cache\n */\nexport class ManifestNotFoundError extends CacheError {\n  constructor() {\n    super(\n      CacheErrorCode.MANIFEST_NOT_FOUND,\n      \"Cache manifest not found. A new manifest will be created.\",\n      { recoverable: true }\n    );\n    this.name = \"ManifestNotFoundError\";\n  }\n}\n\n/**\n * Error thrown when manifest JSON parsing fails\n */\nexport class ManifestParseError extends CacheError {\n  constructor(cause?: Error) {\n    super(\n      CacheErrorCode.MANIFEST_PARSE_ERROR,\n      \"Failed to parse cache manifest. A new manifest will be created.\",\n      { recoverable: true, cause }\n    );\n    this.name = \"ManifestParseError\";\n  }\n}\n\n/**\n * Error thrown when saving manifest fails\n */\nexport class ManifestSaveFailedError extends CacheError {\n  constructor(cause?: Error) {\n    super(\n      CacheErrorCode.MANIFEST_SAVE_FAILED,\n      \"Failed to save cache manifest. Changes may not persist.\",\n      { recoverable: true, cause }\n    );\n    this.name = \"ManifestSaveFailedError\";\n  }\n}\n\n// ============================================================================\n// ASSET ERRORS\n// ============================================================================\n\n/**\n * Error thrown when requested asset is not in cache\n */\nexport class AssetNotCachedError extends CacheError {\n  constructor(url: string) {\n    super(\n      CacheErrorCode.ASSET_NOT_CACHED,\n      `Asset not found in cache: ${url}`,\n      { recoverable: true, details: { url } }\n    );\n    this.name = \"AssetNotCachedError\";\n  }\n}\n\n/**\n * Error thrown when cached asset has expired\n */\nexport class AssetExpiredError extends CacheError {\n  constructor(url: string, expiredAt: Date) {\n    super(CacheErrorCode.ASSET_EXPIRED, `Cached asset has expired: ${url}`, {\n      recoverable: true,\n      details: { url, expiredAt: expiredAt.toISOString() },\n    });\n    this.name = \"AssetExpiredError\";\n  }\n}\n\n/**\n * Error thrown when fetching asset from network fails\n */\nexport class AssetFetchFailedError extends CacheError {\n  constructor(url: string, status?: number, statusText?: string, cause?: Error) {\n    super(\n      CacheErrorCode.ASSET_FETCH_FAILED,\n      `Failed to fetch asset: ${url}${status ? ` (${status} ${statusText || \"\"})` : \"\"}`,\n      { recoverable: true, details: { url, status, statusText }, cause }\n    );\n    this.name = \"AssetFetchFailedError\";\n  }\n}\n\n/**\n * Error thrown when asset exceeds maximum cacheable size\n */\nexport class AssetTooLargeError extends CacheError {\n  constructor(url: string, size: number, maxSize: number) {\n    super(\n      CacheErrorCode.ASSET_TOO_LARGE,\n      `Asset too large to cache: ${url} (${formatBytes(size)} > ${formatBytes(maxSize)})`,\n      { recoverable: false, details: { url, size, maxSize } }\n    );\n    this.name = \"AssetTooLargeError\";\n  }\n}\n\n/**\n * Error thrown when response is invalid (status >= 400)\n */\nexport class AssetInvalidResponseError extends CacheError {\n  constructor(url: string, status: number, statusText: string) {\n    super(\n      CacheErrorCode.ASSET_INVALID_RESPONSE,\n      `Invalid response for asset: ${url} (${status} ${statusText})`,\n      { recoverable: true, details: { url, status, statusText } }\n    );\n    this.name = \"AssetInvalidResponseError\";\n  }\n}\n\n// ============================================================================\n// SERVICE WORKER ERRORS\n// ============================================================================\n\n/**\n * Error thrown when Service Worker API is not supported\n */\nexport class ServiceWorkerNotSupportedError extends CacheError {\n  constructor() {\n    super(\n      CacheErrorCode.SERVICE_WORKER_NOT_SUPPORTED,\n      \"Service Worker is not supported in this browser.\",\n      { recoverable: false }\n    );\n    this.name = \"ServiceWorkerNotSupportedError\";\n  }\n}\n\n/**\n * Error thrown when Service Worker registration fails\n */\nexport class ServiceWorkerRegistrationFailedError extends CacheError {\n  constructor(path: string, cause?: Error) {\n    super(\n      CacheErrorCode.SERVICE_WORKER_REGISTRATION_FAILED,\n      `Failed to register service worker: ${path}`,\n      { recoverable: true, details: { path }, cause }\n    );\n    this.name = \"ServiceWorkerRegistrationFailedError\";\n  }\n}\n\n/**\n * Error thrown when communication with Service Worker fails\n */\nexport class ServiceWorkerCommunicationFailedError extends CacheError {\n  constructor(messageType: string, cause?: Error) {\n    super(\n      CacheErrorCode.SERVICE_WORKER_COMMUNICATION_FAILED,\n      `Failed to communicate with service worker: ${messageType}`,\n      { recoverable: true, details: { messageType }, cause }\n    );\n    this.name = \"ServiceWorkerCommunicationFailedError\";\n  }\n}\n\n// ============================================================================\n// STORAGE ERRORS\n// ============================================================================\n\n/**\n * Error thrown when storage quota is exceeded\n */\nexport class StorageQuotaExceededError extends CacheError {\n  constructor(cause?: Error) {\n    super(\n      CacheErrorCode.STORAGE_QUOTA_EXCEEDED,\n      \"Storage quota exceeded. Consider clearing old cache entries.\",\n      { recoverable: true, cause }\n    );\n    this.name = \"StorageQuotaExceededError\";\n  }\n}\n\n/**\n * Error thrown when storage access is denied\n */\nexport class StorageAccessDeniedError extends CacheError {\n  constructor(cause?: Error) {\n    super(\n      CacheErrorCode.STORAGE_ACCESS_DENIED,\n      \"Storage access denied. This may happen in private/incognito mode.\",\n      { recoverable: false, cause }\n    );\n    this.name = \"StorageAccessDeniedError\";\n  }\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n  if (bytes === 0) return \"0 B\";\n  const k = 1024;\n  const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n\n/**\n * Check if an error is a storage quota exceeded error\n */\nexport function isQuotaExceededError(error: unknown): boolean {\n  if (error instanceof DOMException) {\n    // Different browsers use different names\n    return (\n      error.name === \"QuotaExceededError\" ||\n      error.name === \"NS_ERROR_DOM_QUOTA_REACHED\"\n    );\n  }\n  return false;\n}\n\n/**\n * Check if an error is a storage access denied error\n */\nexport function isStorageAccessDeniedError(error: unknown): boolean {\n  if (error instanceof DOMException) {\n    return (\n      error.name === \"SecurityError\" ||\n      error.name === \"InvalidAccessError\" ||\n      error.name === \"NotAllowedError\"\n    );\n  }\n  return false;\n}\n\n/**\n * Wrap an unknown error in a CacheError\n */\nexport function wrapError(error: unknown, context?: string): CacheError {\n  if (error instanceof CacheError) {\n    return error;\n  }\n\n  if (isQuotaExceededError(error)) {\n    return new StorageQuotaExceededError(error as Error);\n  }\n\n  if (isStorageAccessDeniedError(error)) {\n    return new StorageAccessDeniedError(error as Error);\n  }\n\n  const message = error instanceof Error ? error.message : String(error);\n  return new CacheError(\n    CacheErrorCode.UNKNOWN_ERROR,\n    context ? `${context}: ${message}` : message,\n    {\n      recoverable: true,\n      cause: error instanceof Error ? error : undefined,\n    }\n  );\n}\n","/**\n * Version manager module\n *\n * This module:\n * - Handles asset versioning\n * - Manages cache invalidation based on versions\n * - Provides utilities for working with versioned assets\n */\nimport { CacheManifest } from \"../config/types\";\nimport { CACHE_MANIFEST_PATH } from \"../config/constants\";\nimport { debugLog } from \"../utils/cache-helpers\";\nimport {\n  addVersionToUrl,\n  extractVersionFromUrl,\n  generateSimpleHash,\n} from \"../utils/hash-generator\";\nimport { CacheManager } from \"./cache-manager\";\n\n/**\n * Version manager class\n */\nexport class VersionManager {\n  private static deploymentId: string = \"\";\n\n  /**\n   * Initialize the version manager\n   * @param deploymentId Optional deployment ID for versioning\n   */\n  static init(deploymentId?: string): void {\n    // Generate a deployment ID if not provided\n    this.deploymentId = deploymentId || this.generateDeploymentId();\n    debugLog(\n      \"Version manager initialized with deployment ID:\",\n      this.deploymentId\n    );\n  }\n\n  /**\n   * Generate a deployment ID\n   * @returns Deployment ID\n   */\n  private static generateDeploymentId(): string {\n    // Use the current timestamp as a simple deployment ID\n    return Date.now().toString(36);\n  }\n\n  /**\n   * Get the current deployment ID\n   * @returns Deployment ID\n   */\n  static getDeploymentId(): string {\n    return this.deploymentId;\n  }\n\n  /**\n   * Create a versioned URL for an asset\n   * @param url URL of the asset\n   * @param version Optional version string (defaults to deployment ID)\n   * @returns Versioned URL\n   */\n  static createVersionedUrl(url: string, version?: string): string {\n    const versionToUse = version || this.deploymentId;\n    return addVersionToUrl(url, versionToUse);\n  }\n\n  /**\n   * Check if an asset needs to be updated\n   * @param url URL of the asset\n   * @param version Current version of the asset\n   * @returns Whether the asset needs to be updated\n   */\n  static async needsUpdate(url: string, version: string): Promise<boolean> {\n    // Get the asset metadata from the cache manifest\n    const metadata = await CacheManager.getAssetMetadata(url);\n\n    if (!metadata) {\n      // Asset not in cache, needs update\n      return true;\n    }\n\n    // Compare versions\n    return metadata.version !== version;\n  }\n\n  /**\n   * Update the version of an asset in the cache manifest\n   * @param url URL of the asset\n   * @param version New version of the asset\n   */\n  static async updateVersion(url: string, version: string): Promise<void> {\n    // Get the asset metadata from the cache manifest\n    const metadata = await CacheManager.getAssetMetadata(url);\n\n    if (metadata) {\n      // Update the version\n      metadata.version = version;\n      metadata.lastModified = new Date().toISOString();\n\n      // Update the manifest\n      await CacheManager.addToManifest(url, metadata);\n    }\n  }\n\n  /**\n   * Generate a content-based version for an asset\n   * @param content Asset content\n   * @returns Content hash\n   */\n  static async generateContentVersion(content: Blob | string): Promise<string> {\n    if (typeof content === \"string\") {\n      return generateSimpleHash(content);\n    } else {\n      return await this.generateContentHash(content);\n    }\n  }\n\n  /**\n   * Generate a content hash from a Blob\n   * @param content Blob to hash\n   * @returns Content hash\n   */\n  private static async generateContentHash(content: Blob): Promise<string> {\n    // Use the Web Crypto API if available\n    if (typeof crypto !== \"undefined\" && crypto.subtle) {\n      try {\n        const buffer = await content.arrayBuffer();\n        const hashBuffer = await crypto.subtle.digest(\"SHA-256\", buffer);\n        const hashArray = Array.from(new Uint8Array(hashBuffer));\n        const hashHex = hashArray\n          .map((b) => b.toString(16).padStart(2, \"0\"))\n          .join(\"\");\n        return hashHex.slice(0, 8); // Use first 8 characters for brevity\n      } catch (error) {\n        // Fall back to simple hash\n        return this.generateSimpleHashFromBlob(content);\n      }\n    }\n\n    // Fall back to simple hash if Web Crypto API is not available\n    return this.generateSimpleHashFromBlob(content);\n  }\n\n  /**\n   * Generate a simple hash from a Blob\n   * @param content Blob to hash\n   * @returns Simple hash\n   */\n  private static async generateSimpleHashFromBlob(\n    content: Blob\n  ): Promise<string> {\n    return new Promise((resolve) => {\n      const reader = new FileReader();\n      reader.onload = () => {\n        const result = reader.result as string;\n        resolve(generateSimpleHash(result).slice(0, 8));\n      };\n      reader.readAsText(content);\n    });\n  }\n\n  /**\n   * Check if a URL has a version parameter\n   * @param url URL to check\n   * @returns Whether the URL has a version parameter\n   */\n  static hasVersion(url: string): boolean {\n    return extractVersionFromUrl(url) !== null;\n  }\n\n  /**\n   * Extract the version from a URL\n   * @param url URL to extract version from\n   * @returns Version string or null if not found\n   */\n  static getVersionFromUrl(url: string): string | null {\n    return extractVersionFromUrl(url);\n  }\n\n  /**\n   * Invalidate all assets from a previous deployment\n   * @param previousDeploymentId Previous deployment ID\n   */\n  static async invalidatePreviousDeployment(\n    previousDeploymentId: string\n  ): Promise<void> {\n    try {\n      // Get all assets from the cache manifest\n      const manifest = await this.getManifest();\n\n      if (!manifest) {\n        return;\n      }\n\n      // Find assets with the previous deployment ID\n      const assetsToInvalidate = Object.values(manifest.assets).filter(\n        (asset) => asset.version.startsWith(previousDeploymentId)\n      );\n\n      // Invalidate each asset\n      for (const asset of assetsToInvalidate) {\n        await CacheManager.removeFromManifest(asset.url);\n      }\n\n      debugLog(\n        `Invalidated ${assetsToInvalidate.length} assets from previous deployment`\n      );\n    } catch (error) {\n      debugLog(\"Failed to invalidate previous deployment:\", error);\n    }\n  }\n\n  /**\n   * Get the cache manifest\n   * @returns Cache manifest or null if not available\n   */\n  private static async getManifest(): Promise<CacheManifest | null> {\n    try {\n      // Try to get the manifest from the cache\n      const cache = await caches.open(\"asset-cache-v1\");\n      const manifestResponse = await cache.match(CACHE_MANIFEST_PATH);\n\n      if (manifestResponse) {\n        return await manifestResponse.json();\n      }\n\n      return null;\n    } catch (error) {\n      debugLog(\"Failed to get manifest:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Compare two versions\n   * @param version1 First version\n   * @param version2 Second version\n   * @returns -1 if version1 < version2, 0 if equal, 1 if version1 > version2\n   */\n  static compareVersions(version1: string, version2: string): number {\n    // If versions are timestamps in base36, convert to numbers\n    if (/^[0-9a-z]+$/.test(version1) && /^[0-9a-z]+$/.test(version2)) {\n      const num1 = parseInt(version1, 36);\n      const num2 = parseInt(version2, 36);\n\n      if (!isNaN(num1) && !isNaN(num2)) {\n        return num1 - num2;\n      }\n    }\n\n    // Otherwise, compare as strings\n    return version1.localeCompare(version2);\n  }\n}\n","\"use client\";\n\n/**\n * Next.js asset preloading hooks for the asset caching module\n */\nimport { useEffect } from \"react\";\nimport { AssetLoader } from \"../../core/asset-loader\";\nimport type { CacheOptions } from \"../../config/types\";\n\n/**\n * Hook to preload assets on page load\n * @param urls URLs of assets to preload\n * @param options Caching options\n */\nexport function useBasePreloadAssets(\n  urls: string[],\n  options?: CacheOptions\n): void {\n  useEffect(() => {\n    // Preload assets in the background\n    urls.forEach((url) => {\n      AssetLoader.preload(url, options).catch(() => {\n        // Ignore preloading errors\n      });\n    });\n  }, [urls, options]);\n}\n"]}