Files
arkvault/src/routes/api/file/[id=int]/[[thumbnail=thumbnail]]/download/+server.ts
T

41 lines
1.4 KiB
TypeScript

import { authorize } from "#lib/server/auth.ts";
import { handleAppErrors } from "#lib/server/http.ts";
import { FileService } from "#lib/server/services/index.ts";
import { parseRangeHeader, getContentRangeHeader } from "#lib/shared/http.ts";
import type { RequestEvent, RequestHandler } from "./$types";
const downloadHandler = async ({ locals, params, request }: RequestEvent) => {
const { userId } = await authorize(locals, "activeClient");
const { id } = params;
const getStream = params.thumbnail
? FileService.getFileThumbnailStream
: FileService.getFileStream;
const { encContentStream, range, isRangeRequest } = await getStream(
userId,
id,
parseRangeHeader(request.headers.get("Range")),
);
return {
stream: encContentStream,
status: isRangeRequest ? 206 : 200,
headers: {
"Accept-Ranges": "bytes",
"Content-Length": String(range.end - range.start + 1),
"Content-Type": "application/octet-stream",
...(isRangeRequest ? getContentRangeHeader(range) : {}),
},
};
};
export const GET: RequestHandler = handleAppErrors(async (event) => {
const { stream, ...init } = await downloadHandler(event);
return new Response(stream as ReadableStream, init);
});
export const HEAD: RequestHandler = handleAppErrors(async (event) => {
const { stream, ...init } = await downloadHandler(event);
await stream.cancel();
return new Response(null, init);
});