47 lines
1.4 KiB
TypeScript
47 lines
1.4 KiB
TypeScript
import { logger } from "./logger.js";
|
|
import { pool } from "./db.js";
|
|
import { startHealthServer, setSessionCountsProvider } from "./health.js";
|
|
import { sessionManager } from "./whatsapp/session-manager.js";
|
|
import { startBoss, stopBoss } from "./scheduler/pgboss-client.js";
|
|
import { registerReminderJobs } from "./scheduler/reminder-jobs.js";
|
|
import {
|
|
startCommandConsumer,
|
|
registerDefaultHandlers,
|
|
} from "./ipc/command-consumer.js";
|
|
import { sweepStalePendingAccounts } from "./ipc/pair-handler.js";
|
|
|
|
async function main(): Promise<void> {
|
|
logger.info("bot starting");
|
|
const health = startHealthServer();
|
|
setSessionCountsProvider(() => sessionManager.getCounts());
|
|
|
|
const boss = await startBoss();
|
|
await registerReminderJobs(boss);
|
|
|
|
registerDefaultHandlers();
|
|
const stopConsumer = await startCommandConsumer();
|
|
|
|
await sweepStalePendingAccounts();
|
|
await sessionManager.resumeFromDb();
|
|
|
|
const shutdown = async (signal: string): Promise<void> => {
|
|
logger.info({ signal }, "shutting down");
|
|
await stopConsumer();
|
|
await sessionManager.stopAll();
|
|
await stopBoss();
|
|
health.close();
|
|
await pool.end();
|
|
process.exit(0);
|
|
};
|
|
|
|
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
|
|
logger.info("bot ready");
|
|
}
|
|
|
|
main().catch((err) => {
|
|
logger.fatal({ err }, "bot failed to start");
|
|
process.exit(1);
|
|
});
|