update dependencies, devDependencies, copyright
[websub-hub] / server.js
1 'use strict';
2
3 const http = require('node:http');
4 const { AsyncLocalStorage } = require('node:async_hooks');
5 const DB = require('./src/db');
6 const Logger = require('./src/logger');
7 const Service = require('./src/service');
8 const Config = require('./config');
9 const { fileScope } = require('./src/common');
10 const { version } = require('./package.json');
11
12 const _scope = fileScope(__filename)('main');
13
14 const PORT = process.env.PORT || 4001;
15 const ADDR = process.env.LISTEN_ADDR || '127.0.0.1';
16
17 (async function main () {
18 let config, logger, db, service;
19 try {
20 // This provides an async context store for persisting unique log data per request, id est a requestId.
21 const asyncLocalStorage = new AsyncLocalStorage();
22
23 config = new Config(process.env.NODE_ENV);
24 logger = new Logger(config.logger, { nodeId: config.nodeId }, asyncLocalStorage);
25 db = new DB(logger, config);
26 await db.initialize();
27 service = new Service(logger, db, config, asyncLocalStorage);
28
29 http.createServer(async (req, res) => {
30 await asyncLocalStorage.run({}, async () => {
31 return service.dispatch(req, res);
32 });
33 }).listen(PORT, ADDR, (err) => {
34 if (err) {
35 logger.error(_scope, 'error creating server', err);
36 throw err;
37 }
38 logger.info(_scope, 'server started', { version, listenAddress: ADDR, listenPort: PORT });
39 });
40 } catch (e) {
41 (logger || console).error(_scope, 'error starting server', e);
42 db?.listener && await db.listener.stop();
43 }
44 })();