const { MongoClient } = require("mongodb"); const express = require('express'); const minio = require('minio'); /*============== VARIABLE DECLARATION ==============*/ // 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'; // 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); const historyNumber = parseInt(process.env.HISTORY_AMOUNT) || 1000; // 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); /*============== CODE ==============*/ async function run() { console.log('server.js has been launched'); const app = express(); await mongoClient.connect(); const collection = mongoClient.db().collection(mongoCollection); let eventArray = []; changeStream = collection.watch(pipeline, options); console.log("Started watching changes in database"); // Triggers on GET at /event route app.get('/events', async function (request, response) { let minioClient = new minio.Client({ endPoint: minioURI.hostname, port: parseInt(minioURI.port) || (minioURI.protocol == 'https' ? 443 : 80), useSSL: minioURI.protocol == 'https', accessKey: minioURI.username, secretKey: minioURI.password }); // Notify SSE to React const header = { 'Content-Type': 'text/event-stream', 'Connection': 'keep-alive' }; response.writeHead(200, "OK", header); response.write('Connection established \n\n'); const historyCursor = collection.find({}).sort({$natural : -1}).limit(historyNumber); historyCursor.forEach((document) => { const stringFormat = JSON.stringify(document); eventArray = [stringFormat, ...eventArray]; }) response.write(`event: events, data: [${[...eventArray]}]\n\n`) changeStream.on("change", data => { let document = JSON.stringify(data.fullDocument); eventArray = [document]; if (data.fullDocument.screenshot_count) { for (let i = 1; i <= data.fullDocument.screenshot_count ; i++) { minioClient.presignedUrl('GET', minioBucket, `${data.fullDocument.camera}/${data.fullDocument._id}/${i}.jpg`, 60 * 60, (err, presignedUrl) => { if (err) { return console.log(err) }; const realURL = JSON.stringify({ picUrl: presignedUrl }); eventArray = [realURL, ...eventArray]; }) } }; response.write(`data: [${[...eventArray]}]\n\n`); }); }); app.listen(PORT); console.log(`Server listening at 127.0.0.1:${PORT}`); } run().catch(console.dir);