const path = require('path'); const config = require('../config'); const logger = require('./logger'); const blinkstick = require('./blinkstick'); const parser = require('./parser.js'); const express = require('express'); const favicon = require('serve-favicon'); const bodyparser = require('body-parser'); const app = express(); app.use(favicon(path.join(path.dirname(__dirname), 'public', 'favicon.ico'))); app.use(bodyparser.json()); app.use(bodyparser.urlencoded({extended: true})); const MODE_SET = require('./blinkstick.js').MODE_SET; const MODE_MORPH = require('./blinkstick.js').MODE_MORPH; const MODE_BLINK = require('./blinkstick.js').MODE_BLINK; const MODE_PULSE = require('./blinkstick.js').MODE_PULSE; const MODE_POWEROFF = require('./blinkstick.js').MODE_POWEROFF; const html = require('./index.js').get(); // run the express http server and handle gets/posts async function start() { return await new Promise(function (resolve, reject) { app.listen(config.server.port, config.server.listen) .on('listening', function () { resolve('server listening on ' + config.server.listen + ':' + config.server.port + '...') }) .on('error', function (err) { reject('error starting server (' + err + ')'); }); }); } function handleRequests() { // GET html page app.get('*', (request, response) => { logger.http(request); response.send(html); response.end(); }); // POST '/set' app.post('/' + MODE_SET, (request, response) => { logger.http(request); handleSimpleAnimation(parser.parseRequest(request.body, MODE_SET), response); }); // POST '/morph' app.post('/' + MODE_MORPH, (request, response) => { logger.http(request); handleSimpleAnimation(parser.parseRequest(request.body, MODE_MORPH), response); }); // POST '/blink' app.post('/' + MODE_BLINK, (request, response) => { logger.http(request); handleComplexAnimation(parser.parseRequest(request.body, MODE_BLINK), response); }); // POST '/pulse' app.post('/' + MODE_PULSE, (request, response) => { logger.http(request); handleComplexAnimation(parser.parseRequest(request.body, MODE_PULSE), response); }); // POST '/poweroff' app.post('/' + MODE_POWEROFF, (request, response) => { logger.http(request); handlePowerOff(parser.parseRequest(request.body, MODE_POWEROFF), response); }); } async function handleSimpleAnimation(config, response) { try { response.end(JSON.stringify(await blinkstick.simple(config))); } catch (err) { logger.error(err); response.status(500); response.end(JSON.stringify({status: 'error', error: err.message})); } } async function handleComplexAnimation(config, response) { if (blinkstick.isInfiniteAnimation(config)) { response.end(JSON.stringify({status: 'ok', time: 'infinite'})); response = undefined; } try { const result = await blinkstick.complex(config); if (response === undefined) { return; } response.end(JSON.stringify(result)); } catch (err) { if (response === undefined) { return; } logger.error(err); response.status(500); response.end(JSON.stringify({status: 'error', error: err.message})); } } async function handlePowerOff(config, response) { try { response.end(JSON.stringify(await blinkstick.powerOff(config))); } catch (err) { response.status(500); response.end(JSON.stringify({status: 'error', error: err.message})); } } // exports module.exports = { start, handleRequests };