refactor: simplify stream handling and ensure zip closure in renderComicPage function
This commit is contained in:
parent
837c87fba4
commit
d6dae83f20
1 changed files with 26 additions and 39 deletions
|
@ -51,44 +51,7 @@ export async function renderComicPage({ path, page, reqHeaders, set }: RenderOpt
|
||||||
}
|
}
|
||||||
|
|
||||||
const readStream = await createReadableStreamFromZip(zip.reader, entry);
|
const readStream = await createReadableStreamFromZip(zip.reader, entry);
|
||||||
const nodeReadable = new Readable({
|
|
||||||
read() {
|
|
||||||
// noop
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
let zipClosed = false;
|
|
||||||
const closeZip = async () => {
|
|
||||||
if (!zipClosed) {
|
|
||||||
zipClosed = true;
|
|
||||||
await zip.reader.close();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
readStream.pipeTo(new WritableStream({
|
|
||||||
write(chunk) {
|
|
||||||
nodeReadable.push(chunk);
|
|
||||||
},
|
|
||||||
close() {
|
|
||||||
nodeReadable.push(null);
|
|
||||||
},
|
|
||||||
abort(err) {
|
|
||||||
nodeReadable.destroy(err);
|
|
||||||
},
|
|
||||||
})).catch((err) => {
|
|
||||||
nodeReadable.destroy(err);
|
|
||||||
});
|
|
||||||
|
|
||||||
nodeReadable.on("close", () => {
|
|
||||||
closeZip().catch(console.error);
|
|
||||||
});
|
|
||||||
nodeReadable.on("error", () => {
|
|
||||||
closeZip().catch(console.error);
|
|
||||||
});
|
|
||||||
nodeReadable.on("end", () => {
|
|
||||||
closeZip().catch(console.error);
|
|
||||||
});
|
|
||||||
|
|
||||||
const ext = entry.filename.split(".").pop()?.toLowerCase() ?? "jpeg";
|
const ext = entry.filename.split(".").pop()?.toLowerCase() ?? "jpeg";
|
||||||
headers["Content-Type"] = extensionToMime(ext);
|
headers["Content-Type"] = extensionToMime(ext);
|
||||||
if (typeof entry.uncompressedSize === "number") {
|
if (typeof entry.uncompressedSize === "number") {
|
||||||
|
@ -96,7 +59,31 @@ export async function renderComicPage({ path, page, reqHeaders, set }: RenderOpt
|
||||||
}
|
}
|
||||||
|
|
||||||
set.status = 200;
|
set.status = 200;
|
||||||
return nodeReadable;
|
|
||||||
|
// Ensure zip file is closed after stream ends
|
||||||
|
const streamWithCleanup = new ReadableStream({
|
||||||
|
async start(controller) {
|
||||||
|
try {
|
||||||
|
const reader = readStream.getReader();
|
||||||
|
while (true) {
|
||||||
|
const { done, value } = await reader.read();
|
||||||
|
if (done) break;
|
||||||
|
controller.enqueue(value);
|
||||||
|
}
|
||||||
|
controller.close();
|
||||||
|
} catch (error) {
|
||||||
|
controller.error(error);
|
||||||
|
throw error;
|
||||||
|
} finally {
|
||||||
|
await zip.reader.close();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cancel: async () => {
|
||||||
|
await zip.reader.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return streamWithCleanup
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
await zip.reader.close();
|
await zip.reader.close();
|
||||||
throw error;
|
throw error;
|
||||||
|
|
Loading…
Add table
Reference in a new issue