jsmpeg
jsmpeg copied to clipboard
SSL Support
I have coded a new server with SSL support, maybe help some users.
/*
- CONFIG */ var cfg = { host: '192.168.0.10', //server ip input_port: 8081, output_port: 8082, ssl_client: true, ssl_streamer: true, ssl_key: 'D:\mykeys\sitekey.key', ssl_cert: 'D:\mykeys\sitekey.crt', STREAM_SECRET: 'asdasd123123', RECORD_STREAM: false };
/*
- WEBSOCKET */ var fs = require('fs'); var http = require('http'); var https = require('https'); var WebSocket = require('ws'); var ws_input = false; var ws_output = false;
// INPUT function handleInputConnection(){ var app = false; if(cfg.ssl_streamer){ app = https.createServer({ key: fs.readFileSync(cfg.ssl_key), cert: fs.readFileSync(cfg.ssl_cert) }, onRequestOutput).listen(cfg.output_port, cfg.host); }else{ app = http.createServer(onRequestOutput).listen(cfg.output_port, cfg.host); }
ws_input = new WebSocket.Server({server:app, perMessageDeflate:false}); ws_input.on('connection', function(client){ client.ip = client._socket.remoteAddress;
client.on('close', function(reasonCode, description){ console.log('['+client.ip+'] disconnected.'); }); console.log('Stream ['+client.ip+'] connected.');}); } var onRequestInput = function(request, response) { var params = request.url.substr(1).split('/');
if (params[0] !== cfg.STREAM_SECRET) { console.log( 'Failed Stream Connection: '+ request.socket.remoteAddress + ':' + request.socket.remotePort + ' - wrong secret.' ); return response.end(); }
response.connection.setTimeout(0);
request.on('data', function(data){ ws_output.broadcast(data); if (request.socket.recording) { request.socket.recording.write(data); } }); request.on('end',function(){ console.log('Stream fechado'); if (request.socket.recording) { request.socket.recording.close(); } });
// Record the stream to a local file? if (cfg.RECORD_STREAM) { var path = 'recordings/' + Date.now() + '.ts'; request.socket.recording = fs.createWriteStream(path); }
console.log('Stream connected.');}; handleInputConnection();
// OUTPUT function handleOutputConnection(){ var app = false; if(cfg.ssl_client){ app = https.createServer({ key: fs.readFileSync(cfg.ssl_key), cert: fs.readFileSync(cfg.ssl_cert) }, onRequestOutput).listen(cfg.output_port, cfg.host); }else{ app = http.createServer(onRequestOutput).listen(cfg.output_port, cfg.host); }
ws_output = new WebSocket.Server({server:app, perMessageDeflate:false}); ws_output.on('connection', function(client){ client.ip = client._socket.remoteAddress;
client.on('close', function(reasonCode, description){ console.log('['+client.ip+'] disconnected.'); }); client.on('error', function(e){ console.log('Error, client connection closed: '+e); }); console.log('Client ['+client.ip+'] connected.');});
ws_output.broadcast = function(data) { ws_output.clients.forEach(function each(client){ if(client.readyState === WebSocket.OPEN){ client.send(data); } }); }; } var onRequestOutput = function(request, response) { console.log('Client connected.'); response.end(); }; handleOutputConnection();
console.log('Listening for incomming MPEG-TS Stream'); console.log('Awaiting WebSocket connections');
Doesn't work as this ... same ports are used input/output