aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/ApiManagers/PDFManager.ts110
-rw-r--r--src/server/DashUploadUtils.ts16
-rw-r--r--src/server/index.ts15
3 files changed, 10 insertions, 131 deletions
diff --git a/src/server/ApiManagers/PDFManager.ts b/src/server/ApiManagers/PDFManager.ts
deleted file mode 100644
index d634a241d..000000000
--- a/src/server/ApiManagers/PDFManager.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import ApiManager, { Registration } from './ApiManager';
-import { Method } from '../RouteManager';
-import RouteSubscriber from '../RouteSubscriber';
-import { existsSync, createReadStream, createWriteStream } from 'fs';
-//import * as Pdfjs from 'pdfjs-dist';
-import { createCanvas } from 'canvas';
-const imageSize = require('probe-image-size');
-import * as express from 'express';
-import { Directory, serverPathToFile, clientPathToFile, pathToDirectory } from './UploadManager';
-import { red } from 'colors';
-import { resolve } from 'path';
-
-export default class PDFManager extends ApiManager {
- protected initialize(register: Registration): void {
- register({
- method: Method.POST,
- subscription: new RouteSubscriber('thumbnail'),
- secureHandler: async ({ req, res }) => {
- const { coreFilename, pageNum, subtree } = req.body;
- return getOrCreateThumbnail(coreFilename, pageNum, res, subtree);
- },
- });
- }
-}
-
-async function getOrCreateThumbnail(coreFilename: string, pageNum: number, res: express.Response, subtree?: string): Promise<void> {
- const resolved = `${coreFilename}-${pageNum}.png`;
- return new Promise<void>(async resolve => {
- const path = serverPathToFile(Directory.pdf_thumbnails, resolved);
- if (existsSync(path)) {
- const existingThumbnail = createReadStream(path);
- const { err, viewport } = await new Promise<any>(resolve => {
- imageSize(existingThumbnail, (err: any, viewport: any) => resolve({ err, viewport }));
- });
- if (err) {
- console.log(red(`In PDF thumbnail response, unable to determine dimensions of ${resolved}:`));
- console.log(err);
- return;
- }
- dispatchThumbnail(res, viewport, resolved);
- } else {
- await CreateThumbnail(coreFilename, pageNum, res, subtree);
- }
- resolve();
- });
-}
-
-async function CreateThumbnail(coreFilename: string, pageNum: number, res: express.Response, subtree?: string) {
- const part1 = subtree ?? '';
- const filename = `${part1}${coreFilename}.pdf`;
- const sourcePath = resolve(pathToDirectory(Directory.pdfs), filename);
- const documentProxy = await Pdfjs.getDocument(sourcePath).promise;
- const factory = new NodeCanvasFactory();
- const page = await documentProxy.getPage(pageNum);
- const viewport = page.getViewport({ scale: 1, rotation: 0, dontFlip: false });
- const { canvas, context } = factory.create(viewport.width, viewport.height);
- const renderContext = {
- canvasContext: context,
- canvasFactory: factory,
- viewport,
- };
- await page.render(renderContext).promise;
- const pngStream = canvas.createPNGStream();
- const resolved = `${coreFilename}-${pageNum}.png`;
- const pngFile = serverPathToFile(Directory.pdf_thumbnails, resolved);
- const out = createWriteStream(pngFile);
- pngStream.pipe(out);
- return new Promise<void>((resolve, reject) => {
- out.on('finish', () => {
- dispatchThumbnail(res, viewport, resolved);
- resolve();
- });
- out.on('error', error => {
- console.log(red(`In PDF thumbnail creation, encountered the following error when piping ${pngFile}:`));
- console.log(error);
- reject();
- });
- });
-}
-
-function dispatchThumbnail(res: express.Response, { width, height }: Pdfjs.PageViewport, thumbnailName: string) {
- res.send({
- path: clientPathToFile(Directory.pdf_thumbnails, thumbnailName),
- width,
- height,
- });
-}
-
-class NodeCanvasFactory {
- create = (width: number, height: number) => {
- const canvas = createCanvas(width, height);
- const context = canvas.getContext('2d');
- return {
- canvas,
- context,
- };
- };
-
- reset = (canvasAndContext: any, width: number, height: number) => {
- canvasAndContext.canvas.width = width;
- canvasAndContext.canvas.height = height;
- };
-
- destroy = (canvasAndContext: any) => {
- canvasAndContext.canvas.width = 0;
- canvasAndContext.canvas.height = 0;
- canvasAndContext.canvas = null;
- canvasAndContext.context = null;
- };
-}
diff --git a/src/server/DashUploadUtils.ts b/src/server/DashUploadUtils.ts
index 46f521bc9..ab3982cc5 100644
--- a/src/server/DashUploadUtils.ts
+++ b/src/server/DashUploadUtils.ts
@@ -120,11 +120,11 @@ export namespace DashUploadUtils {
};
}
- function resolveExistingFile(name: string, pat: string, directory: Directory, type?: string | null, duration?: number, rawText?: string): Upload.FileResponse<Upload.FileInformation> {
- const data = { size: 0, filepath: path.basename(pat), name, type: type ?? '', originalFilename: name, newFilename: name, mimetype: '', hashAlgorithm: 'md5' as 'md5' };
- const file = { ...data, toJSON: () => ({ ...data, length: 0, filename: data.filepath.replace(/.*\//, ''), mtime: new Date(), mime: '', toJson: () => undefined as any }) };
+ function resolveExistingFile(name: string, pat: string, directory: Directory, mimetype?: string | null, duration?: number, rawText?: string): Upload.FileResponse<Upload.FileInformation> {
+ const data = { size: 0, filepath: pat, name, type: mimetype ?? '', originalFilename: name, newFilename: path.basename(pat), mimetype, hashAlgorithm: false as any };
+ const file = { ...data, toJSON: () => ({ ...data, length: 0, filename: data.filepath.replace(/.*\//, ''), mtime: new Date(), mimetype, toJson: () => undefined as any }) };
return {
- source: file,
+ source: file || null,
result: {
accessPaths: {
agnostic: getAccessPaths(directory, data.filepath),
@@ -277,9 +277,9 @@ export namespace DashUploadUtils {
}
}
- console.log(red(`Ignoring unsupported file (${name}) with upload type (${type}).`));
+ console.log(red(`Ignoring unsupported file (${originalFilename}) with upload type (${type}).`));
fs.unlink(path, () => {});
- return { source: file, result: new Error(`Could not upload unsupported file (${name}) with upload type (${type}).`) };
+ return { source: file, result: new Error(`Could not upload unsupported file (${originalFilename}) with upload type (${type}).`) };
}
async function UploadPdf(file: File) {
@@ -291,7 +291,9 @@ export namespace DashUploadUtils {
const textFilename = `${fileKey.substring(0, fileKey.length - 4)}.txt`;
const readStream = createReadStream(serverPathToFile(Directory.text, textFilename));
var rawText = '';
- readStream.on('data', chunk => (rawText += chunk.toString())).on('end', () => res(resolveExistingFile(file.originalFilename ?? '', fileKey, Directory.pdfs, file.mimetype, undefined, rawText)));
+ readStream
+ .on('data', chunk => (rawText += chunk.toString())) //
+ .on('end', () => res(resolveExistingFile(file.originalFilename ?? '', fileKey, Directory.pdfs, file.mimetype, undefined, rawText)));
});
}
const dataBuffer = readFileSync(file.filepath);
diff --git a/src/server/index.ts b/src/server/index.ts
index 745653a19..e4aadf696 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -9,7 +9,6 @@ import DeleteManager from './ApiManagers/DeleteManager';
import DownloadManager from './ApiManagers/DownloadManager';
import GeneralGoogleManager from './ApiManagers/GeneralGoogleManager';
import GooglePhotosManager from './ApiManagers/GooglePhotosManager';
-import PDFManager from './ApiManagers/PDFManager';
import { SearchManager } from './ApiManagers/SearchManager';
import SessionManager from './ApiManagers/SessionManager';
import UploadManager from './ApiManagers/UploadManager';
@@ -64,19 +63,7 @@ async function preliminaryFunctions() {
* with the server
*/
function routeSetter({ isRelease, addSupervisedRoute, logRegistrationOutcome }: RouteManager) {
- const managers = [
- new SessionManager(),
- new UserManager(),
- new UploadManager(),
- new DownloadManager(),
- new SearchManager(),
- new PDFManager(),
- new DeleteManager(),
- new UtilManager(),
- new GeneralGoogleManager(),
- new GooglePhotosManager(),
- new DataVizManager(),
- ];
+ const managers = [new SessionManager(), new UserManager(), new UploadManager(), new DownloadManager(), new SearchManager(), new DeleteManager(), new UtilManager(), new GeneralGoogleManager(), new GooglePhotosManager(), new DataVizManager()];
// initialize API Managers
console.log(yellow('\nregistering server routes...'));