UNPKG

@arisan/data-api

Version:

The Universal Database API Gateway for CLIO's Modules

138 lines (130 loc) 4.32 kB
'use strict'; // 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