const { MongoClient } = require("mongodb"); const express = require('express'); const minio = require('minio'); /*============== VARIABLE DECLARATION ==============*/ // Mongo set-up variables const mongoEndpoint = process.env.ME_CONFIG_MONGODB_SERVER; const mongoPort = parseInt(process.env.ME_CONFIG_MONGODB_PORT); const mongoDatabase = process.env.ME_CONFIG_MONGODB_DB; const mongoCollection = process.env.ME_CONFIG_MONGODB_COLLECTION; // Minio set-up variables const minioEndpoint = process.env.MINIO_ENDPOINT; const minioBucket = process.env.MINIO_BUCKET; const minioPort = parseInt(process.env.MINIO_SERVING_PORT); const minioKey = process.env.MINIO_ACCESS_KEY; const minioSecret = process.env.MINIO_SECRET_KEY; // Stream set-up variables let changeStream; const options = { fullDocument: "updateLookup" }; const pipeline = []; const PORT = process.env.PORT || 3002; // Create Mongo client const MONGO_URI = `mongodb://${mongoEndpoint}:${mongoPort}`; const mongoClient = new MongoClient(MONGO_URI); /*============== CODE ==============*/ async function run() { console.log('server.js has been launched') const app = express(); // Configuring mongoDB connection await mongoClient.connect(); const database = mongoClient.db(mongoDatabase); const collection = database.collection(mongoCollection); // Notify connection console.log(`Connection established with Mongo Database at ${MONGO_URI}`); // Opening event listener on the database changeStream = collection.watch(pipeline, options); console.log("Started watching changes in database"); app.get('/events', async function (request, response) { let eventArray = []; let minioClient = new minio.Client({ endPoint: minioEndpoint, port: minioPort, useSSL: false, accessKey: minioKey, secretKey: minioSecret }); // notifies GET requests console.log('/events was requested'); // Setting the header to event-stream for Server Sent Events (Eventsource) const header = { 'Content-Type': 'text/event-stream', 'Connection': 'keep-alive' } response.writeHead(200, "OK", header); response.write('Connection established \n\n'); // Triggers callback on every change in collection set up changeStream.on("change", data => { // Retrieves modified document on the db and stores it let document = JSON.stringify(data.fullDocument); eventArray = [document, ...eventArray]; // Fetch screenshot if there is one if (data.fullDocument.screenshot_count) { minioClient.presignedUrl('GET', minioBucket, `${data.fullDocument.camera}/${data.fullDocument._id}/1.jpg`, 60 * 60, (err, presignedUrl) => { if (err) { return console.log(err) }; const realURL = JSON.stringify({ picUrl: presignedUrl }); eventArray = [realURL, ...eventArray]; }) } // sends updated array response.write(`data: [${[...eventArray]}]\n\n`); }); }); app.listen(PORT); console.log(`Server listening at 127.0.0.1:${PORT}`); } run().catch(console.dir);