Shinobi/libs/childNode/childUtils.js

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,
}
}