2026-02-17 12:24:43 -06:00
|
|
|
import { createServer } from "node:http";
|
|
|
|
|
import { resolve } from "node:path";
|
2026-02-16 19:07:37 -06:00
|
|
|
import { createDb, createPgliteDb } from "@paperclip/db";
|
2026-02-16 13:31:58 -06:00
|
|
|
import { createApp } from "./app.js";
|
|
|
|
|
import { loadConfig } from "./config.js";
|
|
|
|
|
import { logger } from "./middleware/logger.js";
|
2026-02-17 12:24:43 -06:00
|
|
|
import { setupLiveEventsWebSocketServer } from "./realtime/live-events-ws.js";
|
|
|
|
|
import { heartbeatService } from "./services/index.js";
|
2026-02-16 13:31:58 -06:00
|
|
|
|
|
|
|
|
const config = loadConfig();
|
2026-02-16 19:07:37 -06:00
|
|
|
|
|
|
|
|
let db;
|
|
|
|
|
if (config.databaseUrl) {
|
|
|
|
|
db = createDb(config.databaseUrl);
|
|
|
|
|
} else {
|
2026-02-17 12:24:43 -06:00
|
|
|
const dataDir = resolve("./data/pglite");
|
|
|
|
|
logger.info(`No DATABASE_URL set — using embedded PGlite (${dataDir})`);
|
|
|
|
|
db = await createPgliteDb(dataDir);
|
2026-02-16 19:07:37 -06:00
|
|
|
logger.info("PGlite ready, schema pushed");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const app = createApp(db as any, { serveUi: config.serveUi });
|
2026-02-17 12:24:43 -06:00
|
|
|
const server = createServer(app);
|
2026-02-16 13:31:58 -06:00
|
|
|
|
2026-02-17 12:24:43 -06:00
|
|
|
setupLiveEventsWebSocketServer(server, db as any);
|
|
|
|
|
|
|
|
|
|
if (config.heartbeatSchedulerEnabled) {
|
|
|
|
|
const heartbeat = heartbeatService(db as any);
|
|
|
|
|
setInterval(() => {
|
|
|
|
|
void heartbeat
|
|
|
|
|
.tickTimers(new Date())
|
|
|
|
|
.then((result) => {
|
|
|
|
|
if (result.enqueued > 0) {
|
|
|
|
|
logger.info({ ...result }, "heartbeat timer tick enqueued runs");
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch((err) => {
|
|
|
|
|
logger.error({ err }, "heartbeat timer tick failed");
|
|
|
|
|
});
|
|
|
|
|
}, config.heartbeatSchedulerIntervalMs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
server.listen(config.port, () => {
|
2026-02-16 13:31:58 -06:00
|
|
|
logger.info(`Server listening on :${config.port}`);
|
|
|
|
|
});
|