151 lines
4.7 KiB
JavaScript
151 lines
4.7 KiB
JavaScript
|
const config = require('../config.json');
|
||
|
const logger = require('./logger.js');
|
||
|
const api = require('./api.js')
|
||
|
const constants = require('./constants.js');
|
||
|
const modep = require('./modep.js');
|
||
|
const http = require('http');
|
||
|
|
||
|
var server;
|
||
|
|
||
|
function start() {
|
||
|
return new Promise(function (resolve, reject) {
|
||
|
if (!server) {
|
||
|
server = http.createServer();
|
||
|
}
|
||
|
server.listen(config.server.port, config.server.listen).on('listening', function () {
|
||
|
logger.debug('server listening on ' + config.server.listen + ':' + config.server.port + '...');
|
||
|
handleRequests();
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function handleRequests() {
|
||
|
server.on('request', function (request, response) {
|
||
|
logger.request(request);
|
||
|
var endpoint = api.getEndpoints().get(request.url);
|
||
|
if (!endpoint) {
|
||
|
var msg = 'endpoint \'' + request.url + '\' not defined';
|
||
|
response.writeHead(501);
|
||
|
response.end(msg);
|
||
|
logger.debug(msg);
|
||
|
return;
|
||
|
}
|
||
|
if (!endpoint.types.includes(request.method)) {
|
||
|
var msg = 'endpoint \'' + request.url + '\' does not support ' + request.method + ' requests';
|
||
|
response.writeHead(405);
|
||
|
response.end(msg);
|
||
|
logger.debug(msg);
|
||
|
return;
|
||
|
}
|
||
|
if (request.method == constants.HTTP_GET) {
|
||
|
handleGET(response, endpoint);
|
||
|
return;
|
||
|
}
|
||
|
if (request.method == constants.HTTP_POST) {
|
||
|
handlePOST(request, response, endpoint);
|
||
|
return;
|
||
|
}
|
||
|
var msg = 'endpoint \'' + request.url + '\' does not have any handlers for ' + request.method + ' requests';
|
||
|
response.writeHead(405);
|
||
|
response.end(msg);
|
||
|
logger.debug(msg);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function handleGET(response, endpoint) {
|
||
|
var data = endpoint.data;
|
||
|
if (!data) {
|
||
|
response.writeHead(500);
|
||
|
response.end('error: could not get data for endpoint')
|
||
|
return;
|
||
|
}
|
||
|
response.writeHead(200);
|
||
|
response.end(JSON.stringify(data));
|
||
|
}
|
||
|
|
||
|
function handlePOST(request, response, endpoint) {
|
||
|
if (request.url.startsWith(constants.API_PEDALS)) {
|
||
|
handlePOSTPedals(request)
|
||
|
.then(function (msg) {
|
||
|
response.writeHead(200);
|
||
|
response.end(msg);
|
||
|
})
|
||
|
.catch(function (err, code) {
|
||
|
if (!code) {
|
||
|
code = 500;
|
||
|
}
|
||
|
response.writeHead(code);
|
||
|
response.end(err);
|
||
|
logger.error(err);
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
if (request.url.startsWith(constants.API_PEDALBOARDS)) {
|
||
|
handlePOSTPedalboards(request)
|
||
|
.then(function (msg) {
|
||
|
response.writeHead(200);
|
||
|
response.end(msg);
|
||
|
})
|
||
|
.catch(function (err, code) {
|
||
|
if (!code) {
|
||
|
code = 500;
|
||
|
}
|
||
|
response.writeHead(code);
|
||
|
response.end(err);
|
||
|
logger.error(err);
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
var msg = 'endpoint \'' + request.url + '\' is not yet implemented for ' + request.method + ' requests';
|
||
|
response.writeHead(405);
|
||
|
response.end(msg);
|
||
|
|
||
|
}
|
||
|
|
||
|
function getPOSTParams(request) {
|
||
|
return new Promise(function (resolve, reject) {
|
||
|
var params = "";
|
||
|
request.on("data", function (data) {
|
||
|
params += data;
|
||
|
});
|
||
|
request.on("end", function () {
|
||
|
return resolve(new URLSearchParams(params));
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function handlePOSTPedals(request) {
|
||
|
return new Promise(function (resolve, reject) {
|
||
|
getPOSTParams(request)
|
||
|
.then(function (params) {
|
||
|
var pedalId = request.url.substring(request.url.lastIndexOf('/') + 1);
|
||
|
var controlId = params.get('id');
|
||
|
if (controlId == undefined) {
|
||
|
reject('error: could not handle POST - missing parameter \'id\'', 400)
|
||
|
}
|
||
|
var value = params.get('value');
|
||
|
if (value == undefined) {
|
||
|
reject('error: could not handle POST - missing parameter \'value\'', 400)
|
||
|
}
|
||
|
modep.getPedalControlById(pedalId, controlId)
|
||
|
.then(function (control) {
|
||
|
modep.sendValueToControl(value, control);
|
||
|
})
|
||
|
.then(resolve)
|
||
|
.catch(reject);
|
||
|
})
|
||
|
.catch(reject);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function handlePOSTPedalboards(request) {
|
||
|
return new Promise(function (resolve, reject) {
|
||
|
modep.setPedalboardById(request.url.substring(request.url.lastIndexOf('/') + 1))
|
||
|
.then(resolve)
|
||
|
.catch(reject);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
start
|
||
|
}
|