mirror of
https://github.com/Drop-OSS/drop
synced 2026-08-27 14:23:05 -04:00
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:
parent
aa1de921ee
commit
a520d52ad3
4 changed files with 30 additions and 19 deletions
|
|
@ -1 +1 @@
|
|||
Subproject commit 4c42edf5adfa755c33bc8ce7bf1ddec87a0963a8
|
||||
Subproject commit 06bea063633ed4bf7513e29ad7149bc067561199
|
||||
|
|
@ -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,
|
||||
],
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -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,21 +49,27 @@ 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 gameReadStream = await libraryManager.readFile(
|
||||
context.libraryId,
|
||||
context.libraryPath,
|
||||
context.versionName,
|
||||
file.filename,
|
||||
{ start: file.start, end: file.end },
|
||||
);
|
||||
if (!gameReadStream)
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
statusMessage: "Failed to create read stream",
|
||||
});
|
||||
const streams = await Promise.all(
|
||||
streamFiles.map(async (file) => {
|
||||
const gameReadStream = await libraryManager.readFile(
|
||||
context.libraryId,
|
||||
context.libraryPath,
|
||||
context.versionName,
|
||||
file.filename,
|
||||
{ start: file.start, end: file.end },
|
||||
);
|
||||
if (!gameReadStream)
|
||||
throw createError({
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
export default defineEventHandler(async () => {
|
||||
// await new Promise((r) => setTimeout(r, 700));
|
||||
// await new Promise((r) => setTimeout(r, 1400));
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue