From 08786ed4d78956d6efbc025b3f6ec6f5f4150f69 Mon Sep 17 00:00:00 2001 From: mbaharip <62494292+mbahArip@users.noreply.github.com> Date: Fri, 31 Jan 2025 15:30:49 +0700 Subject: [PATCH] wip: test stream download(?) --- src/app/api/test/fileSize/route.ts | 111 +++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/app/api/test/fileSize/route.ts diff --git a/src/app/api/test/fileSize/route.ts b/src/app/api/test/fileSize/route.ts new file mode 100644 index 0000000..2f5ad7f --- /dev/null +++ b/src/app/api/test/fileSize/route.ts @@ -0,0 +1,111 @@ +import { type NextRequest, NextResponse } from "next/server"; +import stream from "stream"; +import { promisify } from "util"; + +import { gdrive } from "~/lib/utils.server"; + +const pipeline = promisify(stream.pipeline); +const fileId = "1KvMU9sy8fQKKmVKU5xf_u3Y2JZefe0kt"; + +export async function GET(request: NextRequest) { + try { + const start = Date.now(); + console.log("Fetching metadata", Date.now() - start); + const meta = await gdrive.files.get({ + fileId, + fields: "size,mimeType,name", + supportsAllDrives: true, + }); + const { data: metadata } = meta; + + console.log("Fetching file", Date.now() - start); + // const data = await gdrive.files.get( + // { + // fileId: fileId, + // alt: "media", + // acknowledgeAbuse: true, + // }, + // { + // responseType: "stream", + // }, + // ); + + console.log("Setting headers", Date.now() - start); + const headers = new Headers(); + headers.set("Content-Type", metadata.mimeType ?? "application/octet-stream"); + if (metadata.size) headers.set("Content-Length", metadata.size.toString()); + headers.set("Content-Disposition", `attachment; filename="${metadata.name}"`); + + // console.log("Streaming file", Date.now() - start); + // const contentStream = data.data; + // const webStream = new ReadableStream({ + // async start(controller) { + // contentStream.on("data", (chunk) => { + // controller.enqueue(chunk); + // }); + // contentStream.on("end", () => { + // controller.close(); + // }); + // contentStream.on("error", (err) => { + // console.error(err); + // controller.error(err); + // }); + // }, + // cancel() { + // contentStream.destroy(); + // }, + // }); + + // console.log("Returning response", Date.now() - start); + return new Response( + new ReadableStream({ + async start(controller) { + try { + gdrive.files.get( + { + fileId: fileId, + alt: "media", + acknowledgeAbuse: true, + supportsAllDrives: true, + }, + { + responseType: "stream", + }, + (err, res) => { + if (err) throw err; + res?.data + .on("data", (chunk) => { + controller.enqueue(chunk); + }) + .on("end", () => { + controller.close(); + }) + .on("error", (err) => { + console.error(err); + controller.error(err); + }); + }, + ); + } catch (error) { + controller.error(error); + console.error(error); + } + }, + }), + { + headers, + }, + ); + } catch (error) { + const e = error as Error; + console.error(e); + return NextResponse.json( + { + error: e.message, + }, + { + status: 500, + }, + ); + } +}