zdpjs_webrtc
Version:
基于easyrtc二次开发的webrtc框架
378 lines • 829 kB
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>EasyRTC Documentation</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
<link href="../assets/easyrtc-docs-jsdoc-styles-1.css" media="all" rel="stylesheet" />
</head>
<body>
<header class="template">
<div class="wrapper-content">
<a href="../index.html"><img src="../assets/easyrtc-logo.png" alt="EasyRTC Documentation"></a>
<h1 title="EasyRTC Documentation">Documentation</h1>
</div>
</header>
<div class="wrapper-docs">
<nav>
<h2><a href="../index.html">Docs Home</a></h2>
<h3>EasyRTC Guides</h3>
<ul>
<li><a href="../easyrtc_faq.html">FAQ</a></li>
<li><a href="../easyrtc_gettingStarted.html">Getting Started</a></li>
<li><a href="../easyrtc_server_install.html">EasyRTC Server: Installation</a></li>
<li><a href="../easyrtc_client_tutorial.html">EasyRTC Framework Tutorial</a></li>
<li><a href="../easyrtc_rooms.html">Rooms</a></li>
<li><a href="../easyrtc_server_configuration.html">EasyRTC Server: Configuration</a></li>
<li><a href="../easyrtc_server_events.html">EasyRTC Server: Events</a></li>
<li><a href="../easyrtc_server_ice.html">EasyRTC Server: ICE Configuration</a></li>
<li><a href="../easyrtc_with_other_servers.html">Using Alongside Other Servers</a></li>
<li><a href="../easyrtc_server_ssl.html">EasyRTC Server: Using SSL</a></li>
<li><a href="../easyrtc_webrtc_problems.html">WebRTC Problems and Possible Fixes</a></li>
<li><a href="../easyrtc_upcoming_features.html">Upcoming Features</a></li>
<li><a href="../easyrtc_changelog.html">Change Log</a></li>
</ul>
<h3>EasyRTC Client Classes</h3>
<ul>
<li><a href="../client-api/Easyrtc.html">Easyrtc</a></li>
<li><a href="../client-api/Easyrtc_App.html">Easyrtc_App</a></li>
<li><a href="../client-api/Easyrtc_ft.html">Easyrtc_ft</a></li>
<li><a href="../client-api/Easyrtc_IframeCapture.html">Easyrtc_IframeCapture</a></li>
<li><a href="../client-api/Easyrtc_No_IframeCapture.html">Easyrtc_No_IframeCapture</a></li>
<li><a href="../client-api/Easyrtc_Rates.html">Easyrtc_Rates</a></li>
<li><a href="../client-api/Easyrtc_Recorder.html">Easyrtc_Recorder</a></li>
</ul>
<h3>EasyRTC Server Modules</h3>
<ul>
<li><a href="../server-api/module-easyrtc_default_event_listeners.html">easyrtc_default_event_listeners</a></li>
<li><a href="../server-api/module-easyrtc_default_options.html">easyrtc_default_options</a></li>
<li><a href="../server-api/module-easyrtc_private_obj.html">easyrtc_private_obj</a></li>
<li><a href="../server-api/module-easyrtc_public_obj.html">easyrtc_public_obj</a></li>
<li><a href="../server-api/module-easyrtc_util.html">easyrtc_util</a></li>
<li><a href="../server-api/module-general_util.html">general_util</a></li>
</ul>
<h3>EasyRTC Server Classes</h3>
<ul>
<li><a href="../server-api/module-easyrtc_default_event_listeners-eventListener.html">eventListener</a></li>
<li><a href="../server-api/module-easyrtc_public_obj-pub.html">pub</a></li>
<li><a href="../server-api/module-easyrtc_public_obj-pub.events.html">events</a></li>
<li><a href="../server-api/module-easyrtc_public_obj-pub.util.html">util</a></li>
<li><a href="../server-api/module-easyrtc_util-eu.html">eu</a></li>
<li><a href="../server-api/module-general_util-g.html">g</a></li>
<li><a href="../server-api/pub.appObj.html">appObj</a></li>
<li><a href="../server-api/pub.appObj.connectionObj.html">connectionObj</a></li>
<li><a href="../server-api/pub.appObj.connectionObj.connectionRoomObj.html">connectionRoomObj</a></li>
<li><a href="../server-api/pub.appObj.roomObj.html">roomObj</a></li>
<li><a href="../server-api/pub.appObj.sessionObj.html">sessionObj</a></li>
</ul>
</nav>
<div class="easyrtc-docs-content">
<div id="main">
<h1 class="page-title">Source: easyrtc_int.js</h1>
<section>
<article>
<pre class="prettyprint source linenums easyrtc"><code><a name="line1"></a><div class="linenumber">1</div><div style="width:0em;display:inline-block"></div>/* global define, module, require, console, MediaStreamTrack, createIceServer, RTCIceCandidate, RTCPeerConnection, RTCSessionDescription */
<a name="line2"></a><div class="linenumber">2</div><div style="width:0em;display:inline-block"></div>/*!
<a name="line3"></a><div class="linenumber">3</div><div style="width:1em;display:inline-block"></div>Script: easyrtc.js
<a name="line4"></a><div class="linenumber">4</div>
<a name="line5"></a><div class="linenumber">5</div><div style="width:2em;display:inline-block"></div>Provides client side support for the EasyRTC framework.
<a name="line6"></a><div class="linenumber">6</div><div style="width:2em;display:inline-block"></div>See the easyrtc_client_api.md and easyrtc_client_tutorial.md
<a name="line7"></a><div class="linenumber">7</div><div style="width:2em;display:inline-block"></div>for more details.
<a name="line8"></a><div class="linenumber">8</div>
<a name="line9"></a><div class="linenumber">9</div><div style="width:1em;display:inline-block"></div>About: License
<a name="line10"></a><div class="linenumber">10</div>
<a name="line11"></a><div class="linenumber">11</div><div style="width:2em;display:inline-block"></div>Copyright (c) 2016, Priologic Software Inc.
<a name="line12"></a><div class="linenumber">12</div><div style="width:2em;display:inline-block"></div>All rights reserved.
<a name="line13"></a><div class="linenumber">13</div>
<a name="line14"></a><div class="linenumber">14</div><div style="width:2em;display:inline-block"></div>Redistribution and use in source and binary forms, with or without
<a name="line15"></a><div class="linenumber">15</div><div style="width:2em;display:inline-block"></div>modification, are permitted provided that the following conditions are met:
<a name="line16"></a><div class="linenumber">16</div>
<a name="line17"></a><div class="linenumber">17</div><div style="width:4em;display:inline-block"></div>* Redistributions of source code must retain the above copyright notice,
<a name="line18"></a><div class="linenumber">18</div><div style="width:5em;display:inline-block"></div>this list of conditions and the following disclaimer.
<a name="line19"></a><div class="linenumber">19</div><div style="width:4em;display:inline-block"></div>* Redistributions in binary form must reproduce the above copyright
<a name="line20"></a><div class="linenumber">20</div><div style="width:5em;display:inline-block"></div>notice, this list of conditions and the following disclaimer in the
<a name="line21"></a><div class="linenumber">21</div><div style="width:5em;display:inline-block"></div>documentation and/or other materials provided with the distribution.
<a name="line22"></a><div class="linenumber">22</div>
<a name="line23"></a><div class="linenumber">23</div><div style="width:2em;display:inline-block"></div>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
<a name="line24"></a><div class="linenumber">24</div><div style="width:2em;display:inline-block"></div>AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
<a name="line25"></a><div class="linenumber">25</div><div style="width:2em;display:inline-block"></div>IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
<a name="line26"></a><div class="linenumber">26</div><div style="width:2em;display:inline-block"></div>ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
<a name="line27"></a><div class="linenumber">27</div><div style="width:2em;display:inline-block"></div>LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
<a name="line28"></a><div class="linenumber">28</div><div style="width:2em;display:inline-block"></div>CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
<a name="line29"></a><div class="linenumber">29</div><div style="width:2em;display:inline-block"></div>SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
<a name="line30"></a><div class="linenumber">30</div><div style="width:2em;display:inline-block"></div>INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
<a name="line31"></a><div class="linenumber">31</div><div style="width:2em;display:inline-block"></div>CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
<a name="line32"></a><div class="linenumber">32</div><div style="width:2em;display:inline-block"></div>ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
<a name="line33"></a><div class="linenumber">33</div><div style="width:2em;display:inline-block"></div>POSSIBILITY OF SUCH DAMAGE.
<a name="line34"></a><div class="linenumber">34</div><div style="width:0em;display:inline-block"></div>*/
<a name="line35"></a><div class="linenumber">35</div>
<a name="line36"></a><div class="linenumber">36</div><div style="width:0em;display:inline-block"></div>(function (root, factory) {
<a name="line37"></a><div class="linenumber">37</div><div style="width:2em;display:inline-block"></div>if (typeof define === 'function' && define.amd) {
<a name="line38"></a><div class="linenumber">38</div><div style="width:4em;display:inline-block"></div>//RequireJS (AMD) build system
<a name="line39"></a><div class="linenumber">39</div><div style="width:4em;display:inline-block"></div>define(['easyrtc_lang', 'webrtc-adapter', 'socket.io'], factory);
<a name="line40"></a><div class="linenumber">40</div><div style="width:2em;display:inline-block"></div>} else if (typeof module === 'object' && module.exports) {
<a name="line41"></a><div class="linenumber">41</div><div style="width:4em;display:inline-block"></div>//CommonJS build system
<a name="line42"></a><div class="linenumber">42</div><div style="width:4em;display:inline-block"></div>module.exports = factory(require('easyrtc_lang'), require('webrtc-adapter'), require('socket.io'));
<a name="line43"></a><div class="linenumber">43</div><div style="width:2em;display:inline-block"></div>} else {
<a name="line44"></a><div class="linenumber">44</div><div style="width:4em;display:inline-block"></div>//Vanilla JS, ensure dependencies are loaded correctly
<a name="line45"></a><div class="linenumber">45</div><div style="width:4em;display:inline-block"></div>if (typeof window.io === 'undefined' || !window.io) {
<a name="line46"></a><div class="linenumber">46</div><div style="width:6em;display:inline-block"></div>throw new Error("easyrtc requires socket.io");
<a name="line47"></a><div class="linenumber">47</div><div style="width:4em;display:inline-block"></div>}
<a name="line48"></a><div class="linenumber">48</div><div style="width:4em;display:inline-block"></div>root.easyrtc = factory(window.easyrtc_lang, window.adapter, window.io);
<a name="line49"></a><div class="linenumber">49</div><div style="width:1em;display:inline-block"></div>}
<a name="line50"></a><div class="linenumber">50</div><div style="width:0em;display:inline-block"></div>}(this, function (easyrtc_lang, adapter, io, undefined) {
<a name="line51"></a><div class="linenumber">51</div>
<a name="line52"></a><div class="linenumber">52</div><div style="width:0em;display:inline-block"></div>"use strict";
<a name="line53"></a><div class="linenumber">53</div><div style="width:0em;display:inline-block"></div>/**
<a name="line54"></a><div class="linenumber">54</div><div style="width:0em;display:inline-block"></div>* @class Easyrtc.
<a name="line55"></a><div class="linenumber">55</div><div style="width:0em;display:inline-block"></div>*
<a name="line56"></a><div class="linenumber">56</div><div style="width:0em;display:inline-block"></div>* @returns {Easyrtc} the new easyrtc instance.
<a name="line57"></a><div class="linenumber">57</div><div style="width:0em;display:inline-block"></div>*
<a name="line58"></a><div class="linenumber">58</div><div style="width:0em;display:inline-block"></div>* @constructs Easyrtc
<a name="line59"></a><div class="linenumber">59</div><div style="width:0em;display:inline-block"></div>*/
<a name="line60"></a><div class="linenumber">60</div><div style="width:0em;display:inline-block"></div>var Easyrtc = function() {
<a name="line61"></a><div class="linenumber">61</div>
<a name="line62"></a><div class="linenumber">62</div><div style="width:2em;display:inline-block"></div>var self = this;
<a name="line63"></a><div class="linenumber">63</div>
<a name="line64"></a><div class="linenumber">64</div><div style="width:2em;display:inline-block"></div>function logDebug (message, obj) {
<a name="line65"></a><div class="linenumber">65</div><div style="width:4em;display:inline-block"></div>if (self.debugPrinter) {
<a name="line66"></a><div class="linenumber">66</div><div style="width:6em;display:inline-block"></div>self.debugPrinter(message, obj);
<a name="line67"></a><div class="linenumber">67</div><div style="width:4em;display:inline-block"></div>}
<a name="line68"></a><div class="linenumber">68</div><div style="width:2em;display:inline-block"></div>}
<a name="line69"></a><div class="linenumber">69</div>
<a name="line70"></a><div class="linenumber">70</div><div style="width:2em;display:inline-block"></div>function isEmptyObj(obj) {
<a name="line71"></a><div class="linenumber">71</div><div style="width:4em;display:inline-block"></div>if (obj === null || obj === undefined) {
<a name="line72"></a><div class="linenumber">72</div><div style="width:6em;display:inline-block"></div>return true;
<a name="line73"></a><div class="linenumber">73</div><div style="width:4em;display:inline-block"></div>}
<a name="line74"></a><div class="linenumber">74</div><div style="width:4em;display:inline-block"></div>var key;
<a name="line75"></a><div class="linenumber">75</div><div style="width:4em;display:inline-block"></div>for (key in obj) {
<a name="line76"></a><div class="linenumber">76</div><div style="width:6em;display:inline-block"></div>if (obj.hasOwnProperty(key)) {
<a name="line77"></a><div class="linenumber">77</div><div style="width:8em;display:inline-block"></div>return false;
<a name="line78"></a><div class="linenumber">78</div><div style="width:6em;display:inline-block"></div>}
<a name="line79"></a><div class="linenumber">79</div><div style="width:4em;display:inline-block"></div>}
<a name="line80"></a><div class="linenumber">80</div><div style="width:4em;display:inline-block"></div>return true;
<a name="line81"></a><div class="linenumber">81</div><div style="width:2em;display:inline-block"></div>}
<a name="line82"></a><div class="linenumber">82</div>
<a name="line83"></a><div class="linenumber">83</div><div style="width:2em;display:inline-block"></div>/** @private */
<a name="line84"></a><div class="linenumber">84</div><div style="width:2em;display:inline-block"></div>var autoInitUserMedia = true;
<a name="line85"></a><div class="linenumber">85</div><div style="width:2em;display:inline-block"></div>/** @private */
<a name="line86"></a><div class="linenumber">86</div><div style="width:2em;display:inline-block"></div>var sdpLocalFilter = null;
<a name="line87"></a><div class="linenumber">87</div><div style="width:2em;display:inline-block"></div>/** @private */
<a name="line88"></a><div class="linenumber">88</div><div style="width:2em;display:inline-block"></div>var sdpRemoteFilter = null;
<a name="line89"></a><div class="linenumber">89</div><div style="width:2em;display:inline-block"></div>/** @private */
<a name="line90"></a><div class="linenumber">90</div><div style="width:2em;display:inline-block"></div>var iceCandidateFilter = null;
<a name="line91"></a><div class="linenumber">91</div><div style="width:2em;display:inline-block"></div>/** @private */
<a name="line92"></a><div class="linenumber">92</div><div style="width:2em;display:inline-block"></div>var iceConnectionStateChangeListener = null;
<a name="line93"></a><div class="linenumber">93</div><div style="width:2em;display:inline-block"></div>var signalingStateChangeListener = null;
<a name="line94"></a><div class="linenumber">94</div><div style="width:2em;display:inline-block"></div>/** @private */
<a name="line95"></a><div class="linenumber">95</div><div style="width:2em;display:inline-block"></div>var connectionOptions = {
<a name="line96"></a><div class="linenumber">96</div><div style="width:4em;display:inline-block"></div>'connect timeout': 10000,
<a name="line97"></a><div class="linenumber">97</div><div style="width:4em;display:inline-block"></div>'force new connection': true
<a name="line98"></a><div class="linenumber">98</div><div style="width:2em;display:inline-block"></div>};
<a name="line99"></a><div class="linenumber">99</div>
<a name="line100"></a><div class="linenumber">100</div><div style="width:2em;display:inline-block"></div>/** @private */
<a name="line101"></a><div class="linenumber">101</div><div style="width:2em;display:inline-block"></div>//
<a name="line102"></a><div class="linenumber">102</div><div style="width:2em;display:inline-block"></div>// this function replaces the deprecated MediaStream.stop method
<a name="line103"></a><div class="linenumber">103</div><div style="width:2em;display:inline-block"></div>//
<a name="line104"></a><div class="linenumber">104</div><div style="width:2em;display:inline-block"></div>function stopStream(stream) {
<a name="line105"></a><div class="linenumber">105</div><div style="width:3em;display:inline-block"></div>var i;
<a name="line106"></a><div class="linenumber">106</div><div style="width:3em;display:inline-block"></div>var tracks;
<a name="line107"></a><div class="linenumber">107</div>
<a name="line108"></a><div class="linenumber">108</div><div style="width:3em;display:inline-block"></div>tracks = stream.getAudioTracks();
<a name="line109"></a><div class="linenumber">109</div><div style="width:3em;display:inline-block"></div>for( i = 0; i < tracks.length; i++ ) {
<a name="line110"></a><div class="linenumber">110</div><div style="width:5em;display:inline-block"></div>try {
<a name="line111"></a><div class="linenumber">111</div><div style="width:6em;display:inline-block"></div>tracks[i].stop();
<a name="line112"></a><div class="linenumber">112</div><div style="width:5em;display:inline-block"></div>} catch(err){}
<a name="line113"></a><div class="linenumber">113</div><div style="width:3em;display:inline-block"></div>}
<a name="line114"></a><div class="linenumber">114</div><div style="width:3em;display:inline-block"></div>tracks = stream.getVideoTracks();
<a name="line115"></a><div class="linenumber">115</div><div style="width:3em;display:inline-block"></div>for( i = 0; i < tracks.length; i++ ) {
<a name="line116"></a><div class="linenumber">116</div><div style="width:5em;display:inline-block"></div>try {
<a name="line117"></a><div class="linenumber">117</div><div style="width:6em;display:inline-block"></div>tracks[i].stop();
<a name="line118"></a><div class="linenumber">118</div><div style="width:5em;display:inline-block"></div>} catch(err){}
<a name="line119"></a><div class="linenumber">119</div><div style="width:3em;display:inline-block"></div>}
<a name="line120"></a><div class="linenumber">120</div>
<a name="line121"></a><div class="linenumber">121</div><div style="width:3em;display:inline-block"></div>if (typeof stream.stop === 'function') {
<a name="line122"></a><div class="linenumber">122</div><div style="width:5em;display:inline-block"></div>try {
<a name="line123"></a><div class="linenumber">123</div><div style="width:6em;display:inline-block"></div>stream.stop();
<a name="line124"></a><div class="linenumber">124</div><div style="width:5em;display:inline-block"></div>} catch(err){}
<a name="line125"></a><div class="linenumber">125</div><div style="width:3em;display:inline-block"></div>}
<a name="line126"></a><div class="linenumber">126</div><div style="width:2em;display:inline-block"></div>}
<a name="line127"></a><div class="linenumber">127</div>
<a name="line128"></a><div class="linenumber">128</div><div style="width:2em;display:inline-block"></div>/**
<a name="line129"></a><div class="linenumber">129</div><div style="width:2em;display:inline-block"></div>* Sets functions which filter sdp records before calling setLocalDescription or setRemoteDescription.
<a name="line130"></a><div class="linenumber">130</div><div style="width:2em;display:inline-block"></div>* This is advanced functionality which can break things, easily. See the easyrtc_rates.js file for a
<a name="line131"></a><div class="linenumber">131</div><div style="width:2em;display:inline-block"></div>* filter builder.
<a name="line132"></a><div class="linenumber">132</div><div style="width:2em;display:inline-block"></div>* @param {Function} localFilter a function that takes an sdp string and returns an sdp string.
<a name="line133"></a><div class="linenumber">133</div><div style="width:2em;display:inline-block"></div>* @param {Function} remoteFilter a function that takes an sdp string and returns an sdp string.
<a name="line134"></a><div class="linenumber">134</div><div style="width:2em;display:inline-block"></div>*/
<a name="line135"></a><div class="linenumber">135</div><div style="width:2em;display:inline-block"></div>this.setSdpFilters = function(localFilter, remoteFilter) {
<a name="line136"></a><div class="linenumber">136</div><div style="width:4em;display:inline-block"></div>sdpLocalFilter = localFilter;
<a name="line137"></a><div class="linenumber">137</div><div style="width:4em;display:inline-block"></div>sdpRemoteFilter = remoteFilter;
<a name="line138"></a><div class="linenumber">138</div><div style="width:2em;display:inline-block"></div>};
<a name="line139"></a><div class="linenumber">139</div>
<a name="line140"></a><div class="linenumber">140</div><div style="width:2em;display:inline-block"></div>/**
<a name="line141"></a><div class="linenumber">141</div><div style="width:2em;display:inline-block"></div>* Sets a function to warn about the peer connection closing.
<a name="line142"></a><div class="linenumber">142</div><div style="width:2em;display:inline-block"></div>* @param {Function} handler: a function that gets an easyrtcid as an argument.
<a name="line143"></a><div class="linenumber">143</div><div style="width:2em;display:inline-block"></div>*/
<a name="line144"></a><div class="linenumber">144</div><div style="width:2em;display:inline-block"></div>this.setPeerClosedListener = function( handler ) {
<a name="line145"></a><div class="linenumber">145</div><div style="width:3em;display:inline-block"></div>this.onPeerClosed = handler;
<a name="line146"></a><div class="linenumber">146</div><div style="width:2em;display:inline-block"></div>};
<a name="line147"></a><div class="linenumber">147</div>
<a name="line148"></a><div class="linenumber">148</div><div style="width:2em;display:inline-block"></div>/**
<a name="line149"></a><div class="linenumber">149</div><div style="width:2em;display:inline-block"></div>* Sets a function to warn about the peer connection open.
<a name="line150"></a><div class="linenumber">150</div><div style="width:2em;display:inline-block"></div>* @param {Function} handler: a function that gets an easyrtcid as an argument.
<a name="line151"></a><div class="linenumber">151</div><div style="width:2em;display:inline-block"></div>*/
<a name="line152"></a><div class="linenumber">152</div><div style="width:2em;display:inline-block"></div>this.setPeerOpenListener = function( handler ) {
<a name="line153"></a><div class="linenumber">153</div><div style="width:3em;display:inline-block"></div>this.onPeerOpen = handler;
<a name="line154"></a><div class="linenumber">154</div><div style="width:2em;display:inline-block"></div>};
<a name="line155"></a><div class="linenumber">155</div>
<a name="line156"></a><div class="linenumber">156</div><div style="width:2em;display:inline-block"></div>/**
<a name="line157"></a><div class="linenumber">157</div><div style="width:2em;display:inline-block"></div>* Sets a function to receive warnings about the peer connection
<a name="line158"></a><div class="linenumber">158</div><div style="width:2em;display:inline-block"></div>* failing. The peer connection may recover by itself.
<a name="line159"></a><div class="linenumber">159</div><div style="width:2em;display:inline-block"></div>* @param {Function} failingHandler: a function that gets an easyrtcid as an argument.
<a name="line160"></a><div class="linenumber">160</div><div style="width:2em;display:inline-block"></div>* @param {Function} recoveredHandler: a function that gets an easyrtcid as an argument.
<a name="line161"></a><div class="linenumber">161</div><div style="width:2em;display:inline-block"></div>*/
<a name="line162"></a><div class="linenumber">162</div><div style="width:2em;display:inline-block"></div>this.setPeerFailingListener = function( failingHandler, recoveredHandler ) {
<a name="line163"></a><div class="linenumber">163</div><div style="width:3em;display:inline-block"></div>this.onPeerFailing = failingHandler;
<a name="line164"></a><div class="linenumber">164</div><div style="width:3em;display:inline-block"></div>this.onPeerRecovered = recoveredHandler;
<a name="line165"></a><div class="linenumber">165</div><div style="width:2em;display:inline-block"></div>};
<a name="line166"></a><div class="linenumber">166</div>
<a name="line167"></a><div class="linenumber">167</div><div style="width:2em;display:inline-block"></div>/**
<a name="line168"></a><div class="linenumber">168</div><div style="width:2em;display:inline-block"></div>* Sets a function which filters IceCandidate records being sent or received.
<a name="line169"></a><div class="linenumber">169</div><div style="width:2em;display:inline-block"></div>*
<a name="line170"></a><div class="linenumber">170</div><div style="width:2em;display:inline-block"></div>* Candidate records can be received while they are being generated locally (before being
<a name="line171"></a><div class="linenumber">171</div><div style="width:2em;display:inline-block"></div>* sent to a peer), and after they are received by the peer. The filter receives two arguments, the candidate record and a boolean
<a name="line172"></a><div class="linenumber">172</div><div style="width:2em;display:inline-block"></div>* flag that is true for a candidate being received from another peer,
<a name="line173"></a><div class="linenumber">173</div><div style="width:2em;display:inline-block"></div>* and false for a candidate that was generated locally. The candidate record has the form:
<a name="line174"></a><div class="linenumber">174</div><div style="width:2em;display:inline-block"></div>* {type: 'candidate', label: sdpMLineIndex, id: sdpMid, candidate: candidateString}
<a name="line175"></a><div class="linenumber">175</div><div style="width:2em;display:inline-block"></div>* The function should return one of the following: the input candidate record, a modified candidate record, or null (indicating that the
<a name="line176"></a><div class="linenumber">176</div><div style="width:2em;display:inline-block"></div>* candidate should be discarded).
<a name="line177"></a><div class="linenumber">177</div><div style="width:2em;display:inline-block"></div>* @param {Function} filter
<a name="line178"></a><div class="linenumber">178</div><div style="width:2em;display:inline-block"></div>*/
<a name="line179"></a><div class="linenumber">179</div><div style="width:2em;display:inline-block"></div>this.setIceCandidateFilter = function(filter) {
<a name="line180"></a><div class="linenumber">180</div><div style="width:4em;display:inline-block"></div>iceCandidateFilter = filter;
<a name="line181"></a><div class="linenumber">181</div><div style="width:2em;display:inline-block"></div>};
<a name="line182"></a><div class="linenumber">182</div>
<a name="line183"></a><div class="linenumber">183</div><div style="width:2em;display:inline-block"></div>/**
<a name="line184"></a><div class="linenumber">184</div><div style="width:2em;display:inline-block"></div>* Sets a function that listens on IceConnectionStateChange events.
<a name="line185"></a><div class="linenumber">185</div><div style="width:2em;display:inline-block"></div>*
<a name="line186"></a><div class="linenumber">186</div><div style="width:2em;display:inline-block"></div>* During ICE negotiation the peer connection fires the iceconnectionstatechange event.
<a name="line187"></a><div class="linenumber">187</div><div style="width:2em;display:inline-block"></div>* It is sometimes useful for the application to learn about these changes, especially if the ICE connection fails.
<a name="line188"></a><div class="linenumber">188</div><div style="width:2em;display:inline-block"></div>* The function should accept three parameters: the easyrtc id of the peer, the iceconnectionstatechange event target and the iceconnectionstate.
<a name="line189"></a><div class="linenumber">189</div><div style="width:2em;display:inline-block"></div>* @param {Function} listener
<a name="line190"></a><div class="linenumber">190</div><div style="width:2em;display:inline-block"></div>*/
<a name="line191"></a><div class="linenumber">191</div><div style="width:2em;display:inline-block"></div>this.setIceConnectionStateChangeListener = function(listener) {
<a name="line192"></a><div class="linenumber">192</div><div style="width:3em;display:inline-block"></div>iceConnectionStateChangeListener = listener;
<a name="line193"></a><div class="linenumber">193</div><div style="width:2em;display:inline-block"></div>};
<a name="line194"></a><div class="linenumber">194</div>
<a name="line195"></a><div class="linenumber">195</div><div style="width:2em;display:inline-block"></div>/**
<a name="line196"></a><div class="linenumber">196</div><div style="width:2em;display:inline-block"></div>* Sets a function that listens on SignalingStateChange events.
<a name="line197"></a><div class="linenumber">197</div><div style="width:2em;display:inline-block"></div>*
<a name="line198"></a><div class="linenumber">198</div><div style="width:2em;display:inline-block"></div>* During ICE negotiation the peer connection fires the signalingstatechange event.
<a name="line199"></a><div class="linenumber">199</div><div style="width:2em;display:inline-block"></div>* The function should accept three parameters: the easyrtc id of the peer, the signalingstatechange event target and the signalingstate.
<a name="line200"></a><div class="linenumber">200</div><div style="width:2em;display:inline-block"></div>* @param {Function} listener
<a name="line201"></a><div class="linenumber">201</div><div style="width:2em;display:inline-block"></div>*/
<a name="line202"></a><div class="linenumber">202</div><div style="width:2em;display:inline-block"></div>this.setSignalingStateChangeListener = function(listener) {
<a name="line203"></a><div class="linenumber">203</div><div style="width:3em;display:inline-block"></div>signalingStateChangeListener = listener;
<a name="line204"></a><div class="linenumber">204</div><div style="width:2em;display:inline-block"></div>};
<a name="line205"></a><div class="linenumber">205</div>
<a name="line206"></a><div class="linenumber">206</div><div style="width:2em;display:inline-block"></div>/**
<a name="line207"></a><div class="linenumber">207</div><div style="width:2em;display:inline-block"></div>* Controls whether a default local media stream should be acquired automatically during calls and accepts
<a name="line208"></a><div class="linenumber">208</div><div style="width:2em;display:inline-block"></div>* if a list of streamNames is not supplied. The default is true, which mimics the behaviour of earlier releases
<a name="line209"></a><div class="linenumber">209</div><div style="width:2em;display:inline-block"></div>* that didn't support multiple streams. This function should be called before easyrtc.call or before entering an
<a name="line210"></a><div class="linenumber">210</div><div style="width:2em;display:inline-block"></div>* accept callback.
<a name="line211"></a><div class="linenumber">211</div><div style="width:2em;display:inline-block"></div>* @param {Boolean} flag true to allocate a default local media stream.
<a name="line212"></a><div class="linenumber">212</div><div style="width:2em;display:inline-block"></div>*/
<a name="line213"></a><div class="linenumber">213</div><div style="width:2em;display:inline-block"></div>this.setAutoInitUserMedia = function(flag) {
<a name="line214"></a><div class="linenumber">214</div><div style="width:4em;display:inline-block"></div>autoInitUserMedia = !!flag;
<a name="line215"></a><div class="linenumber">215</div><div style="width:2em;display:inline-block"></div>};
<a name="line216"></a><div class="linenumber">216</div>
<a name="line217"></a><div class="linenumber">217</div><div style="width:2em;display:inline-block"></div>/**
<a name="line218"></a><div class="linenumber">218</div><div style="width:2em;display:inline-block"></div>* This function performs a printf like formatting. It actually takes an unlimited
<a name="line219"></a><div class="linenumber">219</div><div style="width:2em;display:inline-block"></div>* number of arguments, the declared arguments arg1, arg2, arg3 are present just for
<a name="line220"></a><div class="linenumber">220</div><div style="width:2em;display:inline-block"></div>* documentation purposes.
<a name="line221"></a><div class="linenumber">221</div><div style="width:2em;display:inline-block"></div>* @param {String} format A string like "abcd{1}efg{2}hij{1}."
<a name="line222"></a><div class="linenumber">222</div><div style="width:2em;display:inline-block"></div>* @param {String} arg1 The value that replaces {1}
<a name="line223"></a><div class="linenumber">223</div><div style="width:2em;display:inline-block"></div>* @param {String} arg2 The value that replaces {2}
<a name="line224"></a><div class="linenumber">224</div><div style="width:2em;display:inline-block"></div>* @param {String} arg3 The value that replaces {3}
<a name="line225"></a><div class="linenumber">225</div><div style="width:2em;display:inline-block"></div>* @returns {String} the formatted string.
<a name="line226"></a><div class="linenumber">226</div><div style="width:2em;display:inline-block"></div>*/
<a name="line227"></a><div class="linenumber">227</div><div style="width:2em;display:inline-block"></div>this.format = function(format, arg1, arg2, arg3) {
<a name="line228"></a><div class="linenumber">228</div><div style="width:4em;display:inline-block"></div>var formatted = arguments[0];
<a name="line229"></a><div class="linenumber">229</div><div style="width:4em;display:inline-block"></div>for (var i = 1; i < arguments.length; i++) {
<a name="line230"></a><div class="linenumber">230</div><div style="width:6em;display:inline-block"></div>var regexp = new RegExp('\\{' + (i - 1) + '\\}', 'gi');
<a name="line231"></a><div class="linenumber">231</div><div style="width:6em;display:inline-block"></div>formatted = formatted.replace(regexp, arguments[i]);
<a name="line232"></a><div class="linenumber">232</div><div style="width:4em;display:inline-block"></div>}
<a name="line233"></a><div class="linenumber">233</div><div style="width:4em;display:inline-block"></div>return formatted;
<a name="line234"></a><div class="linenumber">234</div><div style="width:2em;display:inline-block"></div>};
<a name="line235"></a><div class="linenumber">235</div>
<a name="line236"></a><div class="linenumber">236</div><div style="width:2em;display:inline-block"></div>/**
<a name="line237"></a><div class="linenumber">237</div><div style="width:2em;display:inline-block"></div>* This function checks if a socket is actually connected.
<a name="line238"></a><div class="linenumber">238</div><div style="width:2em;display:inline-block"></div>* @private
<a name="line239"></a><div class="linenumber">239</div><div style="width:2em;display:inline-block"></div>* @param {Object} socket a socket.io socket.
<a name="line240"></a><div class="linenumber">240</div><div style="width:2em;display:inline-block"></div>* @return true if the socket exists and is connected, false otherwise.
<a name="line241"></a><div class="linenumber">241</div><div style="width:2em;display:inline-block"></div>*/
<a name="line242"></a><div class="linenumber">242</div><div style="width:2em;display:inline-block"></div>function isSocketConnected(socket) {
<a name="line243"></a><div class="linenumber">243</div><div style="width:3em;display:inline-block"></div>return socket && (
<a name="line244"></a><div class="linenumber">244</div><div style="width:6em;display:inline-block"></div>(socket.socket && socket.socket.connected) || socket.connected
<a name="line245"></a><div class="linenumber">245</div><div style="width:4em;display:inline-block"></div>);
<a name="line246"></a><div class="linenumber">246</div><div style="width:2em;display:inline-block"></div>}
<a name="line247"></a><div class="linenumber">247</div>
<a name="line248"></a><div class="linenumber">248</div><div style="width:2em;display:inline-block"></div>/** @private */
<a name="line249"></a><div class="linenumber">249</div><div style="width:2em;display:inline-block"></div>//
<a name="line250"></a><div class="linenumber">250</div><div style="width:2em;display:inline-block"></div>// Maps a key to a language specific string using the easyrtc_lang map.
<a name="line251"></a><div class="linenumber">251</div><div style="width:2em;display:inline-block"></div>// Defaults to the key if the key can not be found, but outputs a warning in that case.
<a name="line252"></a><div class="linenumber">252</div><div style="width:2em;display:inline-block"></div>// This function is only used internally by easyrtc.js
<a name="line253"></a><div class="linenumber">253</div><div style="width:2em;display:inline-block"></div>//
<a name="line254"></a><div class="linenumber">254</div><div style="width:2em;display:inline-block"></div>var haveAudioVideo = {
<a name="line255"></a><div class="linenumber">255</div><div style="width:4em;display:inline-block"></div>audio: false,
<a name="line256"></a><div class="linenumber">256</div><div style="width:4em;display:inline-block"></div>video: false
<a name="line257"></a><div class="linenumber">257</div><div style="width:2em;display:inline-block"></div>};
<a name="line258"></a><div class="linenumber">258</div>
<a name="line259"></a><div class="linenumber">259</div><div style="width:2em;display:inline-block"></div>/**
<a name="line260"></a><div class="linenumber">260</div><div style="width:2em;display:inline-block"></div>* @private
<a name="line261"></a><div class="linenumber">261</div><div style="width:2em;display:inline-block"></div>* @param {String} key
<a name="line262"></a><div class="linenumber">262</div><div style="width:2em;display:inline-block"></div>*/
<a name="line263"></a><div class="linenumber">263</div><div style="width:2em;display:inline-block"></div>this.getConstantString = function(key) {
<a name="line264"></a><div class="linenumber">264</div><div style="width:4em;display:inline-block"></div>if (easyrtc_lang[key]) {
<a name="line265"></a><div class="linenumber">265</div><div style="width:6em;display:inline-block"></div>return easyrtc_lang[key];
<a name="line266"></a><div class="linenumber">266</div><div style="width:4em;display:inline-block"></div>}
<a name="line267"></a><div class="linenumber">267</div><div style="width:4em;display:inline-block"></div>else {
<a name="line268"></a><div class="linenumber">268</div><div style="width:6em;display:inline-block"></div>self.showError(self.errCodes.DEVELOPER_ERR, "Could not find key='" + key + "' in easyrtc_lang");
<a name="line269"></a><div class="linenumber">269</div><div style="width:6em;display:inline-block"></div>return key;
<a name="line270"></a><div class="linenumber">270</div><div style="width:4em;display:inline-block"></div>}
<a name="line271"></a><div class="linenumber">271</div><div style="width:2em;display:inline-block"></div>};
<a name="line272"></a><div class="linenumber">272</div>
<a name="line273"></a><div class="linenumber">273</div><div style="width:2em;display:inline-block"></div>/** @private */
<a name="line274"></a><div class="linenumber">274</div><div style="width:2em;display:inline-block"></div>//
<a name="line275"></a><div class="linenumber">275</div><div style="width:2em;display:inline-block"></div>// this is a list of the events supported by the generalized event listener.
<a name="line276"></a><div class="linenumber">276</div><div style="width:2em;display:inline-block"></div>//
<a name="line277"></a><div class="linenumber">277</div><div style="width:2em;display:inline-block"></div>var allowedEvents = {
<a name="line278"></a><div class="linenumber">278</div><div style="width:4em;display:inline-block"></div>roomOccupant: true, // this receives the list of everybody in any room you belong to
<a name="line279"></a><div class="linenumber">279</div><div style="width:4em;display:inline-block"></div>roomOccupants: true // this receives a {roomName:..., occupants:...} value for a specific room
<a name="line280"></a><div class="linenumber">280</div><div style="width:2em;display:inline-block"></div>};
<a name="line281"></a><div class="linenumber">281</div>
<a name="line282"></a><div class="linenumber">282</div><div style="width:2em;display:inline-block"></div>/** @private */
<a name="line283"></a><div class="linenumber">283</div><div style="width:2em;display:inline-block"></div>//
<a name="line284"></a><div class="linenumber">284</div><div style="width:2em;display:inline-block"></div>// A map of eventListeners. The key is the event type.
<a name="line285"></a><div class="linenumber">285</div><div style="width:2em;display:inline-block"></div>//
<a name="line286"></a><div class="linenumber">286</div><div style="width:2em;display:inline-block"></div>var eventListeners = {};
<a name="line287"></a><div class="linenumber">287</div>
<a name="line288"></a><div class="linenumber">288</div><div style="width:2em;display:inline-block"></div>/**
<a name="line289"></a><div class="linenumber">289</div><div style="width:2em;display:inline-block"></div>* This function checks if an attempt was made to add an event listener or
<a name="line290"></a><div class="linenumber">290</div><div style="width:2em;display:inline-block"></div>* or emit an unlisted event, since such is typically a typo.
<a name="line291"></a><div class="linenumber">291</div><div style="width:2em;display:inline-block"></div>* @private
<a name="line292"></a><div class="linenumber">292</div><div style="width:2em;display:inline-block"></div>* @param {String} eventName
<a name="line293"></a><div class="linenumber">293</div><div style="width:2em;display:inline-block"></div>* @param {String} callingFunction the name of the calling function.
<a name="line294"></a><div class="linenumber">294</div><div style="width:2em;display:inline-block"></div>*/
<a name="line295"></a><div class="linenumber">295</div><div style="width:2em;display:inline-block"></div>function event(eventName, callingFunction) {
<a name="line296"></a><div class="linenumber">296</div><div style="width:4em;display:inline-block"></div>if (typeof eventName !== 'string') {
<a name="line297"></a><div class="linenumber">297</div><div style="width:6em;display:inline-block"></div>self.showError(self.errCodes.DEVELOPER_ERR, callingFunction + " called without a string as the first argument");
<a name="line298"></a><div class="linenumber">298</div><div style="width:6em;display:inline-block"></div>throw "developer error";
<a name="line299"></a><div class="linenumber">299</div><div style="width:4em;display:inline