UNPKG

zdpjs_webrtc

Version:
378 lines 829 kB
<!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>/*&nbsp;global&nbsp;define,&nbsp;module,&nbsp;require,&nbsp;console,&nbsp;MediaStreamTrack,&nbsp;createIceServer,&nbsp;RTCIceCandidate,&nbsp;RTCPeerConnection,&nbsp;RTCSessionDescription&nbsp;*/ <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:&nbsp;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&nbsp;client&nbsp;side&nbsp;support&nbsp;for&nbsp;the&nbsp;EasyRTC&nbsp;framework. <a name="line6"></a><div class="linenumber">6</div><div style="width:2em;display:inline-block"></div>See&nbsp;the&nbsp;easyrtc_client_api.md&nbsp;and&nbsp;easyrtc_client_tutorial.md <a name="line7"></a><div class="linenumber">7</div><div style="width:2em;display:inline-block"></div>for&nbsp;more&nbsp;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:&nbsp;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&nbsp;(c)&nbsp;2016,&nbsp;Priologic&nbsp;Software&nbsp;Inc. <a name="line12"></a><div class="linenumber">12</div><div style="width:2em;display:inline-block"></div>All&nbsp;rights&nbsp;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&nbsp;and&nbsp;use&nbsp;in&nbsp;source&nbsp;and&nbsp;binary&nbsp;forms,&nbsp;with&nbsp;or&nbsp;without <a name="line15"></a><div class="linenumber">15</div><div style="width:2em;display:inline-block"></div>modification,&nbsp;are&nbsp;permitted&nbsp;provided&nbsp;that&nbsp;the&nbsp;following&nbsp;conditions&nbsp;are&nbsp;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>*&nbsp;Redistributions&nbsp;of&nbsp;source&nbsp;code&nbsp;must&nbsp;retain&nbsp;the&nbsp;above&nbsp;copyright&nbsp;notice, <a name="line18"></a><div class="linenumber">18</div><div style="width:5em;display:inline-block"></div>this&nbsp;list&nbsp;of&nbsp;conditions&nbsp;and&nbsp;the&nbsp;following&nbsp;disclaimer. <a name="line19"></a><div class="linenumber">19</div><div style="width:4em;display:inline-block"></div>*&nbsp;Redistributions&nbsp;in&nbsp;binary&nbsp;form&nbsp;must&nbsp;reproduce&nbsp;the&nbsp;above&nbsp;copyright <a name="line20"></a><div class="linenumber">20</div><div style="width:5em;display:inline-block"></div>notice,&nbsp;this&nbsp;list&nbsp;of&nbsp;conditions&nbsp;and&nbsp;the&nbsp;following&nbsp;disclaimer&nbsp;in&nbsp;the <a name="line21"></a><div class="linenumber">21</div><div style="width:5em;display:inline-block"></div>documentation&nbsp;and/or&nbsp;other&nbsp;materials&nbsp;provided&nbsp;with&nbsp;the&nbsp;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&nbsp;SOFTWARE&nbsp;IS&nbsp;PROVIDED&nbsp;BY&nbsp;THE&nbsp;COPYRIGHT&nbsp;HOLDERS&nbsp;AND&nbsp;CONTRIBUTORS&nbsp;"AS&nbsp;IS" <a name="line24"></a><div class="linenumber">24</div><div style="width:2em;display:inline-block"></div>AND&nbsp;ANY&nbsp;EXPRESS&nbsp;OR&nbsp;IMPLIED&nbsp;WARRANTIES,&nbsp;INCLUDING,&nbsp;BUT&nbsp;NOT&nbsp;LIMITED&nbsp;TO,&nbsp;THE <a name="line25"></a><div class="linenumber">25</div><div style="width:2em;display:inline-block"></div>IMPLIED&nbsp;WARRANTIES&nbsp;OF&nbsp;MERCHANTABILITY&nbsp;AND&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;PURPOSE <a name="line26"></a><div class="linenumber">26</div><div style="width:2em;display:inline-block"></div>ARE&nbsp;DISCLAIMED.&nbsp;IN&nbsp;NO&nbsp;EVENT&nbsp;SHALL&nbsp;THE&nbsp;COPYRIGHT&nbsp;HOLDER&nbsp;OR&nbsp;CONTRIBUTORS&nbsp;BE <a name="line27"></a><div class="linenumber">27</div><div style="width:2em;display:inline-block"></div>LIABLE&nbsp;FOR&nbsp;ANY&nbsp;DIRECT,&nbsp;INDIRECT,&nbsp;INCIDENTAL,&nbsp;SPECIAL,&nbsp;EXEMPLARY,&nbsp;OR <a name="line28"></a><div class="linenumber">28</div><div style="width:2em;display:inline-block"></div>CONSEQUENTIAL&nbsp;DAMAGES&nbsp;(INCLUDING,&nbsp;BUT&nbsp;NOT&nbsp;LIMITED&nbsp;TO,&nbsp;PROCUREMENT&nbsp;OF <a name="line29"></a><div class="linenumber">29</div><div style="width:2em;display:inline-block"></div>SUBSTITUTE&nbsp;GOODS&nbsp;OR&nbsp;SERVICES;&nbsp;LOSS&nbsp;OF&nbsp;USE,&nbsp;DATA,&nbsp;OR&nbsp;PROFITS;&nbsp;OR&nbsp;BUSINESS <a name="line30"></a><div class="linenumber">30</div><div style="width:2em;display:inline-block"></div>INTERRUPTION)&nbsp;HOWEVER&nbsp;CAUSED&nbsp;AND&nbsp;ON&nbsp;ANY&nbsp;THEORY&nbsp;OF&nbsp;LIABILITY,&nbsp;WHETHER&nbsp;IN <a name="line31"></a><div class="linenumber">31</div><div style="width:2em;display:inline-block"></div>CONTRACT,&nbsp;STRICT&nbsp;LIABILITY,&nbsp;OR&nbsp;TORT&nbsp;(INCLUDING&nbsp;NEGLIGENCE&nbsp;OR&nbsp;OTHERWISE) <a name="line32"></a><div class="linenumber">32</div><div style="width:2em;display:inline-block"></div>ARISING&nbsp;IN&nbsp;ANY&nbsp;WAY&nbsp;OUT&nbsp;OF&nbsp;THE&nbsp;USE&nbsp;OF&nbsp;THIS&nbsp;SOFTWARE,&nbsp;EVEN&nbsp;IF&nbsp;ADVISED&nbsp;OF&nbsp;THE <a name="line33"></a><div class="linenumber">33</div><div style="width:2em;display:inline-block"></div>POSSIBILITY&nbsp;OF&nbsp;SUCH&nbsp;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&nbsp;(root,&nbsp;factory)&nbsp;{ <a name="line37"></a><div class="linenumber">37</div><div style="width:2em;display:inline-block"></div>if&nbsp;(typeof&nbsp;define&nbsp;===&nbsp;'function'&nbsp;&amp;&amp;&nbsp;define.amd)&nbsp;{ <a name="line38"></a><div class="linenumber">38</div><div style="width:4em;display:inline-block"></div>//RequireJS&nbsp;(AMD)&nbsp;build&nbsp;system <a name="line39"></a><div class="linenumber">39</div><div style="width:4em;display:inline-block"></div>define(['easyrtc_lang',&nbsp;'webrtc-adapter',&nbsp;'socket.io'],&nbsp;factory); <a name="line40"></a><div class="linenumber">40</div><div style="width:2em;display:inline-block"></div>}&nbsp;else&nbsp;if&nbsp;(typeof&nbsp;module&nbsp;===&nbsp;'object'&nbsp;&amp;&amp;&nbsp;module.exports)&nbsp;{ <a name="line41"></a><div class="linenumber">41</div><div style="width:4em;display:inline-block"></div>//CommonJS&nbsp;build&nbsp;system <a name="line42"></a><div class="linenumber">42</div><div style="width:4em;display:inline-block"></div>module.exports&nbsp;=&nbsp;factory(require('easyrtc_lang'),&nbsp;require('webrtc-adapter'),&nbsp;require('socket.io')); <a name="line43"></a><div class="linenumber">43</div><div style="width:2em;display:inline-block"></div>}&nbsp;else&nbsp;{ <a name="line44"></a><div class="linenumber">44</div><div style="width:4em;display:inline-block"></div>//Vanilla&nbsp;JS,&nbsp;ensure&nbsp;dependencies&nbsp;are&nbsp;loaded&nbsp;correctly <a name="line45"></a><div class="linenumber">45</div><div style="width:4em;display:inline-block"></div>if&nbsp;(typeof&nbsp;window.io&nbsp;===&nbsp;'undefined'&nbsp;||&nbsp;!window.io)&nbsp;{ <a name="line46"></a><div class="linenumber">46</div><div style="width:6em;display:inline-block"></div>throw&nbsp;new&nbsp;Error("easyrtc&nbsp;requires&nbsp;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&nbsp;=&nbsp;factory(window.easyrtc_lang,&nbsp;window.adapter,&nbsp;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,&nbsp;function&nbsp;(easyrtc_lang,&nbsp;adapter,&nbsp;io,&nbsp;undefined)&nbsp;{ <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&nbsp;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>*&nbsp;@class&nbsp;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>*&nbsp;@returns&nbsp;{Easyrtc}&nbsp;the&nbsp;new&nbsp;easyrtc&nbsp;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>*&nbsp;@constructs&nbsp;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&nbsp;Easyrtc&nbsp;=&nbsp;function()&nbsp;{ <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&nbsp;self&nbsp;=&nbsp;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&nbsp;logDebug&nbsp;(message,&nbsp;obj)&nbsp;{ <a name="line65"></a><div class="linenumber">65</div><div style="width:4em;display:inline-block"></div>if&nbsp;(self.debugPrinter)&nbsp;{ <a name="line66"></a><div class="linenumber">66</div><div style="width:6em;display:inline-block"></div>self.debugPrinter(message,&nbsp;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&nbsp;isEmptyObj(obj)&nbsp;{ <a name="line71"></a><div class="linenumber">71</div><div style="width:4em;display:inline-block"></div>if&nbsp;(obj&nbsp;===&nbsp;null&nbsp;||&nbsp;obj&nbsp;===&nbsp;undefined)&nbsp;{ <a name="line72"></a><div class="linenumber">72</div><div style="width:6em;display:inline-block"></div>return&nbsp;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&nbsp;key; <a name="line75"></a><div class="linenumber">75</div><div style="width:4em;display:inline-block"></div>for&nbsp;(key&nbsp;in&nbsp;obj)&nbsp;{ <a name="line76"></a><div class="linenumber">76</div><div style="width:6em;display:inline-block"></div>if&nbsp;(obj.hasOwnProperty(key))&nbsp;{ <a name="line77"></a><div class="linenumber">77</div><div style="width:8em;display:inline-block"></div>return&nbsp;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&nbsp;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>/**&nbsp;@private&nbsp;*/ <a name="line84"></a><div class="linenumber">84</div><div style="width:2em;display:inline-block"></div>var&nbsp;autoInitUserMedia&nbsp;=&nbsp;true; <a name="line85"></a><div class="linenumber">85</div><div style="width:2em;display:inline-block"></div>/**&nbsp;@private&nbsp;*/ <a name="line86"></a><div class="linenumber">86</div><div style="width:2em;display:inline-block"></div>var&nbsp;sdpLocalFilter&nbsp;=&nbsp;null; <a name="line87"></a><div class="linenumber">87</div><div style="width:2em;display:inline-block"></div>/**&nbsp;@private&nbsp;*/ <a name="line88"></a><div class="linenumber">88</div><div style="width:2em;display:inline-block"></div>var&nbsp;sdpRemoteFilter&nbsp;=&nbsp;null; <a name="line89"></a><div class="linenumber">89</div><div style="width:2em;display:inline-block"></div>/**&nbsp;@private&nbsp;*/ <a name="line90"></a><div class="linenumber">90</div><div style="width:2em;display:inline-block"></div>var&nbsp;iceCandidateFilter&nbsp;=&nbsp;null; <a name="line91"></a><div class="linenumber">91</div><div style="width:2em;display:inline-block"></div>/**&nbsp;@private&nbsp;*/ <a name="line92"></a><div class="linenumber">92</div><div style="width:2em;display:inline-block"></div>var&nbsp;iceConnectionStateChangeListener&nbsp;=&nbsp;null; <a name="line93"></a><div class="linenumber">93</div><div style="width:2em;display:inline-block"></div>var&nbsp;signalingStateChangeListener&nbsp;=&nbsp;null; <a name="line94"></a><div class="linenumber">94</div><div style="width:2em;display:inline-block"></div>/**&nbsp;@private&nbsp;*/ <a name="line95"></a><div class="linenumber">95</div><div style="width:2em;display:inline-block"></div>var&nbsp;connectionOptions&nbsp;=&nbsp;&nbsp;{ <a name="line96"></a><div class="linenumber">96</div><div style="width:4em;display:inline-block"></div>'connect&nbsp;timeout':&nbsp;10000, <a name="line97"></a><div class="linenumber">97</div><div style="width:4em;display:inline-block"></div>'force&nbsp;new&nbsp;connection':&nbsp;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>/**&nbsp;@private&nbsp;*/ <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>//&nbsp;this&nbsp;function&nbsp;replaces&nbsp;the&nbsp;deprecated&nbsp;MediaStream.stop&nbsp;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&nbsp;stopStream(stream)&nbsp;{ <a name="line105"></a><div class="linenumber">105</div><div style="width:3em;display:inline-block"></div>var&nbsp;i; <a name="line106"></a><div class="linenumber">106</div><div style="width:3em;display:inline-block"></div>var&nbsp;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&nbsp;=&nbsp;stream.getAudioTracks(); <a name="line109"></a><div class="linenumber">109</div><div style="width:3em;display:inline-block"></div>for(&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;tracks.length;&nbsp;i++&nbsp;)&nbsp;{ <a name="line110"></a><div class="linenumber">110</div><div style="width:5em;display:inline-block"></div>try&nbsp;{ <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>}&nbsp;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&nbsp;=&nbsp;stream.getVideoTracks(); <a name="line115"></a><div class="linenumber">115</div><div style="width:3em;display:inline-block"></div>for(&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;tracks.length;&nbsp;i++&nbsp;)&nbsp;{ <a name="line116"></a><div class="linenumber">116</div><div style="width:5em;display:inline-block"></div>try&nbsp;{ <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>}&nbsp;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&nbsp;(typeof&nbsp;stream.stop&nbsp;===&nbsp;'function')&nbsp;{ <a name="line122"></a><div class="linenumber">122</div><div style="width:5em;display:inline-block"></div>try&nbsp;{ <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>}&nbsp;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>*&nbsp;Sets&nbsp;functions&nbsp;which&nbsp;filter&nbsp;sdp&nbsp;records&nbsp;before&nbsp;calling&nbsp;setLocalDescription&nbsp;or&nbsp;setRemoteDescription. <a name="line130"></a><div class="linenumber">130</div><div style="width:2em;display:inline-block"></div>*&nbsp;This&nbsp;is&nbsp;advanced&nbsp;functionality&nbsp;which&nbsp;can&nbsp;break&nbsp;things,&nbsp;easily.&nbsp;See&nbsp;the&nbsp;easyrtc_rates.js&nbsp;file&nbsp;for&nbsp;a <a name="line131"></a><div class="linenumber">131</div><div style="width:2em;display:inline-block"></div>*&nbsp;filter&nbsp;builder. <a name="line132"></a><div class="linenumber">132</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{Function}&nbsp;localFilter&nbsp;a&nbsp;function&nbsp;that&nbsp;takes&nbsp;an&nbsp;sdp&nbsp;string&nbsp;and&nbsp;returns&nbsp;an&nbsp;sdp&nbsp;string. <a name="line133"></a><div class="linenumber">133</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{Function}&nbsp;remoteFilter&nbsp;a&nbsp;function&nbsp;that&nbsp;takes&nbsp;an&nbsp;sdp&nbsp;string&nbsp;and&nbsp;returns&nbsp;an&nbsp;sdp&nbsp;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&nbsp;=&nbsp;function(localFilter,&nbsp;remoteFilter)&nbsp;{ <a name="line136"></a><div class="linenumber">136</div><div style="width:4em;display:inline-block"></div>sdpLocalFilter&nbsp;=&nbsp;localFilter; <a name="line137"></a><div class="linenumber">137</div><div style="width:4em;display:inline-block"></div>sdpRemoteFilter&nbsp;=&nbsp;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>*&nbsp;Sets&nbsp;a&nbsp;function&nbsp;to&nbsp;warn&nbsp;about&nbsp;the&nbsp;peer&nbsp;connection&nbsp;closing. <a name="line142"></a><div class="linenumber">142</div><div style="width:2em;display:inline-block"></div>*&nbsp;&nbsp;@param&nbsp;{Function}&nbsp;handler:&nbsp;a&nbsp;function&nbsp;that&nbsp;gets&nbsp;an&nbsp;easyrtcid&nbsp;as&nbsp;an&nbsp;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&nbsp;=&nbsp;function(&nbsp;handler&nbsp;)&nbsp;{ <a name="line145"></a><div class="linenumber">145</div><div style="width:3em;display:inline-block"></div>this.onPeerClosed&nbsp;=&nbsp;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>*&nbsp;Sets&nbsp;a&nbsp;function&nbsp;to&nbsp;warn&nbsp;about&nbsp;the&nbsp;peer&nbsp;connection&nbsp;open. <a name="line150"></a><div class="linenumber">150</div><div style="width:2em;display:inline-block"></div>*&nbsp;&nbsp;@param&nbsp;{Function}&nbsp;handler:&nbsp;a&nbsp;function&nbsp;that&nbsp;gets&nbsp;an&nbsp;easyrtcid&nbsp;as&nbsp;an&nbsp;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&nbsp;=&nbsp;function(&nbsp;handler&nbsp;)&nbsp;{ <a name="line153"></a><div class="linenumber">153</div><div style="width:3em;display:inline-block"></div>this.onPeerOpen&nbsp;=&nbsp;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>*&nbsp;Sets&nbsp;a&nbsp;function&nbsp;to&nbsp;receive&nbsp;warnings&nbsp;about&nbsp;the&nbsp;peer&nbsp;connection <a name="line158"></a><div class="linenumber">158</div><div style="width:2em;display:inline-block"></div>*&nbsp;failing.&nbsp;The&nbsp;peer&nbsp;connection&nbsp;may&nbsp;recover&nbsp;by&nbsp;itself. <a name="line159"></a><div class="linenumber">159</div><div style="width:2em;display:inline-block"></div>*&nbsp;&nbsp;@param&nbsp;{Function}&nbsp;failingHandler:&nbsp;a&nbsp;function&nbsp;that&nbsp;gets&nbsp;an&nbsp;easyrtcid&nbsp;as&nbsp;an&nbsp;argument. <a name="line160"></a><div class="linenumber">160</div><div style="width:2em;display:inline-block"></div>*&nbsp;&nbsp;@param&nbsp;{Function}&nbsp;recoveredHandler:&nbsp;a&nbsp;function&nbsp;that&nbsp;gets&nbsp;an&nbsp;easyrtcid&nbsp;as&nbsp;an&nbsp;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&nbsp;=&nbsp;function(&nbsp;failingHandler,&nbsp;recoveredHandler&nbsp;)&nbsp;{ <a name="line163"></a><div class="linenumber">163</div><div style="width:3em;display:inline-block"></div>this.onPeerFailing&nbsp;=&nbsp;failingHandler; <a name="line164"></a><div class="linenumber">164</div><div style="width:3em;display:inline-block"></div>this.onPeerRecovered&nbsp;=&nbsp;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>*&nbsp;Sets&nbsp;a&nbsp;function&nbsp;which&nbsp;filters&nbsp;IceCandidate&nbsp;records&nbsp;being&nbsp;sent&nbsp;or&nbsp;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>*&nbsp;Candidate&nbsp;records&nbsp;can&nbsp;be&nbsp;received&nbsp;while&nbsp;they&nbsp;are&nbsp;being&nbsp;generated&nbsp;locally&nbsp;(before&nbsp;being <a name="line171"></a><div class="linenumber">171</div><div style="width:2em;display:inline-block"></div>*&nbsp;sent&nbsp;to&nbsp;a&nbsp;peer),&nbsp;and&nbsp;after&nbsp;they&nbsp;are&nbsp;received&nbsp;by&nbsp;the&nbsp;peer.&nbsp;The&nbsp;filter&nbsp;receives&nbsp;two&nbsp;arguments,&nbsp;the&nbsp;candidate&nbsp;record&nbsp;and&nbsp;a&nbsp;boolean <a name="line172"></a><div class="linenumber">172</div><div style="width:2em;display:inline-block"></div>*&nbsp;flag&nbsp;that&nbsp;is&nbsp;true&nbsp;for&nbsp;a&nbsp;candidate&nbsp;being&nbsp;received&nbsp;from&nbsp;another&nbsp;peer, <a name="line173"></a><div class="linenumber">173</div><div style="width:2em;display:inline-block"></div>*&nbsp;and&nbsp;false&nbsp;for&nbsp;a&nbsp;candidate&nbsp;that&nbsp;was&nbsp;generated&nbsp;locally.&nbsp;The&nbsp;candidate&nbsp;record&nbsp;has&nbsp;the&nbsp;form: <a name="line174"></a><div class="linenumber">174</div><div style="width:2em;display:inline-block"></div>*&nbsp;&nbsp;{type:&nbsp;'candidate',&nbsp;label:&nbsp;sdpMLineIndex,&nbsp;id:&nbsp;sdpMid,&nbsp;candidate:&nbsp;candidateString} <a name="line175"></a><div class="linenumber">175</div><div style="width:2em;display:inline-block"></div>*&nbsp;The&nbsp;function&nbsp;should&nbsp;return&nbsp;one&nbsp;of&nbsp;the&nbsp;following:&nbsp;the&nbsp;input&nbsp;candidate&nbsp;record,&nbsp;a&nbsp;modified&nbsp;candidate&nbsp;record,&nbsp;or&nbsp;null&nbsp;(indicating&nbsp;that&nbsp;the <a name="line176"></a><div class="linenumber">176</div><div style="width:2em;display:inline-block"></div>*&nbsp;candidate&nbsp;should&nbsp;be&nbsp;discarded). <a name="line177"></a><div class="linenumber">177</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{Function}&nbsp;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&nbsp;=&nbsp;function(filter)&nbsp;{ <a name="line180"></a><div class="linenumber">180</div><div style="width:4em;display:inline-block"></div>iceCandidateFilter&nbsp;=&nbsp;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>*&nbsp;Sets&nbsp;a&nbsp;function&nbsp;that&nbsp;listens&nbsp;on&nbsp;IceConnectionStateChange&nbsp;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>*&nbsp;During&nbsp;ICE&nbsp;negotiation&nbsp;the&nbsp;peer&nbsp;connection&nbsp;fires&nbsp;the&nbsp;iceconnectionstatechange&nbsp;event. <a name="line187"></a><div class="linenumber">187</div><div style="width:2em;display:inline-block"></div>*&nbsp;It&nbsp;is&nbsp;sometimes&nbsp;useful&nbsp;for&nbsp;the&nbsp;application&nbsp;to&nbsp;learn&nbsp;about&nbsp;these&nbsp;changes,&nbsp;especially&nbsp;if&nbsp;the&nbsp;ICE&nbsp;connection&nbsp;fails. <a name="line188"></a><div class="linenumber">188</div><div style="width:2em;display:inline-block"></div>*&nbsp;The&nbsp;function&nbsp;should&nbsp;accept&nbsp;three&nbsp;parameters:&nbsp;the&nbsp;easyrtc&nbsp;id&nbsp;of&nbsp;the&nbsp;peer,&nbsp;the&nbsp;iceconnectionstatechange&nbsp;event&nbsp;target&nbsp;and&nbsp;the&nbsp;iceconnectionstate. <a name="line189"></a><div class="linenumber">189</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{Function}&nbsp;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&nbsp;=&nbsp;function(listener)&nbsp;{ <a name="line192"></a><div class="linenumber">192</div><div style="width:3em;display:inline-block"></div>iceConnectionStateChangeListener&nbsp;=&nbsp;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>*&nbsp;Sets&nbsp;a&nbsp;function&nbsp;that&nbsp;listens&nbsp;on&nbsp;SignalingStateChange&nbsp;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>*&nbsp;During&nbsp;ICE&nbsp;negotiation&nbsp;the&nbsp;peer&nbsp;connection&nbsp;fires&nbsp;the&nbsp;signalingstatechange&nbsp;event. <a name="line199"></a><div class="linenumber">199</div><div style="width:2em;display:inline-block"></div>*&nbsp;The&nbsp;function&nbsp;should&nbsp;accept&nbsp;three&nbsp;parameters:&nbsp;the&nbsp;easyrtc&nbsp;id&nbsp;of&nbsp;the&nbsp;peer,&nbsp;the&nbsp;signalingstatechange&nbsp;event&nbsp;target&nbsp;and&nbsp;the&nbsp;signalingstate. <a name="line200"></a><div class="linenumber">200</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{Function}&nbsp;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&nbsp;=&nbsp;function(listener)&nbsp;{ <a name="line203"></a><div class="linenumber">203</div><div style="width:3em;display:inline-block"></div>signalingStateChangeListener&nbsp;=&nbsp;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>*&nbsp;Controls&nbsp;whether&nbsp;a&nbsp;default&nbsp;local&nbsp;media&nbsp;stream&nbsp;should&nbsp;be&nbsp;acquired&nbsp;automatically&nbsp;during&nbsp;calls&nbsp;and&nbsp;accepts <a name="line208"></a><div class="linenumber">208</div><div style="width:2em;display:inline-block"></div>*&nbsp;if&nbsp;a&nbsp;list&nbsp;of&nbsp;streamNames&nbsp;is&nbsp;not&nbsp;supplied.&nbsp;The&nbsp;default&nbsp;is&nbsp;true,&nbsp;which&nbsp;mimics&nbsp;the&nbsp;behaviour&nbsp;of&nbsp;earlier&nbsp;releases <a name="line209"></a><div class="linenumber">209</div><div style="width:2em;display:inline-block"></div>*&nbsp;that&nbsp;didn't&nbsp;support&nbsp;multiple&nbsp;streams.&nbsp;This&nbsp;function&nbsp;should&nbsp;be&nbsp;called&nbsp;before&nbsp;easyrtc.call&nbsp;or&nbsp;before&nbsp;entering&nbsp;an <a name="line210"></a><div class="linenumber">210</div><div style="width:2em;display:inline-block"></div>*&nbsp;accept&nbsp;&nbsp;callback. <a name="line211"></a><div class="linenumber">211</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{Boolean}&nbsp;flag&nbsp;true&nbsp;to&nbsp;allocate&nbsp;a&nbsp;default&nbsp;local&nbsp;media&nbsp;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&nbsp;=&nbsp;function(flag)&nbsp;{ <a name="line214"></a><div class="linenumber">214</div><div style="width:4em;display:inline-block"></div>autoInitUserMedia&nbsp;=&nbsp;!!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>*&nbsp;This&nbsp;function&nbsp;performs&nbsp;a&nbsp;printf&nbsp;like&nbsp;formatting.&nbsp;It&nbsp;actually&nbsp;takes&nbsp;an&nbsp;unlimited <a name="line219"></a><div class="linenumber">219</div><div style="width:2em;display:inline-block"></div>*&nbsp;number&nbsp;of&nbsp;arguments,&nbsp;the&nbsp;declared&nbsp;arguments&nbsp;arg1,&nbsp;arg2,&nbsp;arg3&nbsp;are&nbsp;present&nbsp;just&nbsp;for <a name="line220"></a><div class="linenumber">220</div><div style="width:2em;display:inline-block"></div>*&nbsp;documentation&nbsp;purposes. <a name="line221"></a><div class="linenumber">221</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{String}&nbsp;format&nbsp;A&nbsp;string&nbsp;like&nbsp;"abcd{1}efg{2}hij{1}." <a name="line222"></a><div class="linenumber">222</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{String}&nbsp;arg1&nbsp;The&nbsp;value&nbsp;that&nbsp;replaces&nbsp;{1} <a name="line223"></a><div class="linenumber">223</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{String}&nbsp;arg2&nbsp;The&nbsp;value&nbsp;that&nbsp;replaces&nbsp;{2} <a name="line224"></a><div class="linenumber">224</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{String}&nbsp;arg3&nbsp;The&nbsp;value&nbsp;that&nbsp;replaces&nbsp;{3} <a name="line225"></a><div class="linenumber">225</div><div style="width:2em;display:inline-block"></div>*&nbsp;@returns&nbsp;{String}&nbsp;the&nbsp;formatted&nbsp;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&nbsp;=&nbsp;function(format,&nbsp;arg1,&nbsp;arg2,&nbsp;arg3)&nbsp;{ <a name="line228"></a><div class="linenumber">228</div><div style="width:4em;display:inline-block"></div>var&nbsp;formatted&nbsp;=&nbsp;arguments[0]; <a name="line229"></a><div class="linenumber">229</div><div style="width:4em;display:inline-block"></div>for&nbsp;(var&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;arguments.length;&nbsp;i++)&nbsp;{ <a name="line230"></a><div class="linenumber">230</div><div style="width:6em;display:inline-block"></div>var&nbsp;regexp&nbsp;=&nbsp;new&nbsp;RegExp('\\{'&nbsp;+&nbsp;(i&nbsp;-&nbsp;1)&nbsp;+&nbsp;'\\}',&nbsp;'gi'); <a name="line231"></a><div class="linenumber">231</div><div style="width:6em;display:inline-block"></div>formatted&nbsp;=&nbsp;formatted.replace(regexp,&nbsp;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&nbsp;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>*&nbsp;This&nbsp;function&nbsp;checks&nbsp;if&nbsp;a&nbsp;socket&nbsp;is&nbsp;actually&nbsp;connected. <a name="line238"></a><div class="linenumber">238</div><div style="width:2em;display:inline-block"></div>*&nbsp;@private <a name="line239"></a><div class="linenumber">239</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{Object}&nbsp;socket&nbsp;a&nbsp;socket.io&nbsp;socket. <a name="line240"></a><div class="linenumber">240</div><div style="width:2em;display:inline-block"></div>*&nbsp;@return&nbsp;true&nbsp;if&nbsp;the&nbsp;socket&nbsp;exists&nbsp;and&nbsp;is&nbsp;connected,&nbsp;false&nbsp;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&nbsp;isSocketConnected(socket)&nbsp;{ <a name="line243"></a><div class="linenumber">243</div><div style="width:3em;display:inline-block"></div>return&nbsp;socket&nbsp;&amp;&amp;&nbsp;( <a name="line244"></a><div class="linenumber">244</div><div style="width:6em;display:inline-block"></div>(socket.socket&nbsp;&amp;&amp;&nbsp;socket.socket.connected)&nbsp;||&nbsp;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>/**&nbsp;@private&nbsp;*/ <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>//&nbsp;Maps&nbsp;a&nbsp;key&nbsp;to&nbsp;a&nbsp;language&nbsp;specific&nbsp;string&nbsp;using&nbsp;the&nbsp;easyrtc_lang&nbsp;map. <a name="line251"></a><div class="linenumber">251</div><div style="width:2em;display:inline-block"></div>//&nbsp;Defaults&nbsp;to&nbsp;the&nbsp;key&nbsp;if&nbsp;the&nbsp;key&nbsp;can&nbsp;not&nbsp;be&nbsp;found,&nbsp;but&nbsp;outputs&nbsp;a&nbsp;warning&nbsp;in&nbsp;that&nbsp;case. <a name="line252"></a><div class="linenumber">252</div><div style="width:2em;display:inline-block"></div>//&nbsp;This&nbsp;function&nbsp;is&nbsp;only&nbsp;used&nbsp;internally&nbsp;by&nbsp;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&nbsp;haveAudioVideo&nbsp;=&nbsp;{ <a name="line255"></a><div class="linenumber">255</div><div style="width:4em;display:inline-block"></div>audio:&nbsp;false, <a name="line256"></a><div class="linenumber">256</div><div style="width:4em;display:inline-block"></div>video:&nbsp;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>*&nbsp;@private <a name="line261"></a><div class="linenumber">261</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{String}&nbsp;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&nbsp;=&nbsp;function(key)&nbsp;{ <a name="line264"></a><div class="linenumber">264</div><div style="width:4em;display:inline-block"></div>if&nbsp;(easyrtc_lang[key])&nbsp;{ <a name="line265"></a><div class="linenumber">265</div><div style="width:6em;display:inline-block"></div>return&nbsp;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&nbsp;{ <a name="line268"></a><div class="linenumber">268</div><div style="width:6em;display:inline-block"></div>self.showError(self.errCodes.DEVELOPER_ERR,&nbsp;"Could&nbsp;not&nbsp;find&nbsp;key='"&nbsp;+&nbsp;key&nbsp;+&nbsp;"'&nbsp;in&nbsp;easyrtc_lang"); <a name="line269"></a><div class="linenumber">269</div><div style="width:6em;display:inline-block"></div>return&nbsp;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>/**&nbsp;@private&nbsp;*/ <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>//&nbsp;this&nbsp;is&nbsp;a&nbsp;list&nbsp;of&nbsp;the&nbsp;events&nbsp;supported&nbsp;by&nbsp;the&nbsp;generalized&nbsp;event&nbsp;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&nbsp;allowedEvents&nbsp;=&nbsp;{ <a name="line278"></a><div class="linenumber">278</div><div style="width:4em;display:inline-block"></div>roomOccupant:&nbsp;true,&nbsp;&nbsp;//&nbsp;this&nbsp;receives&nbsp;the&nbsp;list&nbsp;of&nbsp;everybody&nbsp;in&nbsp;any&nbsp;room&nbsp;you&nbsp;belong&nbsp;to <a name="line279"></a><div class="linenumber">279</div><div style="width:4em;display:inline-block"></div>roomOccupants:&nbsp;true&nbsp;&nbsp;//&nbsp;this&nbsp;receives&nbsp;a&nbsp;{roomName:...,&nbsp;occupants:...}&nbsp;value&nbsp;for&nbsp;a&nbsp;specific&nbsp;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>/**&nbsp;@private&nbsp;*/ <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>//&nbsp;A&nbsp;map&nbsp;of&nbsp;eventListeners.&nbsp;The&nbsp;key&nbsp;is&nbsp;the&nbsp;event&nbsp;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&nbsp;eventListeners&nbsp;=&nbsp;{}; <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>*&nbsp;This&nbsp;function&nbsp;checks&nbsp;if&nbsp;an&nbsp;attempt&nbsp;was&nbsp;made&nbsp;to&nbsp;add&nbsp;an&nbsp;event&nbsp;listener&nbsp;or <a name="line290"></a><div class="linenumber">290</div><div style="width:2em;display:inline-block"></div>*&nbsp;or&nbsp;emit&nbsp;an&nbsp;unlisted&nbsp;event,&nbsp;since&nbsp;such&nbsp;is&nbsp;typically&nbsp;a&nbsp;typo. <a name="line291"></a><div class="linenumber">291</div><div style="width:2em;display:inline-block"></div>*&nbsp;@private <a name="line292"></a><div class="linenumber">292</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{String}&nbsp;eventName <a name="line293"></a><div class="linenumber">293</div><div style="width:2em;display:inline-block"></div>*&nbsp;@param&nbsp;{String}&nbsp;callingFunction&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;calling&nbsp;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&nbsp;event(eventName,&nbsp;callingFunction)&nbsp;{ <a name="line296"></a><div class="linenumber">296</div><div style="width:4em;display:inline-block"></div>if&nbsp;(typeof&nbsp;eventName&nbsp;!==&nbsp;'string')&nbsp;{ <a name="line297"></a><div class="linenumber">297</div><div style="width:6em;display:inline-block"></div>self.showError(self.errCodes.DEVELOPER_ERR,&nbsp;callingFunction&nbsp;+&nbsp;"&nbsp;called&nbsp;without&nbsp;a&nbsp;string&nbsp;as&nbsp;the&nbsp;first&nbsp;argument"); <a name="line298"></a><div class="linenumber">298</div><div style="width:6em;display:inline-block"></div>throw&nbsp;"developer&nbsp;error"; <a name="line299"></a><div class="linenumber">299</div><div style="width:4em;display:inline