-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
36 lines (31 loc) · 1.28 KB
/
Copy pathindex.js
File metadata and controls
36 lines (31 loc) · 1.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Entry point. Runs the web (producer) and/or worker (consumer) roles in one process.
// ROLE=all node index.js web + worker (default; local use)
// ROLE=web node index.js producer only
// ROLE=worker node index.js consumer only (scale horizontally)
const { cfg } = require('./src/config');
const { log } = require('./src/logger');
const { startWeb } = require('./src/web');
const { startWorker } = require('./src/worker');
const { reviewQueue, deadQueue, connection } = require('./src/queue');
const servers = [];
let worker;
if (cfg.role === 'web' || cfg.role === 'all') servers.push(startWeb());
if (cfg.role === 'worker' || cfg.role === 'all') worker = startWorker();
log('info', '-', `TurtleCode started (role=${cfg.role})`);
// Graceful shutdown: stop accepting work, finish in-flight jobs, close connections.
let shuttingDown = false;
async function shutdown(sig) {
if (shuttingDown) return;
shuttingDown = true;
log('info', '-', `shutting down (${sig})`);
await Promise.allSettled([
...servers.map(s => new Promise(resolve => s.close(resolve))),
worker?.close(),
reviewQueue.close(),
deadQueue.close(),
]);
await connection.quit();
process.exit(0);
}
process.on('SIGTERM', () => shutdown('SIGTERM'));
process.on('SIGINT', () => shutdown('SIGINT'));