import { Archiver } from "./archiver.js"; import { loadConfig } from "./config.js"; import { startHealthServer } from "./health.js"; import { logger } from "./logger.js"; import { MatrixClient } from "./matrix.js"; import { ArchiveProcessor } from "./processor.js"; import { PgArchiveStore } from "./store.js"; import { OcisWebDav } from "./webdav.js"; async function main(): Promise { const config = loadConfig(); const shutdown = new AbortController(); for (const signal of ["SIGTERM", "SIGINT"] as const) { process.once(signal, () => { logger.info({ signal }, "archive-bot: shutting down"); shutdown.abort(); }); } const matrix = new MatrixClient({ homeserver: config.homeserverUrl, user: config.matrixUser, password: config.matrixPassword, deviceId: config.matrixDeviceId, mediaRedirectHosts: config.mediaRedirectHosts, roomIds: config.mappings.map((m) => m.roomId), logger, }); await matrix.login(shutdown.signal); logger.info({ userId: matrix.userId, rooms: config.mappings.length }, "archive-bot: logged in"); const store = PgArchiveStore.create(config.databaseUrl, matrix.userId); const library = new OcisWebDav(config.webdav.baseUrl, config.webdav.user, config.webdav.password); const processor = new ArchiveProcessor(matrix, store, new Archiver(matrix, library, store), config.mappings, logger); await processor.init(); const health = startHealthServer(config.healthPort, () => processor.health(), logger); try { await processor.run(shutdown.signal, (signal) => matrix.login(signal)); } finally { await new Promise((resolve) => health.close(() => resolve())); await store.close(); } logger.info("archive-bot: stopped"); } void main().catch((error: unknown) => { logger.fatal({ err: error instanceof Error ? error.message : String(error) }, "archive-bot: fatal"); process.exitCode = 1; });