Working (only tested Split yet but im tired)
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user