pbc/libs/server.js

109 lines
3.3 KiB
JavaScript

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
}