angular-simple-webrtc
Version:
simpleWebRTC service for AngularJS
279 lines (245 loc) • 7.85 kB
JavaScript
(function(root, factory) {
;
if(typeof define === 'function' && define.amd) { // AMD
define(['SimpleWebRTC'], function(SimpleWebRTC) {
factory(root.angular, SimpleWebRTC);
});
} else if(typeof exports === 'object' || typeof global === 'object') {
var angular = root.angular || (window && window.angular);
module.exports = factory(angular, require('simplewebrtc-newsocketio')); // Node/Browserify
} else {
factory(root.angular, root.SimpleWebRTC); // Browser
}
})(this, function(angular, SimpleWebRTC, undefined) {
'use strict';
var ngSimpleWebRTCModule = angular.module('SimpleWebRTCModule', ['ng']);
var ngSimpleWebRTC = function($rootScope) {
var self = this;
self.webrtc = null;
self.$rootScope = $rootScope;
self.joinedRoom = '';
self.streamList = [];
};
ngSimpleWebRTC.prototype.init = function(options) {
var self = this;
var URL = window.URL || window.webkitURL;
self.options = options;
self.webrtc = new SimpleWebRTC(options);
self.webrtc.on('joinedRoom', function() {
self.$rootScope.$broadcast('webrtc:joinedRoom', options.roomName);
self.joinedRoom = options.roomName;
});
self.webrtc.on('readyToCall', function() {
if (options.roomName) {
self.webrtc.joinRoom(options.roomName);
}
});
self.webrtc.on('createdPeer', function(peer) {
self.setupPeer(peer);
});
self.webrtc.on('localStream', function(stream) {
var video = document.createElement('video');
video.id = stream.id;
video.src = URL.createObjectURL(stream);
video.play();
stream.videoEl = video;
stream.isRemote = false;
stream.isShown = true;
self.streamList.push(stream);
self.$rootScope.$broadcast('webrtc:streamListChanged');
});
self.webrtc.on('videoAdded', function(video, peer) {
var add = true;
for (var i = 0; i < self.streamList.length; i ++) {
var v = self.streamList[i];
if (peer.id === v.id) {
add = false;
break;
}
}
if (add) {
peer.isRemote = true;
self.streamList.push(peer);
self.$rootScope.$broadcast('webrtc:streamListChanged');
}
});
self.webrtc.on('videoAdded', function(video, peer) {
var add = true;
var map = {};
console.log(arguments);
for (var i = 0; i < self.streamList.length; i ++) {
var v = self.streamList[i];
var type = v.type || 'video';
v.isShown = true;
map[v.id] = map[v.id] || {};
map[v.id][type] = v;
}
peer.isShown = true;
var dupe = map[peer.id];
if (dupe) {
if (dupe['video'] && peer.type === 'screen') {
dupe['video'].isShown = false;
} else if (dupe['video'] && dupe['video'].type === peer.type) {
return;
} else if (dupe['video'] && dupe['screen'].type === peer.type) {
return;
} else {
peer.isShown = false;
}
}
peer.isRemote = true;
if (peer && peer.pc) {
peer.pc.on('iceConnectionStateChange', function (event) {
console.log(peer.pc.iceConnectionState);
self.$rootScope.$broadcast('webrtc:streamListChanged');
});
}
self.streamList.push(peer);
self.$rootScope.$broadcast('webrtc:streamListChanged');
});
self.webrtc.on('videoRemoved', function(video) {
var added = false;
var map = {};
for (var i = 0; i < self.streamList.length; i ++) {
var v = self.streamList[i];
v.isShown = true;
map[v.id] = map[v.id] || {};
map[v.id][v.type] = v;
}
var dupe = map[video.id];
if (dupe) {
if (dupe['video']) {
dupe.isShown = true;
}
}
for (var i = 0; i < self.streamList.length; i ++) {
var v = self.streamList[i];
if (video.id === v.videoEl.id) {
v = null;
self.streamList.splice(i, 1);
self.$rootScope.$broadcast('webrtc:streamListChanged');
break;
}
}
});
self.webrtc.on('channelMessage', function(peer, label, data) {
if (label === 'text-message' &&
data.type === 'text/plain') {
self.$rootScope.$broadcast('webrtc:textMessage', {
peer: peer,
message: data.payload.message,
time: data.payload.time
});
}
});
}
ngSimpleWebRTC.prototype.sendTextMessage = function(message) {
var self = this;
self.webrtc.sendDirectlyToAll("text-message",
"text/plain",
{
message: message,
time: (new Date()).valueOf()
});
}
ngSimpleWebRTC.prototype.isInitialized = function() {
var self = this;
return (self.webrtc != null);
}
ngSimpleWebRTC.prototype.joinRoom = function(roomName) {
var self = this;
self.options.roomName = roomName;
self.joinedRoom = '';
self.webrtc.joinRoom(roomName);
}
ngSimpleWebRTC.prototype.isLocalVideoEnabled = function() {
var self = this;
for (var i = 0; i < self.streamList.length; i ++) {
var s = self.streamList[i];
if (s.isRemote == false) {
return s.getVideoTracks()[0].enabled;
}
}
}
ngSimpleWebRTC.prototype.pauseVideo = function() {
var self = this;
self.webrtc.pauseVideo();
}
ngSimpleWebRTC.prototype.resumeVideo = function() {
var self = this;
self.webrtc.resumeVideo();
}
ngSimpleWebRTC.prototype.mute = function() {
var self = this;
self.webrtc.mute();
}
ngSimpleWebRTC.prototype.unmute = function() {
var self = this;
self.webrtc.unmute();
}
ngSimpleWebRTC.prototype.isMuted = function() {
var self = this;
for (var i = 0; i < self.streamList.length; i ++) {
var s = self.streamList[i];
if (s.isRemote == false) {
var audio = s.getAudioTracks();
if (audio && audio.length > 0) {
return !audio[0].enabled;
}
}
}
}
ngSimpleWebRTC.prototype.getPeers = function() {
var self = this;
return self.webrtc.getPeers();
}
ngSimpleWebRTC.prototype.setupPeer = function(peer) {
var self = this;
peer.on('fileTransfer', function(metadata, receiver) {
self.handleFileTransfer(peer, metadata, receiver);
});
self.$rootScope.$broadcast('webrtc:peerCreated', peer);
}
ngSimpleWebRTC.prototype.handleFileTransfer = function(peer, metadata, receiver) {
var self = this;
self.$rootScope.$broadcast('webrtc:fileTransferStarted', {
peer: peer,
metadata: metadata,
receiver: receiver
});
receiver.on('progress', function(byteReceived) {
self.$rootScope.$broadcast('webrtc:fileTransferProgress', {
peer: peer,
metadata: metadata,
byteReceived: byteReceived
});
});
receiver.on('receivedFile', function(file, metadata) {
self.$rootScope.$broadcast('webrtc:fileTransferDone', {
peer: peer,
metadata: metadata,
file: file
});
receiver.channel.close();
});
}
ngSimpleWebRTC.prototype.sendFile = function(peer, file) {
var self = this;
var sender = peer.sendFile(file);
sender.on('progress', function(byteSent) {
self.$rootScope.$broadcast('webrtc:sentFileProgress', {
peer: peer,
byteSent: byteSent
});
});
sender.on('sentFile', function(byteSent) {
self.$rootScope.$broadcast('webrtc:sentFileDone', peer);
});
sender.on('complete', function(byteSent) {
self.$rootScope.$broadcast('webrtc:sentFileReceived', peer);
});
return sender;
}
ngSimpleWebRTC.$inject = [ "$rootScope" ];
ngSimpleWebRTCModule.service('$SimpleWebRTC', ngSimpleWebRTC);
});