|
1 | | -import cluster, { Worker } from 'cluster' |
2 | | -import { cpus } from 'os' |
3 | | -import http from 'http' |
4 | | -import process from 'process' |
5 | | -import { WebSocketServer } from 'ws' |
| 1 | +import cluster from 'cluster' |
6 | 2 |
|
7 | | -import { createSettings } from './factories/settings-factory' |
8 | | -import { EventRepository } from './repositories/event-repository' |
9 | | -import { getDbClient } from './database/client' |
10 | | -import packageJson from '../package.json' |
11 | | -import { webSocketAdapterFactory } from './factories/websocket-adapter-factory' |
12 | | -import { WebSocketServerAdapter } from './adapters/web-socket-server-adapter' |
| 3 | +import { appFactory } from './factories/app-factory' |
| 4 | +import { workerFactory } from './factories/worker-factory' |
13 | 5 |
|
14 | | -const newWorker = (): Worker => { |
15 | | - return cluster.fork() |
| 6 | +export const run = (isPrimary: boolean) => { |
| 7 | + return (isPrimary) |
| 8 | + ? appFactory |
| 9 | + : workerFactory |
16 | 10 | } |
17 | 11 |
|
18 | | -if (cluster.isPrimary) { |
19 | | - console.log(`${packageJson.name}@${packageJson.version}`) |
20 | | - console.log(`supported NIPs: ${packageJson.supportedNips}`) |
21 | | - console.log(`primary ${process.pid} - running`) |
22 | | - |
23 | | - const numCpus = cpus().length |
24 | | - |
25 | | - for (let i = 0; i < numCpus; i++) { |
26 | | - newWorker() |
27 | | - } |
28 | | - |
29 | | - cluster.on('exit', (deadWorker, code, signal) => { |
30 | | - console.log(`worker ${deadWorker.process.pid} - exiting`) |
31 | | - if (code === 0 || signal === 'SIGINT') { |
32 | | - return |
33 | | - } |
34 | | - const worker = newWorker() |
35 | | - |
36 | | - const newPID = worker.process.pid |
37 | | - const oldPID = deadWorker.process.pid |
38 | | - |
39 | | - console.log('worker ' + oldPID + ' died.') |
40 | | - console.log('worker ' + newPID + ' born.') |
41 | | - }) |
42 | | - |
43 | | - cluster.on('message', (source, message) => { |
44 | | - for (const worker of Object.values(cluster.workers)) { |
45 | | - if (source.id === worker.id) { |
46 | | - continue |
47 | | - } |
48 | | - |
49 | | - worker.send(message) |
50 | | - } |
51 | | - }) |
52 | | - |
53 | | - process.on('SIGTERM', () => { |
54 | | - console.log('exiting...') |
55 | | - process.exit(0) |
56 | | - }) |
57 | | -} else if (cluster.isWorker) { |
58 | | - const port = Number(process.env.SERVER_PORT) || 8008 |
59 | | - |
60 | | - const dbClient = getDbClient() |
61 | | - const eventRepository = new EventRepository(dbClient) |
62 | | - |
63 | | - const server = http.createServer() |
64 | | - const wss = new WebSocketServer({ server, maxPayload: 1024 * 1024 }) |
65 | | - const adapter = new WebSocketServerAdapter( |
66 | | - server, |
67 | | - wss, |
68 | | - webSocketAdapterFactory(eventRepository), |
69 | | - createSettings, |
70 | | - ) |
71 | | - |
72 | | - adapter.listen(port) |
73 | | - |
74 | | - const exitHandler = () => { |
75 | | - console.log(`worker ${process.pid} - exiting`) |
76 | | - wss.close(() => { |
77 | | - server.close(() => { |
78 | | - dbClient.destroy(() => { |
79 | | - process.exit(0) |
80 | | - }) |
81 | | - }) |
82 | | - }) |
83 | | - } |
84 | | - |
85 | | - process.on('SIGINT', exitHandler) |
86 | | - process.on('SIGHUP', exitHandler) |
87 | | - process.on('SIGTERM', exitHandler) |
88 | | - process.on('uncaughtException', exitHandler) |
89 | | - |
90 | | - process.on('message', (message: { eventName: string, event: unknown }) => { |
91 | | - adapter.emit(message.eventName, message.event) |
92 | | - }) |
93 | | - |
94 | | - console.log(`worker ${process.pid} - listening on port ${port}`) |
| 12 | +if (require.main === module) { |
| 13 | + run(cluster.isPrimary)() |
95 | 14 | } |
| 15 | + |
0 commit comments