const logger = require('./logger.js'); const commands = require('./commands.js'); const http = require('http'); let server; let api; async function start() { const listen = global.config?.server?.listen || '0.0.0.0'; const port = global.config?.server?.port; setupAPI(); if (server === undefined) { server = http.createServer(); } return new Promise((resolve, reject) => { server.listen(port, listen) .on('listening', function () { logger.info('server listening on ' + listen + ':' + port + '...'); handleRequests(); resolve(); }); }); } function handleRequests() { server.on('request', (request, response) => { request.timestamp = new Date().getTime(); respond(request, response); }); } async function respond(request, response) { if (request === undefined || response === undefined) { return; } let endpoint = api[request.method]?.[request.url]; let result = await commands.execute(endpoint); result.command = endpoint.command; result.args = endpoint.args; return finishRequest(request, response, result); } function finishRequest(request, response, result) { if (response === undefined) { return; } result.time = (new Date().getTime() - request.timestamp) + 'ms'; let code = result.code || 200; if (result.error !== undefined && result.error.length > 0) { code = 501; } delete result.code; response.writeHead(code); const json = JSON.stringify(result); response.end(json); logger.http({ request: request, code: code, data: json }); } function setupAPI() { const apiConfig = global.config?.api; if (apiConfig === undefined || apiConfig.length === 0) { throw new Error('no api endpoints configured - aborting'); } const now = new Date().getTime(); api = {}; logger.debug('setting up api...'); let index; for (index = 0; index < global.config.api.length; index++) { let endpoint = global.config.api[index]; let key = endpoint.url; let method = endpoint.method.toUpperCase(); delete endpoint.method; delete endpoint.url; let methodApi = api[method] || {}; methodApi[key] = endpoint; api[method] = methodApi; } logger.debug('api setup with ' + index + ' endpoints after ' + (new Date().getTime() - now) + 'ms'); } module.exports = { start }