-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
134 lines (110 loc) · 4.22 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
const express = require("express");
const fs = require("fs");
const path = require("path");
const cp = require("child_process");
const VueSSR = require("vue-server-renderer");
const LRU = require("lru-cache");
const axios = require("axios");
const querystring = require("querystring");
const cache = new LRU({ max: 10000, maxAge: 100000 });
const LOG_NAME = "error.log";
const PORT = 80;
const BASEURL = process.env.TOPAZ_BASEURL || "https://isu-csafe.stat.iastate.edu/topazdb/";
// okta variables
const OKTA_DOMAIN = process.env.TOPAZ_OKTA_DOMAIN;
const OKTA_CLIENT_ID = process.env.TOPAZ_OKTA_CLIENTID;
const OKTA_CLIENT_SECRET = process.env.TOPAZ_OKTA_CLIENTSECRET;
const OKTA_AUTHSERV = process.env.TOPAZ_OKTA_AUTHSERV;
const OKTA_REDIRECTURI = process.env.TOPAZ_OKTA_REDIRECTURI;
console.assert(OKTA_DOMAIN !== null);
console.assert(OKTA_CLIENT_ID !== null);
console.assert(OKTA_CLIENT_SECRET !== null);
console.assert(OKTA_REDIRECTURI !== null);
const server = express();
var serverBundle, clientManifest, renderer;
function createLogHeader() {
return new Date().toDateString() + " ========\n";
}
function exec(command) {
return new Promise((resolve, reject) => {
cp.exec(command, { encoding: 'utf-8' }, (error, stdout, stderr) => {
if(error) reject(stdout); // when webpack is run inside npm scripts, stderr from webpack will be piped to stdout
else resolve(stdout);
})
});
}
async function reload() {
try {
if(process.env.NODE_ENV !== "production") {
let result = await exec("npm run --silent build");
if(!result.match(/Build Complete/g)) return;
} else {
var client = fs.readFileSync("./dist/client.js");
client = client.replace("{{TOPAZ_OKTA_DOMAIN}}", OKTA_DOMAIN);
client = client.replace("{{TOPAZ_OKTA_AUTHSERV}}", OKTA_AUTHSERV);
client = client.replace("{{TOPAZ_OKTA_CLIENTID}}", OKTA_CLIENT_ID);
client = client.replace("{{TOPAZ_OKTA_REDIRECTURI}}", OKTA_REDIRECTURI);
fs.writeFileSync("./dist/client.js", client);
}
delete require.cache[require.resolve("./dist/vue-ssr-server-bundle.json")];
delete require.cache[require.resolve("./dist/vue-ssr-client-manifest.json")];
serverBundle = require("./dist/vue-ssr-server-bundle.json");
clientManifest = require("./dist/vue-ssr-client-manifest.json");
renderer = VueSSR.createBundleRenderer(serverBundle, {
runInNewContext: false,
template: fs.readFileSync("./index.html", "utf-8"),
clientManifest,
inject: false,
cache,
});
console.log("reload complete");
return true;
} catch(err) {
console.error("An error occurred reloading the server. The output has been written to gui/error.log");
fs.appendFileSync(LOG_NAME, createLogHeader() + err + "\n\n");
return false;
}
}
if(process.argv.includes("--watch")) {
const watch = require("watch");
watch.createMonitor(__dirname + "/src", monitor => {
monitor.on("changed", async () => {
console.log("Source changed, reloading server");
await reload();
});
});
}
server.use(express.json());
server.use("/dist", express.static(path.join(__dirname, "./dist")));
server.get("*", (req, res) => {
const context = {
url: req.url,
base: BASEURL,
meta: "",
title: "TopazDB",
cookies: req.headers["cookie"],
};
renderer.renderToString(context, (err, html) => {
console.log(err);
let code = err !== null && typeof err.code === "number" ? err.code : 200;
res.status(code);
switch(code) {
case 404:
html = "Page not found";
break;
case 500:
html = "Internal Server Error";
break;
case 503:
html = "TopazDB is currently undergoing maintenance. Please check back later.";
break;
default:
case 200: break;
}
res.end(html);
});
});
(async function() {
await reload();
server.listen(PORT);
})();