diff options
-rw-r--r-- | logs/npm-2-Wed, 11 Dec 2019 08:44:28 GMT.log | 274 | ||||
-rw-r--r-- | logs/npx ts-node-20965-Wed, 11 Dec 2019 03:38:32 GMT | 0 | ||||
-rw-r--r-- | logs/server_pids.txt | 1 | ||||
-rw-r--r-- | src/server/ActionUtilities.ts | 22 | ||||
-rw-r--r-- | src/server/ProcessManager.ts | 49 | ||||
-rw-r--r-- | src/server/daemon/current_daemon_pid.txt | 1 | ||||
-rw-r--r-- | src/server/daemon/persistence_daemon.ts | 53 | ||||
-rw-r--r-- | src/server/daemon/session_crashes_@ 2019-12-11T08:31:56.281Z.log | 1 | ||||
-rw-r--r-- | src/server/daemon/session_crashes_@ 2019-12-11T08:43:46.454Z.log | 2 |
9 files changed, 357 insertions, 46 deletions
diff --git a/logs/npm-2-Wed, 11 Dec 2019 08:44:28 GMT.log b/logs/npm-2-Wed, 11 Dec 2019 08:44:28 GMT.log new file mode 100644 index 000000000..37e232d48 --- /dev/null +++ b/logs/npm-2-Wed, 11 Dec 2019 08:44:28 GMT.log @@ -0,0 +1,274 @@ + +> dash@1.0.0 start-spawn /Users/swilkinss2012/Documents/GitHub/Dash-Web +> cross-env SPAWNED=true NODE_OPTIONS=--max_old_space_size=4096 ts-node-dev -- src/server/index.ts + +Using ts-node version 7.0.1, typescript version 3.7.2 +objc[9678]: Class GNotificationCenterDelegate is implemented in both /Users/swilkinss2012/Documents/GitHub/Dash-Web/node_modules/sharp/vendor/lib/libgio-2.0.0.dylib (0x10838d578) and /Users/swilkinss2012/Documents/GitHub/Dash-Web/node_modules/canvas/build/Release/libgio-2.0.0.dylib (0x10afd9578). One of the two will be used. Which one is undefined. +[34m +starting execution of preliminary functions...[0m +(node:9678) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect. +[34mcompleted preliminary functions +.[0m +Starting type checking and linting service... +Using 1 worker with 2048MB memory limit + +running server in [33mdevelopment[39m mode +[33m[39m +[33mregistering server routes...[39m +[32mall server routes have been successfully registered:[39m +[36m/[39m +[36m/activity[39m +[36m/buxton[39m +[36m/delete[39m +[36m/deleteAll[39m +[36m/deleteWithAux[39m +[36m/deleteWithGoogleCredentials[39m +[36m/doc/:docId[39m +[36m/downloadId/:docId[39m +[36m/environment/:key[39m +[36m/getCurrentUser[39m +[36m/getUserDocumentId[39m +[36m/getUsers[39m +[36m/googleDocs/:sector/:action[39m +[36m/googlePhotosMediaDownload[39m +[36m/googlePhotosMediaUpload[39m +[36m/home[39m +[36m/imageHierarchyExport/:docId[39m +[36m/inspectImage[39m +[36m/persist[39m +[36m/pull[39m +[36m/readGoogleAccessToken[39m +[36m/search[39m +[36m/serializeDoc/:docId[39m +[36m/serverHeartbeat[39m +[36m/shutdown[39m +[36m/solr/:action[39m +[36m/textsearch[39m +[36m/thumbnail/:filename[39m +[36m/upload[39m +[36m/uploadDoc[39m +[36m/uploadURI[39m +[36m/version[39m +[36m/writeGoogleAccessToken[39m + +websocket listening on port [33m4321[39m +server listening on port [33m1050[39m + +[34mℹ[39m [90m「wdm」[39m: wait until bundle finished: /serverHeartbeat +[32muser samuel_wilkins@brown.edu has connected to the web socket[39m +[32muser samuel_wilkins@brown.edu has connected to the web socket[39m +[34mℹ[39m [90m「wdm」[39m: wait until bundle finished: /serverHeartbeat +[34mℹ[39m [90m「wdm」[39m: wait until bundle finished: /serverHeartbeat +[34mℹ[39m [90m「wdm」[39m: wait until bundle finished: /serverHeartbeat +[34mℹ[39m [90m「wdm」[39m: wait until bundle finished: /serverHeartbeat +[32muser samuel_wilkins@brown.edu has connected to the web socket[39m +[32muser samuel_wilkins@brown.edu has connected to the web socket[39m +Type checking and linting in progress... +webpack built 8f6b743d91fd3862683b in 47419ms +[33m⚠[39m [90m「wdm」[39m: Hash: [1m8f6b743d91fd3862683b[39m[22m +Version: webpack [1m4.36.1[39m[22m +Time: [1m47419[39m[22mms +Built at: 12/11/2019 [1m3:45:31 AM[39m[22m + [1mAsset[39m[22m [1mSize[39m[22m [1mChunks[39m[22m [1m[39m[22m [1m[39m[22m[1mChunk Names[39m[22m +[1m[32m275711e56bd1bc79fdff544a3d7dbfae.png[39m[22m 289 bytes [1m[39m[22m [1m[32m[emitted][39m[22m +[1m[32m32f1593298e6e7bee5673bf647328d72.png[39m[22m 429 bytes [1m[39m[22m [1m[32m[emitted][39m[22m +[1m[32m718c914a99a2136c01c84e01f63e505a.png[39m[22m 829 bytes [1m[39m[22m [1m[32m[emitted][39m[22m +[1m[32m906f1a1816c2a03b5c7612f6aa2ceece.png[39m[22m 281 bytes [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32massets/downarrow.png[39m[22m 3.28 KiB [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32massets/env.json[39m[22m 360 bytes [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32massets/google_photos.png[39m[22m 114 KiB [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32massets/google_tags.png[39m[22m 7.9 KiB [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32massets/loading.gif[39m[22m 112 KiB [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32massets/pdf.worker.js[39m[22m 1.55 MiB [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32mbundle.js[39m[22m 20.8 MiB [1mbundle[39m[22m [1m[32m[emitted][39m[22m bundle + [1m[32mbundle.js.map[39m[22m 23.3 MiB [1mbundle[39m[22m [1m[32m[emitted][39m[22m bundle + [1m[32mdebug/repl.html[39m[22m 348 bytes [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32mdebug/test.html[39m[22m 245 bytes [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32mdebug/viewer.html[39m[22m 357 bytes [1m[39m[22m [1m[32m[emitted][39m[22m +[1m[32me7a34b49f3c49ca0c25c76b30cd09e12.png[39m[22m 445 bytes [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32mimageUpload.js[39m[22m 20.8 MiB [1mimageUpload[39m[22m [1m[32m[emitted][39m[22m imageUpload + [1m[32mimageUpload.js.map[39m[22m 23.3 MiB [1mimageUpload[39m[22m [1m[32m[emitted][39m[22m imageUpload + [1m[32mindex.html[39m[22m 593 bytes [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32minkControls.js[39m[22m 116 KiB [1minkControls[39m[22m [1m[32m[emitted][39m[22m inkControls + [1m[32minkControls.js.map[39m[22m 122 KiB [1minkControls[39m[22m [1m[32m[emitted][39m[22m inkControls + [1m[32mmobile/image.html[39m[22m 333 bytes [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32mmobile/ink.html[39m[22m 252 bytes [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32mrepl.js[39m[22m 9.31 MiB [1mrepl[39m[22m [1m[32m[emitted][39m[22m repl + [1m[32mrepl.js.map[39m[22m 10.5 MiB [1mrepl[39m[22m [1m[32m[emitted][39m[22m repl + [1m[32mtest.js[39m[22m 1.2 MiB [1mtest[39m[22m [1m[32m[emitted][39m[22m test + [1m[32mtest.js.map[39m[22m 1.42 MiB [1mtest[39m[22m [1m[32m[emitted][39m[22m test + [1m[32mtest.pdf[39m[22m 53.6 KiB [1m[39m[22m [1m[32m[emitted][39m[22m + [1m[32mvendors~pdfjsWorker.js[39m[22m 1.55 MiB [1mvendors~pdfjsWorker[39m[22m [1m[32m[emitted][39m[22m vendors~pdfjsWorker + [1m[32mvendors~pdfjsWorker.js.map[39m[22m 1.87 MiB [1mvendors~pdfjsWorker[39m[22m [1m[32m[emitted][39m[22m vendors~pdfjsWorker + [1m[32mviewer.js[39m[22m 9.47 MiB [1mviewer[39m[22m [1m[32m[emitted][39m[22m viewer + [1m[32mviewer.js.map[39m[22m 10.7 MiB [1mviewer[39m[22m [1m[32m[emitted][39m[22m viewer +Entrypoint [1mbundle[39m[22m = [1m[32mbundle.js[39m[22m [1m[32mbundle.js.map[39m[22m +Entrypoint [1mviewer[39m[22m = [1m[32mviewer.js[39m[22m [1m[32mviewer.js.map[39m[22m +Entrypoint [1mrepl[39m[22m = [1m[32mrepl.js[39m[22m [1m[32mrepl.js.map[39m[22m +Entrypoint [1mtest[39m[22m = [1m[32mtest.js[39m[22m [1m[32mtest.js.map[39m[22m +Entrypoint [1minkControls[39m[22m = [1m[32minkControls.js[39m[22m [1m[32minkControls.js.map[39m[22m +Entrypoint [1mimageUpload[39m[22m = [1m[32mimageUpload.js[39m[22m [1m[32mimageUpload.js.map[39m[22m +[19] [1mmulti ./src/client/views/Main.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33mbundle[39m[22m}[1m[32m [built][39m[22m +[20] [1mmulti ./src/debug/Viewer.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33mviewer[39m[22m}[1m[32m [built][39m[22m +[21] [1mmulti ./src/debug/Repl.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33mrepl[39m[22m}[1m[32m [built][39m[22m +[22] [1mmulti ./src/debug/Test.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33mtest[39m[22m}[1m[32m [built][39m[22m +[23] [1mmulti ./src/mobile/InkControls.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33minkControls[39m[22m}[1m[32m [built][39m[22m +[24] [1mmulti ./src/mobile/ImageUpload.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33mimageUpload[39m[22m}[1m[32m [built][39m[22m + [[1m./node_modules/mobx-react/index.module.js[39m[22m] 48.8 KiB {[1m[33mbundle[39m[22m} {[1m[33mviewer[39m[22m} {[1m[33mrepl[39m[22m} {[1m[33mimageUpload[39m[22m}[1m[32m [built][39m[22m + [[1m./node_modules/mobx/lib/mobx.module.js[39m[22m] 175 KiB {[1m[33mbundle[39m[22m} {[1m[33mviewer[39m[22m} {[1m[33mrepl[39m[22m} {[1m[33mimageUpload[39m[22m}[1m[32m [built][39m[22m + [./node_modules/webpack-hot-middleware/client.js?reload=true] [1m(webpack)-hot-middleware/client.js?reload=true[39m[22m 7.68 KiB {[1m[33mbundle[39m[22m} {[1m[33mviewer[39m[22m} {[1m[33mrepl[39m[22m} {[1m[33mtest[39m[22m} {[1m[33minkControls[39m[22m} {[1m[33mimageUpload[39m[22m}[1m[32m [built][39m[22m + [[1m./src/client/views/Main.tsx[39m[22m] 4.03 KiB {[1m[33mbundle[39m[22m}[1m[32m [built][39m[22m + [[1m./src/debug/Repl.tsx[39m[22m] 6.87 KiB {[1m[33mrepl[39m[22m}[1m[32m [built][39m[22m + [[1m./src/debug/Test.tsx[39m[22m] 1.02 KiB {[1m[33mtest[39m[22m}[1m[32m [built][39m[22m + [[1m./src/debug/Viewer.tsx[39m[22m] 12.1 KiB {[1m[33mviewer[39m[22m}[1m[32m [built][39m[22m + [[1m./src/mobile/ImageUpload.tsx[39m[22m] 9.97 KiB {[1m[33mimageUpload[39m[22m}[1m[32m [built][39m[22m + [[1m./src/mobile/InkControls.tsx[39m[22m] 14 bytes {[1m[33minkControls[39m[22m}[1m[32m [built][39m[22m + + 1494 hidden modules + +[1m[33mWARNING in ./node_modules/typescript/lib/typescript.js 5121:41-60 +Critical dependency: the request of a dependency is an expression + @ ./src/client/util/Scripting.ts + @ ./src/debug/Viewer.tsx + @ multi ./src/debug/Viewer.tsx webpack-hot-middleware/client?reload=true[39m[22m +[34mℹ[39m [90m「wdm」[39m: Compiled with warnings. +[34mℹ[39m [90m「wdm」[39m: Compiling... +webpack building... +[34mℹ[39m [90m「wdm」[39m: wait until bundle finished: /login +[34mℹ[39m [90m「wdm」[39m: wait until bundle finished: /login +[34mℹ[39m [90m「wdm」[39m: wait until bundle finished: /login +[34mℹ[39m [90m「wdm」[39m: wait until bundle finished: /login +[34mℹ[39m [90m「wdm」[39m: wait until bundle finished: /login +Type checking and linting in progress... +webpack built 8f6b743d91fd3862683b in 615ms +[33m⚠[39m [90m「wdm」[39m: Hash: [1m8f6b743d91fd3862683b[39m[22m +Version: webpack [1m4.36.1[39m[22m +Time: [1m615[39m[22mms +Built at: 12/11/2019 [1m3:45:33 AM[39m[22m + [1mAsset[39m[22m [1mSize[39m[22m [1mChunks[39m[22m [1m[39m[22m[1m[39m[22m[1mChunk Names[39m[22m +[1m[32m275711e56bd1bc79fdff544a3d7dbfae.png[39m[22m 289 bytes [1m[39m[22m [1m[32m[39m[22m +[1m[32m32f1593298e6e7bee5673bf647328d72.png[39m[22m 429 bytes [1m[39m[22m [1m[32m[39m[22m +[1m[32m718c914a99a2136c01c84e01f63e505a.png[39m[22m 829 bytes [1m[39m[22m [1m[32m[39m[22m +[1m[32m906f1a1816c2a03b5c7612f6aa2ceece.png[39m[22m 281 bytes [1m[39m[22m [1m[32m[39m[22m + [1m[32mbundle.js[39m[22m 20.8 MiB [1mbundle[39m[22m [1m[32m[39m[22mbundle + [1m[32mbundle.js.map[39m[22m 23.3 MiB [1mbundle[39m[22m [1m[32m[39m[22mbundle +[1m[32me7a34b49f3c49ca0c25c76b30cd09e12.png[39m[22m 445 bytes [1m[39m[22m [1m[32m[39m[22m + [1m[32mimageUpload.js[39m[22m 20.8 MiB [1mimageUpload[39m[22m [1m[32m[39m[22mimageUpload + [1m[32mimageUpload.js.map[39m[22m 23.3 MiB [1mimageUpload[39m[22m [1m[32m[39m[22mimageUpload + [1m[32minkControls.js[39m[22m 116 KiB [1minkControls[39m[22m [1m[32m[39m[22minkControls + [1m[32minkControls.js.map[39m[22m 122 KiB [1minkControls[39m[22m [1m[32m[39m[22minkControls + [1m[32mrepl.js[39m[22m 9.31 MiB [1mrepl[39m[22m [1m[32m[39m[22mrepl + [1m[32mrepl.js.map[39m[22m 10.5 MiB [1mrepl[39m[22m [1m[32m[39m[22mrepl + [1m[32mtest.js[39m[22m 1.2 MiB [1mtest[39m[22m [1m[32m[39m[22mtest + [1m[32mtest.js.map[39m[22m 1.42 MiB [1mtest[39m[22m [1m[32m[39m[22mtest + [1m[32mvendors~pdfjsWorker.js[39m[22m 1.55 MiB [1mvendors~pdfjsWorker[39m[22m [1m[32m[39m[22mvendors~pdfjsWorker + [1m[32mvendors~pdfjsWorker.js.map[39m[22m 1.87 MiB [1mvendors~pdfjsWorker[39m[22m [1m[32m[39m[22mvendors~pdfjsWorker + [1m[32mviewer.js[39m[22m 9.47 MiB [1mviewer[39m[22m [1m[32m[39m[22mviewer + [1m[32mviewer.js.map[39m[22m 10.7 MiB [1mviewer[39m[22m [1m[32m[39m[22mviewer +Entrypoint [1mbundle[39m[22m = [1m[32mbundle.js[39m[22m [1m[32mbundle.js.map[39m[22m +Entrypoint [1mviewer[39m[22m = [1m[32mviewer.js[39m[22m [1m[32mviewer.js.map[39m[22m +Entrypoint [1mrepl[39m[22m = [1m[32mrepl.js[39m[22m [1m[32mrepl.js.map[39m[22m +Entrypoint [1mtest[39m[22m = [1m[32mtest.js[39m[22m [1m[32mtest.js.map[39m[22m +Entrypoint [1minkControls[39m[22m = [1m[32minkControls.js[39m[22m [1m[32minkControls.js.map[39m[22m +Entrypoint [1mimageUpload[39m[22m = [1m[32mimageUpload.js[39m[22m [1m[32mimageUpload.js.map[39m[22m +[19] [1mmulti ./src/client/views/Main.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33mbundle[39m[22m} +[20] [1mmulti ./src/debug/Viewer.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33mviewer[39m[22m} +[21] [1mmulti ./src/debug/Repl.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33mrepl[39m[22m} +[22] [1mmulti ./src/debug/Test.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33mtest[39m[22m} +[23] [1mmulti ./src/mobile/InkControls.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33minkControls[39m[22m} +[24] [1mmulti ./src/mobile/ImageUpload.tsx webpack-hot-middleware/client?reload=true[39m[22m 40 bytes {[1m[33mimageUpload[39m[22m} + [[1m./node_modules/mobx-react/index.module.js[39m[22m] 48.8 KiB {[1m[33mbundle[39m[22m} {[1m[33mviewer[39m[22m} {[1m[33mrepl[39m[22m} {[1m[33mimageUpload[39m[22m} + [[1m./node_modules/mobx/lib/mobx.module.js[39m[22m] 175 KiB {[1m[33mbundle[39m[22m} {[1m[33mviewer[39m[22m} {[1m[33mrepl[39m[22m} {[1m[33mimageUpload[39m[22m} + [./node_modules/webpack-hot-middleware/client.js?reload=true] [1m(webpack)-hot-middleware/client.js?reload=true[39m[22m 7.68 KiB {[1m[33mbundle[39m[22m} {[1m[33mviewer[39m[22m} {[1m[33mrepl[39m[22m} {[1m[33mtest[39m[22m} {[1m[33minkControls[39m[22m} {[1m[33mimageUpload[39m[22m} + [[1m./src/client/views/Main.tsx[39m[22m] 4.03 KiB {[1m[33mbundle[39m[22m} + [[1m./src/debug/Repl.tsx[39m[22m] 6.87 KiB {[1m[33mrepl[39m[22m} + [[1m./src/debug/Test.tsx[39m[22m] 1.02 KiB {[1m[33mtest[39m[22m} + [[1m./src/debug/Viewer.tsx[39m[22m] 12.1 KiB {[1m[33mviewer[39m[22m} + [[1m./src/mobile/ImageUpload.tsx[39m[22m] 9.97 KiB {[1m[33mimageUpload[39m[22m} + [[1m./src/mobile/InkControls.tsx[39m[22m] 14 bytes {[1m[33minkControls[39m[22m} + + 1494 hidden modules + +[1m[33mWARNING in ./node_modules/typescript/lib/typescript.js 5121:41-60 +Critical dependency: the request of a dependency is an expression + @ ./src/client/util/Scripting.ts + @ ./src/debug/Viewer.tsx + @ multi ./src/debug/Viewer.tsx webpack-hot-middleware/client?reload=true[39m[22m +[34mℹ[39m [90m「wdm」[39m: Compiled with warnings. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(81,21): +prefer-const: Identifier 'marks' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(83,25): +prefer-const: Identifier 'tr' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(86,21): +prefer-const: Identifier 'isValidColor' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(87,25): +prefer-const: Identifier 's' is never reassigned; use 'const' instead of 'var'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(89,36): +triple-equals: == should be === +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(90,18): +semicolon: Missing semicolon +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(99,21): +prefer-const: Identifier 'tr' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(100,21): +prefer-const: Identifier 'marks' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(126,25): +prefer-const: Identifier 'node' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(141,25): +prefer-const: Identifier 'node' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(154,66): +no-unnecessary-type-assertion: This assertion is unnecessary since it does not change the type of the expression. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(155,25): +prefer-const: Identifier 'node' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(155,33): +no-unnecessary-type-assertion: This assertion is unnecessary since it does not change the type of the expression. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(160,25): +prefer-const: Identifier 'node' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextRules.ts(192,29): +prefer-const: Identifier 'doc' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextSchema.tsx(640,134): +semicolon: Missing semicolon +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextSchema.tsx(649,21): +prefer-const: Identifier 'expand' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextSchema.tsx(650,21): +prefer-const: Identifier 'tr' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextSchema.tsx(654,138): +semicolon: Missing semicolon +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/util/RichTextSchema.tsx(658,10): +semicolon: Missing semicolon +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/collections/CollectionView.tsx(243,13): +prefer-const: Identifier 'main' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/collections/CollectionView.tsx(244,13): +prefer-const: Identifier 'next' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/collections/CollectionView.tsx(245,13): +prefer-const: Identifier 'prev' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/DocumentDecorations.tsx(88,21): +prefer-const: Identifier 'selectionTitleFieldKey' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/DocumentDecorations.tsx(95,8): +semicolon: Missing semicolon +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/EditableView.tsx(123,13): +prefer-const: Identifier 'wasFocused' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/MainView.tsx(289,11): +semicolon: Missing semicolon +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/nodes/DocumentView.tsx(151,25): +prefer-const: Identifier 'any' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/nodes/FormattedTextBox.tsx(910,13): +prefer-const: Identifier 'prosediv' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/nodes/FormattedTextBox.tsx(911,13): +prefer-const: Identifier 'keeplocation' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/nodes/FormattedTextBox.tsx(913,13): +prefer-const: Identifier 'pos' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/nodes/FormattedTextBox.tsx(928,17): +prefer-const: Identifier 'pcords' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/nodes/FormattedTextBox.tsx(929,17): +prefer-const: Identifier 'node' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/nodes/FormattedTextBox.tsx(935,21): +prefer-const: Identifier 'lastNode' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/nodes/FormattedTextBox.tsx(976,71): +semicolon: Missing semicolon +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/nodes/FormattedTextBox.tsx(987,17): +prefer-const: Identifier '$pos' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/nodes/FormattedTextBox.tsx(1001,25): +prefer-const: Identifier '$olist_pos' is never reassigned; use 'const' instead of 'let'. +WARNING in /Users/swilkinss2012/Documents/GitHub/Dash-Web/src/client/views/nodes/FormattedTextBox.tsx(1103,17): +prefer-const: Identifier 'newHeight' is never reassigned; use 'const' instead of 'let'. +No type errors found +Version: typescript 3.7.2, tslint 5.18.0 +Time: 5473ms diff --git a/logs/npx ts-node-20965-Wed, 11 Dec 2019 03:38:32 GMT b/logs/npx ts-node-20965-Wed, 11 Dec 2019 03:38:32 GMT deleted file mode 100644 index e69de29bb..000000000 --- a/logs/npx ts-node-20965-Wed, 11 Dec 2019 03:38:32 GMT +++ /dev/null diff --git a/logs/server_pids.txt b/logs/server_pids.txt new file mode 100644 index 000000000..2aa143f24 --- /dev/null +++ b/logs/server_pids.txt @@ -0,0 +1 @@ +9675 created at Wed, 11 Dec 2019 08:44:28 GMT diff --git a/src/server/ActionUtilities.ts b/src/server/ActionUtilities.ts index 2173f4369..9bdc4ed93 100644 --- a/src/server/ActionUtilities.ts +++ b/src/server/ActionUtilities.ts @@ -1,12 +1,11 @@ -import * as fs from 'fs'; +import { readFile, writeFile, exists, mkdir, unlink } from 'fs'; import { ExecOptions } from 'shelljs'; -import { exec, spawn } from 'child_process'; +import { exec } from 'child_process'; import * as path from 'path'; import * as rimraf from "rimraf"; import { yellow, Color } from 'colors'; const projectRoot = path.resolve(__dirname, "../../"); - export function pathFromRoot(relative: string) { return path.resolve(projectRoot, relative); } @@ -21,24 +20,17 @@ export const command_line = (command: string, fromDirectory?: string) => { }); }; -export async function spawn_detached_process(command: string, args?: readonly string[]) { - const out = path.resolve(projectRoot, `./logs/${command}-${process.pid}-${new Date().toUTCString()}`); - const child_out = fs.openSync(out, 'a'); - const child_error = fs.openSync(out, 'a'); - spawn(command, args, { detached: true, stdio: ["ignore", child_out, child_error] }).unref(); -} - export const read_text_file = (relativePath: string) => { const target = path.resolve(__dirname, relativePath); return new Promise<string>((resolve, reject) => { - fs.readFile(target, (err, data) => err ? reject(err) : resolve(data.toString())); + readFile(target, (err, data) => err ? reject(err) : resolve(data.toString())); }); }; export const write_text_file = (relativePath: string, contents: any) => { const target = path.resolve(__dirname, relativePath); return new Promise<void>((resolve, reject) => { - fs.writeFile(target, contents, (err) => err ? reject(err) : resolve()); + writeFile(target, contents, (err) => err ? reject(err) : resolve()); }); }; @@ -93,10 +85,10 @@ export function msToTime(duration: number) { } export const createIfNotExists = async (path: string) => { - if (await new Promise<boolean>(resolve => fs.exists(path, resolve))) { + if (await new Promise<boolean>(resolve => exists(path, resolve))) { return true; } - return new Promise<boolean>(resolve => fs.mkdir(path, error => resolve(error === null))); + return new Promise<boolean>(resolve => mkdir(path, error => resolve(error === null))); }; export async function Prune(rootDirectory: string): Promise<boolean> { @@ -104,4 +96,4 @@ export async function Prune(rootDirectory: string): Promise<boolean> { return error === null; } -export const Destroy = (mediaPath: string) => new Promise<boolean>(resolve => fs.unlink(mediaPath, error => resolve(error === null))); +export const Destroy = (mediaPath: string) => new Promise<boolean>(resolve => unlink(mediaPath, error => resolve(error === null))); diff --git a/src/server/ProcessManager.ts b/src/server/ProcessManager.ts index 2237f9e1b..671f0a234 100644 --- a/src/server/ProcessManager.ts +++ b/src/server/ProcessManager.ts @@ -1,7 +1,9 @@ -import { writeFileSync, unlinkSync, existsSync, mkdirSync } from "fs"; -import { pathFromRoot, log_execution, spawn_detached_process } from './ActionUtilities'; -import { resolve } from "path"; -import { red, yellow } from "colors"; +import { existsSync, mkdirSync, createWriteStream } from "fs"; +import { pathFromRoot, log_execution } from './ActionUtilities'; +import { red, green } from "colors"; +import rimraf = require("rimraf"); +import { ChildProcess, spawn } from "child_process"; +import { Stream } from "stream"; const daemonPath = pathFromRoot("./src/server/daemon/persistence_daemon.ts"); @@ -9,22 +11,33 @@ export namespace ProcessManager { export async function initialize() { const logPath = pathFromRoot("./logs"); - const filePath = resolve(logPath, "./server_pids.txt"); - const exists = existsSync(logPath); - if (exists) { - unlinkSync(filePath); - } else { - mkdirSync(logPath); + if (existsSync(logPath)) { + if (!process.env.SPAWNED) { + await new Promise<any>(resolve => rimraf(logPath, resolve)); + } } - const { pid } = process; - if (process.env.SPAWNED === "true") { - writeFileSync(filePath, `${pid} created at ${new Date().toUTCString()}\n`); + mkdirSync(logPath); + } + + function generate_log_name(command: string, args?: readonly string[]) { + return pathFromRoot(`./logs/${command}-${args?.length}-${new Date().toUTCString()}.log`); + } + + export type Sink = "pipe" | "ipc" | "ignore" | "inherit" | Stream | number | null | undefined; + + export async function spawn_detached(command: string, args?: readonly string[], out?: Sink): Promise<ChildProcess> { + if (!out) { + const logStream = createWriteStream(generate_log_name(command, args)); + out = await new Promise<number>(resolve => logStream.on("open", resolve)); } + const child = spawn(command, args, { detached: true, stdio: ["ignore", out, out] }); + child.unref(); + return child; } let daemonInitialized = false; export async function trySpawnDaemon() { - if (!daemonInitialized) { + if (!process.env.SPAWNED && !daemonInitialized) { daemonInitialized = true; await log_execution({ startMessage: "\ninitializing persistence daemon", @@ -32,13 +45,15 @@ export namespace ProcessManager { const success = error === null && result !== undefined; if (!success) { console.log(red("failed to initialize the persistance daemon")); + console.log(error); process.exit(0); } - return "persistence daemon process closed"; + return "failsafe daemon process successfully spawned"; }, - action: () => spawn_detached_process("npx ts-node", [daemonPath]), - color: yellow + action: () => spawn_detached('npx', ['ts-node', daemonPath], process.stdout), + color: green }); + console.log(); } } diff --git a/src/server/daemon/current_daemon_pid.txt b/src/server/daemon/current_daemon_pid.txt new file mode 100644 index 000000000..f3cd0298c --- /dev/null +++ b/src/server/daemon/current_daemon_pid.txt @@ -0,0 +1 @@ +9626
\ No newline at end of file diff --git a/src/server/daemon/persistence_daemon.ts b/src/server/daemon/persistence_daemon.ts index 3eb17a9b4..099c7898c 100644 --- a/src/server/daemon/persistence_daemon.ts +++ b/src/server/daemon/persistence_daemon.ts @@ -1,22 +1,41 @@ import * as request from "request-promise"; -import { log_execution, spawn_detached_process } from "../ActionUtilities"; -import { red, yellow, cyan, green } from "colors"; +import { log_execution, pathFromRoot } from "../ActionUtilities"; +import { red, yellow, cyan, green, Color } from "colors"; import * as nodemailer from "nodemailer"; import { MailOptions } from "nodemailer/lib/json-transport"; -import { writeFileSync } from "fs"; +import { writeFileSync, appendFileSync, createWriteStream, existsSync } from "fs"; import { resolve } from 'path'; +import { ChildProcess } from "child_process"; +import { ProcessManager } from "../ProcessManager"; + +console.log(yellow("Initializing daemon...")); + +process.on('SIGINT', () => current_backup?.kill("SIGTERM")); + +const crashLogPath = resolve(__dirname, `./session_crashes_${timestamp()}.log`); +function addLogEntry(message: string, color: Color) { + const formatted = color(`${message} ${timestamp()}.`); + console.log(formatted); + appendFileSync(crashLogPath, `${formatted}\n`); +} const LOCATION = "http://localhost"; const recipient = "samuel_wilkins@brown.edu"; let restarting = false; -writeFileSync(resolve(__dirname, "./current_pid.txt"), process.pid); +const frequency = 10; +const { pid } = process; +writeFileSync(resolve(__dirname, "./current_daemon_pid.txt"), pid); +console.log(cyan(`${pid} written to ./current_daemon_pid.txt`)); function timestamp() { return `@ ${new Date().toISOString()}`; } +let current_backup: ChildProcess | undefined = undefined; + async function listen() { + console.log(yellow(`Beginning to poll server heartbeat every ${frequency} seconds...\n`)); if (!LOCATION) { console.log(red("No location specified for persistence daemon. Please include as a command line environment variable or in a .env file.")); process.exit(0); @@ -28,34 +47,40 @@ async function listen() { let error: any; try { await request.get(heartbeat); + if (restarting) { + addLogEntry("Backup server successfully restarted", green); + } + restarting = false; } catch (e) { error = e; } finally { if (error) { if (!restarting) { restarting = true; - console.log(yellow("Detected a server crash!")); + addLogEntry("Detected a server crash", red); + current_backup?.kill(); await log_execution({ startMessage: "Sending crash notification email", endMessage: ({ error, result }) => { const success = error === null && result === true; - return (success ? `Notification successfully sent to ` : `Failed to notify `) + recipient; + return `${(success ? `Notification successfully sent to` : `Failed to notify`)} ${recipient} ${timestamp()}`; }, action: async () => notify(error || "Hmm, no error to report..."), color: cyan }); - console.log(await log_execution({ + current_backup = await log_execution({ startMessage: "Initiating server restart", - endMessage: "Server successfully restarted", - action: () => spawn_detached_process(`npm run start-spawn`), + endMessage: ({ result, error }) => { + const success = error === null && result !== undefined; + return success ? "Child process spawned.." : `An error occurred while attempting to restart the server:\n${error}`; + }, + action: () => ProcessManager.spawn_detached('npm', ['run', 'start-spawn']), color: green - })); - restarting = false; + }); + writeFileSync(pathFromRoot("./logs/current_server_pid.txt"), `${current_backup?.pid ?? -1} created ${timestamp()}\n`); } else { console.log(yellow(`Callback ignored because restarting already initiated ${timestamp()}`)); } - } else { - console.log(green(`No issues detected ${timestamp()}`)); } } }, 1000 * 10); @@ -85,7 +110,7 @@ async function notify(error: any) { text: emailText(error) } as MailOptions; return new Promise<boolean>(resolve => { - smtpTransport.sendMail(mailOptions, (dispatchError: Error | null) => { console.log(dispatchError); resolve(dispatchError === null); }); + smtpTransport.sendMail(mailOptions, (dispatchError: Error | null) => resolve(dispatchError === null)); }); } diff --git a/src/server/daemon/session_crashes_@ 2019-12-11T08:31:56.281Z.log b/src/server/daemon/session_crashes_@ 2019-12-11T08:31:56.281Z.log new file mode 100644 index 000000000..32b7810ea --- /dev/null +++ b/src/server/daemon/session_crashes_@ 2019-12-11T08:31:56.281Z.log @@ -0,0 +1 @@ +Detected a server crash @ 2019-12-11T08:32:36.317Z diff --git a/src/server/daemon/session_crashes_@ 2019-12-11T08:43:46.454Z.log b/src/server/daemon/session_crashes_@ 2019-12-11T08:43:46.454Z.log new file mode 100644 index 000000000..ebb6843c2 --- /dev/null +++ b/src/server/daemon/session_crashes_@ 2019-12-11T08:43:46.454Z.log @@ -0,0 +1,2 @@ +[31mDetected a server crash @ 2019-12-11T08:44:26.494Z.[39m +[32mBackup server successfully restarted @ 2019-12-11T08:45:33.644Z.[39m |