remex/libs/server.js

88 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.debug('server listening on ' + config.server.listen + ':' + config.server.port + '...');
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();
respond(request, response, api.get(request.url));
2022-02-02 17:07:16 +01:00
});
}
2022-03-15 01:36:47 +01:00
async function respond(request, response, endpoint) {
if (response === undefined) {
return;
}
let data = {
2022-03-17 16:51:36 +01:00
status: 'ok',
command: endpoint.command,
args: endpoint.args
2022-03-15 01:36:47 +01:00
};
2022-03-17 16:51:36 +01:00
if (endpoint.detached === true) {
data.detached = true;
}
2022-03-15 01:36:47 +01:00
let code = 200;
if (endpoint === undefined) {
code = 501;
data.status = 'error';
data.msg = 'endpoint not defined';
} else if (request.method.toLowerCase() !== (endpoint.type.toLowerCase())) {
code = 405;
data.status = 'error';
data.msg = 'endpoint does not support ' + request.method + ' requests';
} else {
try {
2022-03-17 16:51:36 +01:00
const result = await commands.execute(endpoint);
if (result !== undefined) {
data.result = result;
}
2022-03-15 01:36:47 +01:00
} catch (err) {
code = 501;
data.status = 'error';
2022-03-17 16:51:36 +01:00
data.msg = err.toString();
2022-03-15 01:36:47 +01:00
}
}
2022-03-17 16:51:36 +01:00
data.time = new Date().getTime() - request.timestamp + 'ms';
2022-03-15 01:36:47 +01:00
const json = JSON.stringify(data);
response.writeHead(code);
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
}
api = new Map();
2022-03-15 01:36:47 +01:00
config.api.forEach(function (endpoint) {
let url = endpoint.url;
let tmp = endpoint;
2022-02-02 17:07:16 +01:00
delete tmp.url;
api.set(url, tmp);
});
}
module.exports = {
start
}