From c4a58c459536dc583cfffefef5556f20fa4b822b Mon Sep 17 00:00:00 2001 From: C4illin Date: Tue, 21 May 2024 17:31:02 +0200 Subject: [PATCH] run jobs in parallell --- bun.lockb | Bin 99545 -> 100054 bytes package.json | 2 +- src/converters/main.ts | 48 +++++++++++++++++++++++++---------------- src/index.tsx | 39 ++++++++++++++++++++++++++------- 4 files changed, 62 insertions(+), 27 deletions(-) diff --git a/bun.lockb b/bun.lockb index bc04852b11fe4e6cc637942e7d487b324859b177..5f01d4345b4729be2cdbcca0db075f85fdc1cc6b 100755 GIT binary patch delta 14832 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 C8`kOo diff --git a/package.json b/package.json index 2f0b233..e59dc23 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "@elysiajs/html": "^1.0.2", "@elysiajs/jwt": "^1.0.2", "@elysiajs/static": "^1.0.3", - "elysia": "latest", + "elysia": "^1.0.21", "sharp": "^0.33.4" }, "module": "src/index.tsx", diff --git a/src/converters/main.ts b/src/converters/main.ts index 345649e..3d3ea7f 100644 --- a/src/converters/main.ts +++ b/src/converters/main.ts @@ -64,18 +64,19 @@ export async function mainConverter( targetPath: string, // biome-ignore lint/suspicious/noExplicitAny: options?: any, - converter?: string, + converterName?: string, ) { const fileType = normalizeFiletype(fileTypeOriginal); // biome-ignore lint/suspicious/noExplicitAny: let converterFunc: any; - let converterName = converter; + // let converterName = converterName; - if (converter) { - converterFunc = properties[converter]; + if (converterName) { + converterFunc = properties[converterName]?.converter; } else { // Iterate over each converter in properties + // biome-ignore lint/style/noParameterAssign: for (converterName in properties) { const converterObj = properties[converterName]; @@ -83,9 +84,6 @@ export async function mainConverter( break; } - // if converter properties.from is an object loop thorugh the keys otherwise use the array - // for example ffmpeg is an object eg from: {video: ["mp4", "webm"], audio: ["mp3"]} - for (const key in converterObj.properties.from) { if ( converterObj.properties.from[key].includes(fileType) && @@ -114,17 +112,17 @@ export async function mainConverter( options, ); console.log( - `Converted ${inputFilePath} from ${fileType} to ${convertTo} successfully using ${converter}.`, + `Converted ${inputFilePath} from ${fileType} to ${convertTo} successfully using ${converterName}.`, ); } catch (error) { console.error( - `Failed to convert ${inputFilePath} from ${fileType} to ${convertTo} using ${converter}.`, + `Failed to convert ${inputFilePath} from ${fileType} to ${convertTo} using ${converterName}.`, error, ); } } -const possibleConversions: { [key: string]: string[] } = {}; +const possibleConversions: { [key: string]: { [key: string]: string[] } } = {}; for (const converterName in properties) { const converterProperties = properties[converterName]?.properties; @@ -134,12 +132,16 @@ for (const converterName in properties) { } for (const key in converterProperties.from) { - if (!converterProperties.from[key] || !converterProperties.to[key]) { + if (converterProperties.from[key] === undefined) { continue; } - for (const extension of converterProperties.from[key]) { - possibleConversions[extension] = converterProperties.to[key]; + for (const extension of converterProperties.from[key] ?? []) { + if (!possibleConversions[extension]) { + possibleConversions[extension] = {}; + } + possibleConversions[extension][converterName] = + converterProperties.to[key] || []; } } } @@ -153,19 +155,29 @@ for (const converterName in properties) { // JSON.stringify(possibleConversions), // ); -export const getPossibleConversions = (from: string): string[] => { +export const getPossibleConversions = ( + from: string, +): { [key: string]: string[] } => { const fromClean = normalizeFiletype(from); - return possibleConversions[fromClean] || ([] as string[]); + return possibleConversions[fromClean] || {}; }; -let allTargets: string[] = []; +const allTargets: { [key: string]: string[] | undefined } = {}; for (const converterName in properties) { - const converterProperties = properties[converterName].properties; + const converterProperties = properties[converterName]?.properties; + + if (!converterProperties) { + continue; + } for (const key in converterProperties.to) { - allTargets = allTargets.concat(converterProperties.to[key]); + if (allTargets[converterName]) { + allTargets[converterName].push(...converterProperties.to[key]); + } else { + allTargets[converterName] = converterProperties.to[key]; + } } } diff --git a/src/index.tsx b/src/index.tsx index baa3343..31c6768 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -357,9 +357,14 @@ const app = new Elysia() - {getAllTargets().map((target) => ( + {Object.entries(getAllTargets()).map(([converter, targets]) => ( // biome-ignore lint/correctness/useJsxKeyInIterable: - + + {targets.map((target) => ( + // biome-ignore lint/correctness/useJsxKeyInIterable: + + ))} + ))} @@ -379,9 +384,14 @@ const app = new Elysia() - {getPossibleConversions(body.fileType).map((target) => ( + {Object.entries(getPossibleConversions(body.fileType)).map(([converter, targets]) => ( // biome-ignore lint/correctness/useJsxKeyInIterable: - + + {targets.map((target) => ( + // biome-ignore lint/correctness/useJsxKeyInIterable: + + ))} + ))} ); @@ -503,7 +513,8 @@ const app = new Elysia() ); } - const convertTo = normalizeFiletype(body.convert_to); + const convertTo = normalizeFiletype(body.convert_to.split(",")[0] as string); + const converterName = body.convert_to.split(",")[1]; const fileNames = JSON.parse(body.file_names) as string[]; if (!Array.isArray(fileNames) || fileNames.length === 0) { @@ -520,17 +531,29 @@ const app = new Elysia() "INSERT INTO file_names (job_id, file_name, output_file_name) VALUES (?, ?, ?)", ); - for (const fileName of fileNames) { + // Start the conversion process in the background + Promise.all(fileNames.map(async (fileName) => { const filePath = `${userUploadsDir}${fileName}`; const fileTypeOrig = fileName.split(".").pop() as string; const fileType = normalizeFiletype(fileTypeOrig); const newFileName = fileName.replace(fileTypeOrig, convertTo); const targetPath = `${userOutputDir}${newFileName}`; - await mainConverter(filePath, fileType, convertTo, targetPath); + await mainConverter(filePath, fileType, convertTo, targetPath, {}, converterName); query.run(jobId.value, fileName, newFileName); - } + })) + .then(() => { + // All conversions are done, update the job status to 'completed' + db.run( + "UPDATE jobs SET status = 'completed' WHERE id = ?", + jobId.value, + ); + }) + .catch((error) => { + console.error('Error in conversion process:', error); + }); + // Redirect the client immediately return redirect(`/results/${jobId.value}`); }, {