UNPKG

@arisan/data-api

Version:

The Universal Database API Gateway for CLIO's Modules

154 lines (136 loc) 5.55 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = mountEventRecorders; var _express = require('express'); var _express2 = _interopRequireDefault(_express); var _mongodb = require('mongodb'); var _mongodb2 = _interopRequireDefault(_mongodb); var _checkObjectID = require('../middleware/checkObjectID'); var _checkObjectID2 = _interopRequireDefault(_checkObjectID); var _checkStreamIndex = require('../middleware/checkStreamIndex'); var _checkStreamIndex2 = _interopRequireDefault(_checkStreamIndex); var _DataAPI = require('../DataAPI'); var _DataAPI2 = _interopRequireDefault(_DataAPI); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } //endregion const context = { router: _express2.default.Router({ mergeParams: true }), cameras: null, recorders: null, logger: null }; //endregion //region 2. Project Libraries //region 1. Platform Libraries context.router.get('/', _checkObjectID2.default); context.router.get('/', _checkStreamIndex2.default); context.router.get('/', (req, res) => { const log = (lvl, msg) => context.logger.log(lvl, msg, { tags: `GET ${req.originalUrl}` }); log('debug', JSON.stringify(req.params, null, 2)); const triggeringCameraId = new _mongodb2.default.ObjectID(req.params.id); const expired = new Date(Date.now() - (_DataAPI2.default.heartbeatInterval + 3) * 1000); const findBrokers = { cameraIds: [], streamIndexes: [], activated: [], brokers: [] }; context.cameras.find({ triggering_camera_id: triggeringCameraId }).forEach(camera => { findBrokers.cameraIds.push(camera._id.toHexString()); findBrokers.streamIndexes.push(camera.active_stream_index); findBrokers.activated.push(context.recorders.findOne({ module: 'broker', 'stream_infos.id': `${camera._id.toHexString()}/${camera.active_stream_index}`, updated: { $gt: expired } }, { fields: { private_ip: 1, port: 1 } })); findBrokers.brokers.push(null); }, findErr => { if (findErr) { log('error', findErr.message); res.status(500).send(findErr.message); return; } Promise.all(findBrokers.activated).then(activatedBrokers => { let findCleanBroker = null; activatedBrokers.forEach((activatedBroker, arrayIndex) => { if (!activatedBroker) { if (findCleanBroker) { return; } findCleanBroker = context.recorders.findOne({ module: 'broker', updated: { $gt: expired } }, { fields: { private_ip: 1, port: 1 }, sort: [['cpu_load', 1]] }); } else { findBrokers.brokers.splice(arrayIndex, 1, { host: activatedBroker.private_ip, port: activatedBroker.port, cameraId: findBrokers.cameraIds[arrayIndex], streamIndex: findBrokers.streamIndexes[arrayIndex] }); } }); return findCleanBroker; }).then(cleanBroker => { findBrokers.cameraIds.forEach((cameraId, arrayIndex) => { if (!findBrokers.brokers[arrayIndex]) { findBrokers.brokers.splice(arrayIndex, 1, { host: cleanBroker.private_ip, port: cleanBroker.port, cameraId, streamIndex: findBrokers.streamIndexes[arrayIndex] }); } }); if (findBrokers.brokers.length === 0) { const message = 'Event Brokers Not Found'; log('error', message); res.status(500).send(message); return; } const reply = { recorderInfo: findBrokers.brokers }; log('debug', JSON.stringify(reply, null, 2)); log('info', '200 OK'); res.status(200).send(reply); }).catch(err => { log('err', err.message); res.status(500).send(err.message); }); }); }); //noinspection JSUnusedGlobalSymbols /** * Mount router for /c/:/s/:/event-recorders * @param {object} options Options * @param {object} options.app Express App * @param {MongoClient.Db} options.database Associated Database * @param {winston.Logger} options.logger Logger */ function mountEventRecorders(options) { context.logger = options.logger; const log = (lvl, msg) => context.logger.log(lvl, msg, { tags: 'mountEventRecorders' }); log('debug', 'Mounting router for /c/:/s/:/event-recorders....'); options.app.use('/cameras/:id/streams/:index/event-recorders', context.router); context.cameras = options.database.collection('cameras'); context.recorders = options.database.collection('recorders'); context.recorders.createIndex({ module: 1, cpu_load: 1, updated: 1 }, { background: true }); log('info', 'Router for /c/:/s/:/event-recorders Mounted'); } //# sourceMappingURL=mountEventRecorders.js.map