File: source/skylink-events.js

                      var _eventsDocs = {
                        /**
                         * Event triggered when socket connection to Signaling server has opened.
                         * @event channelOpen
                         * @param {JSON} session The socket connection session information.
                         * @param {String} session.serverUrl The socket connection Signaling url used.
                         * @param {String} session.transportType The socket connection transport type used.
                         * @param {JSON} session.socketOptions The socket connection options.
                         * @param {Number} session.attempts The socket connection current reconnection attempts.
                         * @param {Number} session.finalAttempts The socket connection current last attempts
                         *   for the last available transports and port.
                         * @for Skylink
                         * @since 0.1.0
                         */
                        channelOpen: [],
                      
                        /**
                         * Event triggered when socket connection to Signaling server has closed.
                         * @event channelClose
                         * @param {JSON} session The socket connection session information.
                         *   <small>Object signature matches the <code>session</code> parameter payload received in the
                         *   <a href="#event_channelOpen"><code>channelOpen</code> event</a>.</small>
                         * @for Skylink
                         * @since 0.1.0
                         */
                        channelClose: [],
                      
                        /**
                         * <blockquote class="info">
                         *   Note that this is used only for SDK developer purposes.
                         * </blockquote>
                         * Event triggered when receiving socket message from the Signaling server.
                         * @event channelMessage
                         * @param {JSON} message The socket message object.
                         * @param {JSON} session The socket connection session information.
                         *   <small>Object signature matches the <code>session</code> parameter payload received in the
                         *   <a href="#event_channelOpen"><code>channelOpen</code> event</a>.</small>
                         * @for Skylink
                         * @since 0.1.0
                         */
                        channelMessage: [],
                      
                        /**
                         * <blockquote class="info">
                         *   This may be caused by Javascript errors in the event listener when subscribing to events.<br>
                         *   It may be resolved by checking for code errors in your Web App in the event subscribing listener.<br>
                         *   <code>skylinkDemo.on("eventName", function () { // Errors here });</code>
                         * </blockquote>
                         * Event triggered when socket connection encountered exception.
                         * @event channelError
                         * @param {Error|String} error The error object.
                         * @param {JSON} session The socket connection session information.
                         *   <small>Object signature matches the <code>session</code> parameter payload received in the
                         *   <a href="#event_channelOpen"><code>channelOpen</code> event</a>.</small>
                         * @for Skylink
                         * @since 0.1.0
                         */
                        channelError: [],
                      
                        /**
                         * Event triggered when attempting to establish socket connection to Signaling server when failed.
                         * @event channelRetry
                         * @param {String} fallbackType The current fallback state.
                         *   [Rel: Skylink.SOCKET_FALLBACK]
                         * @param {Number} currentAttempt The current socket reconnection attempt.
                         * @param {JSON} session The socket connection session information.
                         *   <small>Object signature matches the <code>session</code> parameter payload received in the
                         *   <a href="#event_channelOpen"><code>channelOpen</code> event</a>.</small>
                         * @for Skylink
                         * @since 0.5.6
                         */
                        channelRetry: [],
                      
                        /**
                         * Event triggered when attempt to establish socket connection to Signaling server has failed.
                         * @event socketError
                         * @param {Number} errorCode The socket connection error code.
                         *   [Rel: Skylink.SOCKET_ERROR]
                         * @param {Error|String|Number} error The error object.
                         * @param {String} type The fallback state of the socket connection attempt.
                         *   [Rel: Skylink.SOCKET_FALLBACK]
                         * @param {JSON} session The socket connection session information.
                         *   <small>Object signature matches the <code>session</code> parameter payload received in the
                         *   <a href="#event_channelOpen"><code>channelOpen</code> event</a>.</small>
                         * @for Skylink
                         * @since 0.5.5
                         */
                        socketError: [],
                      
                        /**
                         * Event triggered when <a href="#method_init"><code>init()</code> method</a> ready state changes.
                         * @event readyStateChange
                         * @param {Number} readyState The current <code>init()</code> ready state.
                         *   [Rel: Skylink.READY_STATE_CHANGE]
                         * @param {JSON} [error] The error result.
                         *   <small>Defined only when <code>state</code> is <code>ERROR</code>.</small>
                         * @param {Number} error.status The HTTP status code when failed.
                         * @param {Number} error.errorCode The ready state change failure code.
                         *   [Rel: Skylink.READY_STATE_CHANGE_ERROR]
                         * @param {Error} error.content The error object.
                         * @param {String} room The Room to The Room to retrieve session token for.
                         * @for Skylink
                         * @since 0.4.0
                         */
                        readyStateChange: [],
                      
                        /**
                         * Event triggered when a Peer connection establishment state has changed.
                         * @event handshakeProgress
                         * @param {String} state The current Peer connection establishment state.
                         *   [Rel: Skylink.HANDSHAKE_PROGRESS]
                         * @param {String} peerId The Peer ID.
                         * @param {Error|String} [error] The error object.
                         *   <small>Defined only when <code>state</code> is <code>ERROR</code>.</small>
                         * @for Skylink
                         * @since 0.3.0
                         */
                        handshakeProgress: [],
                      
                        /**
                         * <blockquote class="info">
                         *   Learn more about how ICE works in this
                         *   <a href="https://temasys.com.sg/ice-what-is-this-sorcery/">article here</a>.
                         * </blockquote>
                         * Event triggered when a Peer connection ICE gathering state has changed.
                         * @event candidateGenerationState
                         * @param {String} state The current Peer connection ICE gathering state.
                         *   [Rel: Skylink.CANDIDATE_GENERATION_STATE]
                         * @param {String} peerId The Peer ID.
                         * @for Skylink
                         * @since 0.1.0
                         */
                        candidateGenerationState: [],
                      
                        /**
                         * <blockquote class="info">
                         *   Learn more about how ICE works in this
                         *   <a href="https://temasys.com.sg/ice-what-is-this-sorcery/">article here</a>.
                         * </blockquote>
                         * Event triggered when a Peer connection session description exchanging state has changed.
                         * @event peerConnectionState
                         * @param {String} state The current Peer connection session description exchanging state.
                         *   [Rel: Skylink.PEER_CONNECTION_STATE]
                         * @param {String} peerId The Peer ID.
                         * @for Skylink
                         * @since 0.1.0
                         */
                        peerConnectionState: [],
                      
                        /**
                         * <blockquote class="info">
                         *   Learn more about how ICE works in this
                         *   <a href="https://temasys.com.sg/ice-what-is-this-sorcery/">article here</a>.
                         * </blockquote>
                         * Event triggered when a Peer connection ICE connection state has changed.
                         * @event iceConnectionState
                         * @param {String} state The current Peer connection ICE connection state.
                         *   [Rel: Skylink.ICE_CONNECTION_STATE]
                         * @param {String} peerId The Peer ID.
                         * @for Skylink
                         * @since 0.1.0
                         */
                        iceConnectionState: [],
                      
                        /**
                         * Event triggered when retrieval of Stream failed.
                         * @event mediaAccessError
                         * @param {Error|String} error The error object.
                         * @param {Boolean} isScreensharing The flag if event occurred during
                         *   <a href="#method_shareScreen"><code>shareScreen()</code> method</a> and not
                         *   <a href="#method_getUserMedia"><code>getUserMedia()</code> method</a>.
                         * @param {Boolean} isAudioFallbackError The flag if event occurred during
                         *   retrieval of audio tracks only when <a href="#method_getUserMedia"><code>getUserMedia()</code> method</a>
                         *   had failed to retrieve both audio and video tracks.
                         * @for Skylink
                         * @since 0.1.0
                         */
                        mediaAccessError: [],
                      
                        /**
                         * Event triggered when Stream retrieval fallback state has changed.
                         * @event mediaAccessFallback
                         * @param {JSON} error The error result.
                         * @param {Error|String} error.error The error object.
                         * @param {JSON} [error.diff=null] The list of excepted but received audio and video tracks in Stream.
                         *   <small>Defined only when <code>state</code> payload is <code>FALLBACKED</code>.</small>
                         * @param {JSON} error.diff.video The expected and received video tracks.
                         * @param {Number} error.diff.video.expected The expected video tracks.
                         * @param {Number} error.diff.video.received The received video tracks.
                         * @param {JSON} error.diff.audio The expected and received audio tracks.
                         * @param {Number} error.diff.audio.expected The expected audio tracks.
                         * @param {Number} error.diff.audio.received The received audio tracks.
                         * @param {Number} state The fallback state.
                         *   [Rel: Skylink.MEDIA_ACCESS_FALLBACK_STATE]
                         * @param {Boolean} isScreensharing The flag if event occurred during
                         *   <a href="#method_shareScreen"><code>shareScreen()</code> method</a> and not
                         *   <a href="#method_getUserMedia"><code>getUserMedia()</code> method</a>.
                         * @param {Boolean} isAudioFallback The flag if event occurred during
                         *   retrieval of audio tracks only when <a href="#method_getUserMedia"><code>getUserMedia()</code> method</a>
                         *   had failed to retrieve both audio and video tracks.
                         * @param {String} streamId The Stream ID.
                         *   <small>Defined only when <code>state</code> payload is <code>FALLBACKED</code>.</small>
                         * @for Skylink
                         * @since 0.6.3
                         */
                        mediaAccessFallback: [],
                      
                        /**
                         * Event triggered when retrieval of Stream is successful.
                         * @event mediaAccessSuccess
                         * @param {MediaStream} stream The Stream object.
                         *   <small>To attach it to an element: <code>attachMediaStream(videoElement, stream);</code>.</small>
                         * @param {Boolean} isScreensharing The flag if event occurred during
                         *   <a href="#method_shareScreen"><code>shareScreen()</code> method</a> and not
                         *   <a href="#method_getUserMedia"><code>getUserMedia()</code> method</a>.
                         * @param {Boolean} isAudioFallback The flag if event occurred during
                         *   retrieval of audio tracks only when <a href="#method_getUserMedia"><code>getUserMedia()</code> method</a>
                         *   had failed to retrieve both audio and video tracks.
                         * @param {String} streamId The Stream ID.
                         * @for Skylink
                         * @since 0.1.0
                         */
                        mediaAccessSuccess: [],
                      
                        /**
                         * Event triggered when retrieval of Stream is required to complete <a href="#method_joinRoom">
                         * <code>joinRoom()</code> method</a> request.
                         * @event mediaAccessRequired
                         * @for Skylink
                         * @since 0.5.5
                         */
                        mediaAccessRequired: [],
                      
                        /**
                         * Event triggered when Stream has stopped streaming.
                         * @event mediaAccessStopped
                         * @param {Boolean} isScreensharing The flag if event occurred during
                         *   <a href="#method_shareScreen"><code>shareScreen()</code> method</a> and not
                         *   <a href="#method_getUserMedia"><code>getUserMedia()</code> method</a>.
                         * @param {Boolean} isAudioFallback The flag if event occurred during
                         *   retrieval of audio tracks only when <a href="#method_getUserMedia"><code>getUserMedia()</code> method</a>
                         *   had failed to retrieve both audio and video tracks.
                         * @param {String} streamId The Stream ID.
                         * @for Skylink
                         * @since 0.5.6
                         */
                        mediaAccessStopped: [],
                      
                        /**
                         * Event triggered when a Peer joins the room.
                         * @event peerJoined
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} peerInfo The Peer session information.
                         * @param {JSON|String} peerInfo.userData The Peer current custom data.
                         * @param {JSON} peerInfo.settings The Peer sending Stream settings.
                         * @param {Boolean|JSON} peerInfo.settings.data The flag if Peer has any Datachannel connections enabled.
                         *   <small>If <code>isSelf</code> value is <code>true</code>, this determines if User allows
                         *   Datachannel connections, else if value is <code>false</code>, this determines if Peer has any active
                         *   Datachannel connections (where <a href="#event_dataChannelState"><code>dataChannelState</code> event</a>
                         *   triggers <code>state</code> as <code>OPEN</code> and <code>channelType</code> as
                         *   <code>MESSAGING</code> for Peer) with Peer.</small>
                         * @param {Boolean|JSON} peerInfo.settings.audio The Peer Stream audio settings.
                         *   <small>When defined as <code>false</code>, it means there is no audio being sent from Peer.</small>
                         *   <small>When defined as <code>true</code>, the <code>peerInfo.settings.audio.stereo</code> value is
                         *   considered as <code>false</code> and the <code>peerInfo.settings.audio.exactConstraints</code>
                         *   value is considered as <code>false</code>.</small>
                         * @param {Boolean} peerInfo.settings.audio.stereo The flag if stereo band is configured
                         *   when encoding audio codec is <a href="#attr_AUDIO_CODEC"><code>OPUS</code></a> for receiving audio data.
                         * @param {Boolean} [peerInfo.settings.audio.usedtx] <blockquote class="info">
                         *   Note that this feature might not work depending on the browser support and implementation.</blockquote>
                         *   The flag if DTX (Discontinuous Transmission) is configured when encoding audio codec
                         *   is <a href="#attr_AUDIO_CODEC"><code>OPUS</code></a> for sending audio data.
                         *   <small>This might help to reduce bandwidth it reduces the bitrate during silence or background noise.</small>
                         *   <small>When not defined, the default browser configuration is used.</small>
                         * @param {Boolean} [peerInfo.settings.audio.useinbandfec] <blockquote class="info">
                         *   Note that this feature might not work depending on the browser support and implementation.</blockquote>
                         *   The flag if capability to take advantage of in-band FEC (Forward Error Correction) is
                         *   configured when encoding audio codec is <a href="#attr_AUDIO_CODEC"><code>OPUS</code></a> for sending audio data.
                         *   <small>This might help to reduce the harm of packet loss by encoding information about the previous packet.</small>
                         *   <small>When not defined, the default browser configuration is used.</small>
                         * @param {Number} [peerInfo.settings.audio.maxplaybackrate] <blockquote class="info">
                         *   Note that this feature might not work depending on the browser support and implementation.</blockquote>
                         *   The maximum output sampling rate rendered in Hertz (Hz) when encoding audio codec is
                         *   <a href="#attr_AUDIO_CODEC"><code>OPUS</code></a> for sending audio data.
                         *   <small>This value must be between <code>8000</code> to <code>48000</code>.</small>
                         *   <small>When not defined, the default browser configuration is used.</small>
                         * @param {Boolean} peerInfo.settings.audio.echoCancellation The flag if echo cancellation is enabled for audio tracks.
                         * @param {Array} [peerInfo.settings.audio.optional] The Peer Stream <code>navigator.getUserMedia()</code> API
                         *   <code>audio: { optional [..] }</code> property.
                         * @param {String} [peerInfo.settings.audio.deviceId] The Peer Stream audio track source ID of the device used.
                         * @param {Boolean} peerInfo.settings.audio.exactConstraints The flag if Peer Stream audio track is sending exact
                         *   requested values of <code>peerInfo.settings.audio.deviceId</code> when provided.
                         * @param {Boolean|JSON} peerInfo.settings.video The Peer Stream video settings.
                         *   <small>When defined as <code>false</code>, it means there is no video being sent from Peer.</small>
                         *   <small>When defined as <code>true</code>, the <code>peerInfo.settings.video.screenshare</code> value is
                         *   considered as <code>false</code>  and the <code>peerInfo.settings.video.exactConstraints</code>
                         *   value is considered as <code>false</code>.</small>
                         * @param {JSON} [peerInfo.settings.video.resolution] The Peer Stream video resolution.
                         *   [Rel: Skylink.VIDEO_RESOLUTION]
                         * @param {Number|JSON} peerInfo.settings.video.resolution.width The Peer Stream video resolution width or
                         *   video resolution width settings.
                         *   <small>When defined as a JSON object, it is the user set resolution width settings with (<code>"min"</code> or
                         *   <code>"max"</code> or <code>"ideal"</code> or <code>"exact"</code> etc configurations).</small>
                         * @param {Number|JSON} peerInfo.settings.video.resolution.height The Peer Stream video resolution height or
                         *   video resolution height settings.
                         *   <small>When defined as a JSON object, it is the user set resolution height settings with (<code>"min"</code> or
                         *   <code>"max"</code> or <code>"ideal"</code> or <code>"exact"</code> etc configurations).</small>
                         * @param {Number|JSON} [peerInfo.settings.video.frameRate] The Peer Stream video
                         *   <a href="https://en.wikipedia.org/wiki/Frame_rate">frameRate</a> per second (fps) or video frameRate settings.
                         *   <small>When defined as a JSON object, it is the user set frameRate settings with (<code>"min"</code> or
                         *   <code>"max"</code> or <code>"ideal"</code> or <code>"exact"</code> etc configurations).</small>
                         * @param {Boolean} peerInfo.settings.video.screenshare The flag if Peer Stream is a screensharing Stream.
                         * @param {Array} [peerInfo.settings.video.optional] The Peer Stream <code>navigator.getUserMedia()</code> API
                         *   <code>video: { optional [..] }</code> property.
                         * @param {String} [peerInfo.settings.video.deviceId] The Peer Stream video track source ID of the device used.
                         * @param {Boolean} peerInfo.settings.video.exactConstraints The flag if Peer Stream video track is sending exact
                         *   requested values of <code>peerInfo.settings.video.resolution</code>,
                         *   <code>peerInfo.settings.video.frameRate</code> and <code>peerInfo.settings.video.deviceId</code>
                         *   when provided.
                         * @param {String|JSON} [peerInfo.settings.video.facingMode] The Peer Stream video camera facing mode.
                         *   <small>When defined as a JSON object, it is the user set facingMode settings with (<code>"min"</code> or
                         *   <code>"max"</code> or <code>"ideal"</code> or <code>"exact"</code> etc configurations).</small>
                         * @param {JSON} peerInfo.settings.bandwidth The maximum streaming bandwidth sent from Peer.
                         * @param {Number} [peerInfo.settings.bandwidth.audio] The maximum audio streaming bandwidth sent from Peer.
                         * @param {Number} [peerInfo.settings.bandwidth.video] The maximum video streaming bandwidth sent from Peer.
                         * @param {Number} [peerInfo.settings.bandwidth.data] The maximum data streaming bandwidth sent from Peer.
                         * @param {JSON} peerInfo.settings.googleXBandwidth <blockquote class="info">
                         *   Note that this feature might not work depending on the browser support and implementation,
                         *   and its properties and values are only defined for User's end and cannot be viewed
                         *   from Peer's end (when <code>isSelf</code> value is <code>false</code>).</blockquote>
                         *   The experimental google video streaming bandwidth sent to Peers.
                         * @param {Number} [peerInfo.settings.googleXBandwidth.min] The minimum experimental google video streaming bandwidth sent to Peers.
                         * @param {Number} [peerInfo.settings.googleXBandwidth.max] The maximum experimental google video streaming bandwidth sent to Peers.
                         * @param {JSON} peerInfo.mediaStatus The Peer Stream muted settings.
                         * @param {Boolean} peerInfo.mediaStatus.audioMuted The flag if Peer Stream audio tracks is muted or not.
                         *   <small>If Peer <code>peerInfo.settings.audio</code> is false, this will be defined as <code>true</code>.</small>
                         * @param {Boolean} peerInfo.mediaStatus.videoMuted The flag if Peer Stream video tracks is muted or not.
                         *   <small>If Peer <code>peerInfo.settings.video</code> is false, this will be defined as <code>true</code>.</small>
                         * @param {JSON} peerInfo.agent The Peer agent information.
                         * @param {String} peerInfo.agent.name The Peer agent name.
                         *   <small>Data may be accessing browser or non-Web SDK name.</small>
                         * @param {Number} peerInfo.agent.version The Peer agent version.
                         *   <small>Data may be accessing browser or non-Web SDK version. If the original value is <code>"0.9.6.1"</code>,
                         *   it will be interpreted as <code>0.90601</code> where <code>0</code> helps to seperate the minor dots.</small>
                         * @param {String} [peerInfo.agent.os] The Peer platform name.
                         *  <small>Data may be accessing OS platform version from Web SDK.</small>
                         * @param {String} [peerInfo.agent.pluginVersion] The Peer Temasys Plugin version.
                         *  <small>Defined only when Peer is using the Temasys Plugin (IE / Safari).</small>
                         * @param {String} peerInfo.agent.DTProtocolVersion The Peer data transfer (DT) protocol version.
                         * @param {String} peerInfo.agent.SMProtocolVersion The Peer signaling message (SM) protocol version.
                         * @param {String} peerInfo.room The Room Peer is from.
                         * @param {JSON} peerInfo.config The Peer connection configuration.
                         * @param {Boolean} peerInfo.config.enableIceTrickle The flag if Peer connection has
                         *   trickle ICE enabled or faster connectivity.
                         * @param {Boolean} peerInfo.config.enableDataChannel The flag if Datachannel connections would be enabled for Peer.
                         * @param {Boolean} peerInfo.config.enableIceRestart The flag if Peer connection has ICE connection restart support.
                         *   <small>Note that ICE connection restart support is not honoured for MCU enabled Peer connection.</small>
                         * @param {Number} peerInfo.config.priorityWeight The flag if Peer or User should be the offerer.
                         *   <small>If User's <code>priorityWeight</code> is higher than Peer's, User is the offerer, else Peer is.
                         *   However for the case where the MCU is connected, User will always be the offerer.</small>
                         * @param {Boolean} peerInfo.config.publishOnly The flag if Peer is publishing only stream but not receiving streams.
                         * @param {Boolean} peerInfo.config.receiveOnly The flag if Peer is receiving only streams but not publishing stream.
                         * @param {String} [peerInfo.parentId] The parent Peer ID that it is matched to for multi-streaming connections.
                         * @param {Boolean} [peerInfo.connected] The flag if Peer ICE connection has been established successfully.
                         *  <small>Defined only when <code>isSelf</code> payload value is <code>false</code>.</small>
                         * @param {Boolean} [peerInfo.init] The flag if Peer connection has been created successfully.
                         *  <small>Defined only when <code>isSelf</code> payload value is <code>false</code>.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @for Skylink
                         * @since 0.5.2
                         */
                        peerJoined: [],
                      
                        /**
                         * Event triggered when a Peer connection has been refreshed.
                         * @event peerRestart
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} peerInfo The Peer session information.
                         *   <small>Object signature matches the <code>peerInfo</code> parameter payload received in the
                         *   <a href="#event_peerJoined"><code>peerJoined</code> event</a>.</small>
                         * @param {Boolean} isSelfInitiateRestart The flag if User is initiating the Peer connection refresh.
                         * @param {Boolean} isIceRestart The flag if Peer connection ICE connection will restart.
                         * @for Skylink
                         * @since 0.5.5
                         */
                        peerRestart: [],
                      
                        /**
                         * Event triggered when a Peer session information has been updated.
                         * @event peerUpdated
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} peerInfo The Peer session information.
                         *   <small>Object signature matches the <code>peerInfo</code> parameter payload received in the
                         *   <a href="#event_peerJoined"><code>peerJoined</code> event</a>.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @for Skylink
                         * @since 0.5.2
                         */
                        peerUpdated: [],
                      
                        /**
                         * Event triggered when a Peer leaves the room.
                         * @event peerLeft
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} peerInfo The Peer session information.
                         *   <small>Object signature matches the <code>peerInfo</code> parameter payload received in the
                         *   <a href="#event_peerJoined"><code>peerJoined</code> event</a>.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @for Skylink
                         * @since 0.5.2
                         */
                        peerLeft: [],
                      
                        /**
                         * Event triggered when Room session has ended abruptly due to network disconnections.
                         * @event sessionDisconnect
                         * @param {String} peerId The User's Room session Peer ID.
                         * @param {JSON} peerInfo The User's Room session information.
                         *   <small>Object signature matches the <code>peerInfo</code> parameter payload received in the
                         *   <a href="#event_peerJoined"><code>peerJoined</code> event</a>.</small>
                         * @for Skylink
                         * @since 0.6.10
                         */
                        sessionDisconnect: [],
                      
                        /**
                         * Event triggered when receiving Peer Stream.
                         * @event incomingStream
                         * @param {String} peerId The Peer ID.
                         * @param {MediaStream} stream The Stream object.
                         *   <small>To attach it to an element: <code>attachMediaStream(videoElement, stream);</code>.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @param {JSON} peerInfo The Peer session information.
                         *   <small>Object signature matches the <code>peerInfo</code> parameter payload received in the
                         *   <a href="#event_peerJoined"><code>peerJoined</code> event</a>.</small>
                         * @param {Boolean} isScreensharing The flag if Peer Stream is a screensharing Stream.
                         * @param {String} streamId The Stream ID.
                         * @for Skylink
                         * @since 0.5.5
                         */
                        incomingStream: [],
                      
                        /**
                         * Event triggered when receiving message from Peer.
                         * @event incomingMessage
                         * @param {JSON} message The message result.
                         * @param {JSON|String} message.content The message object.
                         * @param {String} message.senderPeerId The sender Peer ID.
                         * @param {String|Array} [message.targetPeerId] The value of the <code>targetPeerId</code>
                         *   defined in <a href="#method_sendP2PMessage"><code>sendP2PMessage()</code> method</a> or
                         *   <a href="#method_sendMessage"><code>sendMessage()</code> method</a>.
                         *   <small>Defined as User's Peer ID when <code>isSelf</code> payload value is <code>false</code>.</small>
                         *   <small>Defined as <code>null</code> when provided <code>targetPeerId</code> in
                         *   <a href="#method_sendP2PMessage"><code>sendP2PMessage()</code> method</a> or
                         *   <a href="#method_sendMessage"><code>sendMessage()</code> method</a> is not defined.</small>
                         * @param {Array} [message.listOfPeers] The list of Peers that the message has been sent to.
                         *  <small>Defined only when <code>isSelf</code> payload value is <code>true</code>.</small>
                         * @param {Boolean} message.isPrivate The flag if message is targeted or not, basing
                         *   off the <code>targetPeerId</code> parameter being defined in
                         *   <a href="#method_sendP2PMessage"><code>sendP2PMessage()</code> method</a> or
                         *   <a href="#method_sendMessage"><code>sendMessage()</code> method</a>.
                         * @param {Boolean} message.isDataChannel The flag if message is sent from
                         *   <a href="#method_sendP2PMessage"><code>sendP2PMessage()</code> method</a>.
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} peerInfo The Peer session information.
                         *   <small>Object signature matches the <code>peerInfo</code> parameter payload received in the
                         *   <a href="#event_peerJoined"><code>peerJoined</code> event</a>.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @for Skylink
                         * @since 0.5.2
                         */
                        incomingMessage: [],
                      
                        /**
                         * Event triggered when receiving completed data transfer from Peer.
                         * @event incomingData
                         * @param {Blob|String} data The data.
                         * @param {String} transferId The data transfer ID.
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} transferInfo The data transfer information.
                         *   <small>Object signature matches the <code>transferInfo</code> parameter payload received in the
                         *   <a href="#event_dataTransferState"><code>dataTransferState</code> event</a>
                         *   except without the <code>data</code> property.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @for Skylink
                         * @since 0.6.1
                         */
                        incomingData: [],
                      
                        /**
                         * Event triggered when receiving upload data transfer from Peer.
                         * @event incomingDataRequest
                         * @param {String} transferId The transfer ID.
                         * @param {String} peerId The Peer ID.
                         * @param {String} transferInfo The data transfer information.
                         *   <small>Object signature matches the <code>transferInfo</code> parameter payload received in the
                         *   <a href="#event_dataTransferState"><code>dataTransferState</code> event</a>
                         *   except without the <code>data</code> property.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @for Skylink
                         * @since 0.6.1
                         */
                        incomingDataRequest: [],
                      
                        /**
                         * Event triggered when data streaming session has been started from Peer to User.
                         * @event incomingDataStreamStarted
                         * @param {String} streamId The data streaming session ID.
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} streamInfo The data streaming session information.
                         *   <small>Object signature matches the <code>streamInfo</code> parameter payload received in the
                         *   <a href="#event_dataStreamState"><code>dataStreamState</code> event</a>
                         *   except without the <code>chunk</code> property.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @beta
                         * @for Skylink
                         * @since 0.6.18
                         */
                        incomingDataStreamStarted: [],
                      
                        /**
                         * Event triggered when data streaming session has been stopped from Peer to User.
                         * @event incomingDataStreamStopped
                         * @param {String} streamId The data streaming session ID.
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} streamInfo The data streaming session information.
                         *   <small>Object signature matches the <code>streamInfo</code> parameter payload received in the
                         *   <a href="#event_dataStreamState"><code>dataStreamState</code> event</a>
                         *   except without the <code>chunk</code> property.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @beta
                         * @for Skylink
                         * @since 0.6.18
                         */
                        incomingDataStreamStopped: [],
                      
                        /**
                         * Event triggered when data streaming session has been stopped from Peer to User.
                         * @event incomingDataStream
                         * @param {Blob|String} chunk The data chunk received.
                         * @param {String} streamId The data streaming session ID.
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} streamInfo The data streaming session information.
                         *   <small>Object signature matches the <code>streamInfo</code> parameter payload received in the
                         *   <a href="#event_dataStreamState"><code>dataStreamState</code> event</a>
                         *   except without the <code>chunk</code> property.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @beta
                         * @for Skylink
                         * @since 0.6.18
                         */
                        incomingDataStream: [],
                      
                        /**
                         * Event triggered when Room locked status has changed.
                         * @event roomLock
                         * @param {Boolean} isLocked The flag if Room is locked.
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} peerInfo The Peer session information.
                         *   <small>Object signature matches the <code>peerInfo</code> parameter payload received in the
                         *   <a href="#event_peerJoined"><code>peerJoined</code> event</a>.</small>
                         * @param {Boolean} isSelf The flag if User changed the Room locked status.
                         * @for Skylink
                         * @since 0.5.2
                         */
                        roomLock: [],
                      
                        /**
                         * Event triggered when a Datachannel connection state has changed.
                         * @event dataChannelState
                         * @param {String} state The current Datachannel connection state.
                         *   [Rel: Skylink.DATA_CHANNEL_STATE]
                         * @param {String} peerId The Peer ID.
                         * @param {Error} [error] The error object.
                         *   <small>Defined only when <code>state</code> payload is <code>ERROR</code> or <code>SEND_MESSAGE_ERROR</code>.</small>
                         * @param {String} channelName The Datachannel ID.
                         * @param {String} channelType The Datachannel type.
                         *   [Rel: Skylink.DATA_CHANNEL_TYPE]
                         * @param {String} messageType The Datachannel sending Datachannel message error type.
                         *   <small>Defined only when <cod>state</code> payload is <code>SEND_MESSAGE_ERROR</code>.</small>
                         *   [Rel: Skylink.DATA_CHANNEL_MESSAGE_ERROR]
                         * @param {JSON} bufferAmount The Datachannel buffered amount information.
                         * @param {Number} bufferAmount.bufferedAmountLow The size of currently queued data to send on the Datachannel connection.
                         * @param {Number} bufferAmount.bufferedAmountLowThreshold The current buffered amount low threshold configured.
                         * @for Skylink
                         * @since 0.1.0
                         */
                        dataChannelState: [],
                      
                        /**
                         * Event triggered when a data transfer state has changed.
                         * @event dataTransferState
                         * @param {String} state The current data transfer state.
                         *   [Rel: Skylink.DATA_TRANSFER_STATE]
                         * @param {String} transferId The data transfer ID.
                         *   <small>Note that this is defined as <code>null</code> when <code>state</code> payload is <code>START_ERROR</code>.</small>
                         * @param {String} peerId The Peer ID.
                         *   <small>Note that this could be defined as <code>null</code> when <code>state</code> payload is
                         *   <code>START_ERROR</code> and there is no Peers to start data transfer with.</small>
                         * @param {JSON} transferInfo The data transfer information.
                         * @param {Blob|String} [transferInfo.data] The data object.
                         *   <small>Defined only when <code>state</code> payload is <code>UPLOAD_STARTED</code> or
                         *   <code>DOWNLOAD_COMPLETED</code>.</small>
                         * @param {String} transferInfo.name The data transfer name.
                         * @param {Number} transferInfo.size The data transfer data object size.
                         * @param {String} transferInfo.dataType The data transfer session type.
                         *   [Rel: Skylink.DATA_TRANSFER_SESSION_TYPE]
                         * @param {String} transferInfo.chunkType The data transfer type of data chunk being used to send to Peer for transfers.
                         *   <small>For <a href="#method_sendBlobData"><code>sendBlobData()</code> method</a> data transfers, the
                         *   initial data chunks value may change depending on the currently received data chunk type or the
                         *   agent supported sending type of data chunks.</small>
                         *   <small>For <a href="#method_sendURLData"><code>sendURLData()</code> method</a> data transfers, it is
                         *   <code>STRING</code> always.</small>
                         *   [Rel: Skylink.DATA_TRANSFER_DATA_TYPE]
                         * @param {String} [transferInfo.mimeType] The data transfer data object MIME type.
                         *   <small>Defined only when <a href="#method_sendBlobData"><code>sendBlobData()</code> method</a>
                         *   data object sent MIME type information is defined.</small>
                         * @param {Number} transferInfo.chunkSize The data transfer data chunk size.
                         * @param {Number} transferInfo.percentage The data transfer percentage of completion progress.
                         * @param {Number} transferInfo.timeout The flag if data transfer is targeted or not, basing
                         *   off the <code>targetPeerId</code> parameter being defined in
                         *   <a href="#method_sendURLData"><code>sendURLData()</code> method</a> or
                         *   <a href="#method_sendBlobData"><code>sendBlobData()</code> method</a>.
                         * @param {Boolean} transferInfo.isPrivate The flag if message is targeted or not, basing
                         *   off the <code>targetPeerId</code> parameter being defined in
                         *   <a href="#method_sendBlobData"><code>sendBlobData()</code> method</a> or
                         *   <a href="#method_sendURLData"><code>sendURLData()</code> method</a>.
                         * @param {String} transferInfo.direction The data transfer direction.
                         *   [Rel: Skylink.DATA_TRANSFER_TYPE]
                         * @param {JSON} [error] The error result.
                         *   <small>Defined only when <code>state</code> payload is <code>ERROR</code>, <code>CANCEL</code>,
                         *   <code>REJECTED</code>, <code>START_ERROR</code> or <code>USER_REJECTED</code>.</small>
                         * @param {Error|String} error.message The error object.
                         * @param {String} error.transferType The data transfer direction from where the error occurred.
                         *   [Rel: Skylink.DATA_TRANSFER_TYPE]
                         * @for Skylink
                         * @since 0.4.1
                         */
                        dataTransferState: [],
                      
                        /**
                         * Event triggered when a data streaming state has changed.
                         * @event dataStreamState
                         * @param {String} state The current data streaming state.
                         *   [Rel: Skylink.DATA_STREAM_STATE]
                         * @param {String} streamId The data streaming session ID.
                         *   <small>Note that this is defined as <code>null</code> when <code>state</code> payload is <code>START_ERROR</code>.</small>
                         * @param {String} peerId The Peer ID.
                         *   <small>Note that this could be defined as <code>null</code> when <code>state</code> payload is
                         *   <code>START_ERROR</code> and there is no Peers to start data streaming with.</small>
                         * @param {JSON} streamInfo The data streaming information.
                         * @param {Blob|String} [streamInfo.chunk] The data chunk received.
                         *   <small>Defined only when <code>state</code> payload is <code>RECEIVED</code> or <code>SENT</code>.</small>
                         * @param {Number} streamInfo.chunkSize The data streaming data chunk size received.
                         * @param {String} streamInfo.chunkType The data streaming data chunk type received.
                         *   <small>The initial data chunks value may change depending on the currently received data chunk type or the
                         *   agent supported sending type of data chunks.</small>
                         *   [Rel: Skylink.DATA_TRANSFER_DATA_TYPE]
                         * @param {String} streamInfo.isStringStream The flag if data streaming data chunks are strings.
                         * @param {Boolean} streamInfo.isPrivate The flag if data streaming is targeted or not, basing
                         *   off the <code>targetPeerId</code> parameter being defined in
                         *   <a href="#method_startStreamingData"><code>startStreamingData()</code> method</a>.
                         * @param {String} streamInfo.senderPeerId The sender Peer ID.
                         * @param {Error} [error] The error object.
                         *   <small>Defined only when <code>state</code> payload is <code>ERROR</code> or <code>START_ERROR</code>,.</small>
                         * @beta
                         * @for Skylink
                         * @since 0.6.18
                         */
                        dataStreamState: [],
                      
                        /**
                         * Event triggered when Signaling server reaction state has changed.
                         * @event systemAction
                         * @param {String} action The current Signaling server reaction state.
                         *   [Rel: Skylink.SYSTEM_ACTION]
                         * @param {String} message The message.
                         * @param {String} reason The Signaling server reaction state reason of action code.
                         *   [Rel: Skylink.SYSTEM_ACTION_REASON]
                         * @for Skylink
                         * @since 0.5.1
                         */
                        systemAction: [],
                      
                        /**
                         * Event triggered when a server Peer joins the room.
                         * @event serverPeerJoined
                         * @param {String} peerId The Peer ID.
                         * @param {String} serverPeerType The server Peer type
                         *   [Rel: Skylink.SERVER_PEER_TYPE]
                         * @for Skylink
                         * @since 0.6.1
                         */
                        serverPeerJoined: [],
                      
                        /**
                         * Event triggered when a server Peer leaves the room.
                         * @event serverPeerLeft
                         * @param {String} peerId The Peer ID.
                         * @param {String} serverPeerType The server Peer type
                         *   [Rel: Skylink.SERVER_PEER_TYPE]
                         * @for Skylink
                         * @since 0.6.1
                         */
                        serverPeerLeft: [],
                      
                        /**
                         * Event triggered when a server Peer connection has been refreshed.
                         * @event serverPeerRestart
                         * @param {String} peerId The Peer ID.
                         * @param {String} serverPeerType The server Peer type
                         *   [Rel: Skylink.SERVER_PEER_TYPE]
                         * @for Skylink
                         * @since 0.6.1
                         */
                        serverPeerRestart: [],
                      
                        /**
                         * Event triggered when a Peer Stream streaming has stopped.
                         * <small>Note that it may not be the currently sent Stream to User, and it also triggers
                         * when User leaves the Room for any currently sent Stream to User from Peer.</small>
                         * @event streamEnded
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} peerInfo The Peer session information.
                         *   <small>Object signature matches the <code>peerInfo</code> parameter payload received in the
                         *   <a href="#event_peerJoined"><code>peerJoined</code> event</a>.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @param {Boolean} isScreensharing The flag if Peer Stream is a screensharing Stream.
                         * @param {String} streamId The Stream ID.
                         * @for Skylink
                         * @since 0.5.10
                         */
                        streamEnded: [],
                      
                        /**
                         * Event triggered when Peer Stream audio or video tracks has been muted / unmuted.
                         * @event streamMuted
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} peerInfo The Peer session information.
                         *   <small>Object signature matches the <code>peerInfo</code> parameter payload received in the
                         *   <a href="#event_peerJoined"><code>peerJoined</code> event</a>.</small>
                         * @param {Boolean} isSelf The flag if Peer is User.
                         * @param {Boolean} isScreensharing The flag if Peer Stream is a screensharing Stream.
                         * @for Skylink
                         * @since 0.6.1
                         */
                        streamMuted: [],
                      
                        /**
                         * Event triggered when <a href="#method_getPeers"><code>getPeers()</code> method</a> retrieval state changes.
                         * @event getPeersStateChange
                         * @param {String} state The current <code>getPeers()</code> retrieval state.
                         *   [Rel: Skylink.GET_PEERS_STATE]
                         * @param {String} privilegedPeerId The User's privileged Peer ID.
                         * @param {JSON} peerList The list of Peer IDs Rooms within the same App space.
                         * @param {Array} peerList.#room The list of Peer IDs associated with the Room defined in <code>#room</code> property.
                         * @for Skylink
                         * @since 0.6.1
                         */
                        getPeersStateChange: [],
                      
                        /**
                         * Event triggered when <a href="#method_introducePeer"><code>introducePeer()</code> method</a>
                         * introduction request state changes.
                         * @event introduceStateChange
                         * @param {String} state The current <code>introducePeer()</code> introduction request state.
                         *   [Rel: Skylink.INTRODUCE_STATE]
                         * @param {String} privilegedPeerId The User's privileged Peer ID.
                         * @param {String} sendingPeerId The Peer ID to be connected with <code>receivingPeerId</code>.
                         * @param {String} receivingPeerId The Peer ID to be connected with <code>sendingPeerId</code>.
                         * @param {String} [reason] The error object.
                         *   <small>Defined only when <code>state</code> payload is <code>ERROR</code>.</small>
                         * @for Skylink
                         * @since 0.6.1
                         */
                        introduceStateChange: [],
                      
                        /**
                         * Event triggered when recording session state has changed.
                         * @event recordingState
                         * @param {Number} state The current recording session state.
                         *   [Rel: Skylink.RECORDING_STATE]
                         * @param {String} recordingId The recording session ID.
                         * @param {JSON} link The recording session mixin videos link in
                         *   <a href="https://en.wikipedia.org/wiki/MPEG-4_Part_14">MP4</a> format.
                         *   <small>Defined only when <code>state</code> payload is <code>LINK</code>.</small>
                         * @param {String} link.#peerId The recording session recorded Peer only video associated
                         *   with the Peer ID defined in <code>#peerId</code> property.
                         *   <small>If <code>#peerId</code> value is <code>"mixin"</code>, it means that is the mixin
                         *   video of all Peers in the Room.</small>
                         * @param {Error|String} error The error object.
                         *   <small>Defined only when <code>state</code> payload is <code>ERROR</code>.</small>
                         * @beta
                         * @for Skylink
                         * @since 0.6.16
                         */
                        recordingState: [],
                      
                        /**
                         * Event triggered when <a href="#method_getConnectionStatus"><code>getConnectionStatus()</code> method</a>
                         * retrieval state changes.
                         * @event getConnectionStatusStateChange
                         * @param {Number} state The current <code>getConnectionStatus()</code> retrieval state.
                         *   [Rel: Skylink.GET_CONNECTION_STATUS_STATE]
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} [stats] The Peer connection current stats.
                         *   <small>Defined only when <code>state</code> payload is <code>RETRIEVE_SUCCESS</code>.</small>
                         * @param {JSON} stats.raw The Peer connection raw stats before parsing.
                         * @param {JSON} stats.audio The Peer connection audio streaming stats.
                         * @param {JSON} stats.audio.sending The Peer connection sending audio streaming stats.
                         * @param {Number} stats.audio.sending.bytes The Peer connection current sending audio streaming bytes.
                         *   <small>Note that value is in bytes so you have to convert that to bits for displaying for an example kbps.</small>
                         * @param {Number} stats.audio.sending.totalBytes The Peer connection total sending audio streaming bytes.
                         *   <small>Note that value is in bytes so you have to convert that to bits for displaying for an example kbps.</small>
                         * @param {Number} stats.audio.sending.packets The Peer connection current sending audio streaming packets.
                         * @param {Number} stats.audio.sending.totalPackets The Peer connection total sending audio streaming packets.
                         * @param {Number} stats.audio.sending.packetsLost <blockquote class="info">
                         *   This property has been deprecated and would be removed in future releases
                         *   as it should not be in <code>sending</code> property.
                         *   </blockquote> The Peer connection current sending audio streaming packets lost.
                         * @param {Number} stats.audio.sending.totalPacketsLost <blockquote class="info">
                         *   This property has been deprecated and would be removed in future releases
                         *   as it should not be in <code>sending</code> property.
                         *   </blockquote> The Peer connection total sending audio streaming packets lost.
                         * @param {Number} stats.audio.sending.ssrc The Peer connection sending audio streaming RTP packets SSRC.
                         * @param {Number} stats.audio.sending.rtt The Peer connection sending audio streaming RTT (Round-trip delay time).
                         *   <small>Defined as <code>0</code> if it's not present in original raw stats before parsing.</small>
                         * @param {Number} stats.audio.sending.jitter <blockquote class="info">
                         *   This property has been deprecated and would be removed in future releases
                         *   as it should not be in <code>sending</code> property.
                         *   </blockquote> The Peer connection sending audio streaming RTP packets jitter in seconds.
                         *   <small>Defined as <code>0</code> if it's not present in original raw stats before parsing.</small>
                         * @param {Number} [stats.audio.sending.jitterBufferMs] <blockquote class="info">
                         *   This property has been deprecated and would be removed in future releases
                         *   as it should not be in <code>sending</code> property.
                         *   </blockquote> The Peer connection sending audio streaming
                         *   RTP packets jitter buffer in miliseconds.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} [stats.audio.sending.codec] The Peer connection sending audio streaming selected codec information.
                         *   <small>Defined as <code>null</code> if local session description is not available before parsing.</small>
                         * @param {String} stats.audio.sending.codec.name The Peer connection sending audio streaming selected codec name.
                         * @param {Number} stats.audio.sending.codec.payloadType The Peer connection sending audio streaming selected codec payload type.
                         * @param {String} [stats.audio.sending.codec.implementation] The Peer connection sending audio streaming selected codec implementation.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.audio.sending.codec.channels] The Peer connection sending audio streaming selected codec channels (2 for stereo).
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing,
                         *   and this is usually present in <code>stats.audio</code> property.</small>
                         * @param {Number} [stats.audio.sending.codec.clockRate] The Peer connection sending audio streaming selected codec media sampling rate.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.audio.sending.codec.params] The Peer connection sending audio streaming selected codec parameters.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.audio.sending.inputLevel] The Peer connection sending audio streaming input level.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.audio.sending.echoReturnLoss] The Peer connection sending audio streaming echo return loss in db (decibels).
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.audio.sending.echoReturnLossEnhancement] The Peer connection sending audio streaming
                         *   echo return loss enhancement db (decibels).
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} stats.audio.receiving The Peer connection receiving audio streaming stats.
                         * @param {Number} stats.audio.receiving.bytes The Peer connection current sending audio streaming bytes.
                         *   <small>Note that value is in bytes so you have to convert that to bits for displaying for an example kbps.</small>
                         * @param {Number} stats.audio.receiving.totalBytes The Peer connection total sending audio streaming bytes.
                         *   <small>Note that value is in bytes so you have to convert that to bits for displaying for an example kbps.</small>
                         * @param {Number} stats.audio.receiving.packets The Peer connection current receiving audio streaming packets.
                         * @param {Number} stats.audio.receiving.totalPackets The Peer connection total receiving audio streaming packets.
                         * @param {Number} stats.audio.receiving.packetsLost The Peer connection current receiving audio streaming packets lost.
                         * @param {Number} stats.audio.receiving.fractionLost The Peer connection current receiving audio streaming fraction packets lost.
                         * @param {Number} stats.audio.receiving.packetsDiscarded The Peer connection current receiving audio streaming packets discarded.
                         * @param {Number} stats.audio.receiving.totalPacketsLost The Peer connection total receiving audio streaming packets lost.
                         * @param {Number} stats.audio.receiving.totalPacketsDiscarded The Peer connection total receiving audio streaming packets discarded.
                         * @param {Number} stats.audio.receiving.ssrc The Peer connection receiving audio streaming RTP packets SSRC.
                         * @param {Number} stats.audio.receiving.jitter The Peer connection receiving audio streaming RTP packets jitter in seconds.
                         *   <small>Defined as <code>0</code> if it's not present in original raw stats before parsing.</small>
                         * @param {Number} [stats.audio.receiving.jitterBufferMs] The Peer connection receiving audio streaming
                         *   RTP packets jitter buffer in miliseconds.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} [stats.audio.receiving.codec] The Peer connection receiving audio streaming selected codec information.
                         *   <small>Defined as <code>null</code> if remote session description is not available before parsing.</small>
                         *   <small>Note that if the value is polyfilled, the value may not be accurate since the remote Peer can override the selected codec.
                         *   The value is derived from the remote session description.</small>
                         * @param {String} stats.audio.receiving.codec.name The Peer connection receiving audio streaming selected codec name.
                         * @param {Number} stats.audio.receiving.codec.payloadType The Peer connection receiving audio streaming selected codec payload type.
                         * @param {String} [stats.audio.receiving.codec.implementation] The Peer connection receiving audio streaming selected codec implementation.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.audio.receiving.codec.channels] The Peer connection receiving audio streaming selected codec channels (2 for stereo).
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing,
                         *   and this is usually present in <code>stats.audio</code> property.</small>
                         * @param {Number} [stats.audio.receiving.codec.clockRate] The Peer connection receiving audio streaming selected codec media sampling rate.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.audio.receiving.codec.params] The Peer connection receiving audio streaming selected codec parameters.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.audio.receiving.outputLevel] The Peer connection receiving audio streaming output level.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} stats.video The Peer connection video streaming stats.
                         * @param {JSON} stats.video.sending The Peer connection sending video streaming stats.
                         * @param {Number} stats.video.sending.bytes The Peer connection current sending video streaming bytes.
                         *   <small>Note that value is in bytes so you have to convert that to bits for displaying for an example kbps.</small>
                         * @param {Number} stats.video.sending.totalBytes The Peer connection total sending video streaming bytes.
                         *   <small>Note that value is in bytes so you have to convert that to bits for displaying for an example kbps.</small>
                         * @param {Number} stats.video.sending.packets The Peer connection current sending video streaming packets.
                         * @param {Number} stats.video.sending.totalPackets The Peer connection total sending video streaming packets.
                         * @param {Number} stats.video.sending.packetsLost <blockquote class="info">
                         *   This property has been deprecated and would be removed in future releases
                         *   as it should not be in <code>sending</code> property.
                         *   </blockquote> The Peer connection current sending video streaming packets lost.
                         * @param {Number} stats.video.sending.totalPacketsLost <blockquote class="info">
                         *   This property has been deprecated and would be removed in future releases
                         *   as it should not be in <code>sending</code> property.
                         *   </blockquote> The Peer connection total sending video streaming packets lost.
                         * @param {Number} stats.video.sending.ssrc The Peer connection sending video streaming RTP packets SSRC.
                         * @param {Number} stats.video.sending.rtt The Peer connection sending video streaming RTT (Round-trip delay time).
                         *   <small>Defined as <code>0</code> if it's not present in original raw stats before parsing.</small>
                         * @param {Number} stats.video.sending.jitter <blockquote class="info">
                         *   This property has been deprecated and would be removed in future releases
                         *   as it should not be in <code>sending</code> property.
                         *   </blockquote> The Peer connection sending video streaming RTP packets jitter in seconds.
                         *   <small>Defined as <code>0</code> if it's not present in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.jitterBufferMs] <blockquote class="info">
                         *   This property has been deprecated and would be removed in future releases
                         *   as it should not be in <code>sending</code> property.
                         *   </blockquote> The Peer connection sending video streaming RTP packets jitter buffer in miliseconds.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.qpSum] The Peer connection sending video streaming sum of the QP values of frames passed.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} [stats.video.sending.codec] The Peer connection sending video streaming selected codec information.
                         *   <small>Defined as <code>null</code> if local session description is not available before parsing.</small>
                         * @param {String} stats.video.sending.codec.name The Peer connection sending video streaming selected codec name.
                         * @param {Number} stats.video.sending.codec.payloadType The Peer connection sending video streaming selected codec payload type.
                         * @param {String} [stats.video.sending.codec.implementation] The Peer connection sending video streaming selected codec implementation.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.codec.channels] The Peer connection sending video streaming selected codec channels (2 for stereo).
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing,
                         *   and this is usually present in <code>stats.audio</code> property.</small>
                         * @param {Number} [stats.video.sending.codec.clockRate] The Peer connection sending video streaming selected codec media sampling rate.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.video.sending.codec.params] The Peer connection sending video streaming selected codec parameters.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.frames] The Peer connection sending video streaming frames.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.frameRateInput] The Peer connection sending video streaming fps input.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.frameRateInput] The Peer connection sending video streaming fps input.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.framesDropped] The Peer connection sending video streaming frames dropped.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.frameRateMean] The Peer connection sending video streaming fps mean.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.frameRateStdDev] The Peer connection sending video streaming fps standard deviation.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.framesPerSecond] The Peer connection sending video streaming fps.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.framesDecoded] The Peer connection sending video streaming frames decoded.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.framesCorrupted] The Peer connection sending video streaming frames corrupted.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.totalFrames] The Peer connection total sending video streaming frames.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.nacks] The Peer connection current sending video streaming nacks.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.totalNacks] The Peer connection total sending video streaming nacks.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.plis] The Peer connection current sending video streaming plis.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.totalPlis] The Peer connection total sending video streaming plis.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.firs] The Peer connection current sending video streaming firs.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.totalFirs] The Peer connection total sending video streaming firs.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.slis] The Peer connection current sending video streaming slis.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.sending.totalSlis] The Peer connection total sending video streaming slis.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} stats.video.receiving The Peer connection receiving video streaming stats.
                         * @param {Number} stats.video.receiving.bytes The Peer connection current receiving video streaming bytes.
                         *   <small>Note that value is in bytes so you have to convert that to bits for displaying for an example kbps.</small>
                         * @param {Number} stats.video.receiving.totalBytes The Peer connection total receiving video streaming bytes.
                         *   <small>Note that value is in bytes so you have to convert that to bits for displaying for an example kbps.</small>
                         * @param {Number} stats.video.receiving.packets The Peer connection current receiving video streaming packets.
                         * @param {Number} stats.video.receiving.totalPackets The Peer connection total receiving video streaming packets.
                         * @param {Number} stats.video.receiving.packetsLost The Peer connection current receiving video streaming packets lost.
                         * @param {Number} stats.video.receiving.fractionLost The Peer connection current receiving video streaming fraction packets lost.
                         * @param {Number} stats.video.receiving.packetsDiscarded The Peer connection current receiving video streaming packets discarded.
                         * @param {Number} stats.video.receiving.totalPacketsLost The Peer connection total receiving video streaming packets lost.
                         * @param {Number} stats.video.receiving.totalPacketsDiscarded The Peer connection total receiving video streaming packets discarded.
                         * @param {Number} stats.video.receiving.ssrc The Peer connection receiving video streaming RTP packets SSRC.
                         * @param {Number} [stats.video.receiving.e2eDelay] The Peer connection receiving video streaming e2e delay.
                         *   <small>Defined as <code>null</code> if it's not present in original raw stats before parsing, and that
                         *   it finds any existing audio, video or object (plugin) DOM elements that has set with the
                         *   Peer remote stream object to parse current time. Note that <code>document.getElementsByTagName</code> function
                         *   and DOM <code>.currentTime</code> has to be supported inorder for data to be parsed correctly.</small>
                         * @param {Number} stats.video.receiving.jitter The Peer connection receiving video streaming RTP packets jitter in seconds.
                         *   <small>Defined as <code>0</code> if it's not present in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.jitterBufferMs] The Peer connection receiving video streaming
                         *   RTP packets jitter buffer in miliseconds.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} [stats.video.receiving.codec] The Peer connection receiving video streaming selected codec information.
                         *   <small>Defined as <code>null</code> if remote session description is not available before parsing.</small>
                         *   <small>Note that if the value is polyfilled, the value may not be accurate since the remote Peer can override the selected codec.
                         *   The value is derived from the remote session description.</small>
                         * @param {String} stats.video.receiving.codec.name The Peer connection receiving video streaming selected codec name.
                         * @param {Number} stats.video.receiving.codec.payloadType The Peer connection receiving video streaming selected codec payload type.
                         * @param {String} [stats.video.receiving.codec.implementation] The Peer connection receiving video streaming selected codec implementation.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.codec.channels] The Peer connection receiving video streaming selected codec channels (2 for stereo).
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing,
                         *   and this is usually present in <code>stats.audio</code> property.</small>
                         * @param {Number} [stats.video.receiving.codec.clockRate] The Peer connection receiving video streaming selected codec media sampling rate.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.video.receiving.codec.params] The Peer connection receiving video streaming selected codec parameters.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.frames] The Peer connection receiving video streaming frames.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.framesOutput] The Peer connection receiving video streaming fps output.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.framesDecoded] The Peer connection receiving video streaming frames decoded.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.frameRateMean] The Peer connection receiving video streaming fps mean.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.frameRateStdDev] The Peer connection receiving video streaming fps standard deviation.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.framesPerSecond] The Peer connection receiving video streaming fps.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.framesDecoded] The Peer connection receiving video streaming frames decoded.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.framesCorrupted] The Peer connection receiving video streaming frames corrupted.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.totalFrames] The Peer connection total receiving video streaming frames.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.nacks] The Peer connection current receiving video streaming nacks.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.totalNacks] The Peer connection total receiving video streaming nacks.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.plis] The Peer connection current receiving video streaming plis.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.totalPlis] The Peer connection total receiving video streaming plis.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.firs] The Peer connection current receiving video streaming firs.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.totalFirs] The Peer connection total receiving video streaming firs.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.slis] The Peer connection current receiving video streaming slis.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Number} [stats.video.receiving.totalPlis] The Peer connection total receiving video streaming slis.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} stats.selectedCandidate The Peer connection selected ICE candidate pair stats.
                         * @param {JSON} stats.selectedCandidate.local The Peer connection selected local ICE candidate.
                         * @param {String} stats.selectedCandidate.local.ipAddress The Peer connection selected
                         *   local ICE candidate IP address.
                         * @param {Number} stats.selectedCandidate.local.portNumber The Peer connection selected
                         *   local ICE candidate port number.
                         * @param {String} stats.selectedCandidate.local.transport The Peer connection selected
                         *   local ICE candidate IP transport type.
                         * @param {String} stats.selectedCandidate.local.candidateType The Peer connection selected
                         *   local ICE candidate type.
                         * @param {String} [stats.selectedCandidate.local.turnMediaTransport] The Peer connection possible
                         *   transport used when relaying local media to TURN server.
                         *   <small>Types are <code>"UDP"</code> (UDP connections), <code>"TCP"</code> (TCP connections) and
                         *   <code>"TCP/TLS"</code> (TCP over TLS connections).</small>
                         * @param {JSON} stats.selectedCandidate.remote The Peer connection selected remote ICE candidate.
                         * @param {String} stats.selectedCandidate.remote.ipAddress The Peer connection selected
                         *   remote ICE candidate IP address.
                         * @param {Number} stats.selectedCandidate.remote.portNumber The Peer connection selected
                         *   remote ICE candidate port number.
                         * @param {String} stats.selectedCandidate.remote.transport The Peer connection selected
                         *   remote ICE candidate IP transport type.
                         * @param {String} stats.selectedCandidate.remote.candidateType The Peer connection selected
                         *   remote ICE candidate type.
                         * @param {Boolean} [stats.selectedCandidate.writable] The flag if Peer has gotten ACK to an ICE request.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {Boolean} [stats.selectedCandidate.readable] The flag if Peer has gotten a valid incoming ICE request.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.rtt] The current STUN connectivity checks RTT (Round-trip delay time).
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.totalRtt] The total STUN connectivity checks RTT (Round-trip delay time).
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} stats.selectedCandidate.requests The ICE connectivity check requests.
                         * @param {String} [stats.selectedCandidate.requests.received] The current ICE connectivity check requests received.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.requests.sent] The current ICE connectivity check requests sent.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.requests.totalReceived] The total ICE connectivity check requests received.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.requests.totalSent] The total ICE connectivity check requests sent.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} stats.selectedCandidate.responses The ICE connectivity check responses.
                         * @param {String} [stats.selectedCandidate.responses.received] The current ICE connectivity check responses received.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.responses.sent] The current ICE connectivity check responses sent.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.responses.totalReceived] The total ICE connectivity check responses received.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.responses.totalSent] The total ICE connectivity check responses sent.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} stats.selectedCandidate.consentRequests The current ICE consent requests.
                         * @param {String} [stats.selectedCandidate.consentRequests.received] The current ICE consent requests received.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.consentRequests.sent] The current ICE consent requests sent.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.consentRequests.totalReceived] The total ICE consent requests received.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.consentRequests.totalSent] The total ICE consent requests sent.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} stats.selectedCandidate.consentResponses The current ICE consent responses.
                         * @param {String} [stats.selectedCandidate.consentResponses.received] The current ICE consent responses received.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.consentResponses.sent] The current ICE consent responses sent.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.consentResponses.totalReceived] The total ICE consent responses received.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.selectedCandidate.consentResponses.totalSent] The total ICE consent responses sent.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} stats.certificate The Peer connection DTLS/SRTP exchanged certificates information.
                         * @param {JSON} stats.certificate.local The Peer connection local certificate information.
                         * @param {String} [stats.certificate.local.fingerprint] The Peer connection local certificate fingerprint.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.certificate.local.fingerprintAlgorithm] The Peer connection local
                         *   certificate fingerprint algorithm.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.certificate.local.derBase64] The Peer connection local
                         *   base64 certificate in binary DER format encoded in base64.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} stats.certificate.remote The Peer connection remote certificate information.
                         * @param {String} [stats.certificate.remote.fingerprint] The Peer connection remote certificate fingerprint.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.certificate.remote.fingerprintAlgorithm] The Peer connection remote
                         *   certificate fingerprint algorithm.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.certificate.remote.derBase64] The Peer connection remote
                         *   base64 certificate in binary DER format encoded in base64.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.certificate.srtpCipher] The certificates SRTP cipher.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {String} [stats.certificate.dtlsCipher] The certificates DTLS cipher.
                         *   <small>Defined as <code>null</code> if it's not available in original raw stats before parsing.</small>
                         * @param {JSON} stats.connection The Peer connection object stats.
                         * @param {String} stats.connection.iceConnectionState The Peer connection ICE connection state.
                         * @param {String} stats.connection.iceGatheringState The Peer connection ICE gathering state.
                         * @param {String} stats.connection.signalingState The Peer connection signaling state.
                         * @param {JSON} stats.connection.localDescription The Peer connection local session description.
                         * @param {String} stats.connection.localDescription.type The Peer connection local session description type.
                         *   <small>Defined as <code>null</code> when local session description is not available.</small>
                         * @param {String} stats.connection.localDescription.sdp The Peer connection local session description SDP.
                         *   <small>Defined as <code>null</code> when local session description is not available.</small>
                         * @param {JSON} stats.connection.remoteDescription The Peer connection remote session description.
                         * @param {String} stats.connection.remoteDescription.type The Peer connection remote session description type.
                         *   <small>Defined as <code>null</code> when remote session description is not available.</small>
                         * @param {String} stats.connection.remoteDescription.sdp The Peer connection remote session description sdp.
                         *   <small>Defined as <code>null</code> when remote session description is not available.</small>
                         * @param {JSON} stats.connection.candidates The Peer connection list of ICE candidates sent or received.
                         * @param {JSON} stats.connection.candidates.sending The Peer connection list of local ICE candidates sent.
                         * @param {Array} stats.connection.candidates.sending.host The Peer connection list of local
                         *   <code>"host"</code> (local network) ICE candidates sent.
                         * @param {JSON} stats.connection.candidates.sending.host.#index The Peer connection local
                         *   <code>"host"</code> (local network) ICE candidate.
                         * @param {String} stats.connection.candidates.sending.host.#index.candidate The Peer connection local
                         *   <code>"host"</code> (local network) ICE candidate connection description.
                         * @param {String} stats.connection.candidates.sending.host.#index.sdpMid The Peer connection local
                         *   <code>"host"</code> (local network) ICE candidate identifier based on the local session description.
                         * @param {Number} stats.connection.candidates.sending.host.#index.sdpMLineIndex The Peer connection local
                         *   <code>"host"</code> (local network) ICE candidate media description index (starting from <code>0</code>)
                         *   based on the local session description.
                         * @param {Array} stats.connection.candidates.sending.srflx The Peer connection list of local
                         *   <code>"srflx"</code> (STUN) ICE candidates sent.
                         * @param {JSON} stats.connection.candidates.sending.srflx.#index The Peer connection local
                         *   <code>"srflx"</code> (STUN) ICE candidate.
                         * @param {String} stats.connection.candidates.sending.srflx.#index.candidate The Peer connection local
                         *   <code>"srflx"</code> (STUN) ICE candidate connection description.
                         * @param {String} stats.connection.candidates.sending.srflx.#index.sdpMid The Peer connection local
                         *   <code>"srflx"</code> (STUN) ICE candidate identifier based on the local session description.
                         * @param {Number} stats.connection.candidates.sending.srflx.#index.sdpMLineIndex The Peer connection local
                         *   <code>"srflx"</code> (STUN) ICE candidate media description index (starting from <code>0</code>)
                         *   based on the local session description.
                         * @param {Array} stats.connection.candidates.sending.relay The Peer connection list of local
                         *   <code>"relay"</code> (TURN) candidates sent.
                         * @param {JSON} stats.connection.candidates.sending.relay.#index The Peer connection local
                         *   <code>"relay"</code> (TURN) ICE candidate.
                         * @param {String} stats.connection.candidates.sending.relay.#index.candidate The Peer connection local
                         *   <code>"relay"</code> (TURN) ICE candidate connection description.
                         * @param {String} stats.connection.candidates.sending.relay.#index.sdpMid The Peer connection local
                         *   <code>"relay"</code> (TURN) ICE candidate identifier based on the local session description.
                         * @param {Number} stats.connection.candidates.sending.relay.#index.sdpMLineIndex The Peer connection local
                         *   <code>"relay"</code> (TURN) ICE candidate media description index (starting from <code>0</code>)
                         *   based on the local session description.
                         * @param {JSON} stats.connection.candidates.receiving The Peer connection list of remote ICE candidates received.
                         * @param {Array} stats.connection.candidates.receiving.host The Peer connection list of remote
                         *   <code>"host"</code> (local network) ICE candidates received.
                         * @param {JSON} stats.connection.candidates.receiving.host.#index The Peer connection remote
                         *   <code>"host"</code> (local network) ICE candidate.
                         * @param {String} stats.connection.candidates.receiving.host.#index.candidate The Peer connection remote
                         *   <code>"host"</code> (local network) ICE candidate connection description.
                         * @param {String} stats.connection.candidates.receiving.host.#index.sdpMid The Peer connection remote
                         *   <code>"host"</code> (local network) ICE candidate identifier based on the remote session description.
                         * @param {Number} stats.connection.candidates.receiving.host.#index.sdpMLineIndex The Peer connection remote
                         *   <code>"host"</code> (local network) ICE candidate media description index (starting from <code>0</code>)
                         *   based on the remote session description.
                         * @param {Array} stats.connection.candidates.receiving.srflx The Peer connection list of remote
                         *   <code>"srflx"</code> (STUN) ICE candidates received.
                         * @param {JSON} stats.connection.candidates.receiving.srflx.#index The Peer connection remote
                         *   <code>"srflx"</code> (STUN) ICE candidate.
                         * @param {String} stats.connection.candidates.receiving.srflx.#index.candidate The Peer connection remote
                         *   <code>"srflx"</code> (STUN) ICE candidate connection description.
                         * @param {String} stats.connection.candidates.receiving.srflx.#index.sdpMid The Peer connection remote
                         *   <code>"srflx"</code> (STUN) ICE candidate identifier based on the remote session description.
                         * @param {Number} stats.connection.candidates.receiving.srflx.#index.sdpMLineIndex The Peer connection remote
                         *   <code>"srflx"</code> (STUN) ICE candidate media description index (starting from <code>0</code>)
                         *   based on the remote session description.
                         * @param {Array} stats.connection.candidates.receiving.relay The Peer connection list of remote
                         *   <code>"relay"</code> (TURN) ICE candidates received.
                         * @param {JSON} stats.connection.candidates.receiving.relay.#index The Peer connection remote
                         *   <code>"relay"</code> (TURN) ICE candidate.
                         * @param {String} stats.connection.candidates.receiving.relay.#index.candidate The Peer connection remote
                         *   <code>"relay"</code> (TURN) ICE candidate connection description.
                         * @param {String} stats.connection.candidates.receiving.relay.#index.sdpMid The Peer connection remote
                         *   <code>"relay"</code> (TURN) ICE candidate identifier based on the remote session description.
                         * @param {Number} stats.connection.candidates.receiving.relay.#index.sdpMLineIndex The Peer connection remote
                         *   <code>"relay"</code> (TURN) ICE candidate media description index (starting from <code>0</code>)
                         *   based on the remote session description.
                         * @param {JSON} stats.connection.dataChannels The Peer connection list of Datachannel connections.
                         * @param {JSON} stats.connection.dataChannels.#channelName The Peer connection Datachannel connection stats.
                         * @param {String} stats.connection.dataChannels.#channelName.label The Peer connection Datachannel connection ID.
                         * @param {String} stats.connection.dataChannels.#channelName.readyState The Peer connection Datachannel connection readyState.
                         *   [Rel: Skylink.DATA_CHANNEL_STATE]
                         * @param {String} stats.connection.dataChannels.#channelName.type The Peer connection Datachannel connection type.
                         *   [Rel: Skylink.DATA_CHANNEL_TYPE]
                         * @param {String} stats.connection.dataChannels.#channelName.currentTransferId The Peer connection
                         *   Datachannel connection current progressing transfer session ID.
                         *   <small>Defined as <code>null</code> when there is currently no transfer session progressing on the Datachannel connection.</small>
                         * @param {String} stats.connection.dataChannels.#channelName.currentStreamId The Peer connection
                         *   Datachannel connection current data streaming session ID.
                         *   <small>Defined as <code>null</code> when there is currently no data streaming session on the Datachannel connection.</small>
                         * @param {JSON} stats.connection.constraints The constraints passed in when constructing the Peer connection object.
                         * @param {JSON} stats.connection.optional The optional constraints passed in when constructing the Peer connection object.
                         * @param {JSON} [stats.connection.sdpConstraints] The constraints passed in when creating Peer connection offer or answer.
                         * @param {Error} error The error object received.
                         *   <small>Defined only when <code>state</code> payload is <code>RETRIEVE_ERROR</code>.</small>
                         * @for Skylink
                         * @since 0.6.14
                         */
                        getConnectionStatusStateChange: [],
                      
                        /**
                         * Event triggered when <a href="#method_muteStream"><code>muteStream()</code> method</a> changes
                         * User Streams audio and video tracks muted status.
                         * @event localMediaMuted
                         * @param {JSON} mediaStatus The Streams muted settings.
                         *   <small>This indicates the muted settings for both
                         *   <a href="#method_getUserMedia"><code>getUserMedia()</code> Stream</a> and
                         *   <a href="#method_shareScreen"><code>shareScreen()</code> Stream</a>.</small>
                         * @param {Boolean} mediaStatus.audioMuted The flag if all Streams audio tracks is muted or not.
                         *   <small>If User's <code>peerInfo.settings.audio</code> is false, this will be defined as <code>true</code>.</small>
                         * @param {Boolean} mediaStatus.videoMuted The flag if all Streams video tracks is muted or not.
                         *   <small>If User's <code>peerInfo.settings.video</code> is false, this will be defined as <code>true</code>.</small>
                         * @for Skylink
                         * @since 0.6.15
                         */
                        localMediaMuted: [],
                      
                        /**
                         * <blockquote class="info">
                         *   Learn more about how ICE works in this
                         *   <a href="https://temasys.com.sg/ice-what-is-this-sorcery/">article here</a>.<br>
                         *   Note that this event may not be triggered for MCU enabled Peer connections as ICE candidates
                         *   may be received in the session description instead.
                         * </blockquote>
                         * Event triggered when remote ICE candidate processing state has changed when Peer is using trickle ICE.
                         * @event candidateProcessingState
                         * @param {String} state The ICE candidate processing state.
                         *   [Rel: Skylink.CANDIDATE_PROCESSING_STATE]
                         * @param {String} peerId The Peer ID.
                         * @param {String} candidateId The remote ICE candidate session ID.
                         *   <small>Note that this value is not related to WebRTC API but for identification of remote ICE candidate received.</small>
                         * @param {String} candidateType The remote ICE candidate type.
                         *   <small>Expected values are <code>"host"</code> (local network), <code>"srflx"</code> (STUN) and <code>"relay"</code> (TURN).</small>
                         * @param {JSON} candidate The remote ICE candidate.
                         * @param {String} candidate.candidate The remote ICE candidate connection description.
                         * @param {String} candidate.sdpMid The remote ICE candidate identifier based on the remote session description.
                         * @param {Number} candidate.sdpMLineIndex The remote ICE candidate media description index
                         *   (starting from <code>0</code>) based on the remote session description.
                         * @param {Error} [error] The error object.
                         *   <small>Defined only when <code>state</code> is <code>DROPPED</code> or <code>PROCESS_ERROR</code>.</small>
                         * @for Skylink
                         * @since 0.6.16
                         */
                        candidateProcessingState: [],
                      
                        /**
                         * <blockquote class="info">
                         *   Learn more about how ICE works in this
                         *   <a href="https://temasys.com.sg/ice-what-is-this-sorcery/">article here</a>.<br>
                         *   Note that this event may not be triggered for MCU enabled Peer connections as ICE candidates
                         *   may be received in the session description instead.
                         * </blockquote>
                         * Event triggered when all remote ICE candidates gathering has completed and been processed.
                         * @event candidatesGathered
                         * @param {String} peerId The Peer ID.
                         * @param {JSON} length The remote ICE candidates length.
                         * @param {Number} length.expected The expected total number of remote ICE candidates to be received.
                         * @param {Number} length.received The actual total number of remote ICE candidates received.
                         * @param {Number} length.processed The total number of remote ICE candidates processed.
                         * @for Skylink
                         * @since 0.6.18
                         */
                        candidatesGathered: []
                      };
                      
                      /**
                       * Function that subscribes a listener to an event.
                       * @method on
                       * @param {String} eventName The event.
                       * @param {Function} callback The listener.
                       *   <small>This will be invoked when event is triggered.</small>
                       * @example
                       *   // Example 1: Subscribing to "peerJoined" event
                       *   skylinkDemo.on("peerJoined", function (peerId, peerInfo, isSelf) {
                       *     console.info("peerJoined event has been triggered with:", peerId, peerInfo, isSelf);
                       *   });
                       * @for Skylink
                       * @since 0.1.0
                       */
                      Skylink.prototype.on = function(eventName, callback) {
                        if ('function' === typeof callback) {
                          this._EVENTS[eventName] = this._EVENTS[eventName] || [];
                          this._EVENTS[eventName].push(callback);
                          log.log([null, 'Event', eventName, 'Event is subscribed']);
                        } else {
                          log.error([null, 'Event', eventName, 'Provided parameter is not a function']);
                        }
                      };
                      
                      /**
                       * Function that subscribes a listener to an event once.
                       * @method once
                       * @param {String} eventName The event.
                       * @param {Function} callback The listener.
                       *   <small>This will be invoked once when event is triggered and conditional function is satisfied.</small>
                       * @param {Function} [condition] The conditional function that will be invoked when event is triggered.
                       *   <small>Return <code>true</code> when invoked to satisfy condition.</small>
                       *   <small>When not provided, the conditional function will always return <code>true</code>.</small>
                       * @param {Boolean} [fireAlways=false] The flag that indicates if <code>once()</code> should act like
                       *   <code>on()</code> but only invoke listener only when conditional function is satisfied.
                       * @example
                       *   // Example 1: Subscribing to "peerJoined" event that triggers without condition
                       *   skylinkDemo.once("peerJoined", function (peerId, peerInfo, isSelf) {
                       *     console.info("peerJoined event has been triggered once with:", peerId, peerInfo, isSelf);
                       *   });
                       *
                       *   // Example 2: Subscribing to "incomingStream" event that triggers with condition
                       *   skylinkDemo.once("incomingStream", function (peerId, stream, isSelf, peerInfo) {
                       *     console.info("incomingStream event has been triggered with User stream:", stream);
                       *   }, function (peerId, peerInfo, isSelf) {
                       *     return isSelf;
                       *   });
                       *
                       *   // Example 3: Subscribing to "dataTransferState" event that triggers always only when condition is satisfied
                       *   skylinkDemo.once("dataTransferState", function (state, transferId, peerId, transferInfo) {
                       *     console.info("Received data transfer from Peer:", transferInfo.data);
                       *   }, function (state, transferId, peerId) {
                       *     if (state === skylinkDemo.DATA_TRANSFER_STATE.UPLOAD_REQUEST) {
                       *       skylinkDemo.acceptDataTransfer(peerId, transferId);
                       *     }
                       *     return state === skylinkDemo.DATA_TRANSFER_STATE.DOWNLOAD_COMPLETED;
                       *   }, true);
                       * @for Skylink
                       * @since 0.5.4
                       */
                      Skylink.prototype.once = function(eventName, callback, condition, fireAlways) {
                        if (typeof condition === 'boolean') {
                          fireAlways = condition;
                          condition = null;
                        }
                        fireAlways = (typeof fireAlways === 'undefined' ? false : fireAlways);
                        condition = (typeof condition !== 'function') ? function () {
                          return true;
                        } : condition;
                      
                        if (typeof callback === 'function') {
                          this._onceEvents[eventName] = this._onceEvents[eventName] || [];
                          this._onceEvents[eventName].push([callback, condition, fireAlways]);
                          log.log([null, 'Event', eventName, 'Event is subscribed on condition']);
                        } else {
                          log.error([null, 'Event', eventName, 'Provided callback is not a function']);
                        }
                      };
                      
                      /**
                       * Function that unsubscribes listeners from an event.
                       * @method off
                       * @param {String} [eventName] The event.
                       * - When not provided, all listeners to all events will be unsubscribed.
                       * @param {Function} [callback] The listener to unsubscribe.
                       * - When not provided, all listeners associated to the event will be unsubscribed.
                       * @example
                       *   // Example 1: Unsubscribe all "peerJoined" event
                       *   skylinkDemo.off("peerJoined");
                       *
                       *   // Example 2: Unsubscribe only one listener from "peerJoined event"
                       *   var pJListener = function (peerId, peerInfo, isSelf) {
                       *     console.info("peerJoined event has been triggered with:", peerId, peerInfo, isSelf);
                       *   };
                       *
                       *   skylinkDemo.off("peerJoined", pJListener);
                       * @for Skylink
                       * @since 0.5.5
                       */
                      Skylink.prototype.off = function(eventName, callback) {
                        if (!(eventName && typeof eventName === 'string')) {
                          this._EVENTS = {};
                          this._onceEvents = {};
                        } else {
                          if (callback === undefined) {
                            this._EVENTS[eventName] = [];
                            this._onceEvents[eventName] = [];
                            log.log([null, 'Event', eventName, 'All events are unsubscribed']);
                            return;
                          }
                          var arr = this._EVENTS[eventName] || [];
                          var once = this._onceEvents[eventName] || [];
                      
                          // unsubscribe events that is triggered always
                          for (var i = 0; i < arr.length; i++) {
                            if (arr[i] === callback) {
                              log.log([null, 'Event', eventName, 'Event is unsubscribed']);
                              arr.splice(i, 1);
                              break;
                            }
                          }
                          // unsubscribe events fired only once
                          if(once !== undefined) {
                            for (var j = 0; j < once.length; j++) {
                              if (once[j][0] === callback) {
                                log.log([null, 'Event', eventName, 'One-time Event is unsubscribed']);
                                once.splice(j, 1);
                                break;
                              }
                            }
                          }
                        }
                      };
                      
                      /**
                       * Function that triggers an event.
                       * The rest of the parameters after the <code>eventName</code> parameter is considered as the event parameter payloads.
                       * @method _trigger
                       * @private
                       * @for Skylink
                       * @since 0.1.0
                       */
                      Skylink.prototype._trigger = function(eventName) {
                        //convert the arguments into an array
                        var args = Array.prototype.slice.call(arguments);
                        var arr = this._EVENTS[eventName];
                        var once = this._onceEvents[eventName] || null;
                        args.shift(); //Omit the first argument since it's the event name
                        if (arr) {
                          // for events subscribed forever
                          for (var i = 0; i < arr.length; i++) {
                            try {
                              log.log([null, 'Event', eventName, 'Event is fired']);
                              if(arr[i].apply(this, args) === false) {
                                break;
                              }
                            } catch(error) {
                              log.error([null, 'Event', eventName, 'Exception occurred in event:'], error);
                              throw error;
                            }
                          }
                        }
                        if (once){
                          // for events subscribed on once
                          for (var j = 0; j < once.length; j++) {
                            if (once[j][1].apply(this, args) === true) {
                              log.log([null, 'Event', eventName, 'Condition is met. Firing event']);
                              if(once[j][0].apply(this, args) === false) {
                                break;
                              }
                              if (once[j] && !once[j][2]) {
                                log.log([null, 'Event', eventName, 'Removing event after firing once']);
                                once.splice(j, 1);
                                //After removing current element, the next element should be element of the same index
                                j--;
                              }
                            } else {
                              log.log([null, 'Event', eventName, 'Condition is still not met. ' +
                                'Holding event from being fired']);
                            }
                          }
                        }
                        log.log([null, 'Event', eventName, 'Event is triggered']);
                      };
                      
                      
                      
                      /**
                       * Function that checks if the current state condition is met before subscribing
                       *   event handler to wait for condition to be fulfilled.
                       * @method _condition
                       * @private
                       * @for Skylink
                       * @since 0.5.5
                       */
                      Skylink.prototype._condition = function(eventName, callback, checkFirst, condition, fireAlways) {
                        if (typeof condition === 'boolean') {
                          fireAlways = condition;
                          condition = null;
                        }
                        if (typeof callback === 'function' && typeof checkFirst === 'function') {
                          if (checkFirst()) {
                            log.log([null, 'Event', eventName, 'First condition is met. Firing callback']);
                            callback();
                            return;
                          }
                          log.log([null, 'Event', eventName, 'First condition is not met. Subscribing to event']);
                          this.once(eventName, callback, condition, fireAlways);
                        } else {
                          log.error([null, 'Event', eventName, 'Provided callback or checkFirst is not a function']);
                        }
                      };
                      
                      /**
                       * Function that starts an interval check to wait for a condition to be resolved.
                       * @method _wait
                       * @private
                       * @for Skylink
                       * @since 0.5.5
                       */
                      Skylink.prototype._wait = function(callback, condition, intervalTime, fireAlways) {
                        fireAlways = (typeof fireAlways === 'undefined' ? false : fireAlways);
                        if (typeof callback === 'function' && typeof condition === 'function') {
                          if (condition()) {
                            log.log([null, 'Event', null, 'Condition is met. Firing callback']);
                            callback();
                            return;
                          }
                          log.log([null, 'Event', null, 'Condition is not met. Doing a check.']);
                      
                          intervalTime = (typeof intervalTime === 'number') ? intervalTime : 50;
                      
                          var doWait = setInterval(function () {
                            if (condition()) {
                              log.log([null, 'Event', null, 'Condition is met after waiting. Firing callback']);
                              if (!fireAlways){
                                clearInterval(doWait);
                              }
                              callback();
                            }
                          }, intervalTime);
                        } else {
                          if (typeof callback !== 'function'){
                            log.error([null, 'Event', null, 'Provided callback is not a function']);
                          }
                          if (typeof condition !== 'function'){
                            log.error([null, 'Event', null, 'Provided condition is not a function']);
                          }
                        }
                      };
                      
                      /**
                       * Function that throttles a method function to prevent multiple invokes over a specified amount of time.
                       * Returns a function to be invoked <code>._throttle(fn, 1000)()</code> to make throttling functionality work.
                       * @method _throttle
                       * @private
                       * @for Skylink
                       * @since 0.5.8
                       */
                      Skylink.prototype._throttle = function(func, prop, wait){
                        var self = this;
                        var now = (new Date()).getTime();
                      
                        if (!(self._timestamp[prop] && ((now - self._timestamp[prop]) < wait))) {
                          func(true);
                          self._timestamp[prop] = now;
                        } else {
                          func(false);
                        }
                      };