{"version":3,"sources":["../../src/config/constants.ts","../../src/utils/cache-helpers.ts"],"names":[],"mappings":"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","file":"index.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 * 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"]}