remex/libs/server.js

83 lines
2.4 KiB
JavaScript
Raw Normal View History

2022-03-17 16:51:36 +01:00
const logger = require('./logger.js');
const commands = require('./commands.js');
2022-02-02 17:07:16 +01:00
const http = require('http');
2022-03-15 01:36:47 +01:00
let server;
let api;
2022-02-02 17:07:16 +01:00
2022-03-15 01:36:47 +01:00
async function start() {
const listen = global.config?.server?.listen || '0.0.0.0';
const port = global.config?.server?.port;
2022-03-17 16:51:36 +01:00
setupAPI();
2022-03-15 01:36:47 +01:00
if (server === undefined) {
2022-02-02 17:07:16 +01:00
server = http.createServer();
}
2022-03-15 01:36:47 +01:00
return new Promise((resolve, reject) => {
server.listen(port, listen)
.on('listening', function () {
logger.info('server listening on ' + listen + ':' + port + '...');
2022-03-15 01:36:47 +01:00
handleRequests();
resolve();
});
});
2022-02-02 17:07:16 +01:00
}
function handleRequests() {
2022-03-15 01:36:47 +01:00
server.on('request', (request, response) => {
request.timestamp = new Date().getTime();
2022-03-18 13:26:51 +01:00
respond(request, response);
2022-02-02 17:07:16 +01:00
});
}
2022-03-18 13:26:51 +01:00
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);
2022-03-18 13:26:51 +01:00
}
function finishRequest(request, response, result) {
2022-03-15 01:36:47 +01:00
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;
2022-03-15 01:36:47 +01:00
}
delete result.code;
2022-03-15 01:36:47 +01:00
response.writeHead(code);
const json = JSON.stringify(result);
2022-03-15 01:36:47 +01:00
response.end(json);
2022-03-17 16:51:36 +01:00
logger.http({ request: request, code: code, data: json });
2022-03-15 01:36:47 +01:00
}
2022-03-17 16:51:36 +01:00
function setupAPI() {
2022-03-15 01:36:47 +01:00
const apiConfig = global.config?.api;
if (apiConfig === undefined || apiConfig.length === 0) {
throw new Error('no api endpoints configured - aborting');
2022-02-02 17:07:16 +01:00
}
2022-03-18 13:26:51 +01:00
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');
2022-02-02 17:07:16 +01:00
}
module.exports = {
start
}