rsnext/packages/next/server/serve-static.ts
Sukka 3466862d9d
fix(#39706): add avif support for node serve static (#39733)
The PR fixes #39706 by adding `avif` mime type directly to `send`. The PR also removes the previous avif workaround for image optimizer.

Note: The PR is still a workaround for now. I will submit a PR to `pillarjs/send` to help them update `mime` to fix the issue once and for all. But now `send.mime.define` just works.

## Bug

- [x] Related issues linked using `fixes #number`
- [x] Integration tests added
- [ ] Errors have helpful link attached, see `contributing.md`
2022-08-18 17:57:12 +00:00

47 lines
1.2 KiB
TypeScript

import { IncomingMessage, ServerResponse } from 'http'
import send from 'next/dist/compiled/send'
// TODO: Remove this once "send" has updated the "mime", or next.js use custom version of "mime"
// Although "mime" has already add avif in version 2.4.7, "send" is still using mime@1.6.0
send.mime.define({
'image/avif': ['avif'],
})
export function serveStatic(
req: IncomingMessage,
res: ServerResponse,
path: string
): Promise<void> {
return new Promise((resolve, reject) => {
send(req, path)
.on('directory', () => {
// We don't allow directories to be read.
const err: any = new Error('No directory access')
err.code = 'ENOENT'
reject(err)
})
.on('error', reject)
.pipe(res)
.on('finish', resolve)
})
}
export function getContentType(extWithoutDot: string): string | null {
const { mime } = send
if ('getType' in mime) {
// 2.0
return mime.getType(extWithoutDot)
}
// 1.0
return (mime as any).lookup(extWithoutDot)
}
export function getExtension(contentType: string): string | null {
const { mime } = send
if ('getExtension' in mime) {
// 2.0
return mime.getExtension(contentType)
}
// 1.0
return (mime as any).extension(contentType)
}