From ed4c7d9400ce76214e520f64a9d96e93500b9968 Mon Sep 17 00:00:00 2001
From: Saud Fatayerji <saudfatayerji@gmail.com>
Date: Wed, 15 Nov 2023 02:27:21 +0300
Subject: [PATCH] Fixed up straggling errors

---
 client-tauri/src/utils/libre-office-utils.tsx |  4 +--
 client-tauri/src/utils/pdf-operations.ts      | 11 +++++---
 server-node/src/utils/endpoint-utils.ts       |  4 +--
 server-node/src/utils/pdf-operations.ts       |  4 +--
 .../src/functions/common/pdf-utils.ts         | 28 +++++++++----------
 shared-operations/src/functions/splitPDF.ts   |  9 +++---
 shared-operations/src/wrappers/PdfFile.ts     | 25 +++++++++++++++++
 7 files changed, 56 insertions(+), 29 deletions(-)

diff --git a/client-tauri/src/utils/libre-office-utils.tsx b/client-tauri/src/utils/libre-office-utils.tsx
index e254f47e1..78826589c 100644
--- a/client-tauri/src/utils/libre-office-utils.tsx
+++ b/client-tauri/src/utils/libre-office-utils.tsx
@@ -1,6 +1,6 @@
 
 import { readBinaryFile, writeBinaryFile, removeDir, BaseDirectory } from '@tauri-apps/api/fs';
