{"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 nodeUrl, { type UrlWithParsedQuery } from 'url'\n\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 } from './config-shared'\nimport { createRequestResponseMocks } from './lib/mock-request'\nimport type { NextUrlWithParsedQuery } from './request-meta'\nimport {\n  CachedRouteKind,\n  type CachedImageValue,\n  type IncrementalCacheEntry,\n  type IncrementalCacheValue,\n  type IncrementalResponseCacheEntry,\n} from './response-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 { getOrInitDiskLRU } from './lib/disk-lru-cache.external'\nimport { parseUrl } from '../lib/url'\nimport type { CacheControl } from './lib/cache-control'\nimport { InvariantError } from '../shared/lib/invariant-error'\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')\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(concurrency: number | null | undefined) {\n  if (_sharp) {\n    return _sharp\n  }\n  try {\n    _sharp = require('sharp') as typeof import('sharp')\n    if (_sharp && _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  const dir = join(/* turbopackIgnore: true */ cacheDir, cacheKey)\n  const filename = join(\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  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  skipMetadata: boolean | null | undefined,\n  concurrency?: number | null | undefined\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  let format:\n    | import('sharp').Metadata['format']\n    | ReturnType<typeof detector>\n    | undefined\n  format = detector(buffer)\n\n  if (!format && !skipMetadata) {\n    const sharp = getSharp(concurrency)\n    const meta = await sharp(buffer)\n      .metadata()\n      .catch((_) => null)\n    format = meta?.format\n  }\n\n  switch (format) {\n    case 'avif':\n      return AVIF\n    case 'webp':\n      return WEBP\n    case 'png':\n      return PNG\n    case 'jpeg':\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    case 'tif':\n      return TIFF\n    case 'pdf':\n      return PDF\n    case 'bmp':\n      return BMP\n    case 'ico':\n      return ICO\n    case 'icns':\n      return ICNS\n    case 'dcraw':\n    case 'dz':\n    case 'exr':\n    case 'fits':\n    case 'heif':\n    case 'input':\n    case 'magick':\n    case 'openslide':\n    case 'ppm':\n    case 'rad':\n    case 'raw':\n    case 'v':\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    default:\n      return null\n  }\n}\n\nexport class ImageOptimizerCache {\n  private cacheDir: string\n  private nextConfig: NextConfigComplete\n  private cacheDiskLRU?: ReturnType<typeof getOrInitDiskLRU>\n  private isDiskCacheEnabled?: boolean\n\n  static validateParams(\n    req: IncomingMessage,\n    query: UrlWithParsedQuery['query'],\n    nextConfig: NextConfigComplete,\n    isDev: boolean\n  ): ImageParamsResult | { errorMessage: string } {\n    const imageData = nextConfig.images\n    const {\n      deviceSizes = [],\n      imageSizes = [],\n      domains = [],\n      minimumCacheTTL = 60,\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 = url.startsWith(\n      `${nextConfig.basePath || ''}/_next/static/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  }: {\n    distDir: string\n    nextConfig: NextConfigComplete\n  }) {\n    this.cacheDir = join(distDir, 'cache', 'images')\n    this.nextConfig = nextConfig\n\n    // Eagerly start LRU initialization for filesystem cache\n    if (\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 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 (!this.nextConfig.experimental.isrFlushToDisk) {\n      return\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 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  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  limitInputPixels?: number\n  sequentialRead?: boolean | null\n  timeoutInSeconds?: number\n}): Promise<Buffer> {\n  const sharp = getSharp(concurrency)\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      quality: Math.max(quality - 20, 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\nexport async function fetchExternalImage(\n  href: string,\n  maximumResponseBody: number\n): Promise<ImageUpstream> {\n  const res = await fetch(href, {\n    signal: AbortSignal.timeout(7_000),\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  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    const mocked = createRequestResponseMocks({\n      url: href,\n      method: _req.method || 'GET',\n      socket: _req.socket,\n      maximumResponseBody,\n    })\n\n    await handleRequest(mocked.req, mocked.res, nodeUrl.parse(href, true))\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      | 'imgOptMaxInputPixels'\n      | 'imgOptSequentialRead'\n      | 'imgOptSkipMetadata'\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(\n    upstreamBuffer,\n    nextConfig.experimental.imgOptSkipMetadata,\n    nextConfig.experimental.imgOptConcurrency\n  )\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      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    res.end(buffer)\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":["ImageError","ImageOptimizerCache","detectContentType","extractEtag","fetchExternalImage","fetchInternalImage","getHash","getImageEtag","getImageSize","getMaxAge","getPreviouslyCachedImageOrNull","getSharp","imageOptimizer","optimizeImage","sendResponse","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","promises","readdir","catch","entries","cacheKey","expireAt","buffer","readFromCacheDir","push","key","size","byteLength","sort","a","b","concurrency","require","divisor","process","env","NODE_ENV","Math","floor","max","e","isError","code","Error","getSupportedMimeType","options","accept","mimeType","mediaType","includes","items","hash","createHash","item","update","String","digest","etag","imageBuffer","Buffer","from","toString","image","writeToCacheDir","extension","maxAge","upstreamEtag","dir","join","filename","rm","recursive","force","mkdir","writeFile","files","file","maxAgeSt","expireAtSt","split","filePath","readFile","Number","deleteFromCacheDir","err","Log","error","skipMetadata","every","i","format","detector","sharp","meta","metadata","_","undefined","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","parseUrl","test","decodeURIComponent","pathname","hasLocalMatch","hrefParsed","URL","_error","protocol","hasRemoteMatch","width","parseInt","isNaN","sizes","isValidSize","quality","headers","isStatic","basePath","getCacheKey","constructor","distDir","maximumDiskCacheSize","experimental","isrFlushToDisk","isDiskCacheEnabled","cacheDiskLRU","getOrInitDiskLRU","get","now","Date","lru","value","kind","CachedRouteKind","IMAGE","revalidateAfter","cacheControl","revalidate","expire","isStale","set","InvariantError","success","statusCode","message","parseCacheControl","str","map","Map","directive","trim","toLowerCase","age","endsWith","slice","n","upstreamImage","previousCacheEntry","contentType","height","limitInputPixels","sequentialRead","timeoutInSeconds","transformer","timeout","seconds","rotate","resize","withoutEnlargement","avif","effort","webp","png","jpeg","mozjpeg","optimizedBuffer","toBuffer","maximumResponseBody","res","fetch","signal","AbortSignal","name","ok","status","body","chunks","totalSize","c","chunk","concat","_req","_res","handleRequest","mocked","createRequestResponseMocks","method","socket","nodeUrl","parse","hasStreamed","buffers","getHeader","imageUpstream","paramsResult","opts","upstreamBuffer","upstreamType","imgOptSkipMetadata","imgOptConcurrency","silent","dangerouslyAllowSVG","isAnimated","getExtension","previouslyCachedImage","imgOptMaxInputPixels","imgOptSequentialRead","imgOptTimeoutInSeconds","blurOpts","blurWidth","blurHeight","blurDataURL","unescape","getImageBlurSvg","getFileNameWithExtension","urlWithoutQueryParams","fileNameWithExtension","pop","fileName","setResponseHeaders","xCache","imagesConfig","setHeader","sendEtagResponse","finished","contentDisposition","type","contentDispositionType","contentSecurityPolicy","getContentType","result","end","imageSizeOf"],"mappings":"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","ignoreList":[0]}