Shinobi/libs/commander.js

157 lines
5.1 KiB
JavaScript

const { Worker } = require('worker_threads');
module.exports = function(s,config,lang,app){
const fetch = require('node-fetch')
const { modifyConfiguration, getConfiguration } = require('./system/utils.js')(config)
let customerServerList = !!config.p2pServerList;
var runningWorker;
config.machineId = config.p2pApiKey + '' + config.p2pGroupId
config.p2pTargetAuth = config.p2pTargetAuth || s.gid(30)
config.p2pShellAccess = config.p2pShellAccess || false
config.useBetterP2P = config.useBetterP2P === undefined ? true : config.useBetterP2P
if(!config.workerStreamOutHandlers){
config.workerStreamOutHandlers = [
'Base64',
'FLV',
'MP4',
];
}
if(!customerServerList){
config.p2pServerList = {
"vancouver-1-v2": {
name: 'Vancouver-1',
host: 'p2p-vancouver-1.shinobi.cloud',
v2: true,
p2pPort: '80',
webPort: '80',
chartPort: '80',
maxNetworkSpeed: {
up: 5000,
down: 5000,
shared: true
},
location: {
lat: 49.284966,
lon: -123.1140607
}
},
"toronto-1-v2": {
name: 'Toronto-1',
host: 'p2p-toronto-1.shinobi.cloud',
v2: true,
p2pPort: '80',
webPort: '80',
chartPort: '80',
maxNetworkSpeed: {
up: 5000,
down: 5000,
shared: true
},
location: {
lat: 43.644773,
lon: -79.3862837
}
},
"paris-1-v2": {
name: 'Paris-1',
host: 'p2p-paris-1.shinobi.cloud',
v2: true,
p2pPort: '80',
webPort: '80',
chartPort: '80',
maxNetworkSpeed: {
up: 200,
down: 200,
shared: true
},
location: {
lat: 48.873877,
lon: 2.295533
}
}
}
// get latest
fetch('https://cdn.shinobi.video/configs/p2pServers.js')
.then(res => res.text())
.then((text) => {
try{
eval(`config.p2pServerList = ` + text)
}catch(err){
s.debugLog(err)
}
});
}
if(!config.p2pHostSelected)config.p2pHostSelected = config.useBetterP2P ? 'paris-1-v2' : 'paris-1'
const p2pServerKeys = Object.keys(config.p2pServerList)
const filteredList = {}
p2pServerKeys.forEach((keyName) => {
const connector = config.p2pServerList[keyName]
if(connector.v2 === !!config.useBetterP2P){
filteredList[keyName] = connector;
}
})
config.p2pServerList = filteredList;
const stopWorker = () => {
if(runningWorker){
runningWorker.postMessage({
f: 'exit'
})
}
}
const startWorker = () => {
stopWorker()
const pathToWorkerScript = __dirname + `/commander/${config.useBetterP2P ? 'workerv2' : 'worker'}.js`
const workerProcess = new Worker(pathToWorkerScript,{
workerData: {
config: config,
lang: lang
}
})
workerProcess.on('message',function(data){
switch(data.f){
case'debugLog':
s.debugLog(...data.data)
break;
case'systemLog':
s.systemLog(...data.data)
break;
}
})
setTimeout(() => {
workerProcess.postMessage({
f: 'init',
})
},2000)
return workerProcess
}
const beginConnection = () => {
runningWorker = startWorker()
}
if(config.p2pEnabled){
beginConnection()
}
/**
* API : Superuser : Save P2P Server choice
*/
app.post(config.webPaths.superApiPrefix+':auth/p2p/save', function (req,res){
s.superAuth(req.params,async (resp) => {
const response = {ok: true};
const form = s.getPostData(req,'data',true)
form.p2pEnabled = form.p2pEnabled === '1' ? true : false
config = Object.assign(config,form)
const currentConfig = await getConfiguration()
const configError = await modifyConfiguration(Object.assign(currentConfig,form))
if(configError)s.systemLog(configError)
setTimeout(() => {
if(form.p2pEnabled){
s.systemLog('Starting P2P')
beginConnection()
}else{
s.systemLog('Stopping P2P')
stopWorker()
}
},2000)
s.closeJsonResponse(res,response)
},res,req)
})
}