150 lines
5.8 KiB
JavaScript
150 lines
5.8 KiB
JavaScript
const fs = require('fs');
|
|
const { createWebSocketClient } = require('../basic/websocketTools.js')
|
|
module.exports = function(s,config,lang,app,io){
|
|
const { cameraDestroy } = require('../monitor/utils.js')(s,config,lang)
|
|
var checkHwInterval = null;
|
|
function onDataFromMasterNode(d) {
|
|
switch(d.f){
|
|
case'sqlCallback':
|
|
const callbackId = d.callbackId;
|
|
if(s.queuedSqlCallbacks[callbackId]){
|
|
s.queuedSqlCallbacks[callbackId](d.err,d.rows)
|
|
delete(s.queuedSqlCallbacks[callbackId])
|
|
}
|
|
break;
|
|
case'init_success':
|
|
console.error(new Date(),'Child Nodes : Authenticated with Master Node!');
|
|
s.connectedToMasterNode = true;
|
|
s.other_helpers = d.child_helpers;
|
|
s.childNodeIdOnMasterNode = d.connectionId
|
|
break;
|
|
case'kill':
|
|
s.initiateMonitorObject(d.d);
|
|
cameraDestroy(d.d)
|
|
break;
|
|
case'sync':
|
|
s.initiateMonitorObject(d.sync);
|
|
Object.keys(d.sync).forEach(function(v){
|
|
s.group[d.sync.ke].activeMonitors[d.sync.mid][v]=d.sync[v];
|
|
});
|
|
break;
|
|
case'delete'://delete video
|
|
s.file('delete',s.dir.videos+d.ke+'/'+d.mid+'/'+d.file)
|
|
break;
|
|
case'deleteTimelapseFrame'://delete timelapse frame
|
|
var filePath = s.getTimelapseFrameDirectory(d) + `${d.currentDate}/` + d.file
|
|
s.file('delete',filePath)
|
|
break;
|
|
case'cameraStop'://stop camera
|
|
// s.group[d.d.ke].activeMonitors[d.d.mid].masterSaysToStop = true
|
|
s.camera('stop',d.d)
|
|
break;
|
|
case'cameraStart'://start or record camera
|
|
s.camera(d.mode,d.d)
|
|
let activeMonitor = s.group[d.d.ke].activeMonitors[d.d.mid]
|
|
// activeMonitor.masterSaysToStop = false
|
|
clearTimeout(activeMonitor.recordingChecker);
|
|
clearTimeout(activeMonitor.streamChecker);
|
|
break;
|
|
}
|
|
}
|
|
function initiateConnectionToMasterNode(){
|
|
s.cx({
|
|
f: 'init',
|
|
port: config.port,
|
|
platform: s.platform,
|
|
coreCount: s.coreCount,
|
|
totalmem: s.totalmem / 1048576,
|
|
availableHWAccels: config.availableHWAccels,
|
|
socketKey: config.childNodes.key
|
|
})
|
|
clearInterval(checkHwInterval)
|
|
checkHwInterval = setInterval(() => {
|
|
sendCurrentCpuUsage()
|
|
sendCurrentRamUsage()
|
|
},5000)
|
|
}
|
|
function onDisconnectFromMasterNode(){
|
|
s.connectedToMasterNode = false;
|
|
destroyAllMonitorProcesses()
|
|
clearInterval(checkHwInterval)
|
|
}
|
|
function destroyAllMonitorProcesses(){
|
|
var groupKeys = Object.keys(s.group)
|
|
groupKeys.forEach(function(groupKey){
|
|
var activeMonitorKeys = Object.keys(s.group[groupKey].activeMonitors)
|
|
activeMonitorKeys.forEach(function(monitorKey){
|
|
var activeMonitor = s.group[groupKey].activeMonitors[monitorKey]
|
|
if(activeMonitor && activeMonitor.spawn && activeMonitor.spawn.close)activeMonitor.spawn.close()
|
|
if(activeMonitor && activeMonitor.spawn && activeMonitor.spawn.kill)activeMonitor.spawn.kill()
|
|
})
|
|
})
|
|
}
|
|
async function sendCurrentCpuUsage(){
|
|
const percent = await s.cpuUsage();
|
|
const use = s.coreCount * (percent / 100)
|
|
s.cx({
|
|
f: 'cpu',
|
|
used: use,
|
|
percent: percent
|
|
})
|
|
}
|
|
async function sendCurrentRamUsage(){
|
|
const ram = await s.ramUsage()
|
|
s.cx({
|
|
f: 'ram',
|
|
used: ram.used,
|
|
percent: ram.percent,
|
|
})
|
|
}
|
|
function createFileTransferToMasterNode(filePath,transferInfo,fileType){
|
|
const response = {ok: true}
|
|
return new Promise((resolve,reject) => {
|
|
const fileTransferConnection = createWebSocketClient('ws://'+config.childNodes.host + '/childNodeFileRelay',{
|
|
onMessage: () => {}
|
|
})
|
|
fileTransferConnection.on('open', function(){
|
|
fileTransferConnection.send(JSON.stringify({
|
|
fileType: fileType || 'video',
|
|
options: transferInfo,
|
|
socketKey: config.childNodes.key,
|
|
connectionId: s.childNodeIdOnMasterNode,
|
|
}))
|
|
setTimeout(() => {
|
|
fs.createReadStream(filePath)
|
|
.on('data',function(data){
|
|
fileTransferConnection.send(data)
|
|
})
|
|
.on('close',function(){
|
|
fileTransferConnection.close()
|
|
resolve(response)
|
|
})
|
|
},2000)
|
|
})
|
|
})
|
|
}
|
|
async function sendVideoToMasterNode(filePath,options){
|
|
const groupKey = options.ke
|
|
const monitorId = options.mid
|
|
const activeMonitor = s.group[groupKey].activeMonitors[monitorId]
|
|
const response = await createFileTransferToMasterNode(filePath,options,'video');
|
|
clearTimeout(activeMonitor.recordingChecker);
|
|
clearTimeout(activeMonitor.streamChecker);
|
|
return response;
|
|
}
|
|
async function sendTimelapseFrameToMasterNode(filePath,options){
|
|
const response = await createFileTransferToMasterNode(filePath,options,'timelapseFrame');
|
|
return response;
|
|
}
|
|
return {
|
|
onDataFromMasterNode,
|
|
initiateConnectionToMasterNode,
|
|
onDisconnectFromMasterNode,
|
|
destroyAllMonitorProcesses,
|
|
sendCurrentCpuUsage,
|
|
sendCurrentRamUsage,
|
|
sendVideoToMasterNode,
|
|
sendTimelapseFrameToMasterNode,
|
|
}
|
|
}
|