Working (only tested Split yet but im tired)

This commit is contained in:
Felix Kaspar
2023-11-14 23:14:08 +01:00
parent d7feec32dd
commit 85d61fddf0
12 changed files with 164 additions and 136 deletions

View File

@@ -1,5 +1,5 @@
{
"watch": ["src"],
"watch": ["src", "../shared-operations/src"],
"ext": "ts,json",
"ignore": ["src/**/*.spec.ts"],
"exec": "node --trace-warnings --experimental-specifier-resolution=node --loader ts-node/esm ./src/index.ts"

View File

@@ -25,6 +25,7 @@
},
"devDependencies": {
"@types/express": "^4.17.21",
"@types/multer": "^1.4.10",
"ts-node-dev": "^2.0.0",
"typescript": "^5.2.2"
},

View File

@@ -7,6 +7,7 @@ const upload = multer();
import Operations from "../../utils/pdf-operations";
import { traverseOperations } from "@stirling-pdf/shared-operations/src/workflow/traverseOperations";
import { PdfFile, RepresentationType } from '@stirling-pdf/shared-operations/src/wrappers/PdfFile';
const activeWorkflows: any = {};
@@ -24,82 +25,78 @@ router.post("/:workflowUuid?", [
// TODO: Validate input further (json may be invalid or not be in workflow format)
const workflow = JSON.parse(req.body.workflow);
// TODO: Replace with static multer function of pdffile
const inputs = await Promise.all((req.files as Express.Multer.File[]).map(async file => {
console.log(file);
return {
originalFileName: file.originalname.replace(/\.[^/.]+$/, ""),
fileName: file.originalname.replace(/\.[^/.]+$/, ""),
buffer: new Uint8Array(await file.buffer)
}
return new PdfFile(file.originalname.replace(/\.[^/.]+$/, ""), new Uint8Array(await file.buffer), RepresentationType.Uint8Array, file.originalname.replace(/\.[^/.]+$/, ""));
}));
// TODO: Enable if traverse & organize migration is done.
// // Allow option to do it synchronously and just make a long request
// if(req.body.async === "false") {
// console.log("Don't do async");
// Allow option to do it synchronously and just make a long request
if(req.body.async === "false") {
console.log("Don't do async");
// const traverse = traverseOperations(workflow.operations, inputs, Operations);
const traverse = traverseOperations(workflow.operations, inputs, Operations);
// let pdfResults;
// let iteration;
// while (true) {
// iteration = await traverse.next();
// if (iteration.done) {
// pdfResults = iteration.value;
// console.log("Done");
// break;
// }
// console.log(iteration.value);
// }
let pdfResults;
let iteration;
while (true) {
iteration = await traverse.next();
if (iteration.done) {
pdfResults = iteration.value;
console.log("Done");
break;
}
console.log(iteration.value);
}
// console.log("Download");
// downloadHandler(res, pdfResults);
// }
// else {
// console.log("Start Aync Workflow");
// // TODO: UUID collision checks
// let workflowID = req.params.workflowUuid
// if(!workflowID)
// workflowID = generateWorkflowID();
console.log("Download");
await downloadHandler(res, pdfResults);
}
else {
console.log("Start Aync Workflow");
// TODO: UUID collision checks
let workflowID = req.params.workflowUuid
if(!workflowID)
workflowID = generateWorkflowID();
// activeWorkflows[workflowID] = {
// createdAt: Date.now(),
// finished: false,
// eventStream: null,
// result: null,
// // TODO: When auth is implemented: owner
// }
// const activeWorkflow = activeWorkflows[workflowID];
activeWorkflows[workflowID] = {
createdAt: Date.now(),
finished: false,
eventStream: null,
result: null,
// TODO: When auth is implemented: owner
}
const activeWorkflow = activeWorkflows[workflowID];
// res.status(200).json({
// "workflowID": workflowID,
// "data-recieved": {
// "fileCount": filesArr.length,
// "workflow": workflow
// }
// });
res.status(200).json({
"workflowID": workflowID,
"data-recieved": {
"fileCount": inputs.length,
"workflow": workflow
}
});
// const traverse = traverseOperations(workflow.operations, inputs, Operations);
const traverse = traverseOperations(workflow.operations, inputs, Operations);
// let pdfResults;
// let iteration;
// while (true) {
// iteration = await traverse.next();
// if (iteration.done) {
// pdfResults = iteration.value;
// if(activeWorkflow.eventStream) {
// activeWorkflow.eventStream.write(`data: processing done\n\n`);
// activeWorkflow.eventStream.end();
// }
// break;
// }
// if(activeWorkflow.eventStream)
// activeWorkflow.eventStream.write(`data: ${iteration.value}\n\n`);
// }
let pdfResults;
let iteration;
while (true) {
iteration = await traverse.next();
if (iteration.done) {
pdfResults = iteration.value;
if(activeWorkflow.eventStream) {
activeWorkflow.eventStream.write(`data: processing done\n\n`);
activeWorkflow.eventStream.end();
}
break;
}
if(activeWorkflow.eventStream)
activeWorkflow.eventStream.write(`data: ${iteration.value}\n\n`);
}
// activeWorkflow.result = pdfResults;
// activeWorkflow.finished = true;
// }
activeWorkflow.result = pdfResults;
activeWorkflow.finished = true;
}
}
]);
@@ -146,7 +143,7 @@ router.get("/progress-stream/:workflowUuid", (req: Request, res: Response) => {
});
});
router.get("/result/:workflowUuid", (req: Request, res: Response) => {
router.get("/result/:workflowUuid", async (req: Request, res: Response) => {
if(!req.params.workflowUuid) {
res.status(400).json({"error": "No workflowUuid weres provided."});
return;
@@ -167,7 +164,7 @@ router.get("/result/:workflowUuid", (req: Request, res: Response) => {
return
}
downloadHandler(res, workflow.result);
await downloadHandler(res, workflow.result);
// Delete workflow / results when done.
delete activeWorkflows[req.params.workflowUuid];
});
@@ -190,7 +187,7 @@ function generateWorkflowID() {
return crypto.randomUUID();
}
function downloadHandler(res: Response, pdfResults: any) {
async function downloadHandler(res: Response, pdfResults: PdfFile[]) {
if(pdfResults.length == 0) {
res.status(500).json({"warning": "The workflow had no outputs."});
}
@@ -211,7 +208,7 @@ function downloadHandler(res: Response, pdfResults: any) {
for (let i = 0; i < pdfResults.length; i++) {
// TODO: Implement other file types (mostly fro image & text extraction)
// TODO: Check for name collisions
zip.append(Buffer.from(pdfResults[i].buffer), { name: pdfResults[i].fileName + ".pdf" });
zip.append(Buffer.from(await pdfResults[i].uint8Array), { name: pdfResults[i].filename + ".pdf" });
}
zip.finalize();
@@ -219,10 +216,10 @@ function downloadHandler(res: Response, pdfResults: any) {
}
else {
const readStream = new stream.PassThrough();
readStream.end(pdfResults[0].buffer);
readStream.end(pdfResults[0].uint8Array);
// TODO: Implement other file types (mostly fro image & text extraction)
res.set("Content-disposition", 'attachment; filename=' + pdfResults[0].fileName + ".pdf");
res.set("Content-disposition", 'attachment; filename=' + pdfResults[0].filename + ".pdf");
res.set("Content-Type", "application/pdf");
readStream.pipe(res);

View File

@@ -3,7 +3,7 @@ import fs from 'fs';
import os from 'os';
import path from 'path';
import { exec, spawn } from 'child_process'
import { PdfFile, fromUint8Array } from '@stirling-pdf/shared-operations/src/wrappers/PdfFile'
import { PdfFile, RepresentationType } from '@stirling-pdf/shared-operations/src/wrappers/PdfFile'
export async function fileToPdf(byteArray: Uint8Array, filename: string): Promise<PdfFile> {
const parentDir = path.join(os.tmpdir(), "StirlingPDF");
@@ -22,7 +22,7 @@ export async function fileToPdf(byteArray: Uint8Array, filename: string): Promis
fs.rmdirSync(tempDir);
return fromUint8Array(outputBytes, outputFileName);
return new PdfFile(outputFileName, outputBytes, RepresentationType.Uint8Array);
}
export function isLibreOfficeInstalled() {