feature: use bun archive instead of tar package (#678)

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2026-10-25 19:52:26 +01:00
1 parent 2135c6b9f1
commit 64cd0130d3
4 files changed
+55 -44

No files matched your search

+37 -11
View File
@@ -1,14 +1,17 @@
import { randomUUID } from "node:crypto";
import { rename, unlink } from "node:fs/promises";
import path from "node:path";
import { Elysia } from "elysia";
import sanitize from "sanitize-filename";
import * as tar from "tar";
import { outputDir } from "..";
import db from "../db/db";
import { WEBROOT } from "../helpers/env";
import { userService } from "./user";
const archiveBuilds = new Map<string, Promise<void>>();
export const download = new Elysia()
.use(userService)
.get(
@@ -55,16 +58,39 @@ export const download = new Elysia()
const outputPath = `${outputDir}${userId}/${jobId}`;
const outputTar = path.join(outputPath, `converted_files_${jobId}.tar`);
await tar.create(
{
file: outputTar,
cwd: outputPath,
filter: (path) => {
return !path.match(".*\\.tar");
},
},
["."],
);
const archiveKey = `${userId}/${jobId}`;
let archiveBuild = archiveBuilds.get(archiveKey);
if (!archiveBuild) {
const build = async () => {
const outputTarName = path.basename(outputTar);
const outputTarTempName = `${outputTarName}.tmp-${randomUUID()}`;
const outputTarTemp = path.join(outputPath, outputTarTempName);
try {
const files: Record<string, Uint8Array> = {};
const glob = new Bun.Glob("**/*");
for await (const file of glob.scan({ cwd: outputPath, onlyFiles: true, dot: true })) {
if (file !== outputTarName && !file.startsWith(`${outputTarName}.tmp-`)) {
files[file] = new Uint8Array(
await Bun.file(path.join(outputPath, file)).arrayBuffer(),
);
}
}
await Bun.Archive.write(outputTarTemp, files);
await rename(outputTarTemp, outputTar);
} finally {
if (await Bun.file(outputTarTemp).exists()) {
await unlink(outputTarTemp);
}
}
};
archiveBuild = build().finally(() => {
archiveBuilds.delete(archiveKey);
});
archiveBuilds.set(archiveKey, archiveBuild);
}
await archiveBuild;
return Bun.file(outputTar);
},
{