{"version":3,"sources":["../../../src/server/image-optimizer.ts"],"sourcesContent":["import { createHash } from 'crypto'\nimport { promises } from 'fs'\nimport type { IncomingMessage, ServerResponse } from 'http'\nimport { mediaType } from 'next/dist/compiled/@hapi/accept'\nimport contentDisposition from 'next/dist/compiled/content-disposition'\nimport imageSizeOf from 'next/dist/compiled/image-size'\nimport { detector } from 'next/dist/compiled/image-detector/detector.js'\nimport isAnimated from 'next/dist/compiled/is-animated'\nimport { join } from 'path'\nimport { getImageBlurSvg } from '../shared/lib/image-blur-svg'\nimport type { ImageConfigComplete } from '../shared/lib/image-config'\nimport { hasLocalMatch } from '../shared/lib/match-local-pattern'\nimport { hasRemoteMatch } from '../shared/lib/match-remote-pattern'\nimport type { NextConfigComplete, NextConfigRuntime } from './config-shared'\nimport { createRequestResponseMocks } from './lib/mock-request'\nimport type { NextUrlWithParsedQuery } from './request-meta'\nimport {\n  CachedRouteKind,\n  IncrementalCacheKind,\n  type CachedImageValue,\n  type IncrementalCacheEntry,\n  type IncrementalCacheValue,\n  type IncrementalResponseCacheEntry,\n} from './response-cache'\nimport type { CacheHandler } from './lib/incremental-cache'\nimport { sendEtagResponse } from './send-payload'\nimport { getContentType, getExtension } from './serve-static'\nimport * as Log from '../build/output/log'\nimport isError from '../lib/is-error'\nimport { isPrivateIp } from './is-private-ip'\nimport { getOrInitDiskLRU } from './lib/disk-lru-cache.external'\nimport { parseUrl, parseReqUrl } from '../lib/url'\nimport type { CacheControl } from './lib/cache-control'\nimport { InvariantError } from '../shared/lib/invariant-error'\nimport { lookup } from 'dns/promises'\nimport { isIP } from 'net'\nimport { ALL } from 'dns'\n\ntype XCacheHeader = 'MISS' | 'HIT' | 'STALE'\n\nconst AVIF = 'image/avif'\nconst WEBP = 'image/webp'\nconst PNG = 'image/png'\nconst JPEG = 'image/jpeg'\nconst JXL = 'image/jxl'\nconst JP2 = 'image/jp2'\nconst HEIC = 'image/heic'\nconst GIF = 'image/gif'\nconst SVG = 'image/svg+xml'\nconst ICO = 'image/x-icon'\nconst ICNS = 'image/x-icns'\nconst TIFF = 'image/tiff'\nconst BMP = 'image/bmp'\nconst PDF = 'application/pdf'\nconst CACHE_VERSION = 4\nconst ANIMATABLE_TYPES = [WEBP, PNG, GIF]\nconst BYPASS_TYPES = [SVG, ICO, ICNS, BMP, JXL, HEIC]\nconst BLUR_IMG_SIZE = 8 // should match `next-image-loader`\nconst BLUR_QUALITY = 70 // should match `next-image-loader`\n\nlet _sharp: typeof import('sharp').default\n\nasync function initCacheEntries(\n  cacheDir: string\n): Promise<Array<{ key: string; size: number; expireAt: number }>> {\n  const cacheKeys = await promises.readdir(cacheDir).catch(() => [])\n  const entries: Array<{ key: string; size: number; expireAt: number }> = []\n\n  for (const cacheKey of cacheKeys) {\n    try {\n      const { expireAt, buffer } = await readFromCacheDir(cacheDir, cacheKey)\n      entries.push({\n        key: cacheKey,\n        size: buffer.byteLength,\n        expireAt,\n      })\n    } catch {\n      // Skip entries that can't be read from disk\n    }\n  }\n\n  // Sort oldest-first so we can replay them chronologically into LRU\n  return entries.sort((a, b) => a.expireAt - b.expireAt)\n}\n\nexport function getSharp(\n  concurrency: number | null | undefined,\n  operationCache: boolean | null | undefined\n) {\n  if (_sharp) {\n    return _sharp\n  }\n  try {\n    _sharp = require('sharp') as typeof import('sharp').default\n    _sharp.block({ operation: ['VipsForeignLoad'] })\n    _sharp.unblock({\n      operation: [\n        'VipsForeignLoadHeif', // avif\n        'VipsForeignLoadJpeg',\n        'VipsForeignLoadNsgif',\n        'VipsForeignLoadPng',\n        'VipsForeignLoadSvg',\n        'VipsForeignLoadTiff',\n        'VipsForeignLoadWebp',\n      ],\n    })\n    if (typeof operationCache === 'boolean') {\n      _sharp.cache(operationCache)\n    }\n    if (_sharp.concurrency() > 1) {\n      // Reducing concurrency should reduce the memory usage too.\n      // We more aggressively reduce in dev but also reduce in prod.\n      // https://sharp.pixelplumbing.com/api-utility#concurrency\n      const divisor = process.env.NODE_ENV === 'development' ? 4 : 2\n      _sharp.concurrency(\n        concurrency ?? Math.floor(Math.max(_sharp.concurrency() / divisor, 1))\n      )\n    }\n  } catch (e: unknown) {\n    if (isError(e) && e.code === 'MODULE_NOT_FOUND') {\n      throw new Error(\n        'Module `sharp` not found. Please run `npm install --cpu=wasm32 sharp` to install it.'\n      )\n    }\n    throw e\n  }\n  return _sharp\n}\n\nexport interface ImageParamsResult {\n  href: string\n  isAbsolute: boolean\n  isStatic: boolean\n  width: number\n  quality: number\n  mimeType: string\n  sizes: number[]\n  minimumCacheTTL: number\n}\n\ninterface ImageUpstream {\n  buffer: Buffer\n  contentType: string | null | undefined\n  cacheControl: string | null | undefined\n  etag: string\n}\n\nfunction getSupportedMimeType(options: string[], accept = ''): string {\n  const mimeType = mediaType(accept, options)\n  return accept.includes(mimeType) ? mimeType : ''\n}\n\nexport function getHash(items: (string | number | Buffer)[]) {\n  const hash = createHash('sha256')\n  for (let item of items) {\n    if (typeof item === 'number') hash.update(String(item))\n    else {\n      hash.update(item)\n    }\n  }\n  // See https://en.wikipedia.org/wiki/Base64#URL_applications\n  return hash.digest('base64url')\n}\n\nexport function extractEtag(\n  etag: string | null | undefined,\n  imageBuffer: Buffer\n) {\n  if (etag) {\n    // upstream etag needs to be base64url encoded due to weak etag signature\n    // as we store this in the cache-entry file name.\n    return Buffer.from(etag).toString('base64url')\n  }\n  return getImageEtag(imageBuffer)\n}\n\nexport function getImageEtag(image: Buffer) {\n  return getHash([image])\n}\n\nasync function writeToCacheDir(\n  cacheDir: string,\n  cacheKey: string,\n  extension: string,\n  maxAge: number,\n  expireAt: number,\n  buffer: Buffer,\n  etag: string,\n  upstreamEtag: string\n) {\n  if (buffer.byteLength === 0) {\n    throw new Error(\n      'Invariant: cannot write an empty buffer to the image cache'\n    )\n  }\n\n  const dir = join(/* turbopackIgnore: true */ cacheDir, cacheKey)\n  const filename = join(\n    /* turbopackIgnore: true */\n    dir,\n    `${maxAge}.${expireAt}.${etag}.${upstreamEtag}.${extension}`\n  )\n\n  await promises.rm(dir, { recursive: true, force: true }).catch(() => {})\n\n  await promises.mkdir(dir, { recursive: true })\n  await promises.writeFile(filename, buffer)\n}\n\nasync function readFromCacheDir(cacheDir: string, cacheKey: string) {\n  const dir = join(/* turbopackIgnore: true */ cacheDir, cacheKey)\n  const files = await promises.readdir(dir)\n  const file = files[0]\n  if (!file) {\n    throw new Error(\n      `Invariant: cache entry \"${cacheKey}\" not found in dir \"${cacheDir}\"`\n    )\n  }\n  const [maxAgeSt, expireAtSt, etag, upstreamEtag, extension] = file.split(\n    '.',\n    5\n  )\n  const filePath = join(/* turbopackIgnore: true */ dir, file)\n  const buffer = await promises.readFile(/* turbopackIgnore: true */ filePath)\n  if (buffer.byteLength === 0) {\n    throw new Error(`Invariant: image cache entry \"${cacheKey}\" is empty`)\n  }\n  const expireAt = Number(expireAtSt)\n  const maxAge = Number(maxAgeSt)\n  return { maxAge, expireAt, etag, upstreamEtag, buffer, extension }\n}\n\nasync function deleteFromCacheDir(cacheDir: string, cacheKey: string) {\n  return promises\n    .rm(join(/* turbopackIgnore: true */ cacheDir, cacheKey), {\n      recursive: true,\n      force: true,\n    })\n    .catch((err) => {\n      Log.error(`Failed to delete cache key ${cacheKey}`, err)\n    })\n}\n\n/**\n * Inspects the first few bytes of a buffer to determine if\n * it matches the \"magic number\" of known file signatures.\n * https://en.wikipedia.org/wiki/List_of_file_signatures\n */\nexport async function detectContentType(\n  buffer: Buffer\n): Promise<string | null> {\n  if (buffer.byteLength === 0) {\n    return null\n  }\n  if ([0xff, 0xd8, 0xff].every((b, i) => buffer[i] === b)) {\n    return JPEG\n  }\n  if (\n    [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].every(\n      (b, i) => buffer[i] === b\n    )\n  ) {\n    return PNG\n  }\n  if ([0x47, 0x49, 0x46, 0x38].every((b, i) => buffer[i] === b)) {\n    return GIF\n  }\n  if (\n    [0x52, 0x49, 0x46, 0x46, 0, 0, 0, 0, 0x57, 0x45, 0x42, 0x50].every(\n      (b, i) => !b || buffer[i] === b\n    )\n  ) {\n    return WEBP\n  }\n  if ([0x3c, 0x3f, 0x78, 0x6d, 0x6c].every((b, i) => buffer[i] === b)) {\n    return SVG\n  }\n  if ([0x3c, 0x73, 0x76, 0x67].every((b, i) => buffer[i] === b)) {\n    return SVG\n  }\n  if (\n    [0, 0, 0, 0, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66].every(\n      (b, i) => !b || buffer[i] === b\n    )\n  ) {\n    return AVIF\n  }\n  if ([0x00, 0x00, 0x01, 0x00].every((b, i) => buffer[i] === b)) {\n    return ICO\n  }\n  if ([0x69, 0x63, 0x6e, 0x73].every((b, i) => buffer[i] === b)) {\n    return ICNS\n  }\n  if ([0x49, 0x49, 0x2a, 0x00].every((b, i) => buffer[i] === b)) {\n    return TIFF\n  }\n  if ([0x42, 0x4d].every((b, i) => buffer[i] === b)) {\n    return BMP\n  }\n  if ([0xff, 0x0a].every((b, i) => buffer[i] === b)) {\n    return JXL\n  }\n  if (\n    [\n      0x00, 0x00, 0x00, 0x0c, 0x4a, 0x58, 0x4c, 0x20, 0x0d, 0x0a, 0x87, 0x0a,\n    ].every((b, i) => buffer[i] === b)\n  ) {\n    return JXL\n  }\n  if (\n    [0, 0, 0, 0, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63].every(\n      (b, i) => !b || buffer[i] === b\n    )\n  ) {\n    return HEIC\n  }\n  if ([0x25, 0x50, 0x44, 0x46, 0x2d].every((b, i) => buffer[i] === b)) {\n    return PDF\n  }\n  if (\n    [\n      0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a,\n    ].every((b, i) => buffer[i] === b)\n  ) {\n    return JP2\n  }\n\n  const format = detector(buffer.subarray(0, 1024))\n\n  switch (format) {\n    case 'webp':\n      return WEBP\n    case 'png':\n      return PNG\n    case 'jpg':\n      return JPEG\n    case 'gif':\n      return GIF\n    case 'svg':\n      return SVG\n    case 'jxl':\n    case 'jxl-stream':\n      return JXL\n    case 'jp2':\n      return JP2\n    case 'tiff':\n      return TIFF\n    case 'bmp':\n      return BMP\n    case 'ico':\n      return ICO\n    case 'icns':\n      return ICNS\n    case 'heif':\n    case 'cur':\n    case 'dds':\n    case 'j2c':\n    case 'ktx':\n    case 'pnm':\n    case 'psd':\n    case 'tga':\n    case undefined:\n      return null // unsupported formats\n    default:\n      format satisfies never // exhaustive check\n      return null // impossible to reach\n  }\n}\n\nexport class ImageOptimizerCache {\n  private cacheDir: string\n  private nextConfig: NextConfigRuntime\n  private cacheHandler?: CacheHandler\n  private cacheDiskLRU?: ReturnType<typeof getOrInitDiskLRU>\n  private isDiskCacheEnabled?: boolean\n\n  static validateParams(\n    req: IncomingMessage,\n    query: NextUrlWithParsedQuery['query'],\n    nextConfig: NextConfigRuntime,\n    isDev: boolean\n  ): ImageParamsResult | { errorMessage: string } {\n    const imageData = nextConfig.images\n    const {\n      deviceSizes = [],\n      imageSizes = [],\n      domains = [],\n      minimumCacheTTL = 14400,\n      formats = ['image/webp'],\n    } = imageData\n    const remotePatterns = nextConfig.images?.remotePatterns || []\n    const localPatterns = nextConfig.images?.localPatterns\n    const qualities = nextConfig.images?.qualities\n    const { url, w, q } = query\n    let href: string\n\n    if (domains.length > 0) {\n      Log.warnOnce(\n        'The \"images.domains\" configuration is deprecated. Please use \"images.remotePatterns\" configuration instead.'\n      )\n    }\n\n    if (!url) {\n      return { errorMessage: '\"url\" parameter is required' }\n    } else if (Array.isArray(url)) {\n      return { errorMessage: '\"url\" parameter cannot be an array' }\n    }\n\n    if (url.length > 3072) {\n      return { errorMessage: '\"url\" parameter is too long' }\n    }\n\n    if (url.startsWith('//')) {\n      return {\n        errorMessage: '\"url\" parameter cannot be a protocol-relative URL (//)',\n      }\n    }\n\n    let isAbsolute: boolean\n\n    if (url.startsWith('/')) {\n      href = url\n      isAbsolute = false\n      if (\n        /\\/_next\\/image($|\\/)/.test(\n          decodeURIComponent(parseUrl(url)?.pathname ?? '')\n        )\n      ) {\n        return {\n          errorMessage: '\"url\" parameter cannot be recursive',\n        }\n      }\n      if (!hasLocalMatch(localPatterns, url)) {\n        return { errorMessage: '\"url\" parameter is not allowed' }\n      }\n    } else {\n      let hrefParsed: URL\n\n      try {\n        hrefParsed = new URL(url)\n        href = hrefParsed.toString()\n        isAbsolute = true\n      } catch (_error) {\n        return { errorMessage: '\"url\" parameter is invalid' }\n      }\n\n      if (!['http:', 'https:'].includes(hrefParsed.protocol)) {\n        return { errorMessage: '\"url\" parameter is invalid' }\n      }\n\n      if (!hasRemoteMatch(domains, remotePatterns, hrefParsed)) {\n        return { errorMessage: '\"url\" parameter is not allowed' }\n      }\n    }\n\n    if (!w) {\n      return { errorMessage: '\"w\" parameter (width) is required' }\n    } else if (Array.isArray(w)) {\n      return { errorMessage: '\"w\" parameter (width) cannot be an array' }\n    } else if (!/^[0-9]+$/.test(w)) {\n      return {\n        errorMessage: '\"w\" parameter (width) must be an integer greater than 0',\n      }\n    }\n\n    if (!q) {\n      return { errorMessage: '\"q\" parameter (quality) is required' }\n    } else if (Array.isArray(q)) {\n      return { errorMessage: '\"q\" parameter (quality) cannot be an array' }\n    } else if (!/^[0-9]+$/.test(q)) {\n      return {\n        errorMessage:\n          '\"q\" parameter (quality) must be an integer between 1 and 100',\n      }\n    }\n\n    const width = parseInt(w, 10)\n\n    if (width <= 0 || isNaN(width)) {\n      return {\n        errorMessage: '\"w\" parameter (width) must be an integer greater than 0',\n      }\n    }\n\n    const sizes = [...(deviceSizes || []), ...(imageSizes || [])]\n\n    if (isDev) {\n      sizes.push(BLUR_IMG_SIZE)\n    }\n\n    const isValidSize =\n      sizes.includes(width) || (isDev && width <= BLUR_IMG_SIZE)\n\n    if (!isValidSize) {\n      return {\n        errorMessage: `\"w\" parameter (width) of ${width} is not allowed`,\n      }\n    }\n\n    const quality = parseInt(q, 10)\n\n    if (isNaN(quality) || quality < 1 || quality > 100) {\n      return {\n        errorMessage:\n          '\"q\" parameter (quality) must be an integer between 1 and 100',\n      }\n    }\n\n    if (qualities) {\n      if (isDev) {\n        qualities.push(BLUR_QUALITY)\n      }\n\n      if (!qualities.includes(quality)) {\n        return {\n          errorMessage: `\"q\" parameter (quality) of ${q} is not allowed`,\n        }\n      }\n    }\n\n    const mimeType = getSupportedMimeType(formats || [], req.headers['accept'])\n\n    const isStatic =\n      url.startsWith(`${nextConfig.basePath || ''}/_next/static/media`) ||\n      url.startsWith(\n        `${nextConfig.basePath || ''}/_next/static/immutable/media`\n      )\n\n    return {\n      href,\n      sizes,\n      isAbsolute,\n      isStatic,\n      width,\n      quality,\n      mimeType,\n      minimumCacheTTL,\n    }\n  }\n\n  static getCacheKey({\n    href,\n    width,\n    quality,\n    mimeType,\n  }: {\n    href: string\n    width: number\n    quality: number\n    mimeType: string\n  }): string {\n    return getHash([CACHE_VERSION, href, width, quality, mimeType])\n  }\n\n  constructor({\n    distDir,\n    nextConfig,\n    cacheHandler,\n  }: {\n    distDir: string\n    nextConfig: NextConfigRuntime\n    cacheHandler?: CacheHandler\n  }) {\n    this.cacheDir = join(/* turbopackIgnore: true */ distDir, 'cache', 'images')\n    this.nextConfig = nextConfig\n    this.cacheHandler = cacheHandler\n\n    // Eagerly start LRU initialization for filesystem cache\n    if (\n      !cacheHandler &&\n      nextConfig.images.maximumDiskCacheSize !== 0 &&\n      nextConfig.experimental.isrFlushToDisk\n    ) {\n      this.isDiskCacheEnabled = true\n      this.cacheDiskLRU = getOrInitDiskLRU(\n        this.cacheDir,\n        nextConfig.images.maximumDiskCacheSize,\n        initCacheEntries,\n        deleteFromCacheDir\n      )\n    }\n  }\n\n  async get(cacheKey: string): Promise<IncrementalResponseCacheEntry | null> {\n    // If a custom cache handler is provided, use it\n    if (this.cacheHandler) {\n      try {\n        const cacheData = await this.cacheHandler.get(cacheKey, {\n          kind: IncrementalCacheKind.IMAGE,\n          isFallback: false,\n        })\n\n        if (!cacheData?.value) {\n          return null\n        }\n\n        if (cacheData.value.kind !== CachedRouteKind.IMAGE) {\n          return null\n        }\n\n        const now = Date.now()\n        const lastModified = cacheData.lastModified || now\n        const revalidate =\n          typeof cacheData.value.revalidate === 'number'\n            ? cacheData.value.revalidate\n            : this.nextConfig.images.minimumCacheTTL\n        const revalidateAfter =\n          Math.max(revalidate, this.nextConfig.images.minimumCacheTTL) * 1000 +\n          lastModified\n        const isStale = revalidateAfter < now\n\n        return {\n          value: cacheData.value,\n          revalidateAfter,\n          cacheControl: { revalidate, expire: undefined },\n          isStale,\n        }\n      } catch (_) {\n        // failed to get from custom cache handler, treat as cache miss\n      }\n      return null\n    }\n\n    // If the filesystem cache is disabled, return early\n    if (!this.isDiskCacheEnabled) {\n      return null\n    }\n\n    // Fall back to filesystem cache\n    try {\n      const now = Date.now()\n      const { maxAge, expireAt, etag, upstreamEtag, buffer, extension } =\n        await readFromCacheDir(this.cacheDir, cacheKey)\n\n      // Promote entry in LRU (mark as recently used)\n      const lru = await this.cacheDiskLRU\n      lru?.get(cacheKey)\n\n      return {\n        value: {\n          kind: CachedRouteKind.IMAGE,\n          etag,\n          buffer,\n          extension,\n          upstreamEtag,\n        },\n        revalidateAfter:\n          Math.max(maxAge, this.nextConfig.images.minimumCacheTTL) * 1000 +\n          Date.now(),\n        cacheControl: { revalidate: maxAge, expire: undefined },\n        isStale: now > expireAt,\n      }\n    } catch (_) {\n      // failed to read from cache dir, treat as cache miss\n    }\n    return null\n  }\n  async set(\n    cacheKey: string,\n    value: IncrementalCacheValue | null,\n    {\n      cacheControl,\n    }: {\n      cacheControl?: CacheControl\n    }\n  ) {\n    if (value?.kind !== CachedRouteKind.IMAGE) {\n      throw new Error('invariant attempted to set non-image to image-cache')\n    }\n\n    const revalidate = cacheControl?.revalidate\n\n    if (typeof revalidate !== 'number') {\n      throw new InvariantError('revalidate must be a number for image-cache')\n    }\n\n    // If a custom cache handler is provided, use it\n    if (this.cacheHandler) {\n      try {\n        // Apply minimumCacheTTL at write time, similar to the implementation in the fallback filesystem cache\n        const effectiveRevalidate = Math.max(\n          revalidate,\n          this.nextConfig.images.minimumCacheTTL\n        )\n        const valueWithRevalidate = {\n          ...value,\n          revalidate: effectiveRevalidate,\n        }\n        await this.cacheHandler.set(cacheKey, valueWithRevalidate, {\n          cacheControl: {\n            revalidate: effectiveRevalidate,\n            expire: cacheControl?.expire,\n          },\n        })\n      } catch (err) {\n        Log.error(`Failed to write image to custom cache ${cacheKey}`, err)\n      }\n      return\n    }\n\n    // If the filesystem cache is disabled, return early\n    if (!this.isDiskCacheEnabled) {\n      return\n    }\n\n    // Fall back to filesystem cache\n    const expireAt =\n      Math.max(revalidate, this.nextConfig.images.minimumCacheTTL) * 1000 +\n      Date.now()\n\n    try {\n      const lru = await this.cacheDiskLRU\n      const success = lru?.set(cacheKey, value.buffer.byteLength)\n      if (success === false) {\n        throw new Error(\n          `image of size ${value.buffer.byteLength} could not be tracked by lru cache`\n        )\n      }\n\n      await writeToCacheDir(\n        this.cacheDir,\n        cacheKey,\n        value.extension,\n        revalidate,\n        expireAt,\n        value.buffer,\n        value.etag,\n        value.upstreamEtag\n      )\n    } catch (err) {\n      Log.error(`Failed to write image to cache ${cacheKey}`, err)\n    }\n  }\n}\nexport class ImageError extends Error {\n  statusCode: number\n\n  constructor(statusCode: number, message: string) {\n    super(message)\n\n    // ensure an error status is used > 400\n    if (statusCode >= 400) {\n      this.statusCode = statusCode\n    } else {\n      this.statusCode = 500\n    }\n  }\n}\n\nfunction parseCacheControl(\n  str: string | null | undefined\n): Map<string, string> {\n  const map = new Map<string, string>()\n  if (!str) {\n    return map\n  }\n  for (let directive of str.split(',')) {\n    let [key, value] = directive.trim().split('=', 2)\n    key = key.toLowerCase()\n    if (value) {\n      value = value.toLowerCase()\n    }\n    map.set(key, value)\n  }\n  return map\n}\n\nexport function getMaxAge(str: string | null | undefined): number {\n  const map = parseCacheControl(str)\n  if (map) {\n    let age = map.get('s-maxage') || map.get('max-age') || ''\n    if (age.startsWith('\"') && age.endsWith('\"')) {\n      age = age.slice(1, -1)\n    }\n    const n = parseInt(age, 10)\n    if (!isNaN(n)) {\n      return n\n    }\n  }\n  return 0\n}\nexport function getPreviouslyCachedImageOrNull(\n  upstreamImage: ImageUpstream,\n  previousCacheEntry: IncrementalCacheEntry | null | undefined\n): CachedImageValue | null {\n  if (\n    previousCacheEntry?.value?.kind === 'IMAGE' &&\n    // Images that are SVGs, animated or failed the optimization previously end up using upstreamEtag as their etag as well,\n    // in these cases we want to trigger a new \"optimization\" attempt.\n    previousCacheEntry.value.upstreamEtag !== previousCacheEntry.value.etag &&\n    // and the upstream etag is the same as the previous cache entry's\n    upstreamImage.etag === previousCacheEntry.value.upstreamEtag\n  ) {\n    return previousCacheEntry.value\n  }\n  return null\n}\n\nexport async function optimizeImage({\n  buffer,\n  contentType,\n  quality,\n  width,\n  height,\n  concurrency,\n  operationCache,\n  limitInputPixels,\n  sequentialRead,\n  timeoutInSeconds,\n}: {\n  buffer: Buffer\n  contentType: string\n  quality: number\n  width: number\n  height?: number\n  concurrency?: number | null\n  operationCache?: boolean | null | undefined\n  limitInputPixels?: number\n  sequentialRead?: boolean | null\n  timeoutInSeconds?: number\n}): Promise<Buffer> {\n  const sharp = getSharp(concurrency, operationCache)\n  const transformer = sharp(buffer, {\n    limitInputPixels,\n    sequentialRead: sequentialRead ?? undefined,\n  })\n    .timeout({\n      seconds: timeoutInSeconds ?? 7,\n    })\n    .rotate()\n\n  if (height) {\n    transformer.resize(width, height)\n  } else {\n    transformer.resize(width, undefined, {\n      withoutEnlargement: true,\n    })\n  }\n\n  if (contentType === AVIF) {\n    transformer.avif({\n      // Scale the quality to try and match webp. This ratio was derived\n      // from sharp's default 80 (webp) and 50 (avif), and then verified\n      // using dssim and ssimulacra2 visual quality tests.\n      quality: Math.max(Math.round(quality * (50 / 80)), 1),\n      effort: 3,\n    })\n  } else if (contentType === WEBP) {\n    transformer.webp({ quality })\n  } else if (contentType === PNG) {\n    transformer.png({ quality })\n  } else if (contentType === JPEG) {\n    transformer.jpeg({ quality, mozjpeg: true })\n  }\n\n  const optimizedBuffer = await transformer.toBuffer()\n\n  return optimizedBuffer\n}\n\nfunction isRedirect(statusCode: number) {\n  return [301, 302, 303, 307, 308].includes(statusCode)\n}\n\nexport async function fetchExternalImage(\n  href: string,\n  dangerouslyAllowLocalIP: boolean,\n  maximumResponseBody: number,\n  count = 3\n): Promise<ImageUpstream> {\n  if (!dangerouslyAllowLocalIP) {\n    const { hostname } = new URL(href)\n    let ips = [hostname]\n    if (!isIP(hostname)) {\n      const records = await lookup(hostname, {\n        family: 0,\n        all: true,\n        hints: ALL,\n      }).catch((_) => [{ address: hostname }])\n      ips = records.map((record) => record.address)\n    }\n    const privateIps = ips.filter((ip) => isPrivateIp(ip))\n    if (privateIps.length > 0) {\n      Log.error(\n        'upstream image',\n        href,\n        'hostname resolved to private IP',\n        JSON.stringify(privateIps),\n        'If this is expected and you understand SSRF risk, use images.dangerouslyAllowLocalIP = true to continue.'\n      )\n      throw new ImageError(400, '\"url\" parameter is not allowed')\n    }\n  }\n  const res = await fetch(href, {\n    signal: AbortSignal.timeout(7_000),\n    redirect: 'manual',\n  }).catch((err) => err as Error)\n\n  if (res instanceof Error) {\n    const err = res as Error\n    if (err.name === 'TimeoutError') {\n      Log.error('upstream image response timed out for', href)\n      throw new ImageError(\n        504,\n        '\"url\" parameter is valid but upstream response timed out'\n      )\n    }\n    throw err\n  }\n\n  const locationHeader = res.headers.get('Location')\n  if (\n    isRedirect(res.status) &&\n    locationHeader &&\n    URL.canParse(locationHeader, href)\n  ) {\n    if (count === 0) {\n      Log.error('upstream image response had too many redirects', href)\n      throw new ImageError(\n        508,\n        '\"url\" parameter is valid but upstream response is invalid'\n      )\n    }\n    const redirect = new URL(locationHeader, href).href\n    return fetchExternalImage(\n      redirect,\n      dangerouslyAllowLocalIP,\n      maximumResponseBody,\n      count - 1\n    )\n  }\n\n  if (!res.ok) {\n    Log.error('upstream image response failed for', href, res.status)\n    throw new ImageError(\n      res.status,\n      '\"url\" parameter is valid but upstream response is invalid'\n    )\n  }\n\n  if (!res.body) {\n    Log.error('upstream image response is empty for', href)\n    throw new ImageError(\n      400,\n      '\"url\" parameter is valid but upstream response is invalid'\n    )\n  }\n\n  const chunks: Buffer[] = []\n  let totalSize = 0\n\n  for await (const c of res.body) {\n    const chunk = Buffer.from(c)\n    totalSize += chunk.byteLength\n    if (totalSize > maximumResponseBody) {\n      Log.error(\n        'upstream image response exceeded maximum size for',\n        href,\n        totalSize\n      )\n      throw new ImageError(\n        413,\n        '\"url\" parameter is valid but upstream response is invalid'\n      )\n    }\n    chunks.push(chunk)\n  }\n\n  const buffer = Buffer.concat(chunks)\n  const contentType = res.headers.get('Content-Type')\n  const cacheControl = res.headers.get('Cache-Control')\n  const etag = extractEtag(res.headers.get('ETag'), buffer)\n  return { buffer, contentType, cacheControl, etag }\n}\n\nexport async function fetchInternalImage(\n  href: string,\n  _req: IncomingMessage,\n  _res: ServerResponse,\n  maximumResponseBody: number,\n  handleRequest: (\n    newReq: IncomingMessage,\n    newRes: ServerResponse,\n    newParsedUrl?: NextUrlWithParsedQuery\n  ) => Promise<void>\n): Promise<ImageUpstream> {\n  try {\n    // Coerce HEAD to GET to avoid issues with the image optimizer\n    const method = !_req.method || _req.method === 'HEAD' ? 'GET' : _req.method\n\n    const mocked = createRequestResponseMocks({\n      url: href,\n      method,\n      socket: _req.socket,\n      maximumResponseBody,\n    })\n\n    await handleRequest(mocked.req, mocked.res, parseReqUrl(href))\n    await mocked.res.hasStreamed\n\n    if (!mocked.res.statusCode) {\n      Log.error('image response failed for', href, mocked.res.statusCode)\n      throw new ImageError(\n        mocked.res.statusCode,\n        '\"url\" parameter is valid but internal response is invalid'\n      )\n    }\n\n    if (mocked.res.buffers.length === 0) {\n      Log.error('internal image response is empty for', href)\n      throw new ImageError(\n        400,\n        '\"url\" parameter is valid but internal response is invalid'\n      )\n    }\n\n    const buffer = Buffer.concat(mocked.res.buffers)\n    const contentType = mocked.res.getHeader('Content-Type')\n    const cacheControl = mocked.res.getHeader('Cache-Control')\n    const etag = extractEtag(mocked.res.getHeader('ETag'), buffer)\n\n    return { buffer, contentType, cacheControl, etag }\n  } catch (err) {\n    if (err instanceof ImageError) {\n      throw err\n    }\n\n    if (\n      err &&\n      typeof err === 'object' &&\n      'code' in err &&\n      err.code === 'ERR_MAX_BODY_SIZE_EXCEEDED'\n    ) {\n      Log.error('internal image response exceeded maximum size for', href)\n      throw new ImageError(\n        413,\n        '\"url\" parameter is valid but internal response is invalid'\n      )\n    }\n\n    Log.error('upstream image response failed for', href, err)\n    throw new ImageError(\n      500,\n      '\"url\" parameter is valid but upstream response is invalid'\n    )\n  }\n}\n\nexport async function imageOptimizer(\n  imageUpstream: ImageUpstream,\n  paramsResult: Pick<\n    ImageParamsResult,\n    'href' | 'width' | 'quality' | 'mimeType'\n  >,\n  nextConfig: {\n    experimental: Pick<\n      NextConfigComplete['experimental'],\n      | 'imgOptConcurrency'\n      | 'imgOptOperationCache'\n      | 'imgOptMaxInputPixels'\n      | 'imgOptSequentialRead'\n      | 'imgOptTimeoutInSeconds'\n    >\n    images: Pick<\n      NextConfigComplete['images'],\n      'dangerouslyAllowSVG' | 'minimumCacheTTL'\n    >\n  },\n  opts: {\n    isDev?: boolean\n    silent?: boolean\n    previousCacheEntry?: IncrementalResponseCacheEntry | null\n  }\n): Promise<{\n  buffer: Buffer\n  contentType: string\n  maxAge: number\n  etag: string\n  upstreamEtag: string\n  error?: unknown\n}> {\n  const { href, quality, width, mimeType } = paramsResult\n  const { buffer: upstreamBuffer, etag: upstreamEtag } = imageUpstream\n  const maxAge = Math.max(\n    nextConfig.images.minimumCacheTTL,\n    getMaxAge(imageUpstream.cacheControl)\n  )\n\n  const upstreamType = await detectContentType(upstreamBuffer)\n\n  if (\n    !upstreamType ||\n    !upstreamType.startsWith('image/') ||\n    upstreamType.includes(',')\n  ) {\n    if (!opts.silent) {\n      Log.error(\n        \"The requested resource isn't a valid image for\",\n        href,\n        'received',\n        upstreamType\n      )\n    }\n    throw new ImageError(400, \"The requested resource isn't a valid image.\")\n  }\n  if (\n    upstreamType.startsWith('image/svg') &&\n    !nextConfig.images.dangerouslyAllowSVG\n  ) {\n    if (!opts.silent) {\n      Log.error(\n        `The requested resource \"${href}\" has type \"${upstreamType}\" but dangerouslyAllowSVG is disabled. Consider adding the \"unoptimized\" property to the <Image>.`\n      )\n    }\n    throw new ImageError(\n      400,\n      '\"url\" parameter is valid but image type is not allowed'\n    )\n  }\n  if (ANIMATABLE_TYPES.includes(upstreamType) && isAnimated(upstreamBuffer)) {\n    if (!opts.silent) {\n      Log.warnOnce(\n        `The requested resource \"${href}\" is an animated image so it will not be optimized. Consider adding the \"unoptimized\" property to the <Image>.`\n      )\n    }\n    return {\n      buffer: upstreamBuffer,\n      contentType: upstreamType,\n      maxAge,\n      etag: upstreamEtag,\n      upstreamEtag,\n    }\n  }\n  if (BYPASS_TYPES.includes(upstreamType)) {\n    return {\n      buffer: upstreamBuffer,\n      contentType: upstreamType,\n      maxAge,\n      etag: upstreamEtag,\n      upstreamEtag,\n    }\n  }\n\n  let contentType: string\n\n  if (mimeType) {\n    contentType = mimeType\n  } else if (\n    getExtension(upstreamType) &&\n    upstreamType !== WEBP &&\n    upstreamType !== AVIF\n  ) {\n    contentType = upstreamType\n  } else {\n    contentType = JPEG\n  }\n  const previouslyCachedImage = getPreviouslyCachedImageOrNull(\n    imageUpstream,\n    opts.previousCacheEntry\n  )\n  if (previouslyCachedImage) {\n    return {\n      buffer: previouslyCachedImage.buffer,\n      contentType,\n      maxAge: opts?.previousCacheEntry?.cacheControl?.revalidate || maxAge,\n      etag: previouslyCachedImage.etag,\n      upstreamEtag: previouslyCachedImage.upstreamEtag,\n    }\n  }\n\n  try {\n    let optimizedBuffer = await optimizeImage({\n      buffer: upstreamBuffer,\n      contentType,\n      quality,\n      width,\n      concurrency: nextConfig.experimental.imgOptConcurrency,\n      operationCache: nextConfig.experimental.imgOptOperationCache,\n      limitInputPixels: nextConfig.experimental.imgOptMaxInputPixels,\n      sequentialRead: nextConfig.experimental.imgOptSequentialRead,\n      timeoutInSeconds: nextConfig.experimental.imgOptTimeoutInSeconds,\n    })\n    if (opts.isDev && width <= BLUR_IMG_SIZE && quality === BLUR_QUALITY) {\n      // During `next dev`, we don't want to generate blur placeholders with webpack\n      // because it can delay starting the dev server. Instead, `next-image-loader.js`\n      // will inline a special url to lazily generate the blur placeholder at request time.\n      const meta = await getImageSize(optimizedBuffer)\n      const blurOpts = {\n        blurWidth: meta.width,\n        blurHeight: meta.height,\n        blurDataURL: `data:${contentType};base64,${optimizedBuffer.toString(\n          'base64'\n        )}`,\n      }\n      optimizedBuffer = Buffer.from(unescape(getImageBlurSvg(blurOpts)))\n      contentType = 'image/svg+xml'\n    }\n    return {\n      buffer: optimizedBuffer,\n      contentType,\n      maxAge,\n      etag: getImageEtag(optimizedBuffer),\n      upstreamEtag,\n    }\n  } catch (error) {\n    if (upstreamType) {\n      // If we fail to optimize, fallback to the original image\n      return {\n        buffer: upstreamBuffer,\n        contentType: upstreamType,\n        maxAge: nextConfig.images.minimumCacheTTL,\n        etag: upstreamEtag,\n        upstreamEtag,\n        error,\n      }\n    } else {\n      throw new ImageError(\n        400,\n        'Unable to optimize image and unable to fallback to upstream image'\n      )\n    }\n  }\n}\n\nfunction getFileNameWithExtension(\n  url: string,\n  contentType: string | null\n): string {\n  const [urlWithoutQueryParams] = url.split('?', 1)\n  const fileNameWithExtension = urlWithoutQueryParams.split('/').pop()\n  if (!contentType || !fileNameWithExtension) {\n    return 'image.bin'\n  }\n\n  const [fileName] = fileNameWithExtension.split('.', 1)\n  const extension = getExtension(contentType)\n  return `${fileName}.${extension}`\n}\n\nfunction setResponseHeaders(\n  req: IncomingMessage,\n  res: ServerResponse,\n  url: string,\n  etag: string,\n  contentType: string | null,\n  isStatic: boolean,\n  xCache: XCacheHeader,\n  imagesConfig: ImageConfigComplete,\n  maxAge: number,\n  isDev: boolean\n) {\n  res.setHeader('Vary', 'Accept')\n  res.setHeader(\n    'Cache-Control',\n    isStatic\n      ? 'public, max-age=315360000, immutable'\n      : `public, max-age=${isDev ? 0 : maxAge}, must-revalidate`\n  )\n  if (sendEtagResponse(req, res, etag)) {\n    // already called res.end() so we're finished\n    return { finished: true }\n  }\n  if (contentType) {\n    res.setHeader('Content-Type', contentType)\n  }\n\n  const fileName = getFileNameWithExtension(url, contentType)\n  res.setHeader(\n    'Content-Disposition',\n    contentDisposition(fileName, { type: imagesConfig.contentDispositionType })\n  )\n\n  res.setHeader('Content-Security-Policy', imagesConfig.contentSecurityPolicy)\n  res.setHeader('X-Nextjs-Cache', xCache)\n\n  return { finished: false }\n}\n\nexport function sendResponse(\n  req: IncomingMessage,\n  res: ServerResponse,\n  url: string,\n  extension: string,\n  buffer: Buffer,\n  etag: string,\n  isStatic: boolean,\n  xCache: XCacheHeader,\n  imagesConfig: ImageConfigComplete,\n  maxAge: number,\n  isDev: boolean\n) {\n  const contentType = getContentType(extension)\n  const result = setResponseHeaders(\n    req,\n    res,\n    url,\n    etag,\n    contentType,\n    isStatic,\n    xCache,\n    imagesConfig,\n    maxAge,\n    isDev\n  )\n  if (!result.finished) {\n    res.setHeader('Content-Length', Buffer.byteLength(buffer))\n    // A response body must not be sent for HEAD requests\n    if (req.method === 'HEAD') {\n      res.end()\n    } else {\n      res.end(buffer)\n    }\n  }\n}\n\nexport async function getImageSize(buffer: Buffer): Promise<{\n  width?: number\n  height?: number\n}> {\n  const { width, height } = imageSizeOf(buffer)\n  return { width, height }\n}\n"],"names":["createHash","promises","mediaType","contentDisposition","imageSizeOf","detector","isAnimated","join","getImageBlurSvg","hasLocalMatch","hasRemoteMatch","createRequestResponseMocks","CachedRouteKind","IncrementalCacheKind","sendEtagResponse","getContentType","getExtension","Log","isError","isPrivateIp","getOrInitDiskLRU","parseUrl","parseReqUrl","InvariantError","lookup","isIP","ALL","AVIF","WEBP","PNG","JPEG","JXL","JP2","HEIC","GIF","SVG","ICO","ICNS","TIFF","BMP","PDF","CACHE_VERSION","ANIMATABLE_TYPES","BYPASS_TYPES","BLUR_IMG_SIZE","BLUR_QUALITY","_sharp","initCacheEntries","cacheDir","cacheKeys","readdir","catch","entries","cacheKey","expireAt","buffer","readFromCacheDir","push","key","size","byteLength","sort","a","b","getSharp","concurrency","operationCache","require","block","operation","unblock","cache","divisor","process","env","NODE_ENV","Math","floor","max","e","code","Error","getSupportedMimeType","options","accept","mimeType","includes","getHash","items","hash","item","update","String","digest","extractEtag","etag","imageBuffer","Buffer","from","toString","getImageEtag","image","writeToCacheDir","extension","maxAge","upstreamEtag","dir","filename","rm","recursive","force","mkdir","writeFile","files","file","maxAgeSt","expireAtSt","split","filePath","readFile","Number","deleteFromCacheDir","err","error","detectContentType","every","i","format","subarray","undefined","ImageOptimizerCache","validateParams","req","query","nextConfig","isDev","imageData","images","deviceSizes","imageSizes","domains","minimumCacheTTL","formats","remotePatterns","localPatterns","qualities","url","w","q","href","length","warnOnce","errorMessage","Array","isArray","startsWith","isAbsolute","test","decodeURIComponent","pathname","hrefParsed","URL","_error","protocol","width","parseInt","isNaN","sizes","isValidSize","quality","headers","isStatic","basePath","getCacheKey","constructor","distDir","cacheHandler","maximumDiskCacheSize","experimental","isrFlushToDisk","isDiskCacheEnabled","cacheDiskLRU","get","cacheData","kind","IMAGE","isFallback","value","now","Date","lastModified","revalidate","revalidateAfter","isStale","cacheControl","expire","_","lru","set","effectiveRevalidate","valueWithRevalidate","success","ImageError","statusCode","message","parseCacheControl","str","map","Map","directive","trim","toLowerCase","getMaxAge","age","endsWith","slice","n","getPreviouslyCachedImageOrNull","upstreamImage","previousCacheEntry","optimizeImage","contentType","height","limitInputPixels","sequentialRead","timeoutInSeconds","sharp","transformer","timeout","seconds","rotate","resize","withoutEnlargement","avif","round","effort","webp","png","jpeg","mozjpeg","optimizedBuffer","toBuffer","isRedirect","fetchExternalImage","dangerouslyAllowLocalIP","maximumResponseBody","count","hostname","ips","records","family","all","hints","address","record","privateIps","filter","ip","JSON","stringify","res","fetch","signal","AbortSignal","redirect","name","locationHeader","status","canParse","ok","body","chunks","totalSize","c","chunk","concat","fetchInternalImage","_req","_res","handleRequest","method","mocked","socket","hasStreamed","buffers","getHeader","imageOptimizer","imageUpstream","paramsResult","opts","upstreamBuffer","upstreamType","silent","dangerouslyAllowSVG","previouslyCachedImage","imgOptConcurrency","imgOptOperationCache","imgOptMaxInputPixels","imgOptSequentialRead","imgOptTimeoutInSeconds","meta","getImageSize","blurOpts","blurWidth","blurHeight","blurDataURL","unescape","getFileNameWithExtension","urlWithoutQueryParams","fileNameWithExtension","pop","fileName","setResponseHeaders","xCache","imagesConfig","setHeader","finished","type","contentDispositionType","contentSecurityPolicy","sendResponse","result","end"],"mappings":"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","ignoreList":[0]}