@arisan/data-api
Version:
The Universal Database API Gateway for CLIO's Modules
138 lines (130 loc) • 4.32 kB
JavaScript
; // eslint-disable-line strict
/* Platform Libraries */
const ObjectID = require('mongodb').ObjectID;
/* Project Libraries */
const BaseHandler = require('./base-handler');
const isValidStreamIndex = require('../Utils').isValidStreamIndex;
const valueOf = require('../Utils').valueOf;
const CLIO_HEARTBEAT_INTERVAL = process.env.CLIO_HEARTBEAT_INTERVAL;
class LiveHandler extends BaseHandler {
constructor(logger, cameras, streamers) {
super(logger);
this.cameras = cameras;
this.streamers = streamers;
this.debug(`${ this.constructor.name } Constructed`);
}
/**
* @param {Object} req
* @param {string} req.params.cameraId
* @param {string} req.params.streamIndex
* @param {Object} res
*/
readLiveInfo(req, res) {
const tag = 'readLiveInfo> ';
const cameraId = req.params.cameraId;
const streamIndex = req.params.streamIndex;
this.debug(`${ tag }Stream ${ cameraId }/${ streamIndex }`);
let objectId;
try {
objectId = new ObjectID(cameraId);
} catch (err) {
this.handleError(res, 400, `${ tag }${ err.message }`);
return;
}
if (!isValidStreamIndex(streamIndex)) {
this.handleError(res, 400, `${ tag }Invalid Stream Index`);
return;
}
this.cameras.find({ _id: objectId }).limit(1).next((findErr, findRes) => {
if (findErr) {
this.handleError(res, 500, `${ tag }${ findErr.message }`);
return;
}
if (!findRes) {
this.handleError(res, 404, `${ tag }Camera ${ cameraId } Not Found`);
return;
}
const rtspUrl = valueOf(findRes, 'streams', streamIndex, 'rtsp_url');
if (!rtspUrl) {
this.handleError(res, 404, `${ tag }Stream ${ cameraId }/${ streamIndex } RTSP URL Not Found`);
return;
}
const reply = {
rtspUrl,
audio: 'OFF'
};
const validDate = new Date(Date.now() - (CLIO_HEARTBEAT_INTERVAL + 3) * 1000);
this.streamers.findOne({
updated: { $gt: validDate }
}, { sort: { cpu_load: 1 } }, (findOneErr, findOneRes) => {
if (findOneErr) {
this.handleError(res, 500, `${ tag }${ findOneErr.message }`);
return;
}
if (!findOneRes) {
this.handleError(res, 404, `${ tag }Streamer Not Available`);
return;
}
console.log(findOneRes);
reply.streamerUrl = `http://${ findOneRes.private_ip }:${ findOneRes.port }`;
this.info(`${ tag }Stream ${ cameraId }/${ streamIndex } ` + `Reply ${ JSON.stringify(reply, null, 2) }`);
res.status(200).send(reply);
});
});
}
/**
* @param {Object} req
* @param {string} req.params.cameraId
* @param {string} req.params.streamIndex
* @param {Object} res
*/
updateStatus(req, res) {
const tag = 'Update Live Status Request: ';
const l = this.logger;
const cameras = this.cameras;
const cameraId = req.params.cameraId;
const streamIndex = req.params.streamIndex;
const requestBody = req.body;
l.debug(`${ tag }Stream ${ cameraId }/${ streamIndex } Status ${ requestBody }`);
let objectId;
try {
objectId = new ObjectID(cameraId);
} catch (err) {
l.error(err);
res.sendStatus(400);
return;
}
if (!isValidStreamIndex(streamIndex)) {
l.error(new Error('Invalid Stream Index'));
res.sendStatus(400);
return;
}
if (requestBody.length === 0) {
l.error(new Error('Update Live Status without Request or Body'));
res.sendStatus(400);
return;
}
/*
* Prepare a differential document for update.
*/
const diff = {};
diff[`streams.${ streamIndex }.live_status`] = requestBody;
diff.updated = new Date();
cameras.updateOne({ _id: objectId }, { $set: diff }, (updateErr, result) => {
if (updateErr) {
l.error(updateErr);
res.sendStatus(500);
return;
}
if (result.matchedCount === 0) {
l.error(`${ tag }Stream ${ cameraId }/${ streamIndex } Not Found`);
res.sendStatus(404);
} else {
l.info(`${ tag }Stream ${ cameraId }/${ streamIndex } Completed Successfully`);
res.sendStatus(200);
}
});
}
}
module.exports = LiveHandler;
//# sourceMappingURL=live-handler.js.map