const logger = require('./logger.js'); const api = require('./api.js'); const http = require('http'); const ID = require('./constants.js').VARIABLE_ID; var server; async function start() { if (!server) { server = http.createServer(); } server.listen(global.config.server.port, global.config.server.listen).on('listening', () => { logger.debug('server listening on ' + global.config.server.listen + ':' + global.config.server.port + '...'); handleRequests(); }); } function handleRequests() { server.on('request', (request, response) => { request.timestamp = new Date().getTime(); if (request.url.length > 1 && request.url.endsWith('/')) { request.url = request.url.substring(0, request.url.length - 1); } let id; let endpointName = request.url; let separatorIndex = request.url.lastIndexOf('/'); if (separatorIndex > 0) { id = request.url.substring(separatorIndex + 1, request.url.length); if (!isNaN(id)) { endpointName = endpointName.substring(0, separatorIndex + 1) + ID; } } var endpoint = api.getEndpoints().get(endpointName); if (endpoint === undefined) { endRequest( request, response, 'endpoint \'' + request.url + '\' not defined', 501 ); return; } endpoint = endpoint[request.method]; if (endpoint === undefined || endpoint.method === undefined) { endRequest( request, response, 'endpoint \'' + request.url + '\' does not have any handlers for ' + request.method + ' requests', 405 ); return; } getRequestParams(request) .then((params) => { return endpoint.method(id, params); }) .then((result) => { endRequest(request, response, result); }) .catch((err, code) => { if (code == undefined) { code = 500; } endRequest(request, response, err, code); }); }); } function endRequest(request, response, msg, code) { code = code || 200; var object = { request: request, code: code } if (msg != undefined) { if (msg instanceof Error) { object.data = msg.toString(); } else if (msg instanceof Object) { object.data = JSON.stringify(msg); } else { object.data = msg; } } response.setHeader('Access-Control-Allow-Origin', '*'); response.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); response.writeHead(object.code); response.end(object.data); logger.http(object); } function getRequestParams(request) { return new Promise((resolve, reject) => { var params = ''; request.on('data', (data) => { params += data; }); request.on('end', () => { if (params == undefined || params.length == 0) { return resolve(); } return resolve(new URLSearchParams(params)); }); }); } module.exports = { start }