Initial commit
This commit is contained in:
165
app.js
Normal file
165
app.js
Normal file
@@ -0,0 +1,165 @@
|
||||
|
||||
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 credentials = {
|
||||
key: privateKey,
|
||||
cert: certificate,
|
||||
minVersion: process.env.MIN_TLS_VERSION || "TLSv1.1"
|
||||
};
|
||||
|
||||
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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user