35 lines
990 B
TypeScript
35 lines
990 B
TypeScript
import { createReadStream } from "node:fs";
|
|
import { rm } from "node:fs/promises";
|
|
import { Readable } from "node:stream";
|
|
import { takeJob } from "@/lib/jobs";
|
|
|
|
export const runtime = "nodejs";
|
|
export const dynamic = "force-dynamic";
|
|
|
|
export async function GET(
|
|
_req: Request,
|
|
context: { params: Promise<{ jobId: string }> },
|
|
): Promise<Response> {
|
|
const { jobId } = await context.params;
|
|
const job = takeJob(jobId);
|
|
if (!job) {
|
|
return Response.json({ error: "Download expired or not found" }, { status: 404 });
|
|
}
|
|
|
|
const file = createReadStream(job.zipPath);
|
|
file.on("close", () => {
|
|
void rm(job.dir, { recursive: true, force: true });
|
|
});
|
|
file.on("error", () => {
|
|
void rm(job.dir, { recursive: true, force: true });
|
|
});
|
|
|
|
return new Response(Readable.toWeb(file) as ReadableStream, {
|
|
headers: {
|
|
"Content-Type": "application/zip",
|
|
"Content-Disposition": 'attachment; filename="ids.zip"',
|
|
"Cache-Control": "no-store",
|
|
},
|
|
});
|
|
}
|