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); if (request.url.endsWith('/')) { request.url = request.url.substring(0, request.url.length - 1); } 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(endpoint[constants.HTTP_GET]) // .then(function (result) { // response.writeHead(200); // response.end(result); // }) // .catch(function (err, code) { // if (!code) { // code = 500; // } // response.writeHead(code); // response.end(err); // }); // return; // } // if (request.method == constants.HTTP_POST) { // handlePOST(request, response) // .then(function (result) { // response.writeHead(200); // response.end(result); // }) // .catch(function (err, code) { // if (!code) { // code = 500; // } // response.writeHead(code); // response.end(err); // }); // return; // } endpoint = endpoint[request.method]; if (endpoint == undefined || endpoint.method == undefined) { var msg = 'error: endpoint \'' + request.url + '\' does not have any handlers for ' + request.method + ' requests'; response.writeHead(405); response.end(msg); logger.debug(msg); return; } endpoint.method(endpoint.args) .then(function (result) { response.writeHead(200); try { response.end(JSON.stringify(result)); } catch (err) { response.end(result); } return; }) .catch(function (err, code) { if (code == undefined) { code = 500; } response.writeHead(500); response.end(err); return; }); }); } function handleGET(endpoint) { return new Promise(function (resolve, reject) { if (!endpoint.method) { return reject('error: no handler defined for endpoint \'' + endpoint.url + '\''); } endpoint.method(endpoint.args) .then(function (data) { return resolve(JSON.stringify(data)) }) .catch(reject); }); } function handlePOST(endpoint) { return new Promise(function (resolve, reject) { if (request.url.startsWith(constants.API_PEDALS)) { handlePOSTPedals(request) .then(resolve) .catch(reject); return; } if (request.url.startsWith(constants.API_PEDALBOARDS)) { handlePOSTPedalboards(request) .then(resolve) .catch(reject); 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 }