{"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, 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 } 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')\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    /* 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  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: NextConfigRuntime\n  private cacheHandler?: CacheHandler\n  private cacheDiskLRU?: ReturnType<typeof getOrInitDiskLRU>\n  private isDiskCacheEnabled?: boolean\n\n  static validateParams(\n    req: IncomingMessage,\n    query: UrlWithParsedQuery['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 = 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    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  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\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        'resolved to private ip',\n        JSON.stringify(privateIps)\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  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    })\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    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    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    // 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","nodeUrl","getImageBlurSvg","hasLocalMatch","hasRemoteMatch","createRequestResponseMocks","CachedRouteKind","IncrementalCacheKind","sendEtagResponse","getContentType","getExtension","Log","isError","isPrivateIp","getOrInitDiskLRU","parseUrl","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","require","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","skipMetadata","every","i","format","sharp","meta","metadata","_","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","transformer","timeout","seconds","rotate","resize","withoutEnlargement","avif","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","parse","hasStreamed","buffers","getHeader","imageOptimizer","imageUpstream","paramsResult","opts","upstreamBuffer","upstreamType","imgOptSkipMetadata","imgOptConcurrency","silent","dangerouslyAllowSVG","previouslyCachedImage","imgOptMaxInputPixels","imgOptSequentialRead","imgOptTimeoutInSeconds","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]}