/* * clippr: a social bookmarking service for the AT Protocol * Copyright (c) 2025 clippr contributors. * SPDX-License-Identifier: AGPL-3.0-only */ import { serve, type ServerType } from "@hono/node-server"; import { Config } from "./config.js"; import { readFromFirehose, startFirehose, stopFirehose, } from "./network/jetstream.js"; import app from "./server.js"; import { Database } from "./db/database.js"; import Logger from "./logger.js"; async function main() { const logger = Logger; logger.info(`Clippr-BE v${process.env.npm_package_version} starting...`); // Config is already loaded into the app (when preparing logger) const config = Config.getInstance().getConfig(); logger.verbose("Initializing database..."); Database.getInstance(); logger.verbose("Initializing Jetstream connection..."); startFirehose(); readFromFirehose(); logger.verbose("Starting XRPC server..."); const server: ServerType = serve({ port: config.port, hostname: config.hostname, fetch: app.fetch, }); logger.info( `XRPC server launched at http://${config.hostname}:${config.port}`, ); process.removeAllListeners("SIGINT"); process.removeAllListeners("SIGTERM"); process.once("SIGINT", () => gracefulShutdown("SIGINT")); process.once("SIGTERM", () => gracefulShutdown("SIGTERM")); function gracefulShutdown(signal: string) { logger.info(`Received ${signal}, shutting down...`); server.close(); stopFirehose(); logger.info("Bye!"); process.exit(0); } } main();