Preallocate download streams (#229)

* feat: pre-allocate streams for high-latency downloads

* fix: update drop-base

* fix: remove debug latency

* fix: lint
This commit is contained in:
DecDuck
2025-08-31 14:50:56 +10:00
committed by GitHub
parent aa1de921ee
commit a520d52ad3
4 changed files with 30 additions and 19 deletions

View File

@ -74,7 +74,8 @@ export default defineNuxtConfig({
vite: {
plugins: [
tailwindcss(),
// eslint-disable-next-line @typescript-eslint/no-explicit-any
tailwindcss() as any,
// only used in dev server, not build because nitro sucks
// see build hook below
viteStaticCopy({
@ -84,7 +85,8 @@ export default defineNuxtConfig({
dest: "twemoji",
},
],
}),
// eslint-disable-next-line @typescript-eslint/no-explicit-any
}) as any,
],
},

View File

@ -9,7 +9,10 @@ const GetChunk = type({
files: type({
filename: "string",
chunkIndex: "number",
}).array(),
})
.array()
.atLeastLength(1)
.atMostLength(256),
}).configure(throwingArktype);
export default defineEventHandler(async (h3) => {
@ -46,7 +49,8 @@ export default defineEventHandler(async (h3) => {
streamFiles.map((e) => e.end - e.start).join(","),
); // Non-standard header, but we're cool like that 😎
for (const file of streamFiles) {
const streams = await Promise.all(
streamFiles.map(async (file) => {
const gameReadStream = await libraryManager.readFile(
context.libraryId,
context.libraryPath,
@ -59,8 +63,13 @@ export default defineEventHandler(async (h3) => {
statusCode: 500,
statusMessage: "Failed to create read stream",
});
return { ...file, stream: gameReadStream };
}),
);
for (const file of streams) {
let length = 0;
await gameReadStream.pipeTo(
await file.stream.pipeTo(
new WritableStream({
write(chunk) {
h3.node.res.write(chunk);

View File

@ -1,3 +1,3 @@
export default defineEventHandler(async () => {
// await new Promise((r) => setTimeout(r, 700));
// await new Promise((r) => setTimeout(r, 1400));
});