pdfcpu & wasm update, server side functions init, README.md, CONTRIBUTE.md

This commit is contained in:
Felix Kaspar
2023-10-18 23:56:56 +02:00
parent 21e0385a31
commit c60de02e14
16 changed files with 360 additions and 32 deletions

View File

@@ -1,5 +1,14 @@
import * as pdfcpuWraopper from "../wasm/pdfcpu-wrapper.js";
import * as pdfcpuWraopper from "../wasm/pdfcpu-wrapper-browser.js";
export function impose(snapshot, nup, format) {
return pdfcpuWraopper.impose(snapshot, nup, format);
export async function impose(snapshot, nup, format) {
return await pdfcpuWraopper.oneToOne([
"pdfcpu.wasm",
"nup",
"-c",
"disable",
'f:' + format,
"/output.pdf",
String(nup),
"input.pdf",
], snapshot);
}

View File

@@ -21,14 +21,12 @@ function configureFs() {
fs = BrowserFS.BFSRequire("fs");
Buffer = BrowserFS.BFSRequire("buffer").Buffer;
// TODO: Find a way to remove these globals:
window.fs = fs;
window.Buffer = Buffer;
}
);
}
// TODO: This needs to be changed in order to run on node
function loadWasm() {
const script = document.createElement("script");
script.src = wasmLocation + "/wasm_exec.js";
@@ -55,7 +53,8 @@ const runWasm = async (param) => {
async function loadFileAsync(data) {
console.log(`Writing file to MemoryFS`);
await fs.writeFile(`/input.pdf`, data);
let exitCode = await runWasm([
console.log(`Write done. Validating...`);
let exitcode = await runWasm([
"pdfcpu.wasm",
"validate",
"-c",
@@ -63,23 +62,21 @@ async function loadFileAsync(data) {
`/input.pdf`,
]);
if (exitCode !== 0)
if (exitcode !== 0)
throw new Error("There was an error validating your PDFs");
console.log(`File is Valid`);
}
export async function impose(snapshot, nup, format) {
};
export async function oneToOne(wasmArray, snapshot) {
await loadFileAsync(Buffer.from(snapshot));
let exitcode = await runWasm([
"pdfcpu.wasm",
"nup",
"-c",
"disable",
'f:' + format,
"output.pdf",
String(nup),
"input.pdf",
]);
console.error("Nuping File");
let exitcode = await runWasm(wasmArray);
if (exitcode !== 0) {
console.error("There was an error nuping your PDFs");
@@ -91,4 +88,16 @@ export async function impose(snapshot, nup, format) {
fs.unlink("output.pdf");
console.log("Your File ist Ready!");
return new Uint8Array(contents);
};
}
export async function manyToOne() {
//TODO: Do this of neccesary for some operations
}
export async function oneToMany() {
//TODO: Do this of neccesary for some operations
}
export async function manyToMany() {
//TODO: Do this of neccesary for some operations
}

View File

@@ -0,0 +1,136 @@
// TODO: Uses the BrowserFS import, needs to be changed for serverside
import { WasmFs } from '@wasmer/wasmfs';
import path from "path";
let webWasmLocation = "/wasm/";
let nodeWasmLocation = "./public/wasm/";
let fs;
const wasmfs = new WasmFs();
(async () => {
await loadWasm();
await configureFs();
})();
async function configureFs() {
// Can't use BrowserFS: https://github.com/jvilk/BrowserFS/issues/271
fs = wasmfs.fs;
global.fs = fs;
console.log("InMemoryFs configured");
}
async function loadWasm() {
global.crypto = (await import("crypto")).webcrypto; // wasm dependecy
await import("./wasm_exec.js");
}
const runWasm = async (param) => {
if (global.cachedWasmResponse === undefined) {
const buffer = (await import("fs")).readFileSync(nodeWasmLocation + "/pdfcpu.wasm");
global.cachedWasmResponse = buffer;
global.go = new Go();
}
const { instance } = await WebAssembly.instantiate(
global.cachedWasmResponse,
global.go.importObject
);
global.go.argv = param;
await global.go.run(instance);
return global.go.exitCode;
};
async function loadFileAsync(data) {
console.log(`Writing file to Disk`);
fs.writeFileSync(`input.pdf`, data);
console.log(`Write done. Validating...`);
let exitcode = await runWasm([
"pdfcpu.wasm",
"validate",
"-c",
"disable",
`input.pdf`,
]);
if (exitcode !== 0)
throw new Error("There was an error validating your PDFs");
// // Get logs of command
// wasmfs.getStdOut().then(response => {
// console.log(response);
// });
console.log(`File is Valid`);
}
export async function oneToOne(wasmArray, snapshot) {
await loadFileAsync(Buffer.from(snapshot));
console.log("Nuping File");
let exitcode = await runWasm(wasmArray);
if (exitcode !== 0) {
console.error("There was an error nuping your PDFs");
return;
}
console.log("Nuping Done");
await checkExistsWithTimeout("/output.pdf", 1000);
console.log("Write started...");
// We need to wait for the file write in memfs to finish in node for some reason
await new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 100);
});
fs.unlinkSync("input.pdf");
const data = fs.readFileSync("/output.pdf");
if(data.length == 0) {
throw Error("File Size 0 that should not happen");
}
fs.unlinkSync("output.pdf");
console.log("Your File ist Ready!");
return new Uint8Array(data);
}
export async function manyToOne() {
//TODO: Do this of neccesary for some operations
}
export async function oneToMany() {
//TODO: Do this of neccesary for some operations
}
export async function manyToMany() {
//TODO: Do this of neccesary for some operations
}
// THX: https://stackoverflow.com/questions/26165725/nodejs-check-file-exists-if-not-wait-till-it-exist
function checkExistsWithTimeout(filePath, timeout) {
return new Promise(function (resolve, reject) {
var timer = setTimeout(function () {
watcher.close();
reject(new Error('File did not exists and was not created during the timeout.'));
}, timeout);
fs.access(filePath, fs.constants.R_OK, function (err) {
if (!err) {
clearTimeout(timer);
watcher.close();
resolve();
}
});
var dir = path.dirname(filePath);
var watcher = fs.watch(dir, function (eventType, filename) {
clearTimeout(timer);
watcher.close();
resolve();
});
});
}