Added an interactive terminal to get info from running server.
parent
87a6153cd8
commit
1b710d273c
|
|
@ -0,0 +1,5 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
const interactiveClient = require('./lib/interactiveClient');
|
||||||
|
|
||||||
|
interactiveClient();
|
||||||
|
|
@ -258,6 +258,14 @@ class Room extends EventEmitter
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async dump()
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
roomId : this._roomId,
|
||||||
|
peers : this._peers.size
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
get id()
|
get id()
|
||||||
{
|
{
|
||||||
return this._roomId;
|
return this._roomId;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
const net = require('net');
|
||||||
|
const os = require('os');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const SOCKET_PATH_UNIX = '/tmp/multiparty-meeting-server.sock';
|
||||||
|
const SOCKET_PATH_WIN = path.join('\\\\?\\pipe', process.cwd(), 'multiparty-meeting-server');
|
||||||
|
const SOCKET_PATH = os.platform() === 'win32'? SOCKET_PATH_WIN : SOCKET_PATH_UNIX;
|
||||||
|
|
||||||
|
module.exports = async function()
|
||||||
|
{
|
||||||
|
const socket = net.connect(SOCKET_PATH);
|
||||||
|
|
||||||
|
process.stdin.pipe(socket);
|
||||||
|
socket.pipe(process.stdout);
|
||||||
|
|
||||||
|
socket.on('connect', () => process.stdin.setRawMode(true));
|
||||||
|
socket.on('close', () => process.exit(0));
|
||||||
|
socket.on('exit', () => socket.end());
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,680 @@
|
||||||
|
const os = require('os');
|
||||||
|
const path = require('path');
|
||||||
|
const repl = require('repl');
|
||||||
|
const readline = require('readline');
|
||||||
|
const net = require('net');
|
||||||
|
const fs = require('fs');
|
||||||
|
const mediasoup = require('mediasoup');
|
||||||
|
const colors = require('colors/safe');
|
||||||
|
const pidusage = require('pidusage');
|
||||||
|
|
||||||
|
const SOCKET_PATH_UNIX = '/tmp/multiparty-meeting-server.sock';
|
||||||
|
const SOCKET_PATH_WIN = path.join('\\\\?\\pipe', process.cwd(), 'multiparty-meeting-server');
|
||||||
|
const SOCKET_PATH = os.platform() === 'win32' ? SOCKET_PATH_WIN : SOCKET_PATH_UNIX;
|
||||||
|
|
||||||
|
// Maps to store all mediasoup objects.
|
||||||
|
const workers = new Map();
|
||||||
|
const routers = new Map();
|
||||||
|
const transports = new Map();
|
||||||
|
const producers = new Map();
|
||||||
|
const consumers = new Map();
|
||||||
|
const dataProducers = new Map();
|
||||||
|
const dataConsumers = new Map();
|
||||||
|
|
||||||
|
class Interactive
|
||||||
|
{
|
||||||
|
constructor(socket)
|
||||||
|
{
|
||||||
|
this._socket = socket;
|
||||||
|
|
||||||
|
this._isTerminalOpen = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
openCommandConsole()
|
||||||
|
{
|
||||||
|
this.log('\n[opening Readline Command Console...]');
|
||||||
|
this.log('type help to print available commands');
|
||||||
|
|
||||||
|
const cmd = readline.createInterface(
|
||||||
|
{
|
||||||
|
input : this._socket,
|
||||||
|
output : this._socket,
|
||||||
|
terminal : true
|
||||||
|
});
|
||||||
|
|
||||||
|
cmd.on('close', () =>
|
||||||
|
{
|
||||||
|
if (this._isTerminalOpen)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.log('\nexiting...');
|
||||||
|
|
||||||
|
this._socket.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
const readStdin = () =>
|
||||||
|
{
|
||||||
|
cmd.question('cmd> ', async (input) =>
|
||||||
|
{
|
||||||
|
const params = input.split(/[\s\t]+/);
|
||||||
|
const command = params.shift();
|
||||||
|
|
||||||
|
switch (command)
|
||||||
|
{
|
||||||
|
case '':
|
||||||
|
{
|
||||||
|
readStdin();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'h':
|
||||||
|
case 'help':
|
||||||
|
{
|
||||||
|
this.log('');
|
||||||
|
this.log('available commands:');
|
||||||
|
this.log('- h, help : show this message');
|
||||||
|
this.log('- usage : show CPU and memory usage of the Node.js and mediasoup-worker processes');
|
||||||
|
this.log('- logLevel level : changes logLevel in all mediasoup Workers');
|
||||||
|
this.log('- logTags [tag] [tag] : changes logTags in all mediasoup Workers (values separated by space)');
|
||||||
|
this.log('- dumpRooms : dump all rooms');
|
||||||
|
this.log('- dumpPeers : dump all peers');
|
||||||
|
this.log('- dw, dumpWorkers : dump mediasoup Workers');
|
||||||
|
this.log('- dr, dumpRouter [id] : dump mediasoup Router with given id (or the latest created one)');
|
||||||
|
this.log('- dt, dumpTransport [id] : dump mediasoup Transport with given id (or the latest created one)');
|
||||||
|
this.log('- dp, dumpProducer [id] : dump mediasoup Producer with given id (or the latest created one)');
|
||||||
|
this.log('- dc, dumpConsumer [id] : dump mediasoup Consumer with given id (or the latest created one)');
|
||||||
|
this.log('- ddp, dumpDataProducer [id] : dump mediasoup DataProducer with given id (or the latest created one)');
|
||||||
|
this.log('- ddc, dumpDataConsumer [id] : dump mediasoup DataConsumer with given id (or the latest created one)');
|
||||||
|
this.log('- st, statsTransport [id] : get stats for mediasoup Transport with given id (or the latest created one)');
|
||||||
|
this.log('- sp, statsProducer [id] : get stats for mediasoup Producer with given id (or the latest created one)');
|
||||||
|
this.log('- sc, statsConsumer [id] : get stats for mediasoup Consumer with given id (or the latest created one)');
|
||||||
|
this.log('- sdp, statsDataProducer [id] : get stats for mediasoup DataProducer with given id (or the latest created one)');
|
||||||
|
this.log('- sdc, statsDataConsumer [id] : get stats for mediasoup DataConsumer with given id (or the latest created one)');
|
||||||
|
this.log('- t, terminal : open Node REPL Terminal');
|
||||||
|
this.log('');
|
||||||
|
readStdin();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'u':
|
||||||
|
case 'usage':
|
||||||
|
{
|
||||||
|
let usage = await pidusage(process.pid);
|
||||||
|
|
||||||
|
this.log(`Node.js process [pid:${process.pid}]:\n${JSON.stringify(usage, null, ' ')}`);
|
||||||
|
|
||||||
|
for (const worker of workers.values())
|
||||||
|
{
|
||||||
|
usage = await pidusage(worker.pid);
|
||||||
|
|
||||||
|
this.log(`mediasoup-worker process [pid:${worker.pid}]:\n${JSON.stringify(usage, null, ' ')}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'logLevel':
|
||||||
|
{
|
||||||
|
const level = params[0];
|
||||||
|
const promises = [];
|
||||||
|
|
||||||
|
for (const worker of workers.values())
|
||||||
|
{
|
||||||
|
promises.push(worker.updateSettings({ logLevel: level }));
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Promise.all(promises);
|
||||||
|
|
||||||
|
this.log('done');
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(String(error));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'logTags':
|
||||||
|
{
|
||||||
|
const tags = params;
|
||||||
|
const promises = [];
|
||||||
|
|
||||||
|
for (const worker of workers.values())
|
||||||
|
{
|
||||||
|
promises.push(worker.updateSettings({ logTags: tags }));
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Promise.all(promises);
|
||||||
|
|
||||||
|
this.log('done');
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(String(error));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'dumpRooms':
|
||||||
|
{
|
||||||
|
for (const room of global.rooms.values())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const dump = await room.dump();
|
||||||
|
|
||||||
|
this.log(`room.dump():\n${JSON.stringify(dump, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`room.dump() failed: ${error}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'dumpPeers':
|
||||||
|
{
|
||||||
|
for (const peer of global.peers.values())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const dump = await peer.peerInfo;
|
||||||
|
|
||||||
|
this.log(`peer.peerInfo():\n${JSON.stringify(dump, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`peer.peerInfo() failed: ${error}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'dw':
|
||||||
|
case 'dumpWorkers':
|
||||||
|
{
|
||||||
|
for (const worker of workers.values())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const dump = await worker.dump();
|
||||||
|
|
||||||
|
this.log(`worker.dump():\n${JSON.stringify(dump, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`worker.dump() failed: ${error}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'dr':
|
||||||
|
case 'dumpRouter':
|
||||||
|
{
|
||||||
|
const id = params[0] || Array.from(routers.keys()).pop();
|
||||||
|
const router = routers.get(id);
|
||||||
|
|
||||||
|
if (!router)
|
||||||
|
{
|
||||||
|
this.error('Router not found');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const dump = await router.dump();
|
||||||
|
|
||||||
|
this.log(`router.dump():\n${JSON.stringify(dump, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`router.dump() failed: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'dt':
|
||||||
|
case 'dumpTransport':
|
||||||
|
{
|
||||||
|
const id = params[0] || Array.from(transports.keys()).pop();
|
||||||
|
const transport = transports.get(id);
|
||||||
|
|
||||||
|
if (!transport)
|
||||||
|
{
|
||||||
|
this.error('Transport not found');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const dump = await transport.dump();
|
||||||
|
|
||||||
|
this.log(`transport.dump():\n${JSON.stringify(dump, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`transport.dump() failed: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'dp':
|
||||||
|
case 'dumpProducer':
|
||||||
|
{
|
||||||
|
const id = params[0] || Array.from(producers.keys()).pop();
|
||||||
|
const producer = producers.get(id);
|
||||||
|
|
||||||
|
if (!producer)
|
||||||
|
{
|
||||||
|
this.error('Producer not found');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const dump = await producer.dump();
|
||||||
|
|
||||||
|
this.log(`producer.dump():\n${JSON.stringify(dump, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`producer.dump() failed: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'dc':
|
||||||
|
case 'dumpConsumer':
|
||||||
|
{
|
||||||
|
const id = params[0] || Array.from(consumers.keys()).pop();
|
||||||
|
const consumer = consumers.get(id);
|
||||||
|
|
||||||
|
if (!consumer)
|
||||||
|
{
|
||||||
|
this.error('Consumer not found');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const dump = await consumer.dump();
|
||||||
|
|
||||||
|
this.log(`consumer.dump():\n${JSON.stringify(dump, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`consumer.dump() failed: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'ddp':
|
||||||
|
case 'dumpDataProducer':
|
||||||
|
{
|
||||||
|
const id = params[0] || Array.from(dataProducers.keys()).pop();
|
||||||
|
const dataProducer = dataProducers.get(id);
|
||||||
|
|
||||||
|
if (!dataProducer)
|
||||||
|
{
|
||||||
|
this.error('DataProducer not found');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const dump = await dataProducer.dump();
|
||||||
|
|
||||||
|
this.log(`dataProducer.dump():\n${JSON.stringify(dump, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`dataProducer.dump() failed: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'ddc':
|
||||||
|
case 'dumpDataConsumer':
|
||||||
|
{
|
||||||
|
const id = params[0] || Array.from(dataConsumers.keys()).pop();
|
||||||
|
const dataConsumer = dataConsumers.get(id);
|
||||||
|
|
||||||
|
if (!dataConsumer)
|
||||||
|
{
|
||||||
|
this.error('DataConsumer not found');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const dump = await dataConsumer.dump();
|
||||||
|
|
||||||
|
this.log(`dataConsumer.dump():\n${JSON.stringify(dump, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`dataConsumer.dump() failed: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'st':
|
||||||
|
case 'statsTransport':
|
||||||
|
{
|
||||||
|
const id = params[0] || Array.from(transports.keys()).pop();
|
||||||
|
const transport = transports.get(id);
|
||||||
|
|
||||||
|
if (!transport)
|
||||||
|
{
|
||||||
|
this.error('Transport not found');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const stats = await transport.getStats();
|
||||||
|
|
||||||
|
this.log(`transport.getStats():\n${JSON.stringify(stats, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`transport.getStats() failed: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'sp':
|
||||||
|
case 'statsProducer':
|
||||||
|
{
|
||||||
|
const id = params[0] || Array.from(producers.keys()).pop();
|
||||||
|
const producer = producers.get(id);
|
||||||
|
|
||||||
|
if (!producer)
|
||||||
|
{
|
||||||
|
this.error('Producer not found');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const stats = await producer.getStats();
|
||||||
|
|
||||||
|
this.log(`producer.getStats():\n${JSON.stringify(stats, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`producer.getStats() failed: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'sc':
|
||||||
|
case 'statsConsumer':
|
||||||
|
{
|
||||||
|
const id = params[0] || Array.from(consumers.keys()).pop();
|
||||||
|
const consumer = consumers.get(id);
|
||||||
|
|
||||||
|
if (!consumer)
|
||||||
|
{
|
||||||
|
this.error('Consumer not found');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const stats = await consumer.getStats();
|
||||||
|
|
||||||
|
this.log(`consumer.getStats():\n${JSON.stringify(stats, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`consumer.getStats() failed: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'sdp':
|
||||||
|
case 'statsDataProducer':
|
||||||
|
{
|
||||||
|
const id = params[0] || Array.from(dataProducers.keys()).pop();
|
||||||
|
const dataProducer = dataProducers.get(id);
|
||||||
|
|
||||||
|
if (!dataProducer)
|
||||||
|
{
|
||||||
|
this.error('DataProducer not found');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const stats = await dataProducer.getStats();
|
||||||
|
|
||||||
|
this.log(`dataProducer.getStats():\n${JSON.stringify(stats, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`dataProducer.getStats() failed: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'sdc':
|
||||||
|
case 'statsDataConsumer':
|
||||||
|
{
|
||||||
|
const id = params[0] || Array.from(dataConsumers.keys()).pop();
|
||||||
|
const dataConsumer = dataConsumers.get(id);
|
||||||
|
|
||||||
|
if (!dataConsumer)
|
||||||
|
{
|
||||||
|
this.error('DataConsumer not found');
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const stats = await dataConsumer.getStats();
|
||||||
|
|
||||||
|
this.log(`dataConsumer.getStats():\n${JSON.stringify(stats, null, ' ')}`);
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
this.error(`dataConsumer.getStats() failed: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 't':
|
||||||
|
case 'terminal':
|
||||||
|
{
|
||||||
|
this._isTerminalOpen = true;
|
||||||
|
|
||||||
|
cmd.close();
|
||||||
|
this.openTerminal();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
this.error(`unknown command '${command}'`);
|
||||||
|
this.log('press \'h\' or \'help\' to get the list of available commands');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
readStdin();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
readStdin();
|
||||||
|
}
|
||||||
|
|
||||||
|
openTerminal()
|
||||||
|
{
|
||||||
|
this.log('\n[opening Node REPL Terminal...]');
|
||||||
|
this.log('here you have access to workers, routers, transports, producers, consumers, dataProducers and dataConsumers ES6 maps');
|
||||||
|
|
||||||
|
const terminal = repl.start(
|
||||||
|
{
|
||||||
|
input : this._socket,
|
||||||
|
output : this._socket,
|
||||||
|
terminal : true,
|
||||||
|
prompt : 'terminal> ',
|
||||||
|
useColors : true,
|
||||||
|
useGlobal : true,
|
||||||
|
ignoreUndefined : false
|
||||||
|
});
|
||||||
|
|
||||||
|
this._isTerminalOpen = true;
|
||||||
|
|
||||||
|
terminal.on('exit', () =>
|
||||||
|
{
|
||||||
|
this.log('\n[exiting Node REPL Terminal...]');
|
||||||
|
|
||||||
|
this._isTerminalOpen = false;
|
||||||
|
|
||||||
|
this.openCommandConsole();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
log(msg)
|
||||||
|
{
|
||||||
|
this._socket.write(`${colors.green(msg)}\n`);
|
||||||
|
}
|
||||||
|
|
||||||
|
error(msg)
|
||||||
|
{
|
||||||
|
this._socket.write(`${colors.red.bold('ERROR: ')}${colors.red(msg)}\n`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function runMediasoupObserver()
|
||||||
|
{
|
||||||
|
mediasoup.observer.on('newworker', (worker) =>
|
||||||
|
{
|
||||||
|
// Store the latest worker in a global variable.
|
||||||
|
global.worker = worker;
|
||||||
|
|
||||||
|
workers.set(worker.pid, worker);
|
||||||
|
worker.observer.on('close', () => workers.delete(worker.pid));
|
||||||
|
|
||||||
|
worker.observer.on('newrouter', (router) =>
|
||||||
|
{
|
||||||
|
// Store the latest router in a global variable.
|
||||||
|
global.router = router;
|
||||||
|
|
||||||
|
routers.set(router.id, router);
|
||||||
|
router.observer.on('close', () => routers.delete(router.id));
|
||||||
|
|
||||||
|
router.observer.on('newtransport', (transport) =>
|
||||||
|
{
|
||||||
|
// Store the latest transport in a global variable.
|
||||||
|
global.transport = transport;
|
||||||
|
|
||||||
|
transports.set(transport.id, transport);
|
||||||
|
transport.observer.on('close', () => transports.delete(transport.id));
|
||||||
|
|
||||||
|
transport.observer.on('newproducer', (producer) =>
|
||||||
|
{
|
||||||
|
// Store the latest producer in a global variable.
|
||||||
|
global.producer = producer;
|
||||||
|
|
||||||
|
producers.set(producer.id, producer);
|
||||||
|
producer.observer.on('close', () => producers.delete(producer.id));
|
||||||
|
});
|
||||||
|
|
||||||
|
transport.observer.on('newconsumer', (consumer) =>
|
||||||
|
{
|
||||||
|
// Store the latest consumer in a global variable.
|
||||||
|
global.consumer = consumer;
|
||||||
|
|
||||||
|
consumers.set(consumer.id, consumer);
|
||||||
|
consumer.observer.on('close', () => consumers.delete(consumer.id));
|
||||||
|
});
|
||||||
|
|
||||||
|
transport.observer.on('newdataproducer', (dataProducer) =>
|
||||||
|
{
|
||||||
|
// Store the latest dataProducer in a global variable.
|
||||||
|
global.dataProducer = dataProducer;
|
||||||
|
|
||||||
|
dataProducers.set(dataProducer.id, dataProducer);
|
||||||
|
dataProducer.observer.on('close', () => dataProducers.delete(dataProducer.id));
|
||||||
|
});
|
||||||
|
|
||||||
|
transport.observer.on('newdataconsumer', (dataConsumer) =>
|
||||||
|
{
|
||||||
|
// Store the latest dataConsumer in a global variable.
|
||||||
|
global.dataConsumer = dataConsumer;
|
||||||
|
|
||||||
|
dataConsumers.set(dataConsumer.id, dataConsumer);
|
||||||
|
dataConsumer.observer.on('close', () => dataConsumers.delete(dataConsumer.id));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = async function(rooms, peers)
|
||||||
|
{
|
||||||
|
// Run the mediasoup observer API.
|
||||||
|
runMediasoupObserver();
|
||||||
|
|
||||||
|
// Make maps global so they can be used during the REPL terminal.
|
||||||
|
global.rooms = rooms;
|
||||||
|
global.peers = peers;
|
||||||
|
global.workers = workers;
|
||||||
|
global.routers = routers;
|
||||||
|
global.transports = transports;
|
||||||
|
global.producers = producers;
|
||||||
|
global.consumers = consumers;
|
||||||
|
global.dataProducers = dataProducers;
|
||||||
|
global.dataConsumers = dataConsumers;
|
||||||
|
|
||||||
|
const server = net.createServer((socket) =>
|
||||||
|
{
|
||||||
|
const interactive = new Interactive(socket);
|
||||||
|
|
||||||
|
interactive.openCommandConsole();
|
||||||
|
});
|
||||||
|
|
||||||
|
await new Promise((resolve) =>
|
||||||
|
{
|
||||||
|
try { fs.unlinkSync(SOCKET_PATH); }
|
||||||
|
catch (error) {}
|
||||||
|
|
||||||
|
server.listen(SOCKET_PATH, resolve);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
@ -6,6 +6,10 @@
|
||||||
"author": "Håvar Aambø Fosstveit <h@fosstveit.net>",
|
"author": "Håvar Aambø Fosstveit <h@fosstveit.net>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "DEBUG=${DEBUG:='*mediasoup* *INFO* *WARN* *ERROR*'} INTERACTIVE=${INTERACTIVE:='true'} node server.js",
|
||||||
|
"connect": "node connect.js"
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"awaitqueue": "^1.0.0",
|
"awaitqueue": "^1.0.0",
|
||||||
"base-64": "^0.1.0",
|
"base-64": "^0.1.0",
|
||||||
|
|
@ -24,6 +28,7 @@
|
||||||
"openid-client": "^3.7.3",
|
"openid-client": "^3.7.3",
|
||||||
"passport": "^0.4.0",
|
"passport": "^0.4.0",
|
||||||
"passport-lti": "0.0.7",
|
"passport-lti": "0.0.7",
|
||||||
|
"pidusage": "^2.0.17",
|
||||||
"redis": "^2.8.0",
|
"redis": "^2.8.0",
|
||||||
"socket.io": "^2.3.0",
|
"socket.io": "^2.3.0",
|
||||||
"spdy": "^4.0.1"
|
"spdy": "^4.0.1"
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,8 @@ const { Issuer, Strategy } = require('openid-client');
|
||||||
const expressSession = require('express-session');
|
const expressSession = require('express-session');
|
||||||
const RedisStore = require('connect-redis')(expressSession);
|
const RedisStore = require('connect-redis')(expressSession);
|
||||||
const sharedSession = require('express-socket.io-session');
|
const sharedSession = require('express-socket.io-session');
|
||||||
|
const interactiveServer = require('./lib/interactiveServer');
|
||||||
|
const interactiveClient = require('./lib/interactiveClient');
|
||||||
|
|
||||||
/* eslint-disable no-console */
|
/* eslint-disable no-console */
|
||||||
console.log('- process.env.DEBUG:', process.env.DEBUG);
|
console.log('- process.env.DEBUG:', process.env.DEBUG);
|
||||||
|
|
@ -117,6 +119,13 @@ let oidcStrategy;
|
||||||
|
|
||||||
async function run()
|
async function run()
|
||||||
{
|
{
|
||||||
|
// Open the interactive server.
|
||||||
|
await interactiveServer(rooms, peers);
|
||||||
|
|
||||||
|
// Open the interactive client.
|
||||||
|
if (process.env.INTERACTIVE === 'true' || process.env.INTERACTIVE === '1')
|
||||||
|
await interactiveClient();
|
||||||
|
|
||||||
if (typeof(config.auth) === 'undefined')
|
if (typeof(config.auth) === 'undefined')
|
||||||
{
|
{
|
||||||
logger.warn('Auth is not configured properly!');
|
logger.warn('Auth is not configured properly!');
|
||||||
|
|
@ -561,6 +570,7 @@ async function getOrCreateRoom({ roomId })
|
||||||
room = await Room.create({ mediasoupWorker, roomId });
|
room = await Room.create({ mediasoupWorker, roomId });
|
||||||
|
|
||||||
rooms.set(roomId, room);
|
rooms.set(roomId, room);
|
||||||
|
|
||||||
room.on('close', () => rooms.delete(roomId));
|
room.on('close', () => rooms.delete(roomId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue