File size: 1,723 Bytes
2671e04
e43a4a9
 
 
 
 
 
2671e04
e43a4a9
 
 
 
 
 
8b5482f
 
 
 
 
 
 
 
 
 
 
 
 
 
e43a4a9
2671e04
 
 
 
 
 
 
 
 
 
 
 
 
 
e43a4a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import path from "node:path";
import express from "express";
import { createApiRouter } from "./routes/apiRouter.js";
import { HttpError } from "./utils/httpError.js";

export function createApp({
  jsonLimit,
  publicDir,
  chatController,
  mediaController
}) {
  const app = express();

  app.disable("x-powered-by");
  app.use((req, res, next) => {
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,PATCH,DELETE,OPTIONS");

    const requestedHeaders = req.get("access-control-request-headers");
    res.setHeader("Access-Control-Allow-Headers", requestedHeaders || "Content-Type, Authorization");

    if (req.method === "OPTIONS") {
      res.status(204).end();
      return;
    }

    next();
  });
  app.use(express.json({ limit: jsonLimit }));
  app.get("/", (_req, res) => {
    res.sendFile(path.join(publicDir, "index.html"));
  });
  app.get(["/chatclient", "/chatclient/"], (_req, res) => {
    res.sendFile(path.join(publicDir, "chatclient", "index.html"));
  });
  app.get(["/chat", "/chat/"], (_req, res) => {
    res.redirect(302, "/chatclient/");
  });
  app.use(express.static(publicDir, {
    extensions: ["html"],
    index: false,
    redirect: false
  }));

  app.use("/v1", createApiRouter({ chatController, mediaController }));

  app.use((req, _res, next) => {
    next(new HttpError(404, `Route not found: ${req.method} ${req.originalUrl}`));
  });

  app.use((error, _req, res, _next) => {
    const statusCode = error.statusCode ?? 500;
    res.status(statusCode).json({
      error: {
        message: error.message ?? "Internal server error",
        details: error.details ?? null
      }
    });
  });

  return app;
}