First cut

This commit is contained in:
kadil
2026-04-17 16:08:31 -05:00
parent d10105ac00
commit 4ee4cb8e7c
58 changed files with 3243 additions and 1 deletions

61
server/src/index.ts Normal file
View File

@@ -0,0 +1,61 @@
import { createApp } from './app.js';
import { createEditQueue } from './queue/edit-queue.js';
import { processEditJob } from './queue/process-edit-job.js';
import { openDb, closeDb, pruneExpiredProposals, pruneIdempotencyKeys } from './db.js';
import { logger } from './logger.js';
const PORT = parseInt(process.env.ORCHESTRATOR_PORT || '3001', 10);
export async function startServer() {
// Initialize database
openDb();
logger.info({ event: 'db.opened' }, 'SQLite database opened');
// Create queue and wire consumer
const queue = createEditQueue();
queue.startConsumer(processEditJob);
// Periodic cleanup
const cleanupInterval = setInterval(() => {
pruneExpiredProposals();
pruneIdempotencyKeys();
}, 60_000);
// Create and start HTTP server
const app = createApp({ queue });
const server = app.listen(PORT, () => {
logger.info({ event: 'server.started', port: PORT }, `Orchestrator listening on port ${PORT}`);
});
// Graceful shutdown
let shuttingDown = false;
async function shutdown(signal: string) {
if (shuttingDown) return;
shuttingDown = true;
logger.info({ event: 'server.shutdown', signal }, `Received ${signal}, shutting down...`);
clearInterval(cleanupInterval);
// Stop accepting new connections
server.close(() => {
logger.info({ event: 'server.closed' }, 'HTTP server closed');
});
// Drain queue (finish current job)
await queue.shutdown();
// Close database
closeDb();
logger.info({ event: 'db.closed' }, 'Database closed');
process.exit(0);
}
process.on('SIGTERM', () => shutdown('SIGTERM'));
process.on('SIGINT', () => shutdown('SIGINT'));
}
startServer().catch(err => {
logger.fatal({ error: (err as Error).message }, 'Failed to start server');
process.exit(1);
});