123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- var util = require('util');
- var webrtcSupport = require('webrtcsupport');
- var mockconsole = require('mockconsole');
- var localMedia = require('localmedia');
- var Peer = require('./peer');
- function WebRTC(opts) {
- var self = this;
- var options = opts || {};
- var config = this.config = {
- debug: false,
-
- peerConnectionConfig: {
- iceServers: [{'urls': 'stun:stun.l.google.com:19302'}]
- },
- peerConnectionConstraints: {
- optional: []
- },
- receiveMedia: {
- offerToReceiveAudio: 1,
- offerToReceiveVideo: 1
- },
- enableDataChannels: true
- };
- var item;
-
-
-
-
- this.logger = function () {
-
-
-
- if (opts.debug) {
- return opts.logger || console;
- } else {
-
-
- return opts.logger || mockconsole;
- }
- }();
-
- for (item in options) {
- if (options.hasOwnProperty(item)) {
- this.config[item] = options[item];
- }
- }
-
- if (!webrtcSupport.support) {
- this.logger.error('Your browser doesn\'t seem to support WebRTC');
- }
-
- this.peers = [];
-
- localMedia.call(this, this.config);
- this.on('speaking', function () {
- if (!self.hardMuted) {
-
- self.peers.forEach(function (peer) {
- if (peer.enableDataChannels) {
- var dc = peer.getDataChannel('hark');
- if (dc.readyState != 'open') return;
- dc.send(JSON.stringify({type: 'speaking'}));
- }
- });
- }
- });
- this.on('stoppedSpeaking', function () {
- if (!self.hardMuted) {
-
- self.peers.forEach(function (peer) {
- if (peer.enableDataChannels) {
- var dc = peer.getDataChannel('hark');
- if (dc.readyState != 'open') return;
- dc.send(JSON.stringify({type: 'stoppedSpeaking'}));
- }
- });
- }
- });
- this.on('volumeChange', function (volume, treshold) {
- if (!self.hardMuted) {
-
- self.peers.forEach(function (peer) {
- if (peer.enableDataChannels) {
- var dc = peer.getDataChannel('hark');
- if (dc.readyState != 'open') return;
- dc.send(JSON.stringify({type: 'volume', volume: volume }));
- }
- });
- }
- });
-
- if (this.config.debug) {
- this.on('*', function (event, val1, val2) {
- var logger;
-
-
- if (self.config.logger === mockconsole) {
- logger = console;
- } else {
- logger = self.logger;
- }
- logger.log('event:', event, val1, val2);
- });
- }
- }
- util.inherits(WebRTC, localMedia);
- WebRTC.prototype.createPeer = function (opts) {
- var peer;
- opts.parent = this;
- peer = new Peer(opts);
- this.peers.push(peer);
- return peer;
- };
- WebRTC.prototype.removePeers = function (id, type) {
- this.getPeers(id, type).forEach(function (peer) {
- peer.end();
- });
- };
- WebRTC.prototype.getPeers = function (sessionId, type) {
- return this.peers.filter(function (peer) {
- return (!sessionId || peer.id === sessionId) && (!type || peer.type === type);
- });
- };
- WebRTC.prototype.sendToAll = function (message, payload) {
- this.peers.forEach(function (peer) {
- peer.send(message, payload);
- });
- };
- WebRTC.prototype.sendDirectlyToAll = function (channel, message, payload) {
- this.peers.forEach(function (peer) {
- if (peer.enableDataChannels) {
- peer.sendDirectly(channel, message, payload);
- }
- });
- };
- module.exports = WebRTC;
|