aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSam Wilkins <samwilkins333@gmail.com>2019-12-02 12:12:58 -0500
committerSam Wilkins <samwilkins333@gmail.com>2019-12-02 12:12:58 -0500
commit77ee66de66a411f79bbbc036d379d09be38d172f (patch)
treeddb0936a3adbe6821d44906d46ac9cd0182b4d15 /src
parentee1ac7b8c9550cc842e91985c1a92d79ce0e5235 (diff)
further cleanup
Diffstat (limited to 'src')
-rw-r--r--src/Utils.ts2
-rw-r--r--src/client/util/ClientDiagnostics.ts18
-rw-r--r--src/client/util/Import & Export/DirectoryImportBox.tsx3
-rw-r--r--src/client/views/MainView.tsx2
-rw-r--r--src/client/views/collections/CollectionSubView.tsx6
-rw-r--r--src/server/ApiManagers/DeleteManager.ts1
-rw-r--r--src/server/ApiManagers/GeneralGoogleManager.ts15
-rw-r--r--src/server/ApiManagers/PDFManager.ts134
-rw-r--r--src/server/ApiManagers/UploadManager.ts43
-rw-r--r--src/server/DashUploadUtils.ts18
-rw-r--r--src/server/RouteManager.ts14
-rw-r--r--src/server/authentication/models/current_user_utils.ts3
-rw-r--r--src/server/credentials/test.json14
13 files changed, 125 insertions, 148 deletions
diff --git a/src/Utils.ts b/src/Utils.ts
index b60e9e023..2543743a4 100644
--- a/src/Utils.ts
+++ b/src/Utils.ts
@@ -2,8 +2,6 @@ import v4 = require('uuid/v4');
import v5 = require("uuid/v5");
import { Socket } from 'socket.io';
import { Message } from './server/Message';
-import { EventEmitter } from 'events';
-import { ConsoleColors } from './server/ActionUtilities';
export namespace Utils {
diff --git a/src/client/util/ClientDiagnostics.ts b/src/client/util/ClientDiagnostics.ts
index 7eef935fd..0a213aa1c 100644
--- a/src/client/util/ClientDiagnostics.ts
+++ b/src/client/util/ClientDiagnostics.ts
@@ -12,18 +12,22 @@ export namespace ClientDiagnostics {
serverPolls--;
}, 1000 * 15);
-
let executed = false;
- const handle = async () => {
+ let solrHandle: NodeJS.Timeout | undefined;
+ const handler = async () => {
const response = await fetch("/solrHeartbeat");
if (!(await response.json()).running) {
- !executed && alert("Looks like SOLR is not running on your machine.");
- executed = true;
- clearInterval(solrHandle);
+ if (!executed) {
+ alert("Looks like SOLR is not running on your machine.");
+ executed = true;
+ solrHandle && clearInterval(solrHandle);
+ }
}
};
- await handle();
- const solrHandle = setInterval(handle, 1000 * 15);
+ await handler();
+ if (!executed) {
+ solrHandle = setInterval(handler, 1000 * 15);
+ }
}
diff --git a/src/client/util/Import & Export/DirectoryImportBox.tsx b/src/client/util/Import & Export/DirectoryImportBox.tsx
index b5e806a97..104d9e099 100644
--- a/src/client/util/Import & Export/DirectoryImportBox.tsx
+++ b/src/client/util/Import & Export/DirectoryImportBox.tsx
@@ -106,7 +106,8 @@ export default class DirectoryImportBox extends React.Component<FieldViewProps>
runInAction(() => this.phase = `Internal: uploading ${this.quota - this.completed} files to Dash...`);
- const uploads = await BatchedArray.from(validated, { batchSize: 15 }).batchedMapAsync<any>(async (batch, collector) => {
+ const batched = BatchedArray.from(validated, { batchSize: 15 });
+ const uploads = await batched.batchedMapAsync<any>(async (batch, collector) => {
const formData = new FormData();
batch.forEach(file => {
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 5231075a1..85dfd8be2 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -4,7 +4,7 @@ import {
faMusic, faObjectGroup, faPause, faMousePointer, faPenNib, faFileAudio, faPen, faEraser, faPlay, faPortrait, faRedoAlt, faThumbtack, faTree, faTv, faUndoAlt, faHighlighter, faMicrophone, faCompressArrowsAlt
} from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { action, computed, configure, observable, reaction, runInAction, autorun } from 'mobx';
+import { action, computed, configure, observable, reaction, runInAction } from 'mobx';
import { observer } from 'mobx-react';
import "normalize.css";
import * as React from 'react';
diff --git a/src/client/views/collections/CollectionSubView.tsx b/src/client/views/collections/CollectionSubView.tsx
index a1bd1527e..a1ae77fef 100644
--- a/src/client/views/collections/CollectionSubView.tsx
+++ b/src/client/views/collections/CollectionSubView.tsx
@@ -6,7 +6,7 @@ import { Id } from "../../../new_fields/FieldSymbols";
import { List } from "../../../new_fields/List";
import { listSpec } from "../../../new_fields/Schema";
import { ScriptField } from "../../../new_fields/ScriptField";
-import { Cast, StrCast } from "../../../new_fields/Types";
+import { Cast } from "../../../new_fields/Types";
import { CurrentUserUtils } from "../../../server/authentication/models/current_user_utils";
import { Utils } from "../../../Utils";
import { DocServer } from "../../DocServer";
@@ -279,9 +279,9 @@ export function CollectionSubView<T>(schemaCtor: (doc: Doc) => T) {
formData.append('file', file);
let dropFileName = file ? file.name : "-empty-";
promises.push(Networking.PostFormDataToServer("/upload", formData).then(results => {
- results.map(action((file: any) => {
+ results.map(action(({ clientAccessPath }: any) => {
let full = { ...options, nativeWidth: type.indexOf("video") !== -1 ? 600 : 300, width: 300, title: dropFileName };
- let pathname = Utils.prepend(file.clientAccessPath);
+ let pathname = Utils.prepend(clientAccessPath);
Docs.Get.DocumentFromType(type, pathname, full).then(doc => {
doc && (Doc.GetProto(doc).fileUpload = path.basename(pathname).replace("upload_", "").replace(/\.[a-z0-9]*$/, ""));
doc && this.props.addDocument(doc);
diff --git a/src/server/ApiManagers/DeleteManager.ts b/src/server/ApiManagers/DeleteManager.ts
index f58a28ce5..71818c673 100644
--- a/src/server/ApiManagers/DeleteManager.ts
+++ b/src/server/ApiManagers/DeleteManager.ts
@@ -56,7 +56,6 @@ export default class DeleteManager extends ApiManager {
}
});
-
}
}
diff --git a/src/server/ApiManagers/GeneralGoogleManager.ts b/src/server/ApiManagers/GeneralGoogleManager.ts
index 171912185..629684e0c 100644
--- a/src/server/ApiManagers/GeneralGoogleManager.ts
+++ b/src/server/ApiManagers/GeneralGoogleManager.ts
@@ -20,8 +20,7 @@ export default class GeneralGoogleManager extends ApiManager {
method: Method.GET,
subscription: "/readGoogleAccessToken",
onValidation: async ({ user, res }) => {
- const userId = user.id;
- const token = await GoogleApiServerUtils.retrieveAccessToken(userId);
+ const token = await GoogleApiServerUtils.retrieveAccessToken(user.id);
if (!token) {
return res.send(GoogleApiServerUtils.generateAuthenticationUrl());
}
@@ -38,18 +37,6 @@ export default class GeneralGoogleManager extends ApiManager {
});
register({
- method: Method.GET,
- subscription: "/deleteWithGoogleCredentials",
- onValidation: async ({ res, isRelease }) => {
- if (isRelease) {
- return _permission_denied(res, deletionPermissionError);
- }
- await Database.Auxiliary.GoogleAuthenticationToken.DeleteAll();
- res.redirect("/delete");
- }
- });
-
- register({
method: Method.POST,
subscription: new RouteSubscriber("/googleDocs").add("sector", "action"),
onValidation: async ({ req, res, user }) => {
diff --git a/src/server/ApiManagers/PDFManager.ts b/src/server/ApiManagers/PDFManager.ts
index 4bd750aaf..151b48dd9 100644
--- a/src/server/ApiManagers/PDFManager.ts
+++ b/src/server/ApiManagers/PDFManager.ts
@@ -4,10 +4,11 @@ import RouteSubscriber from "../RouteSubscriber";
import { exists, createReadStream, createWriteStream } from "fs";
import * as Pdfjs from 'pdfjs-dist';
import { createCanvas } from "canvas";
-const probe = require("probe-image-size");
+const imageSize = require("probe-image-size");
import * as express from "express";
import * as path from "path";
import { Directory, serverPathToFile, clientPathToFile } from "./UploadManager";
+import { ConsoleColors } from "../ActionUtilities";
export default class PDFManager extends ApiManager {
@@ -16,84 +17,77 @@ export default class PDFManager extends ApiManager {
register({
method: Method.GET,
subscription: new RouteSubscriber("thumbnail").add("filename"),
- onValidation: ({ req, res }) => {
- let filename = req.params.filename;
- let noExt = filename.substring(0, filename.length - ".png".length);
- let pagenumber = parseInt(noExt.split('-')[1]);
- return new Promise<void>(resolve => {
- const path = serverPathToFile(Directory.pdf_thumbnails, filename);
- exists(path, (exists: boolean) => {
- console.log(`${path} ${exists ? "exists" : "does not exist"}`);
- if (exists) {
- let input = createReadStream(path);
- probe(input, (err: any, { width, height }: any) => {
- if (err) {
- console.log(err);
- console.log(`error on ${filename}`);
- return;
- }
- res.send({
- path: clientPathToFile(Directory.pdf_thumbnails, filename),
- width,
- height
- });
- });
- }
- else {
- const name = filename.substring(0, filename.length - noExt.split('-')[1].length - ".PNG".length - 1) + ".pdf";
- LoadPage(serverPathToFile(Directory.pdfs, name), pagenumber, res);
- }
- resolve();
- });
- });
- }
+ onValidation: ({ req, res }) => getOrCreateThumbnail(req.params.filename, res)
});
- function LoadPage(file: string, pageNumber: number, res: express.Response) {
- console.log(file);
- Pdfjs.getDocument(file).promise
- .then((pdf: Pdfjs.PDFDocumentProxy) => {
- let factory = new NodeCanvasFactory();
- console.log(pageNumber);
- pdf.getPage(pageNumber).then((page: Pdfjs.PDFPageProxy) => {
- console.log("reading " + page);
- let viewport = page.getViewport(1 as any);
- let canvasAndContext = factory.create(viewport.width, viewport.height);
- let renderContext = {
- canvasContext: canvasAndContext.context,
- canvasFactory: factory,
- viewport
- };
- console.log("read " + pageNumber);
+ }
- page.render(renderContext).promise
- .then(() => {
- console.log("saving " + pageNumber);
- let stream = canvasAndContext.canvas.createPNGStream();
- let filenames = path.basename(file).split(".");
- const pngFile = serverPathToFile(Directory.pdf_thumbnails, `${filenames[0]}-${pageNumber}.png`);
- let out = createWriteStream(pngFile);
- stream.pipe(out);
- out.on("finish", () => {
- console.log(`Success! Saved to ${pngFile}`);
- res.send({
- path: pngFile,
- width: viewport.width,
- height: viewport.height
- });
- });
- }, (reason: string) => {
- console.error(reason + ` ${pageNumber}`);
- });
+}
+
+function getOrCreateThumbnail(thumbnailName: string, res: express.Response) {
+ const noExtension = thumbnailName.substring(0, thumbnailName.length - ".png".length);
+ const pageString = noExtension.split('-')[1];
+ const pageNumber = parseInt(pageString);
+ return new Promise<void>(resolve => {
+ const path = serverPathToFile(Directory.pdf_thumbnails, thumbnailName);
+ exists(path, (exists: boolean) => {
+ if (exists) {
+ let existingThumbnail = createReadStream(path);
+ imageSize(existingThumbnail, (err: any, { width, height }: any) => {
+ if (err) {
+ console.log(ConsoleColors.Red, `In PDF thumbnail response, unable to determine dimensions of ${thumbnailName}:`);
+ console.log(err);
+ return;
+ }
+ res.send({
+ path: clientPathToFile(Directory.pdf_thumbnails, thumbnailName),
+ width,
+ height
});
});
- }
-
- }
+ } else {
+ const offset = thumbnailName.length - pageString.length - 5;
+ const name = thumbnailName.substring(0, offset) + ".pdf";
+ const path = serverPathToFile(Directory.pdfs, name);
+ CreateThumbnail(path, pageNumber, res);
+ }
+ resolve();
+ });
+ });
+}
+async function CreateThumbnail(file: string, pageNumber: number, res: express.Response) {
+ const documentProxy = await Pdfjs.getDocument(file).promise;
+ const factory = new NodeCanvasFactory();
+ const page = await documentProxy.getPage(pageNumber);
+ const viewport = page.getViewport(1 as any);
+ 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 filenames = path.basename(file).split(".");
+ const pngFile = serverPathToFile(Directory.pdf_thumbnails, `${filenames[0]}-${pageNumber}.png`);
+ const out = createWriteStream(pngFile);
+ pngStream.pipe(out);
+ out.on("finish", () => {
+ res.send({
+ path: pngFile,
+ width: viewport.width,
+ height: viewport.height
+ });
+ });
+ out.on("error", error => {
+ console.log(ConsoleColors.Red, `In PDF thumbnail creation, encountered the following error when piping ${pngFile}:`);
+ console.log(error);
+ });
}
class NodeCanvasFactory {
+
create = (width: number, height: number) => {
var canvas = createCanvas(width, height);
var context = canvas.getContext('2d');
diff --git a/src/server/ApiManagers/UploadManager.ts b/src/server/ApiManagers/UploadManager.ts
index 2f76871a6..80ae0ad61 100644
--- a/src/server/ApiManagers/UploadManager.ts
+++ b/src/server/ApiManagers/UploadManager.ts
@@ -40,6 +40,27 @@ export default class UploadManager extends ApiManager {
register({
method: Method.POST,
+ subscription: "/upload",
+ onValidation: async ({ req, res }) => {
+ let form = new formidable.IncomingForm();
+ form.uploadDir = pathToDirectory(Directory.parsed_files);
+ form.keepExtensions = true;
+ return new Promise<void>(resolve => {
+ form.parse(req, async (_err, _fields, files) => {
+ let results: any[] = [];
+ for (const key in files) {
+ const result = await DashUploadUtils.upload(files[key]);
+ result && results.push(result);
+ }
+ _success(res, results);
+ resolve();
+ });
+ });
+ }
+ });
+
+ register({
+ method: Method.POST,
subscription: "/uploadDoc",
onValidation: ({ req, res }) => {
let form = new formidable.IncomingForm();
@@ -142,28 +163,6 @@ export default class UploadManager extends ApiManager {
}
});
-
- register({
- method: Method.POST,
- subscription: "/upload",
- onValidation: async ({ req, res }) => {
- let form = new formidable.IncomingForm();
- form.uploadDir = pathToDirectory(Directory.parsed_files);
- form.keepExtensions = true;
- return new Promise<void>(resolve => {
- form.parse(req, async (_err, _fields, files) => {
- let results: any[] = [];
- for (const key in files) {
- const result = await DashUploadUtils.upload(files[key]);
- result && results.push(result);
- }
- _success(res, results);
- resolve();
- });
- });
- }
- });
-
register({
method: Method.POST,
subscription: "/inspectImage",
diff --git a/src/server/DashUploadUtils.ts b/src/server/DashUploadUtils.ts
index c831eb072..9ccc72e35 100644
--- a/src/server/DashUploadUtils.ts
+++ b/src/server/DashUploadUtils.ts
@@ -85,7 +85,8 @@ export namespace DashUploadUtils {
return UploadPdf(path);
}
}
- console.log(ConsoleColors.Red, `Ignoring unsupported file ${name} with upload type (${type}).`);
+
+ console.log(ConsoleColors.Red, `Ignoring unsupported file (${name}) with upload type (${type}).`);
return { clientAccessPath: undefined };
}
@@ -169,17 +170,12 @@ export namespace DashUploadUtils {
if (isLocal) {
return results;
}
- const metadata = (await new Promise<any>((resolve, reject) => {
- request.head(source, async (error, res) => {
- if (error) {
- return reject(error);
- }
- resolve(res);
- });
- })).headers;
+ const { headers } = (await new Promise<any>((resolve, reject) => {
+ request.head(source, (error, res) => error ? reject(error) : resolve(res));
+ }));
return {
- contentSize: parseInt(metadata[size]),
- contentType: metadata[type],
+ contentSize: parseInt(headers[size]),
+ contentType: headers[type],
...results
};
};
diff --git a/src/server/RouteManager.ts b/src/server/RouteManager.ts
index 3a20d5af5..7c49485f1 100644
--- a/src/server/RouteManager.ts
+++ b/src/server/RouteManager.ts
@@ -26,6 +26,8 @@ export interface RouteInitializer {
onError?: OnError;
}
+const registered = new Map<string, Set<Method>>();
+
export default class RouteManager {
private server: express.Express;
private _isRelease: boolean;
@@ -89,6 +91,18 @@ export default class RouteManager {
} else {
route = subscriber.build;
}
+ const existing = registered.get(route);
+ if (existing) {
+ if (existing.has(method)) {
+ console.log(ConsoleColors.Red, `\nDuplicate registration error: already registered ${route} with Method[${method}]`);
+ console.log('Please remove duplicate registrations before continuing...\n');
+ process.exit(0);
+ }
+ } else {
+ const specific = new Set<Method>();
+ specific.add(method);
+ registered.set(route, specific);
+ }
switch (method) {
case Method.GET:
this.server.get(route, supervised);
diff --git a/src/server/authentication/models/current_user_utils.ts b/src/server/authentication/models/current_user_utils.ts
index 052aa54a6..ac4462f78 100644
--- a/src/server/authentication/models/current_user_utils.ts
+++ b/src/server/authentication/models/current_user_utils.ts
@@ -1,4 +1,4 @@
-import { action, computed, observable, reaction, runInAction } from "mobx";
+import { action, computed, observable, reaction } from "mobx";
import * as rp from 'request-promise';
import { DocServer } from "../../../client/DocServer";
import { Docs } from "../../../client/documents/Documents";
@@ -11,7 +11,6 @@ import { listSpec } from "../../../new_fields/Schema";
import { ScriptField, ComputedField } from "../../../new_fields/ScriptField";
import { Cast, PromiseValue } from "../../../new_fields/Types";
import { Utils } from "../../../Utils";
-import { ButtonBox } from "../../../client/views/nodes/ButtonBox";
import { nullAudio } from "../../../new_fields/URLField";
import { DragManager } from "../../../client/util/DragManager";
import { InkingControl } from "../../../client/views/InkingControl";
diff --git a/src/server/credentials/test.json b/src/server/credentials/test.json
deleted file mode 100644
index 0a032cc2d..000000000
--- a/src/server/credentials/test.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "installed": {
- "client_id": "343179513178-ud6tvmh275r2fq93u9eesrnc66t6akh9.apps.googleusercontent.com",
- "project_id": "quickstart-1565056383187",
- "auth_uri": "https://accounts.google.com/o/oauth2/auth",
- "token_uri": "https://oauth2.googleapis.com/token",
- "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
- "client_secret": "w8KIFSc0MQpmUYHed4qEzn8b",
- "redirect_uris": [
- "urn:ietf:wg:oauth:2.0:oob",
- "http://localhost"
- ]
- }
-} \ No newline at end of file