mirror of
https://github.com/C4illin/ConvertX.git
synced 2026-11-12 17:20:54 +01:00
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:
4 files changed
+55
-44
No files matched your search
+37
-11
@@ -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);
|
||||
},
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user