@arisan/data-api
Version:
The Universal Database API Gateway for CLIO's Modules
97 lines (81 loc) • 3.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = mountNewRecorder;
var _express = require('express');
var _express2 = _interopRequireDefault(_express);
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
//region 1. Platform Libraries
const context = {
router: _express2.default.Router({ mergeParams: true }),
recorders: null,
logger: null
};
//endregion
//region 2. Project Libraries
context.router.get('/', _checkObjectID2.default);
context.router.get('/', _checkStreamIndex2.default);
context.router.get('/:module', (req, res) => {
const log = (lvl, msg) => context.logger.log(lvl, msg, { tags: `GET ${req.originalUrl}` });
log('debug', JSON.stringify(req.params, null, 2));
if (['archive', 'live', 'event'].indexOf(req.params.module) === -1) {
const message = 'Invalid Module Name';
log('error', message);
res.status(400).send(message);
return;
}
const expired = new Date(Date.now() - (_DataAPI2.default.heartbeatInterval + 3) * 1000);
context.recorders.find({
module: req.params.module,
updated: { $gt: expired }
}, {
fields: { load_history: 0 },
sort: { cpu_load: 1 }
}).toArray((findErr, activeRecorders) => {
if (findErr) {
log('error', findErr.message);
res.status(500).send(findErr.message);
return;
}
if (activeRecorders.length === 0) {
const message = `${req.params.module.toUpperCase()} Recorder Not Available`;
log('error', message);
res.status(500).send(message);
return;
}
const max = Math.floor(activeRecorders.length / 2);
const selected = activeRecorders[Math.floor(Math.random() * max)];
const reply = {
host: selected.private_ip,
port: parseInt(selected.port, 10)
};
log('debug', JSON.stringify(reply, null, 2));
log('info', '200 OK');
res.status(200).send(reply);
});
});
//noinspection JSUnusedGlobalSymbols
/**
* Mount router for /c/:/s/:/new-recorder
* @param {object} options Options
* @param {object} options.app Express App
* @param {MongoClient.Db} options.database Associated Database
* @param {winston.Logger} options.logger Logger
*/
function mountNewRecorder(options) {
context.logger = options.logger;
const log = (lvl, msg) => context.logger.log(lvl, msg, { tags: 'mountNewRecorder' });
log('debug', 'Mounting router for /c/:/s/:/new-recorder....');
options.app.use('/cameras/:id/streams/:index/new-recorder', context.router);
context.recorders = options.database.collection('recorders');
log('info', 'Router for /c/:/s/:/new-recorder Mounted');
}
//# sourceMappingURL=mountNewRecorder.js.map