UNPKG

1.46 kBJavaScriptView Raw
1// @ts-check
2import fs from "fs";
3import path from "path";
4
5import Koa2 from "koa";
6import body from "koa-body";
7import compress from "koa-compress";
8import cors from "@koa/cors";
9import helmet from "koa-helmet";
10import koaLogger from "koa-logger";
11import koaPinoLogger from "koa-pino-logger";
12import jwt from "koa-jwt";
13import Router from "koa-tree-router";
14import health from "@36node/koa-health";
15import openapi from "@36node/koa-openapi";
16
17import logger from "./lib/log";
18import { BASE, NODE_ENV } from "./config";
19import { petService } from "./services";
20import pkg from "../package.json";
21import { errHandler } from "./middlewares";
22
23const app = new Koa2();
24const router = new Router({ prefix: BASE });
25const publicKey = fs.readFileSync(path.join(__dirname, "../ssl/rsa_jwt.pub"));
26
27/**
28 * register services
29 */
30petService.bind(router);
31
32/**
33 * logger
34 */
35if (NODE_ENV !== "production") {
36 // simple log under development
37 app.use(koaLogger());
38} else {
39 app.use(koaPinoLogger({ logger }));
40}
41
42/**
43 * application
44 */
45app
46 .use(errHandler())
47 .use(helmet())
48 .use(cors({ exposeHeaders: ["Link", "X-Total-Count"] }))
49 .use(health({ url: `${BASE}/health`, version: pkg.version }))
50 .use(
51 openapi({
52 url: `${BASE}/openapi.yml`,
53 file: path.join(__dirname, "../openapi.yml"),
54 })
55 )
56 .use(jwt({ secret: publicKey, key: "jwt" }))
57 .use(body())
58 .use(compress({ threshold: 2048 }))
59 .use(router.routes());
60
61export default app;