blinky/libs/server.js

110 lines
3.6 KiB
JavaScript
Raw Normal View History

const config = require('../config.json');
const logger = require('./logger.js');
const controller = require('./controller.js');
const parser = require('./parser.js');
const constants = require('./constants.js');
const path = require('path');
2021-04-06 16:41:49 +02:00
const express = require('express');
2022-02-21 11:56:49 +01:00
const favicon = require('serve-favicon');
const bodyparser = require('body-parser');
2021-04-06 16:41:49 +02:00
const app = express();
app.use(favicon(path.join(path.dirname(__dirname), 'public', 'favicon.ico')));
app.use(bodyparser.json());
app.use(bodyparser.urlencoded({extended: true}));
2021-04-06 16:41:49 +02:00
const html = require('./index.js').get();
2021-04-06 16:41:49 +02:00
// run the express http server and handle gets/posts
async function start() {
return await new Promise(function (resolve, reject) {
2021-04-06 16:41:49 +02:00
app.listen(config.server.port, config.server.listen)
.on('listening', function () {
resolve('server listening on ' + config.server.listen + ':' + config.server.port + '...')
2021-04-06 16:41:49 +02:00
})
.on('error', function (err) {
reject('error starting server (' + err + ')');
2021-04-06 16:41:49 +02:00
});
});
}
function handleRequests() {
// GET html page
2022-02-21 00:48:29 +01:00
app.get('*', (request, response) => {
logger.http(request);
response.send(html);
2021-04-06 16:41:49 +02:00
response.end();
});
// POST '/set'
app.post('/' + constants.MODE_SET, (request, response) => {
2022-02-21 00:48:29 +01:00
logger.http(request);
handleSimpleAnimation(parser.parseRequest(request.body, constants.MODE_SET), response);
2022-02-21 00:48:29 +01:00
});
// POST '/morph'
app.post('/' + constants.MODE_MORPH, (request, response) => {
2022-02-21 00:48:29 +01:00
logger.http(request);
handleSimpleAnimation(parser.parseRequest(request.body, constants.MODE_MORPH), response);
2021-04-06 16:41:49 +02:00
});
// POST '/blink'
app.post('/' + constants.MODE_BLINK, (request, response) => {
logger.http(request);
handleComplexAnimation(parser.parseRequest(request.body, constants.MODE_BLINK), response);
});
// POST '/pulse'
app.post('/' + constants.MODE_PULSE, (request, response) => {
logger.http(request);
handleComplexAnimation(parser.parseRequest(request.body, constants.MODE_PULSE), response);
});
// POST '/poweroff'
app.post('/' + constants.MODE_POWEROFF, (request, response) => {
logger.http(request);
handlePowerOff(parser.parseRequest(request.body, constants.MODE_POWEROFF), response);
});
}
2022-02-24 11:33:53 +01:00
async function handleSimpleAnimation(config, response) {
try {
response.end(JSON.stringify(await controller.simple(config)));
2022-02-24 11:33:53 +01:00
} catch (err) {
2022-02-24 11:51:21 +01:00
logger.error(err);
2022-02-24 11:33:53 +01:00
response.status(500);
2022-02-24 11:51:21 +01:00
response.end(JSON.stringify({status: 'error', error: err.message}));
2022-02-24 11:33:53 +01:00
}
}
2022-02-24 11:33:53 +01:00
async function handleComplexAnimation(config, response) {
if (controller.isInfiniteAnimation(config)) {
2022-02-24 11:33:53 +01:00
response.end(JSON.stringify({status: 'ok', time: 'infinite'}));
response = undefined;
}
try {
const result = await controller.complex(config);
2022-02-24 11:33:53 +01:00
if (response === undefined) {
return;
}
response.end(JSON.stringify(result));
} catch (err) {
if (response === undefined) {
return;
}
2022-02-24 11:51:21 +01:00
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 controller.powerOff(config)));
2022-02-24 11:51:21 +01:00
} catch (err) {
2022-02-24 11:33:53 +01:00
response.status(500);
2022-02-24 11:51:21 +01:00
response.end(JSON.stringify({status: 'error', error: err.message}));
2022-02-24 11:33:53 +01:00
}
2021-04-06 16:41:49 +02:00
}
// exports
module.exports = {
start,
handleRequests
};