The frontend/UI server, written in JS using the MarkoJS library
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.2 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. // Setup global environment
  2. require("marko/node-require").install()
  3. require("es6-promise").polyfill()
  4. // Load server config
  5. const config = require("./config")
  6. // Express depedencies
  7. const express = require("express")
  8. const proxy = require("express-http-proxy")
  9. const proxy2 = require("http-proxy-middleware")
  10. const ip = require("ip")
  11. const dns = require("dns")
  12. const lasso = require("lasso")
  13. const lassoMiddleware = require("lasso/middleware")
  14. const markoExpress = require("marko/express")
  15. const bodyParser = require("body-parser")
  16. // Load middleware
  17. const passport = require("./middleware/passport")
  18. const session = require("./middleware/session")
  19. // Setup express
  20. const app = express()
  21. // Configure lasso
  22. lasso.configure(require("./marko-config"))
  23. // Set trusted proxy
  24. if (config.trustedProxy != null) {
  25. if (config.trustedProxy === "GATEWAY") {
  26. const ip = require("child_process").execSync("/sbin/ip route|awk '/default/ { print $3 }'").toString().trim()
  27. app.set('trust proxy', ip)
  28. console.log("Trusting proxy from default gateway", ip);
  29. } else if (ip.isV4Format(config.trustedProxy) || ip.isV6Format(config.trustedProxy)) {
  30. app.set('trust proxy', config.trustedProxy)
  31. console.log("Trusting proxy", config.trustedProxy);
  32. } else {
  33. let trusted = null
  34. setInterval(() => {
  35. dns.resolve4(config.trustedProxy, (err, res) => {
  36. if (err != null) {
  37. if (trusted === null) {
  38. console.error("Failed to resolve trustedProxy hostname")
  39. }
  40. return
  41. }
  42. if (res.length === 0) {
  43. if (trusted === null) {
  44. console.error("No results for trustedProxy hostname")
  45. }
  46. return
  47. }
  48. if (trusted !== res[0]) {
  49. console.log("Trusting proxy", res[0], `(${config.trustedProxy})`);
  50. app.set('trust proxy', res[0])
  51. trusted = res[0]
  52. }
  53. })
  54. }, 1000)
  55. }
  56. }
  57. // Apply middleware
  58. app.use(markoExpress())
  59. app.use(session)
  60. app.use(passport.initialize())
  61. app.use(passport.session())
  62. app.use(require("./middleware/locals"))
  63. // Proxy (does not want all middleware)
  64. app.use("/graphql", require("./routes/graphql").router)
  65. app.use("/playground", proxy(config.playgroundEndpoint))
  66. // The rest of the middleware
  67. app.use(bodyParser.json({limit: "1mb"}))
  68. app.use(bodyParser.text({limit: "256kb"}))
  69. // Static assets
  70. app.use("/assets", express.static(__dirname + "/assets"))
  71. app.use(lassoMiddleware.serveStatic())
  72. // Authentication
  73. app.use("/auth", require("./routes/auth"))
  74. // Global css doesn't work with prebuild.
  75. if (process.env.NODE_ENV === "production") {
  76. app.use("/hax/global.css", require("./routes/globalcss"))
  77. } else {
  78. app.get("/hax/global.css", (req, res) => {
  79. res.type(".css").end("")
  80. })
  81. }
  82. // Page routes
  83. app.use("/story/", require("./routes/story"))
  84. app.use("/story/unlisted/", require("./routes/story/unlisted"))
  85. app.use("/story/by-category/", require("./routes/story/by-category"))
  86. app.use("/story/by-tag/", require("./routes/story/by-tag"))
  87. app.use("/story/by-month/", require("./routes/story/by-month"))
  88. app.use("/story/by-author/", require("./routes/story/by-author"))
  89. app.use("/story/tag-list/", require("./routes/story/tag-list"))
  90. app.use("/story/:id(S[0-9a-z]{15})/", require("./routes/story-content"))
  91. app.use("/logs/", require("./routes/logs"))
  92. app.use("/logs/:id([0-9]{4}-[0-1][0-9]-[0-3][0-9]_[0-9]{9}_[A-Za-z0-9\,\'\-]{2,})/", require("./routes/logs-content"))
  93. app.use("/logs/:id(L[0-9]{0,7})/", require("./routes/logs-content"))
  94. app.use("/data/", require("./routes/data"))
  95. app.use("/data/characters/", require("./routes/data/characters"))
  96. app.use("/data/channels/", require("./routes/data/channels"))
  97. app.use("/data/changes/", require("./routes/data/changes"))
  98. app.use("/data/files/", require("./routes/data/files"))
  99. // Entry point
  100. app.get("/", function(req, res) {
  101. res.redirect("/story/")
  102. })
  103. // Start server
  104. app.listen(config.port, function() {
  105. console.log("Server started: http://localhost:" + config.port + "/")
  106. if (process.send) {
  107. setTimeout(() => process.send("online"), 100)
  108. }
  109. })
  110. // Handle shutdown signals (Docker needs this to shutdown quickly)
  111. process.on('SIGINT', () => process.exit(0))
  112. process.on('SIGTERM', () => process.exit(0))