const Api = require('./Api.js'); const http = require('http'); class ApiServer { constructor() { this.listen = config.api?.listen || "0.0.0.0"; this.port = config.api?.port || 9000; this.api = new Api(); this.server = http.createServer(); this.requestId = 0; } start() { return new Promise((resolve, reject) => { this.server.listen(this.port, this.listen).on('listening', () => { this.port = this.server.address().port; logger.info('api server listening on ' + this.listen + ':' + this.port + '...'); this.#handleRequests(); resolve(); }); this.server.on('error', (err) => { reject('an unexpected error occured: ' + err); }); }); } #handleRequests() { this.server.on('request', async (request, response) => { request.timestamp = Date.now(); request.id = this.requestId; this.requestId++; logger.debug('handling api request #' + request.id + ' \'' + request.url + '\'...'); const result = await this.api.handleRequest(request); response.writeHead(result.code); response.end(result.message); logger.debug('handling api request #' + request.id + '\'' + request.url + '\' took ' + (Date.now() - request.timestamp) + 'ms'); }); } } module.exports = ApiServer;