UNPKG

5.3 kBJavaScriptView Raw
1var util = require('util');
2var webrtc = require('webrtcsupport');
3var WildEmitter = require('wildemitter');
4var mockconsole = require('mockconsole');
5var localMedia = require('localmedia');
6var Peer = require('./peer');
7
8
9function WebRTC(opts) {
10 var self = this;
11 var options = opts || {};
12 var config = this.config = {
13 debug: false,
14 // makes the entire PC config overridable
15 peerConnectionConfig: {
16 iceServers: [{"url": "stun:stun.l.google.com:19302"}]
17 },
18 peerConnectionConstraints: {
19 optional: [
20 {DtlsSrtpKeyAgreement: true}
21 ]
22 },
23 receiveMedia: {
24 mandatory: {
25 OfferToReceiveAudio: true,
26 OfferToReceiveVideo: true
27 }
28 },
29 enableDataChannels: true
30 };
31 var item;
32
33 // expose screensharing check
34 this.screenSharingSupport = webrtc.screenSharing;
35
36 // We also allow a 'logger' option. It can be any object that implements
37 // log, warn, and error methods.
38 // We log nothing by default, following "the rule of silence":
39 // http://www.linfo.org/rule_of_silence.html
40 this.logger = function () {
41 // we assume that if you're in debug mode and you didn't
42 // pass in a logger, you actually want to log as much as
43 // possible.
44 if (opts.debug) {
45 return opts.logger || console;
46 } else {
47 // or we'll use your logger which should have its own logic
48 // for output. Or we'll return the no-op.
49 return opts.logger || mockconsole;
50 }
51 }();
52
53 // set options
54 for (item in options) {
55 this.config[item] = options[item];
56 }
57
58 // check for support
59 if (!webrtc.support) {
60 this.logger.error('Your browser doesn\'t seem to support WebRTC');
61 }
62
63 // where we'll store our peer connections
64 this.peers = [];
65
66 // call localMedia constructor
67 localMedia.call(this, this.config);
68
69 this.on('speaking', function () {
70 if (!self.hardMuted) {
71 // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload
72 self.peers.forEach(function (peer) {
73 if (peer.enableDataChannels) {
74 var dc = peer.getDataChannel('hark');
75 if (dc.readyState != 'open') return;
76 dc.send(JSON.stringify({type: 'speaking'}));
77 }
78 });
79 }
80 });
81 this.on('stoppedSpeaking', function () {
82 if (!self.hardMuted) {
83 // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload
84 self.peers.forEach(function (peer) {
85 if (peer.enableDataChannels) {
86 var dc = peer.getDataChannel('hark');
87 if (dc.readyState != 'open') return;
88 dc.send(JSON.stringify({type: 'stoppedSpeaking'}));
89 }
90 });
91 }
92 });
93 this.on('volumeChange', function (volume, treshold) {
94 if (!self.hardMuted) {
95 // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload
96 self.peers.forEach(function (peer) {
97 if (peer.enableDataChannels) {
98 var dc = peer.getDataChannel('hark');
99 if (dc.readyState != 'open') return;
100 dc.send(JSON.stringify({type: 'volume', volume: volume }));
101 }
102 });
103 }
104 });
105
106 // log events in debug mode
107 if (this.config.debug) {
108 this.on('*', function (event, val1, val2) {
109 var logger;
110 // if you didn't pass in a logger and you explicitly turning on debug
111 // we're just going to assume you're wanting log output with console
112 if (self.config.logger === mockconsole) {
113 logger = console;
114 } else {
115 logger = self.logger;
116 }
117 logger.log('event:', event, val1, val2);
118 });
119 }
120}
121
122util.inherits(WebRTC, localMedia);
123
124WebRTC.prototype.createPeer = function (opts) {
125 var peer;
126 opts.parent = this;
127 peer = new Peer(opts);
128 this.peers.push(peer);
129 return peer;
130};
131
132// removes peers
133WebRTC.prototype.removePeers = function (id, type) {
134 this.getPeers(id, type).forEach(function (peer) {
135 peer.end();
136 });
137};
138
139// fetches all Peer objects by session id and/or type
140WebRTC.prototype.getPeers = function (sessionId, type) {
141 return this.peers.filter(function (peer) {
142 return (!sessionId || peer.id === sessionId) && (!type || peer.type === type);
143 });
144};
145
146// sends message to all
147WebRTC.prototype.sendToAll = function (message, payload) {
148 this.peers.forEach(function (peer) {
149 peer.send(message, payload);
150 });
151};
152
153// sends message to all using a datachannel
154// only sends to anyone who has an open datachannel
155WebRTC.prototype.sendDirectlyToAll = function (channel, message, payload) {
156 this.peers.forEach(function (peer) {
157 if (peer.enableDataChannels) {
158 peer.sendDirectly(channel, message, payload);
159 }
160 });
161};
162
163module.exports = WebRTC;