2017-10-23 00:16:57 +00:00
|
|
|
// @flow
|
2020-06-20 20:59:15 +00:00
|
|
|
import path from "path";
|
|
|
|
import Koa from "koa";
|
|
|
|
import Router from "koa-router";
|
2020-07-18 18:02:40 +00:00
|
|
|
import fs from "fs";
|
|
|
|
import util from "util";
|
2020-06-20 20:59:15 +00:00
|
|
|
import sendfile from "koa-sendfile";
|
|
|
|
import serve from "koa-static";
|
|
|
|
import apexRedirect from "./middlewares/apexRedirect";
|
|
|
|
import { robotsResponse } from "./utils/robots";
|
|
|
|
import { opensearchResponse } from "./utils/opensearch";
|
2020-07-18 18:02:40 +00:00
|
|
|
import environment from "./env";
|
2020-06-20 20:59:15 +00:00
|
|
|
|
|
|
|
const isProduction = process.env.NODE_ENV === "production";
|
2016-04-29 05:25:37 +00:00
|
|
|
const koa = new Koa();
|
|
|
|
const router = new Router();
|
2020-07-18 18:02:40 +00:00
|
|
|
const readFile = util.promisify(fs.readFile);
|
|
|
|
|
2020-08-09 01:53:11 +00:00
|
|
|
const readIndexFile = async (ctx) => {
|
2020-07-18 18:02:40 +00:00
|
|
|
if (isProduction) {
|
|
|
|
return readFile(path.join(__dirname, "../dist/index.html"));
|
|
|
|
}
|
|
|
|
|
|
|
|
const middleware = ctx.devMiddleware;
|
2020-08-09 01:53:11 +00:00
|
|
|
await new Promise((resolve) => middleware.waitUntilValid(resolve));
|
2020-07-18 18:02:40 +00:00
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
middleware.fileSystem.readFile(
|
|
|
|
`${ctx.webpackConfig.output.path}/index.html`,
|
|
|
|
(err, result) => {
|
|
|
|
if (err) {
|
|
|
|
return reject(err);
|
|
|
|
}
|
|
|
|
resolve(result);
|
|
|
|
}
|
|
|
|
);
|
|
|
|
});
|
|
|
|
};
|
2016-04-29 05:25:37 +00:00
|
|
|
|
2017-10-29 22:02:24 +00:00
|
|
|
// serve static assets
|
2018-12-21 04:00:58 +00:00
|
|
|
koa.use(
|
2020-06-20 20:59:15 +00:00
|
|
|
serve(path.resolve(__dirname, "../public"), {
|
2018-12-21 04:00:58 +00:00
|
|
|
maxage: 60 * 60 * 24 * 30 * 1000,
|
|
|
|
})
|
|
|
|
);
|
2017-10-29 22:02:24 +00:00
|
|
|
|
2020-08-09 01:53:11 +00:00
|
|
|
router.get("/_health", (ctx) => (ctx.body = "OK"));
|
2016-09-05 21:26:06 +00:00
|
|
|
|
2020-06-20 20:59:15 +00:00
|
|
|
if (process.env.NODE_ENV === "production") {
|
2020-08-09 01:53:11 +00:00
|
|
|
router.get("/static/*", async (ctx) => {
|
2016-06-01 23:48:35 +00:00
|
|
|
ctx.set({
|
2020-06-20 20:59:15 +00:00
|
|
|
"Cache-Control": `max-age=${356 * 24 * 60 * 60}`,
|
2016-06-01 23:48:35 +00:00
|
|
|
});
|
|
|
|
|
2017-05-10 06:14:24 +00:00
|
|
|
await sendfile(
|
|
|
|
ctx,
|
2020-06-20 20:59:15 +00:00
|
|
|
path.join(__dirname, "../dist/", ctx.path.substring(8))
|
2017-05-10 06:14:24 +00:00
|
|
|
);
|
2016-05-07 16:18:20 +00:00
|
|
|
});
|
2017-10-22 23:33:10 +00:00
|
|
|
}
|
2016-04-29 05:25:37 +00:00
|
|
|
|
2020-08-09 01:53:11 +00:00
|
|
|
router.get("/robots.txt", (ctx) => {
|
2019-08-09 02:52:29 +00:00
|
|
|
ctx.body = robotsResponse(ctx);
|
|
|
|
});
|
|
|
|
|
2020-08-09 01:53:11 +00:00
|
|
|
router.get("/opensearch.xml", (ctx) => {
|
2020-06-20 20:59:15 +00:00
|
|
|
ctx.type = "text/xml";
|
2019-08-09 02:52:29 +00:00
|
|
|
ctx.body = opensearchResponse();
|
|
|
|
});
|
2018-01-22 02:47:43 +00:00
|
|
|
|
2020-07-10 05:33:07 +00:00
|
|
|
// catch all for application
|
2020-06-20 20:59:15 +00:00
|
|
|
router.get("*", async (ctx, next) => {
|
2020-07-10 05:33:07 +00:00
|
|
|
if (ctx.request.path === "/realtime/") {
|
|
|
|
return next();
|
|
|
|
}
|
2019-04-18 02:11:23 +00:00
|
|
|
|
2020-07-18 18:02:40 +00:00
|
|
|
const page = await readIndexFile(ctx);
|
|
|
|
const env = `
|
|
|
|
window.env = ${JSON.stringify(environment)};
|
|
|
|
`;
|
|
|
|
ctx.body = page
|
|
|
|
.toString()
|
|
|
|
.replace(/\/\/inject-env\/\//g, env)
|
|
|
|
.replace(/\/\/inject-sentry-dsn\/\//g, process.env.SENTRY_DSN || "")
|
|
|
|
.replace(/\/\/inject-slack-app-id\/\//g, process.env.SLACK_APP_ID || "");
|
2017-10-22 23:33:10 +00:00
|
|
|
});
|
2016-04-29 05:25:37 +00:00
|
|
|
|
2017-10-23 00:16:57 +00:00
|
|
|
// middleware
|
2018-11-04 03:27:57 +00:00
|
|
|
koa.use(apexRedirect());
|
2016-04-29 05:25:37 +00:00
|
|
|
koa.use(router.routes());
|
|
|
|
|
2016-06-01 23:48:35 +00:00
|
|
|
export default koa;
|