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 () {
|
2022-03-18 13:26:51 +01:00
|
|
|
logger.info('server listening on ' + global.config.server.listen + ':' + global.config.server.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];
|
|
|
|
if (endpoint === undefined) {
|
|
|
|
return finishRequest(request, response, { error: 'endpoint not defined' }, 501);
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
endpoint.result = await commands.execute(endpoint);
|
|
|
|
} catch (err) {
|
|
|
|
endpoint.error = err.toString();
|
|
|
|
return finishRequest(request, response, endpoint, 501);
|
|
|
|
}
|
|
|
|
return finishRequest(request, response, endpoint);
|
|
|
|
}
|
|
|
|
|
|
|
|
function finishRequest(request, response, data, code) {
|
2022-03-15 01:36:47 +01:00
|
|
|
if (response === undefined) {
|
|
|
|
return;
|
|
|
|
}
|
2022-03-18 13:56:19 +01:00
|
|
|
data.time = (new Date().getTime() - request.timestamp) + 'ms';
|
2022-03-18 13:26:51 +01:00
|
|
|
if (code === undefined) {
|
|
|
|
code = 200;
|
2022-03-17 16:51:36 +01:00
|
|
|
}
|
2022-03-18 13:26:51 +01:00
|
|
|
if (code === 200) {
|
|
|
|
data.status = 'ok';
|
2022-03-15 01:36:47 +01:00
|
|
|
} else {
|
2022-03-18 13:26:51 +01:00
|
|
|
data.status = 'error';
|
2022-03-15 01:36:47 +01:00
|
|
|
}
|
2022-03-18 13:56:19 +01:00
|
|
|
|
2022-03-15 01:36:47 +01:00
|
|
|
response.writeHead(code);
|
2022-03-18 13:26:51 +01:00
|
|
|
const json = JSON.stringify(data);
|
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
|
|
|
|
}
|