Skip to content

Instantly share code, notes, and snippets.

@amitv87
Created May 16, 2015 18:46
Show Gist options
  • Save amitv87/ba83ab0f0802e0b6387c to your computer and use it in GitHub Desktop.
Save amitv87/ba83ab0f0802e0b6387c to your computer and use it in GitHub Desktop.
var webrtc = require('..');
var RTCPeerConnection = webrtc.RTCPeerConnection;
var RTCSessionDescription = webrtc.RTCSessionDescription;
var RTCIceCandidate = webrtc.RTCIceCandidate;
var pc1 = new RTCPeerConnection();
var pc2 = new RTCPeerConnection();
pc1.onicecandidate = function(candidate) {
if(!candidate.candidate) return;
pc2.addIceCandidate(candidate.candidate);
}
pc2.onicecandidate = function(candidate) {
if(!candidate.candidate) return;
pc1.addIceCandidate(candidate.candidate);
}
function handle_error(error)
{
throw error;
}
function toUint8Array(buffer, size) {
var ab = new ArrayBuffer(size);
var view = new Uint8Array(ab);
for (var i = 0; i < size; ++i) {
view[i] = buffer[i];
}
return ab;
}
function toBuffer(ab) {
var buffer = new Buffer(ab.byteLength);
var view = new Uint8Array(ab);
for (var i = 0; i < buffer.length; ++i) {
buffer[i] = view[i];
}
return buffer;
}
var timestampStart;
var fs = require("fs");
var stream = require("stream");
var chunksize = 1024;
//target file
var writeStream = fs.createWriteStream('/Users/browserstack/Downloads/test.zip');
//source file
var fileName = "/Users/browserstack/Downloads/nwjs-v0.12.1-osx-x64.zip";
var filesize = 0, bitrate_job, max_rate = 0;
function create_data_channels() {
var dc1 = pc1.createDataChannel('test');
dc1.binaryType = 'arraybuffer';
dc1.onopen = function() {
fs.stat(fileName, function(error, stats) {
fs.open(fileName, "r", function(error, fd) {
var startIndex = 0;
filesize = stats.size;
var readSize = chunksize < stats.size ? chunksize : filesize;
console.log('file:', fileName,'size:', filesize / 1000, 'KB', 'chunksize:', chunksize);
var buffer = new Buffer(chunksize);
var read = function(){
if (startIndex >= filesize){
return;
}
fs.read(fd, buffer, 0, readSize, startIndex, function(error, bytesRead, buf) {
dc1.send(toUint8Array(buf, bytesRead));
startIndex += bytesRead;
if(readSize + startIndex > stats.size){
readSize = stats.size - startIndex;
}
read();
});
}
read();
});
});
dc1.onmessage = function(event) {
}
}
var dc2;
pc2.ondatachannel = function(event) {
dc2 = event.channel;
dc2.onopen = function() {
console.log("pc2: data channel open");
var receivedSize = 0;
var bufferStream = new stream.PassThrough();
bufferStream.pipe(writeStream);
dc2.onmessage = function(event) {
receivedSize += event.data.byteLength;;
bufferStream.push(toBuffer(event.data));
if(filesize == receivedSize){
done(displayStats);
}
}
var oldsize = 0;
timestampStart = (new Date()).getTime();
var ts_old = timestampStart;
var displayStats = function(){
var rate = ((receivedSize - oldsize) / (new Date().getTime() - ts_old)).toFixed(2);
var elapsedTime = new Date().getTime() - timestampStart;
var avg_rate = (receivedSize / elapsedTime).toFixed(2);
if(rate > max_rate){
max_rate = rate;
}
process.stdout.write("\033[0Grx: current = "
+ rate + ' KB/s, ' +
'avg = ' + avg_rate + ' KB/s, ' +
'max = ' + max_rate + ' KB/s, ' +
'time elapsed = ' + (elapsedTime / 1000) + ' seconds, ' +
'recveived = ' + (receivedSize / 1000).toFixed(2) + ' KB'
);
ts_old = new Date().getTime();
oldsize = receivedSize;
}
bitrate_job = setInterval(displayStats, 100);
};
}
create_offer();
}
function create_offer() {
console.log('pc1: create offer');
pc1.createOffer(set_pc1_local_description, handle_error);
}
function set_pc1_local_description(desc) {
console.log('pc1: set local description');
pc1.setLocalDescription(
new RTCSessionDescription(desc),
set_pc2_remote_description.bind(undefined, desc),
handle_error
);
}
function set_pc2_remote_description(desc) {
console.log('pc2: set remote description');
pc2.setRemoteDescription(
new RTCSessionDescription(desc),
create_answer,
handle_error
);
}
function create_answer() {
console.log('pc2: create answer');
pc2.createAnswer(
set_pc2_local_description,
handle_error
);
}
function set_pc2_local_description(desc) {
console.log('pc2: set local description');
pc2.setLocalDescription(
new RTCSessionDescription(desc),
set_pc1_remote_description.bind(undefined, desc),
handle_error
);
}
function set_pc1_remote_description(desc) {
console.log('pc1: set remote description');
pc1.setRemoteDescription(
new RTCSessionDescription(desc),
wait,
handle_error
);
}
function wait() {
console.log('waiting');
}
function run() {
create_data_channels();
}
function done(cb) {
clearInterval(bitrate_job);
cb();
console.log('');
writeStream.close();
pc1.close();
pc2.close();
}
run();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment