import { Application } from "@oak/oak"; import { oakCors } from "@tajpouria/cors"; import attachmentsRouter from "./routes/attachments.ts"; import dumpsRouter from "./routes/dumps.ts"; import filesRouter from "./routes/files.ts"; import thumbnailsRouter from "./routes/thumbnails.ts"; import usersRouter from "./routes/users.ts"; import avatarsRouter from "./routes/avatars.ts"; import wsRouter from "./routes/ws.ts"; import previewRouter from "./routes/preview.ts"; import playlistsRouter from "./routes/playlists.ts"; import commentsRouter from "./routes/comments.ts"; import followsRouter from "./routes/follows.ts"; import notificationsRouter from "./routes/notifications.ts"; import invitesRouter from "./routes/invites.ts"; import searchRouter from "./routes/search.ts"; import { ALLOWED_ORIGINS, LISTEN_HOST, PORT, PUBLIC_URL } from "./config.ts"; import { errorMiddleware } from "./middleware/error.ts"; import { ogMiddleware } from "./middleware/og.ts"; import { routeStaticFilesFrom } from "./lib/static.ts"; const app = new Application(); const cors = oakCors({ origin: ALLOWED_ORIGINS }); app.use(errorMiddleware); app.use(ogMiddleware); // Only invoke oakCors when the origin is present and allowed. // The library calls next() without await when origin is falsy, which // corrupts the response in Oak's async middleware chain. app.use(async (ctx, next) => { const origin = ctx.request.headers.get("origin"); if (origin && ALLOWED_ORIGINS.includes(origin)) { return await cors(ctx, next); } await next(); }); app.use( dumpsRouter.routes(), dumpsRouter.allowedMethods(), ); app.use( filesRouter.routes(), filesRouter.allowedMethods(), ); app.use( thumbnailsRouter.routes(), thumbnailsRouter.allowedMethods(), ); app.use( attachmentsRouter.routes(), attachmentsRouter.allowedMethods(), ); app.use( usersRouter.routes(), usersRouter.allowedMethods(), ); app.use( avatarsRouter.routes(), avatarsRouter.allowedMethods(), ); app.use( wsRouter.routes(), wsRouter.allowedMethods(), ); app.use( previewRouter.routes(), previewRouter.allowedMethods(), ); app.use( playlistsRouter.routes(), playlistsRouter.allowedMethods(), ); app.use( commentsRouter.routes(), commentsRouter.allowedMethods(), ); app.use( followsRouter.routes(), followsRouter.allowedMethods(), ); app.use( notificationsRouter.routes(), notificationsRouter.allowedMethods(), ); app.use( invitesRouter.routes(), invitesRouter.allowedMethods(), ); app.use( searchRouter.routes(), searchRouter.allowedMethods(), ); app.use(routeStaticFilesFrom([ `${Deno.cwd()}/dist`, `${Deno.cwd()}/public`, ])); app.addEventListener( "listen", () => console.log(`Server listening on ${PUBLIC_URL}`), ); app.addEventListener( "error", (e) => console.log(`Uncaught error: ${e.message}`), ); if (import.meta.main) { await app.listen({ hostname: LISTEN_HOST, port: PORT }); } export { app };