diff options
Diffstat (limited to 'src/server.ts')
| -rw-r--r-- | src/server.ts | 80 |
1 files changed, 53 insertions, 27 deletions
diff --git a/src/server.ts b/src/server.ts index 3520958..6a9c06e 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,59 +1,85 @@ import https from "https"; -import morgan from "morgan"; -import express from "express"; -import { resolve } from "path"; import { config } from "dotenv"; import corsConfig from "./config/cors.js"; import { ratelimit } from "./config/ratelimit.js"; -import errorHandler from "./config/errorHandler.js"; -import notFoundHandler from "./config/notFoundHandler.js"; -import animeRouter from "./routes/index.js"; +import { hianimeRouter } from "./routes/hianime.js"; + +import { serveStatic } from "@hono/node-server/serve-static"; +import { serve } from "@hono/node-server"; +import { Hono } from "hono"; +import { logger } from "hono/logger"; + +import { HiAnimeError } from "aniwatch"; config(); -const app: express.Application = express(); -const PORT: number = Number(process.env.PORT) || 4000; -app.use(morgan("dev")); +const BASE_PATH = "/api/v2" as const; +const PORT: number = Number(process.env.ANIWATCH_API_PORT) || 4000; +const ANIWATCH_API_HOSTNAME = process.env?.ANIWATCH_API_HOSTNAME; + +const app = new Hono(); + +app.use(logger()); app.use(corsConfig); // CAUTION: For personal deployments, "refrain" from having an env // named "ANIWATCH_API_HOSTNAME". You may face rate limitting -// and other issues if you do. -const ISNT_PERSONAL_DEPLOYMENT = Boolean(process?.env?.ANIWATCH_API_HOSTNAME); +// or other issues if you do. +const ISNT_PERSONAL_DEPLOYMENT = Boolean(ANIWATCH_API_HOSTNAME); if (ISNT_PERSONAL_DEPLOYMENT) { app.use(ratelimit); } -app.use(express.static(resolve("public"))); -app.get("/health", (_, res) => res.sendStatus(200)); -app.use("/anime", animeRouter); +app.use("/", serveStatic({ root: "public" })); +app.get("/health", (c) => c.text("OK", { status: 200 })); + +app.basePath(BASE_PATH).route("/hianime", hianimeRouter); +app + .basePath(BASE_PATH) + .get("/anicrush", (c) => c.text("Anicrush could be implemented in future.")); -app.use(notFoundHandler); -app.use(errorHandler); +app.notFound((c) => + c.json({ status: 404, message: "Resource Not Found" }, 404) +); + +app.onError((err, c) => { + console.error(err); + const res = { status: 500, message: "Internal Server Error" }; + + if (err instanceof HiAnimeError) { + res.status = err.status; + res.message = err.message; + } + + return c.json(res, { status: res.status }); +}); // NOTE: this env is "required" for vercel deployments -if (!Boolean(process?.env?.IS_VERCEL_DEPLOYMENT)) { - app.listen(PORT, () => { - console.log(`⚔️ api @ http://localhost:${PORT}`); - }); +if (!Boolean(process?.env?.ANIWATCH_API_VERCEL_DEPLOYMENT)) { + serve({ + port: PORT, + fetch: app.fetch, + }).addListener("listening", () => + console.info( + "\x1b[1;36m" + `aniwatch-api at http://localhost:${PORT}` + "\x1b[0m" + ) + ); // NOTE: remove the `if` block below for personal deployments if (ISNT_PERSONAL_DEPLOYMENT) { + const interval = 9 * 60 * 1000; // 9mins + // don't sleep - const intervalTime = 9 * 60 * 1000; // 9mins setInterval(() => { - console.log("HEALTHCHECK ;)", new Date().toLocaleString()); + console.log("aniwatch-api HEALTH_CHECK at", new Date().toISOString()); https - .get( - new URL("/health", `https://${process.env.ANIWATCH_API_HOSTNAME}`) - .href - ) + .get(`https://${ANIWATCH_API_HOSTNAME}/health`) .on("error", (err) => { console.error(err.message); }); - }, intervalTime); + }, interval); } } |
