rtcmulticonnection
Version:
RTCMultiConnection is a WebRTC JavaScript wrapper library runs top over RTCPeerConnection API to support all possible peer-to-peer features.
292 lines (246 loc) • 10.2 kB
JavaScript
// http://127.0.0.1:9001
// http://localhost:9001
const fs = require('fs');
const path = require('path');
const url = require('url');
var httpServer = require('http');
const ioServer = require('socket.io');
const RTCMultiConnectionServer = require('rtcmulticonnection-server');
var PORT = 9001;
var isUseHTTPs = false;
const jsonPath = {
config: 'config.json',
logs: 'logs.json'
};
const BASH_COLORS_HELPER = RTCMultiConnectionServer.BASH_COLORS_HELPER;
const getValuesFromConfigJson = RTCMultiConnectionServer.getValuesFromConfigJson;
const getBashParameters = RTCMultiConnectionServer.getBashParameters;
const resolveURL = RTCMultiConnectionServer.resolveURL;
var config = getValuesFromConfigJson(jsonPath);
config = getBashParameters(config, BASH_COLORS_HELPER);
// if user didn't modifed "PORT" object
// then read value from "config.json"
if(PORT === 9001) {
PORT = config.port;
}
if(isUseHTTPs === false) {
isUseHTTPs = config.isUseHTTPs;
}
function serverHandler(request, response) {
// to make sure we always get valid info from json file
// even if external codes are overriding it
config = getValuesFromConfigJson(jsonPath);
config = getBashParameters(config, BASH_COLORS_HELPER);
// HTTP_GET handling code goes below
try {
var uri, filename;
try {
if (!config.dirPath || !config.dirPath.length) {
config.dirPath = null;
}
uri = url.parse(request.url).pathname;
filename = path.join(config.dirPath ? resolveURL(config.dirPath) : process.cwd(), uri);
} catch (e) {
pushLogs(config, 'url.parse', e);
}
filename = (filename || '').toString();
if (request.method !== 'GET' || uri.indexOf('..') !== -1) {
try {
response.writeHead(401, {
'Content-Type': 'text/plain'
});
response.write('401 Unauthorized: ' + path.join('/', uri) + '\n');
response.end();
return;
} catch (e) {
pushLogs(config, '!GET or ..', e);
}
}
if(filename.indexOf(resolveURL('/admin/')) !== -1 && config.enableAdmin !== true) {
try {
response.writeHead(401, {
'Content-Type': 'text/plain'
});
response.write('401 Unauthorized: ' + path.join('/', uri) + '\n');
response.end();
return;
} catch (e) {
pushLogs(config, '!GET or ..', e);
}
return;
}
var matched = false;
['/demos/', '/dev/', '/dist/', '/socket.io/', '/node_modules/canvas-designer/', '/admin/'].forEach(function(item) {
if (filename.indexOf(resolveURL(item)) !== -1) {
matched = true;
}
});
// files from node_modules
['RecordRTC.js', 'FileBufferReader.js', 'getStats.js', 'getScreenId.js', 'adapter.js', 'MultiStreamsMixer.js'].forEach(function(item) {
if (filename.indexOf(resolveURL('/node_modules/')) !== -1 && filename.indexOf(resolveURL(item)) !== -1) {
matched = true;
}
});
if (filename.search(/.js|.json/g) !== -1 && !matched) {
try {
response.writeHead(404, {
'Content-Type': 'text/plain'
});
response.write('404 Not Found: ' + path.join('/', uri) + '\n');
response.end();
return;
} catch (e) {
pushLogs(config, '404 Not Found', e);
}
}
['Video-Broadcasting', 'Screen-Sharing', 'Switch-Cameras'].forEach(function(fname) {
try {
if (filename.indexOf(fname + '.html') !== -1) {
filename = filename.replace(fname + '.html', fname.toLowerCase() + '.html');
}
} catch (e) {
pushLogs(config, 'forEach', e);
}
});
var stats;
try {
stats = fs.lstatSync(filename);
if (filename.search(/demos/g) === -1 && filename.search(/admin/g) === -1 && stats.isDirectory() && config.homePage === '/demos/index.html') {
if (response.redirect) {
response.redirect('/demos/');
} else {
response.writeHead(301, {
'Location': '/demos/'
});
}
response.end();
return;
}
} catch (e) {
response.writeHead(404, {
'Content-Type': 'text/plain'
});
response.write('404 Not Found: ' + path.join('/', uri) + '\n');
response.end();
return;
}
try {
if (fs.statSync(filename).isDirectory()) {
response.writeHead(404, {
'Content-Type': 'text/html'
});
if (filename.indexOf(resolveURL('/demos/MultiRTC/')) !== -1) {
filename = filename.replace(resolveURL('/demos/MultiRTC/'), '');
filename += resolveURL('/demos/MultiRTC/index.html');
} else if (filename.indexOf(resolveURL('/admin/')) !== -1) {
filename = filename.replace(resolveURL('/admin/'), '');
filename += resolveURL('/admin/index.html');
} else if (filename.indexOf(resolveURL('/demos/dashboard/')) !== -1) {
filename = filename.replace(resolveURL('/demos/dashboard/'), '');
filename += resolveURL('/demos/dashboard/index.html');
} else if (filename.indexOf(resolveURL('/demos/video-conference/')) !== -1) {
filename = filename.replace(resolveURL('/demos/video-conference/'), '');
filename += resolveURL('/demos/video-conference/index.html');
} else if (filename.indexOf(resolveURL('/demos')) !== -1) {
filename = filename.replace(resolveURL('/demos/'), '');
filename = filename.replace(resolveURL('/demos'), '');
filename += resolveURL('/demos/index.html');
} else {
filename += resolveURL(config.homePage);
}
}
} catch (e) {
pushLogs(config, 'statSync.isDirectory', e);
}
var contentType = 'text/plain';
if (filename.toLowerCase().indexOf('.html') !== -1) {
contentType = 'text/html';
}
if (filename.toLowerCase().indexOf('.css') !== -1) {
contentType = 'text/css';
}
if (filename.toLowerCase().indexOf('.png') !== -1) {
contentType = 'image/png';
}
fs.readFile(filename, 'binary', function(err, file) {
if (err) {
response.writeHead(500, {
'Content-Type': 'text/plain'
});
response.write('404 Not Found: ' + path.join('/', uri) + '\n');
response.end();
return;
}
try {
file = file.replace('connection.socketURL = \'/\';', 'connection.socketURL = \'' + config.socketURL + '\';');
} catch (e) {}
response.writeHead(200, {
'Content-Type': contentType
});
response.write(file, 'binary');
response.end();
});
} catch (e) {
pushLogs(config, 'Unexpected', e);
response.writeHead(404, {
'Content-Type': 'text/plain'
});
response.write('404 Not Found: Unexpected error.\n' + e.message + '\n\n' + e.stack);
response.end();
}
}
var httpApp;
if (isUseHTTPs) {
httpServer = require('https');
// See how to use a valid certificate:
// https://github.com/muaz-khan/WebRTC-Experiment/issues/62
var options = {
key: null,
cert: null,
ca: null
};
var pfx = false;
if (!fs.existsSync(config.sslKey)) {
console.log(BASH_COLORS_HELPER.getRedFG(), 'sslKey:\t ' + config.sslKey + ' does not exist.');
} else {
pfx = config.sslKey.indexOf('.pfx') !== -1;
options.key = fs.readFileSync(config.sslKey);
}
if (!fs.existsSync(config.sslCert)) {
console.log(BASH_COLORS_HELPER.getRedFG(), 'sslCert:\t ' + config.sslCert + ' does not exist.');
} else {
options.cert = fs.readFileSync(config.sslCert);
}
if (config.sslCabundle) {
if (!fs.existsSync(config.sslCabundle)) {
console.log(BASH_COLORS_HELPER.getRedFG(), 'sslCabundle:\t ' + config.sslCabundle + ' does not exist.');
}
options.ca = fs.readFileSync(config.sslCabundle);
}
if (pfx === true) {
options = {
pfx: sslKey
};
}
httpApp = httpServer.createServer(options, serverHandler);
} else {
httpApp = httpServer.createServer(serverHandler);
}
RTCMultiConnectionServer.beforeHttpListen(httpApp, config);
httpApp = httpApp.listen(process.env.PORT || PORT, process.env.IP || "0.0.0.0", function() {
RTCMultiConnectionServer.afterHttpListen(httpApp, config);
});
// --------------------------
// socket.io codes goes below
ioServer(httpApp).on('connection', function(socket) {
RTCMultiConnectionServer.addSocket(socket, config);
// ----------------------
// below code is optional
const params = socket.handshake.query;
if (!params.socketCustomEvent) {
params.socketCustomEvent = 'custom-message';
}
socket.on(params.socketCustomEvent, function(message) {
socket.broadcast.emit(params.socketCustomEvent, message);
});
});