UNPKG

27.9 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../../next-server/server/image-optimizer.ts"],"names":["WEBP","PNG","JPEG","GIF","SVG","CACHE_VERSION","MODERN_TYPES","ANIMATABLE_TYPES","VECTOR_TYPES","inflightRequests","Map","imageOptimizer","server","req","res","parsedUrl","nextConfig","distDir","imageData","images","imageConfigDefault","deviceSizes","imageSizes","domains","loader","render404","finished","headers","url","w","q","query","mimeType","getSupportedMimeType","accept","href","statusCode","end","Array","isArray","isAbsolute","startsWith","hrefParsed","URL","toString","_error","includes","protocol","hostname","isStatic","width","parseInt","isNaN","sizes","quality","hash","getHash","imagesDir","hashDir","now","Date","has","get","dedupeResolver","set","Promise","resolve","files","promises","readdir","file","prefix","etag","extension","split","expireAt","Number","contentType","fsPath","setHeader","pipe","unlink","upstreamBuffer","upstreamType","maxAge","upstreamRes","fetch","ok","status","Buffer","from","arrayBuffer","getMaxAge","resBuffers","mockRes","Stream","Writable","isStreamFinished","reject","on","write","chunk","push","isBuffer","_write","mockHeaders","writeHead","_status","_headers","Object","assign","getHeader","name","toLowerCase","getHeaders","getHeaderNames","keys","value","_implicitHeader","mockReq","Readable","_read","emit","method","getRequestHandler","nodeUrl","parse","concat","err","vector","animate","writeToCacheDir","sendResponse","orientation","operations","Orientation","RIGHT_TOP","type","numRotations","BOTTOM_RIGHT","LEFT_BOTTOM","optimizedBuffer","Error","error","delete","dir","buffer","mkdir","recursive","filename","writeFile","options","items","item","update","String","digest","replace","parseCacheControl","str","map","directive","key","trim","minimum","age","endsWith","slice","n","Math","max"],"mappings":"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","sourcesContent":["import { mediaType } from '@hapi/accept'\nimport { createHash } from 'crypto'\nimport { createReadStream, promises } from 'fs'\nimport { getOrientation, Orientation } from 'get-orientation'\nimport { IncomingMessage, ServerResponse } from 'http'\n// @ts-ignore no types for is-animated\nimport isAnimated from 'next/dist/compiled/is-animated'\nimport { join } from 'path'\nimport Stream from 'stream'\nimport nodeUrl, { UrlWithParsedQuery } from 'url'\nimport { NextConfig } from '../../next-server/server/config-shared'\nimport { fileExists } from '../../lib/file-exists'\nimport { ImageConfig, imageConfigDefault } from './image-config'\nimport { processBuffer, Operation } from './lib/squoosh/main'\nimport Server from './next-server'\nimport { sendEtagResponse } from './send-payload'\nimport { getContentType, getExtension } from './serve-static'\n\n//const AVIF = 'image/avif'\nconst WEBP = 'image/webp'\nconst PNG = 'image/png'\nconst JPEG = 'image/jpeg'\nconst GIF = 'image/gif'\nconst SVG = 'image/svg+xml'\nconst CACHE_VERSION = 2\nconst MODERN_TYPES = [/* AVIF, */ WEBP]\nconst ANIMATABLE_TYPES = [WEBP, PNG, GIF]\nconst VECTOR_TYPES = [SVG]\n\nconst inflightRequests = new Map<string, Promise<undefined>>()\n\nexport async function imageOptimizer(\n server: Server,\n req: IncomingMessage,\n res: ServerResponse,\n parsedUrl: UrlWithParsedQuery,\n nextConfig: NextConfig,\n distDir: string\n) {\n const imageData: ImageConfig = nextConfig.images || imageConfigDefault\n const { deviceSizes = [], imageSizes = [], domains = [], loader } = imageData\n\n if (loader !== 'default') {\n await server.render404(req, res, parsedUrl)\n return { finished: true }\n }\n\n const { headers } = req\n const { url, w, q } = parsedUrl.query\n const mimeType = getSupportedMimeType(MODERN_TYPES, headers.accept)\n let href: string\n\n if (!url) {\n res.statusCode = 400\n res.end('\"url\" parameter is required')\n return { finished: true }\n } else if (Array.isArray(url)) {\n res.statusCode = 400\n res.end('\"url\" parameter cannot be an array')\n return { finished: true }\n }\n\n let isAbsolute: boolean\n\n if (url.startsWith('/')) {\n href = url\n isAbsolute = false\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 res.statusCode = 400\n res.end('\"url\" parameter is invalid')\n return { finished: true }\n }\n\n if (!['http:', 'https:'].includes(hrefParsed.protocol)) {\n res.statusCode = 400\n res.end('\"url\" parameter is invalid')\n return { finished: true }\n }\n\n if (!domains.includes(hrefParsed.hostname)) {\n res.statusCode = 400\n res.end('\"url\" parameter is not allowed')\n return { finished: true }\n }\n }\n\n if (!w) {\n res.statusCode = 400\n res.end('\"w\" parameter (width) is required')\n return { finished: true }\n } else if (Array.isArray(w)) {\n res.statusCode = 400\n res.end('\"w\" parameter (width) cannot be an array')\n return { finished: true }\n }\n\n if (!q) {\n res.statusCode = 400\n res.end('\"q\" parameter (quality) is required')\n return { finished: true }\n } else if (Array.isArray(q)) {\n res.statusCode = 400\n res.end('\"q\" parameter (quality) cannot be an array')\n return { finished: true }\n }\n\n // Should match output from next-image-loader\n const isStatic = url.startsWith('/_next/static/image')\n\n const width = parseInt(w, 10)\n\n if (!width || isNaN(width)) {\n res.statusCode = 400\n res.end('\"w\" parameter (width) must be a number greater than 0')\n return { finished: true }\n }\n\n const sizes = [...deviceSizes, ...imageSizes]\n\n if (!sizes.includes(width)) {\n res.statusCode = 400\n res.end(`\"w\" parameter (width) of ${width} is not allowed`)\n return { finished: true }\n }\n\n const quality = parseInt(q)\n\n if (isNaN(quality) || quality < 1 || quality > 100) {\n res.statusCode = 400\n res.end('\"q\" parameter (quality) must be a number between 1 and 100')\n return { finished: true }\n }\n\n const hash = getHash([CACHE_VERSION, href, width, quality, mimeType])\n const imagesDir = join(distDir, 'cache', 'images')\n const hashDir = join(imagesDir, hash)\n const now = Date.now()\n\n // If there're concurrent requests hitting the same resource and it's still\n // being optimized, wait before accessing the cache.\n if (inflightRequests.has(hash)) {\n await inflightRequests.get(hash)\n }\n let dedupeResolver: (val?: PromiseLike<undefined>) => void\n inflightRequests.set(\n hash,\n new Promise((resolve) => (dedupeResolver = resolve))\n )\n\n try {\n if (await fileExists(hashDir, 'directory')) {\n const files = await promises.readdir(hashDir)\n for (let file of files) {\n const [prefix, etag, extension] = file.split('.')\n const expireAt = Number(prefix)\n const contentType = getContentType(extension)\n const fsPath = join(hashDir, file)\n if (now < expireAt) {\n res.setHeader(\n 'Cache-Control',\n isStatic\n ? 'public, max-age=315360000, immutable'\n : 'public, max-age=0, must-revalidate'\n )\n if (sendEtagResponse(req, res, etag)) {\n return { finished: true }\n }\n if (contentType) {\n res.setHeader('Content-Type', contentType)\n }\n createReadStream(fsPath).pipe(res)\n return { finished: true }\n } else {\n await promises.unlink(fsPath)\n }\n }\n }\n\n let upstreamBuffer: Buffer\n let upstreamType: string | null\n let maxAge: number\n\n if (isAbsolute) {\n const upstreamRes = await fetch(href)\n\n if (!upstreamRes.ok) {\n res.statusCode = upstreamRes.status\n res.end('\"url\" parameter is valid but upstream response is invalid')\n return { finished: true }\n }\n\n res.statusCode = upstreamRes.status\n upstreamBuffer = Buffer.from(await upstreamRes.arrayBuffer())\n upstreamType = upstreamRes.headers.get('Content-Type')\n maxAge = getMaxAge(upstreamRes.headers.get('Cache-Control'))\n } else {\n try {\n const resBuffers: Buffer[] = []\n const mockRes: any = new Stream.Writable()\n\n const isStreamFinished = new Promise(function (resolve, reject) {\n mockRes.on('finish', () => resolve(true))\n mockRes.on('end', () => resolve(true))\n mockRes.on('error', () => reject())\n })\n\n mockRes.write = (chunk: Buffer | string) => {\n resBuffers.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n mockRes._write = (chunk: Buffer | string) => {\n mockRes.write(chunk)\n }\n\n const mockHeaders: Record<string, string | string[]> = {}\n\n mockRes.writeHead = (_status: any, _headers: any) =>\n Object.assign(mockHeaders, _headers)\n mockRes.getHeader = (name: string) => mockHeaders[name.toLowerCase()]\n mockRes.getHeaders = () => mockHeaders\n mockRes.getHeaderNames = () => Object.keys(mockHeaders)\n mockRes.setHeader = (name: string, value: string | string[]) =>\n (mockHeaders[name.toLowerCase()] = value)\n mockRes._implicitHeader = () => {}\n mockRes.finished = false\n mockRes.statusCode = 200\n\n const mockReq: any = new Stream.Readable()\n\n mockReq._read = () => {\n mockReq.emit('end')\n mockReq.emit('close')\n return Buffer.from('')\n }\n\n mockReq.headers = req.headers\n mockReq.method = req.method\n mockReq.url = href\n\n await server.getRequestHandler()(\n mockReq,\n mockRes,\n nodeUrl.parse(href, true)\n )\n await isStreamFinished\n res.statusCode = mockRes.statusCode\n\n upstreamBuffer = Buffer.concat(resBuffers)\n upstreamType = mockRes.getHeader('Content-Type')\n maxAge = getMaxAge(mockRes.getHeader('Cache-Control'))\n } catch (err) {\n res.statusCode = 500\n res.end('\"url\" parameter is valid but upstream response is invalid')\n return { finished: true }\n }\n }\n\n const expireAt = maxAge * 1000 + now\n\n if (upstreamType) {\n const vector = VECTOR_TYPES.includes(upstreamType)\n const animate =\n ANIMATABLE_TYPES.includes(upstreamType) && isAnimated(upstreamBuffer)\n if (vector || animate) {\n await writeToCacheDir(hashDir, upstreamType, expireAt, upstreamBuffer)\n sendResponse(req, res, upstreamType, upstreamBuffer, isStatic)\n return { finished: true }\n }\n\n // If upstream type is not a valid image type, return 400 error.\n if (!upstreamType.startsWith('image/')) {\n res.statusCode = 400\n res.end(\"The requested resource isn't a valid image.\")\n return { finished: true }\n }\n }\n\n let contentType: string\n\n if (mimeType) {\n contentType = mimeType\n } else if (\n upstreamType?.startsWith('image/') &&\n getExtension(upstreamType)\n ) {\n contentType = upstreamType\n } else {\n contentType = JPEG\n }\n\n try {\n const orientation = await getOrientation(upstreamBuffer)\n\n const operations: Operation[] = []\n\n if (orientation === Orientation.RIGHT_TOP) {\n operations.push({ type: 'rotate', numRotations: 1 })\n } else if (orientation === Orientation.BOTTOM_RIGHT) {\n operations.push({ type: 'rotate', numRotations: 2 })\n } else if (orientation === Orientation.LEFT_BOTTOM) {\n operations.push({ type: 'rotate', numRotations: 3 })\n } else {\n // TODO: support more orientations\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n // const _: never = orientation\n }\n\n operations.push({ type: 'resize', width })\n\n let optimizedBuffer: Buffer | undefined\n //if (contentType === AVIF) {\n //} else\n if (contentType === WEBP) {\n optimizedBuffer = await processBuffer(\n upstreamBuffer,\n operations,\n 'webp',\n quality\n )\n } else if (contentType === PNG) {\n optimizedBuffer = await processBuffer(\n upstreamBuffer,\n operations,\n 'png',\n quality\n )\n } else if (contentType === JPEG) {\n optimizedBuffer = await processBuffer(\n upstreamBuffer,\n operations,\n 'jpeg',\n quality\n )\n }\n\n if (optimizedBuffer) {\n await writeToCacheDir(hashDir, contentType, expireAt, optimizedBuffer)\n sendResponse(req, res, contentType, optimizedBuffer, isStatic)\n } else {\n throw new Error('Unable to optimize buffer')\n }\n } catch (error) {\n sendResponse(req, res, upstreamType, upstreamBuffer, isStatic)\n }\n\n return { finished: true }\n } finally {\n // Make sure to remove the hash in the end.\n dedupeResolver!()\n inflightRequests.delete(hash)\n }\n}\n\nasync function writeToCacheDir(\n dir: string,\n contentType: string,\n expireAt: number,\n buffer: Buffer\n) {\n await promises.mkdir(dir, { recursive: true })\n const extension = getExtension(contentType)\n const etag = getHash([buffer])\n const filename = join(dir, `${expireAt}.${etag}.${extension}`)\n await promises.writeFile(filename, buffer)\n}\n\nfunction sendResponse(\n req: IncomingMessage,\n res: ServerResponse,\n contentType: string | null,\n buffer: Buffer,\n isStatic: boolean\n) {\n const etag = getHash([buffer])\n res.setHeader(\n 'Cache-Control',\n isStatic\n ? 'public, max-age=315360000, immutable'\n : 'public, max-age=0, must-revalidate'\n )\n if (sendEtagResponse(req, res, etag)) {\n return\n }\n if (contentType) {\n res.setHeader('Content-Type', contentType)\n }\n res.end(buffer)\n}\n\nfunction getSupportedMimeType(options: string[], accept = ''): string {\n const mimeType = mediaType(accept, options)\n return accept.includes(mimeType) ? mimeType : ''\n}\n\nfunction 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#Filenames\n return hash.digest('base64').replace(/\\//g, '-')\n}\n\nfunction parseCacheControl(str: string | null): 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('=')\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): number {\n const minimum = 60\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 Math.max(n, minimum)\n }\n }\n return minimum\n}\n"]}
\No newline at end of file