import { createReadStream, statSync } from "node:fs"; import { Readable } from "node:stream"; import type { NextRequest } from "next/server"; export function streamVideoFile(req: NextRequest, filePath: string, downloadName: string): Response { let size: number; try { size = statSync(filePath).size; } catch { return new Response("File not found on disk", { status: 404 }); } const headers: Record = { "Content-Type": "video/mp4", "Accept-Ranges": "bytes", }; if (req.nextUrl.searchParams.get("download") === "1") { headers["Content-Disposition"] = `attachment; filename="${downloadName}"`; } const range = req.headers.get("range"); const match = range ? /bytes=(\d+)-(\d*)/.exec(range) : null; if (match) { const start = Number(match[1]); const end = match[2] ? Number(match[2]) : size - 1; const stream = createReadStream(filePath, { start, end }); return new Response(Readable.toWeb(stream) as ReadableStream, { status: 206, headers: { ...headers, "Content-Range": `bytes ${start}-${end}/${size}`, "Content-Length": String(end - start + 1), }, }); } const stream = createReadStream(filePath); return new Response(Readable.toWeb(stream) as ReadableStream, { headers: { ...headers, "Content-Length": String(size) }, }); }