diff options
Diffstat (limited to 'src/server/web/index.ts')
| -rw-r--r-- | src/server/web/index.ts | 77 |
1 files changed, 44 insertions, 33 deletions
diff --git a/src/server/web/index.ts b/src/server/web/index.ts index 5b1b6409b9..b28ad5592c 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -5,60 +5,71 @@ import * as path from 'path'; import ms = require('ms'); -// express modules -import * as express from 'express'; -import * as bodyParser from 'body-parser'; -import * as favicon from 'serve-favicon'; -import * as compression from 'compression'; +import * as Koa from 'koa'; +import * as Router from 'koa-router'; +import * as send from 'koa-send'; +import * as favicon from 'koa-favicon'; const client = path.resolve(`${__dirname}/../../client/`); -// Create server -const app = express(); -app.disable('x-powered-by'); +// Init app +const app = new Koa(); -app.use('/docs', require('./docs')); - -app.use(bodyParser.urlencoded({ extended: true })); -app.use(bodyParser.json({ - type: ['application/json', 'text/plain'] -})); -app.use(compression()); +// Serve favicon +app.use(favicon(`${client}/assets/favicon.ico`)); -app.use((req, res, next) => { - res.header('X-Frame-Options', 'DENY'); +// Common request handler +app.use((ctx, next) => { + // IFrameの中に入れられないようにする + ctx.set('X-Frame-Options', 'DENY'); next(); }); +// Init router +const router = new Router(); + //#region static assets -app.use(favicon(`${client}/assets/favicon.ico`)); -app.get('/apple-touch-icon.png', (req, res) => res.sendFile(`${client}/assets/apple-touch-icon.png`)); -app.use('/assets', express.static(`${client}/assets`, { - maxAge: ms('7 days') -})); -app.use('/assets/*.js', (req, res) => res.sendFile(`${client}/assets/404.js`)); -app.use('/assets', (req, res) => { - res.sendStatus(404); +router.get('/assets', async ctx => { + await send(ctx, ctx.path, { + root: `${client}/assets`, + maxage: ms('7 days'), + immutable: true + }); +}); + +// Apple touch icon +router.get('/apple-touch-icon.png', async ctx => { + await send(ctx, `${client}/assets/apple-touch-icon.png`); }); // ServiceWroker -app.get(/^\/sw\.(.+?)\.js$/, (req, res) => - res.sendFile(`${client}/assets/sw.${req.params[0]}.js`)); +router.get(/^\/sw\.(.+?)\.js$/, async ctx => { + await send(ctx, `${client}/assets/sw.${ctx.params[0]}.js`); +}); // Manifest -app.get('/manifest.json', (req, res) => - res.sendFile(`${client}/assets/manifest.json`)); +router.get('/manifest.json', async ctx => { + await send(ctx, `${client}/assets/manifest.json`); +}); //#endregion -app.get(/\/api:url/, require('./url-preview')); +// Docs +router.use('/docs', require('./docs').routes()); + +// URL preview endpoint +router.get('url', require('./url-preview')); // Render base html for all requests -app.get('*', (req, res) => { - res.sendFile(path.resolve(`${client}/app/base.html`), { - maxAge: ms('7 days') +router.get('*', async ctx => { + await send(ctx, `${client}/app/base.html`, { + maxage: ms('7 days'), + immutable: true }); }); +// Register router +app.use(router.routes()); + module.exports = app; |