| 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; |
| } |
|
|