-import { PdfFile, fromUint8Array } from '@stirling-pdf/shared-operations/src/wrappers/PdfFile'
+import { PdfFile,RepresentationType } from '@stirling-pdf/shared-operations/src/wrappers/PdfFile'
 import { runShell } from './tauri-wrapper';
 
 export async function fileToPdf(byteArray: Uint8Array, filename: string): Promise<PdfFile> {
@@ -26,7 +26,7 @@ export async function fileToPdf(byteArray: Uint8Array, filename: string): Promis
 
     await removeDir(tempDir);
 
-    return fromUint8Array(outputBytes, outputFileName);
+    return new PdfFile(outputFileName, outputBytes, RepresentationType.Uint8Array);
 }
 
 export async function isLibreOfficeInstalled() {
diff --git a/client-tauri/src/utils/pdf-operations.ts b/client-tauri/src/utils/pdf-operations.ts
index ee422c523..f943e978f 100644
--- a/client-tauri/src/utils/pdf-operations.ts
+++ b/client-tauri/src/utils/pdf-operations.ts
@@ -1,14 +1,17 @@
 
-import SharedOperations, { OperationsUseages } from '@stirling-pdf/shared-operations/src'
+import SharedOperations, { OperationsType } from '@stirling-pdf/shared-operations/src'
+import { ImposeParamsType } from '@stirling-pdf/shared-operations/src/functions/impose'
+import { PdfFile } from "@stirling-pdf/shared-operations/src/wrappers/PdfFile"
 
 // Import injected libraries here!
 import * as pdfcpuWrapper from "@stirling-pdf/shared-operations/wasm/pdfcpu/pdfcpu-wrapper-browser.js";
 
-async function impose(snapshot: any, nup: number, format: string) {
-    return SharedOperations.impose(snapshot, nup, format, pdfcpuWrapper)
+async function impose(params: ImposeParamsType): Promise<PdfFile> {
+    const paramsToUse = { ...params, pdfcpuWrapper: pdfcpuWrapper };
+    return SharedOperations.impose(paramsToUse);
 }
 
-const toExport: OperationsUseages = {
+const toExport: OperationsType = {
     ...SharedOperations,
     impose,
 }
diff --git a/server-node/src/utils/endpoint-utils.ts b/server-node/src/utils/endpoint-utils.ts
index fce4cffca..7c02bf598 100644
--- a/server-node/src/utils/endpoint-utils.ts
+++ b/server-node/src/utils/endpoint-utils.ts
@@ -12,8 +12,8 @@ export async function respondWithFile(res: Response, bytes: Uint8Array, name: st
 }
 
 export async function respondWithPdfFile(res: Response, file: PdfFile): Promise<void> {
-    const byteFile = await file.convertToByteArrayFile();
-    respondWithFile(res, byteFile.byteArray!, byteFile.filename, "application/pdf");
+    const byteArray = await file.uint8Array;
+    respondWithFile(res, byteArray, file.filename, "application/pdf");
 }
 
 export function response_mustHaveExactlyOneFile(res: Response): void {
diff --git a/server-node/src/utils/pdf-operations.ts b/server-node/src/utils/pdf-operations.ts
index 841fcb73f..f8e9e305f 100644
--- a/server-node/src/utils/pdf-operations.ts
+++ b/server-node/src/utils/pdf-operations.ts
@@ -1,7 +1,7 @@
 
-import SharedOperations, { OperationsType } from "@stirling-pdf/shared-operations/src";
+import SharedOperations, { OperationsType } from "@stirling-pdf/shared-operations/src"
 import { ImposeParamsType } from '@stirling-pdf/shared-operations/src/functions/impose'
-import { PdfFile } from "@stirling-pdf/shared-operations/src/wrappers/PdfFile";
+import { PdfFile } from "@stirling-pdf/shared-operations/src/wrappers/PdfFile"
 
 // Import injected libraries here!
 //import * as pdfcpuWrapper from "@stirling-pdf/shared-operations/wasm/pdfcpu/pdfcpu-wrapper-node.js";
diff --git a/shared-operations/src/functions/common/pdf-utils.ts b/shared-operations/src/functions/common/pdf-utils.ts
index 632cca16c..17c7375e5 100644
--- a/shared-operations/src/functions/common/pdf-utils.ts
+++ b/shared-operations/src/functions/common/pdf-utils.ts
@@ -1,16 +1,16 @@
 
-import { PdfFile, convertAllToPdfLibFile } from '../../wrappers/PdfFile';
+import { PdfFile } from '../../wrappers/PdfFile';
 
 export async function sortPdfs(
         files: PdfFile[],
         sortType: "orderProvided"|"byFileName"|"byDateModified"|"byDateCreated"|"byPDFTitle" = "orderProvided"
     ): Promise<PdfFile[]> {
-
-    const pdfLibFiles = await convertAllToPdfLibFile(files);
     
+    const docCache = await PdfFile.cacheAsPdfLibDocuments(files);
+
     switch(sortType) {
         case "byFileName":
-            pdfLibFiles.sort((a, b) => {
+            files.sort((a, b) => {
                 if (!a || !b) return 0;
                 const ad = a.filename, bd = b.filename;
                 if (!ad || !bd) return 0;
@@ -18,30 +18,30 @@ export async function sortPdfs(
             });
             break;
         case "byDateModified":
-            pdfLibFiles.sort((a, b) => {
-                const ad = a.pdfLib?.getModificationDate()?.getTime();
-                const bd = b.pdfLib?.getModificationDate()?.getTime();
+            files.sort((a, b) => {
+                const ad = docCache.get(a)?.getModificationDate()?.getTime();
+                const bd = docCache.get(b)?.getModificationDate()?.getTime();
                 if (!ad || !bd) return 0;
                 return ad > bd ? 1 : -1
             });
             break;
         case "byDateCreated":
-            pdfLibFiles.sort((a, b) => {
-                const ad = a.pdfLib?.getCreationDate()?.getTime();
-                const bd = b.pdfLib?.getCreationDate()?.getTime();
+            files.sort((a, b) => {
+                const ad = docCache.get(a)?.getCreationDate()?.getTime();
+                const bd = docCache.get(b)?.getCreationDate()?.getTime();
                 if (!ad || !bd) return 0;
                 return ad > bd ? 1 : -1
             });
             break;
         case "byPDFTitle":
-            pdfLibFiles.sort((a, b) => {
-                const ad = a.pdfLib?.getTitle();
-                const bd = b.pdfLib?.getTitle();
+            files.sort((a, b) => {
+                const ad = docCache.get(a)?.getTitle();
+                const bd = docCache.get(b)?.getTitle();
                 if (!ad || !bd) return 0;
                 return ad.localeCompare(bd);
             });
             break;
     }
     
-    return pdfLibFiles;
+    return files;
 }
\ No newline at end of file
diff --git a/shared-operations/src/functions/splitPDF.ts b/shared-operations/src/functions/splitPDF.ts
index 5beba7e8b..1c8907451 100644
--- a/shared-operations/src/functions/splitPDF.ts
+++ b/shared-operations/src/functions/splitPDF.ts
@@ -10,10 +10,9 @@ export type SplitPdfParamsType = {
 export async function splitPDF(params: SplitPdfParamsType): Promise<PdfFile[]> {
     const { file, splitAfterPageArray } = params;
 
-    const byteFile = await file.convertToPdfLibFile();
-    if (!byteFile?.pdfLib) return [];
+    const pdflibDocument = await file.pdflibDocument;
 
-    const numberOfPages = byteFile.pdfLib.getPages().length;
+    const numberOfPages = pdflibDocument.getPages().length;
 
     let pagesArray: number[]  = [];
     let splitAfter = splitAfterPageArray.shift();
@@ -21,13 +20,13 @@ export async function splitPDF(params: SplitPdfParamsType): Promise<PdfFile[]> {
 
     for (let i = 0; i < numberOfPages; i++) {
         if(splitAfter && i > splitAfter && pagesArray.length > 0) {
-            subDocuments.push(await selectPages({file:byteFile, pagesToExtractArray:pagesArray}));
+            subDocuments.push(await selectPages({file, pagesToExtractArray:pagesArray}));
             splitAfter = splitAfterPageArray.shift();
             pagesArray = [];
         }
         pagesArray.push(i);
     }
-    subDocuments.push(await selectPages({file:byteFile, pagesToExtractArray:pagesArray}));
+    subDocuments.push(await selectPages({file, pagesToExtractArray:pagesArray}));
     pagesArray = [];
 
     return subDocuments;
diff --git a/shared-operations/src/wrappers/PdfFile.ts b/shared-operations/src/wrappers/PdfFile.ts
index 0000bd77b..c270204b3 100644
--- a/shared-operations/src/wrappers/PdfFile.ts
+++ b/shared-operations/src/wrappers/PdfFile.ts
@@ -99,6 +99,31 @@ export class PdfFile {
     static fromMulterFiles(values: Express.Multer.File[]): PdfFile[] {
         return values.map(v => PdfFile.fromMulterFile(v));
     }
+
+    static async cacheAsUint8Arrays(files: PdfFile[]): Promise<Map<PdfFile, Uint8Array>> {
+        const docCache = new Map<PdfFile, Uint8Array>();
+        await Promise.all(files.map(async (file) => {
+            const pdfLibDocument = await file.uint8Array;
+            docCache.set(file, pdfLibDocument);
+        }));
+        return docCache;
+    }
+    static async cacheAsPdfLibDocuments(files: PdfFile[]): Promise<Map<PdfFile, PDFLibDocument>> {
+        const docCache = new Map<PdfFile, PDFLibDocument>();
+        await Promise.all(files.map(async (file) => {
+            const pdfLibDocument = await file.pdflibDocument;
+            docCache.set(file, pdfLibDocument);
+        }));
+        return docCache;
+    }
+    static async cacheAsPdfJsDocuments(files: PdfFile[]): Promise<Map<PdfFile, PDFJSDocument>> {
+        const docCache = new Map<PdfFile, PDFJSDocument>();
+        await Promise.all(files.map(async (file) => {
+            const pdfLibDocument = await file.pdfjsDocument;
+            docCache.set(file, pdfLibDocument);
+        }));
+        return docCache;
+    }
 }
 
 export const PdfFileSchema = Joi.any().custom((value, helpers) => {