server/index.ts

76 lines
2.3 KiB
TypeScript
Raw Normal View History

2024-04-07 07:30:49 +02:00
import { exists, mkdir } from "node:fs/promises";
import { connectMeili } from "@meilisearch";
import { moduleIsEntry } from "@module";
import type { PrismaClientInitializationError } from "@prisma/client/runtime/library";
2023-12-02 00:00:00 +01:00
import { initializeRedisCache } from "@redis";
2024-04-07 06:16:54 +02:00
import { config } from "config-manager";
import { LogLevel, LogManager, MultiLogManager } from "log-manager";
2024-04-07 07:30:49 +02:00
import { client } from "~database/datasource";
import { createServer } from "~server";
2023-11-30 05:16:58 +01:00
const timeAtStart = performance.now();
2023-09-11 05:54:14 +02:00
2024-04-07 07:30:49 +02:00
const requests_log = Bun.file(`${process.cwd()}/logs/requests.log`);
const isEntry = moduleIsEntry(import.meta.url);
// If imported as a module, redirect logs to /dev/null to not pollute console (e.g. in tests)
2024-04-07 07:30:49 +02:00
const logger = new LogManager(isEntry ? requests_log : Bun.file("/dev/null"));
const consoleLogger = new LogManager(
2024-04-07 07:30:49 +02:00
isEntry ? Bun.stdout : Bun.file("/dev/null"),
);
const dualLogger = new MultiLogManager([logger, consoleLogger]);
2023-09-15 05:21:38 +02:00
2024-04-07 06:16:54 +02:00
if (!(await exists(config.logging.storage.requests))) {
2024-04-07 07:30:49 +02:00
await consoleLogger.log(
LogLevel.WARNING,
"Lysand",
`Creating logs directory at ${process.cwd()}/logs/`,
);
2024-03-13 18:28:12 +01:00
2024-04-07 07:30:49 +02:00
await mkdir(`${process.cwd()}/logs/`);
2024-03-13 18:28:12 +01:00
}
await dualLogger.log(LogLevel.INFO, "Lysand", "Starting Lysand...");
// NODE_ENV seems to be broken and output `development` even when set to production, so use the flag instead
const isProd =
2024-04-07 07:30:49 +02:00
process.env.NODE_ENV === "production" || process.argv.includes("--prod");
2023-12-02 00:00:00 +01:00
const redisCache = await initializeRedisCache();
if (config.meilisearch.enabled) {
2024-04-07 07:30:49 +02:00
await connectMeili(dualLogger);
}
2023-12-02 00:00:00 +01:00
if (redisCache) {
2024-04-07 07:30:49 +02:00
client.$use(redisCache);
2023-12-02 00:00:00 +01:00
}
2023-11-21 00:58:39 +01:00
// Check if database is reachable
2023-11-29 04:57:35 +01:00
let postCount = 0;
2023-11-21 00:58:39 +01:00
try {
2024-04-07 07:30:49 +02:00
postCount = await client.status.count();
2023-11-21 00:58:39 +01:00
} catch (e) {
2024-04-07 07:30:49 +02:00
const error = e as PrismaClientInitializationError;
await logger.logError(LogLevel.CRITICAL, "Database", error);
await consoleLogger.logError(LogLevel.CRITICAL, "Database", error);
process.exit(1);
2023-11-21 00:58:39 +01:00
}
2024-04-07 06:16:54 +02:00
const server = createServer(config, dualLogger, isProd);
await dualLogger.log(
2024-04-07 07:30:49 +02:00
LogLevel.INFO,
"Server",
`Lysand started at ${config.http.bind}:${config.http.bind_port} in ${(
performance.now() - timeAtStart
).toFixed(0)}ms`,
2023-10-23 02:32:17 +02:00
);
2023-11-21 00:58:39 +01:00
await dualLogger.log(
2024-04-07 07:30:49 +02:00
LogLevel.INFO,
"Database",
`Database is online, now serving ${postCount} posts`,
2023-11-21 00:58:39 +01:00
);
export { config, server };