log-viewer/backend/server.js

84 lines
2.7 KiB
JavaScript
Raw Normal View History

2022-02-09 11:56:34 +00:00
const { MongoClient } = require("mongodb");
const express = require('express');
const minio = require('minio');
2022-02-15 08:55:59 +00:00
/*============== VARIABLE DECLARATION ==============*/
2022-02-09 11:56:34 +00:00
// Mongo set-up variables
const mongoCollection = process.env.MONGO_COLLECTION || 'eventlog';
const mongoUri = process.env.MONGO_URI || 'mongodb://127.0.0.1:27017/default?replicaSet=rs0';
2022-02-09 11:56:34 +00:00
// Minio set-up variables
const minioURI = new URL(process.env.MINIO_URI || 'http://kspace-mugshot:2mSI6HdbJ8@127.0.0.1:9000/kspace-mugshot');
const minioBucket = minioURI.pathname.substring(1);
console.info("Using bucket:", minioBucket);
const historyNumber = parseInt(process.env.HISTORY_AMOUNT) || 1000;
2022-02-09 11:56:34 +00:00
// Stream set-up variables
let changeStream;
const options = { fullDocument: "updateLookup" };
const pipeline = [];
const PORT = process.env.PORT || 3002;
// Create Mongo client
const mongoClient = new MongoClient(mongoUri);
2022-02-09 11:56:34 +00:00
/*============== CODE ==============*/
async function run() {
console.log('server.js has been launched');
2022-02-09 11:56:34 +00:00
const app = express();
await mongoClient.connect();
const collection = mongoClient.db().collection(mongoCollection);
2022-02-09 11:56:34 +00:00
changeStream = collection.watch(pipeline, options);
console.log("Started watching changes in database");
2022-02-15 16:34:10 +00:00
// Triggers on GET at /event route
2022-02-09 11:56:34 +00:00
app.get('/events', async function (request, response) {
let minioClient = new minio.Client({
endPoint: minioURI.hostname,
port: parseInt(minioURI.port) || (minioURI.protocol == 'https:' ? 443 : 80),
2022-02-15 21:33:22 +00:00
useSSL: minioURI.protocol == 'https:',
accessKey: minioURI.username,
secretKey: minioURI.password
2022-02-09 11:56:34 +00:00
});
async function wrapEvent(doc) {
let screenShotArray = [];
let blob;
2022-02-15 20:14:27 +00:00
if (doc && doc.screenshot_count) {
2022-02-15 19:34:59 +00:00
for (let i = 1; i <= doc.screenshot_count ; i++) {
let presignedUrl = await minioClient.presignedUrl('GET', minioBucket, `${doc.camera}/${doc._id}/${i}.jpg`, 60 * 60);
screenShotArray.push({ url: presignedUrl });
2022-02-15 19:34:59 +00:00
}
2022-02-17 08:41:24 +00:00
blob = JSON.stringify({...doc, screenshots: [...screenShotArray]});
} else {
blob = JSON.stringify({...doc})
2022-02-15 19:34:59 +00:00
};
2022-02-15 19:34:59 +00:00
return `event: log-entry\ndata: ${blob}\n\n`
}
2022-02-15 16:34:10 +00:00
// Notify SSE to React
const header = { 'Content-Type': 'text/event-stream', 'Connection': 'keep-alive' };
2022-02-09 11:56:34 +00:00
response.writeHead(200, "OK", header);
const historyCursor = collection.find().sort({$natural:-1}).limit(historyNumber);
2022-02-15 16:34:10 +00:00
historyCursor.forEach(async (document) => {
response.write(await wrapEvent(document));
2022-02-15 16:34:10 +00:00
})
changeStream.on("change", async(data) => {
response.write(await wrapEvent(data.fullDocument));
2022-02-09 11:56:34 +00:00
});
});
app.listen(PORT);
console.log(`Server listening at 127.0.0.1:${PORT}`);
}
run().catch(console.dir);