Files
lsp/app.js
Arnaud Nelissen 440f5a7931 Add gitignore
2022-01-18 08:41:09 +01:00

167 lines
4.8 KiB
JavaScript

const assert = require('assert');
const moment = require('moment');
const cbor = require('cbor');
const express = require('express');
const fs = require('fs');
const http = require('http');
const https = require('https');
const certificate = fs.readFileSync(process.env.CLIENT_CRT || 'cert/client.crt', 'utf8');
const privateKey = fs.readFileSync(process.env.CLIENT_KEY || 'cert/client.key', 'utf8');
const opt = {
key: privateKey,
cert: certificate,
minVersion: process.env.MIN_TLS_VERSION || "TLSv1.1",
sessionTimeout: 2
};
const dbcontroller = require('./db');
const routes = require('./routes')
const app = express();
const http_port = parseInt(process.env.HTTP_PORT, 10) || 80;
const https_port = parseInt(process.env.HTTPS_PORT, 10) || 443;
const environment = process.env.CONFIGURATION || 'develop';
const httpServer = http.createServer(app);
const httpsServer = https.createServer(credentials, app);
///// Splashscreen
console.log(' _ __ __ _ ');
console.log(' / | / /___ / /(_)_____ _____ ___ ____ ');
console.log(' / |/ // _ \\ / // // ___// ___// _ \\ / __ \\');
console.log(' / /| // __// // /(__ )(__ )/ __// / / /');
console.log('/_/ |_/ \\___//_//_//____//____/ \\___//_/ /_/ ');
console.log(' ');
console.log(' T E C H N O L O G I E S');
console.log('');
console.log('');
///// Startup MongoDB Client
dbcontroller.init()
.then((err) => {
if (err) { console.log('Unable to connect to database'); }
else {
console.log('-------------------------------------------------------');
console.log(Date().toString());
console.log('MongoDB Client initialized');
console.log('-------------------------------------------------------');
///// Startup HTTP Server
httpServer.listen(http_port, () => {
console.log('-------------------------------------------------------');
console.log(`Server listening at http://localhost:${http_port}`);
console.log('Environment: ' + environment);
console.log('HTTP Port: ' + http_port);
console.log('-------------------------------------------------------');
});
///// Startup HTTPS Server
httpsServer.listen(https_port, () => {
console.log('-------------------------------------------------------');
console.log(`Server listening at https://localhost:${https_port}`);
console.log('Environment: ' + environment);
console.log('HTTPS Port: ' + https_port);
console.log('-------------------------------------------------------');
});
}
})
app.use(express.json());
app.use(express.raw({ type: 'application/cbor' }));
app.use(express.urlencoded({ extended: true }));
app.use(function (req, res, next) {
// Log request
console.log('-------------------------------------------------------');
console.log(req.method + ' ' + req.url + ' from ' + req.ip);
next();
});
app.use(function (req, res, next) {
if (!req.body.length) {
// No body
//////////
console.log('Got empty frame');
///// Next handler
next();
} else if (req.is('application/cbor')) {
// CBOR frame
/////////////
console.log('Got CBOR frame');
console.log('Encoded:');
console.log(req.body.toString('hex'))
///// Decode CBOR body
cbor.decodeFirst(req.body, (err, decoded) => {
///// Assign decoded data
req.body = decoded;
///// Next handler
console.log('Decoded:');
console.log(req.body)
next();
});
} else {
// JSON frame
/////////////
console.log('Got JSON frame');
console.log(req.body)
///// Next handler
next();
}
});
app.use(function (req, res, next) {
var length = 0;
var send = res.send;
/////////////////////////
// Redefine send function
res.send = function (body) {
if (req.is('application/cbor') || req.acceptsEncodings("application/cbor") || req.acceptsEncodings("cbor")) {
// CBOR Frame
/////////////
console.log('Send CBOR frame');
console.log('Decoded:');
console.log(body)
///// Set header
res.set('Content-Type', 'application/cbor');
length = JSON.stringify(body).length;
///// Convert ' to "
if (body.data) { body.data = cbor.encode(JSON.parse(body.data.replace(/'/g, '"'))); }
///// Encode JSON to CBOR
body = cbor.encode(body);
// Log statistics
console.log('Encoded:');
console.log(body.toString('hex'))
console.log(length + ' Bytes (JSON) -> ' + body.length + ' Bytes (CBOR) -> ' + Math.round((1 - length / body.length) * 100) + '% reduction');
}
///// Send frame
send.call(this, body);
};
///// Next handler
next();
});
app.use(function (req, res, next) {
// Add formatted-date header
res.setHeader("Formatted-Date", moment().format());
next();
});
app.use(routes)