/**
* Stores the list of {{#crossLink "Skylink/on:method"}}on(){{/crossLink}}
* event subscription handlers.
* @attribute _EVENTS
* @param {Array} (#eventName) The array of event subscription handlers that is
* subscribed using {{#crossLink "Skylink/on:method"}}on() method{{/crossLink}}
* associated with the event name.
* @param {Function} (#eventName).(#index) The event subscription handler
* associated with the event name. This is to be triggered multiple times
* until {{#crossLink "Skylink/off:method"}}off(){{/crossLink}} is invoked for
* this event subscription handler.
* @type JSON
* @private
* @required
* @component Events
* @for Skylink
* @since 0.5.2
*/
Skylink.prototype._EVENTS = {
/**
* Event triggered when the socket connection to the platform signaling is opened.
* - This event means that socket connection is open and self is ready to join the room.
* @event channelOpen
* @component Events
* @for Skylink
* @since 0.1.0
*/
channelOpen: [],
/**
* Event triggered when the socket connection to the platform signaling is closed.
* - This event means that socket connection is closed and self has left the room.
* @event channelClose
* @component Events
* @for Skylink
* @since 0.1.0
*/
channelClose: [],
/**
* Event triggered when the socket connection is exchanging messages with the platform signaling.
* - This event is a debugging feature, and it's not advisable to subscribe to
* this event unless you are debugging the socket messages
* received from the platform signaling.
* @event channelMessage
* @param {JSON} message The socket message object data received from the platform signaling.
* @component Events
* @for Skylink
* @since 0.1.0
*/
channelMessage: [],
/**
* Event triggered when the socket connection has occurred an exception
* during a connection with the platform signaling.
* - After this event is triggered, it may result in channelClose,
* and the socket connection with the platform signaling could be disrupted.
* @event channelError
* @param {Object|String} error The error object thrown that caused the exception.
* @component Events
* @for Skylink
* @since 0.1.0
*/
channelError: [],
/**
* Event triggered when attempting to reconnect the socket connection with the platform signaling.
* - Depending on the current type triggered in
* socketError event before, it may or may not attempt the socket reconnection and
* this event may not be triggered.
* - If reconnection attempt fails, it will trigger socketError event
* again and repeat the stage from there.
* @event channelRetry
* @param {String} fallbackType The fallback socket transport that Skylink is attempting to reconnect with.
* [Rel: Skylink.SOCKET_FALLBACK]
* @param {Number} currentAttempt The current reconnection attempt.
* @component Events
* @for Skylink
* @since 0.5.6
*/
channelRetry: [],
/**
* Event triggered when attempt to (re)connect the socket connection with the platform signaling has failed.
* - Depending on the current type payload, it may or may not attempt the
* socket reconnection and channelRetry event may not be triggered.
* - If reconnection attempt fails and there are still available ports to reconnect with,
* it will trigger channelRetry event again and
* repeat the stage from there.
* @event socketError
* @param {String} errorCode The socket connection error code received.
* [Rel: Skylink.SOCKET_ERROR]
* @param {Number|String|Object} error The error object thrown that caused the failure.
* @param {String} type The socket transport that Skylink has failed to connect with.
* [Rel: Skylink.SOCKET_FALLBACK]
* @component Events
* @for Skylink
* @since 0.5.5
*/
socketError: [],
/**
* Event triggered when room connection information is being retrieved from platform server.
* - This is also triggered when init() is invoked, but
* the socket connection events like channelOpen does
* not get triggered but stops at readyStateChange event.
* @event readyStateChange
* @param {String} readyState The current ready state of the retrieval when the event is triggered.
* [Rel: Skylink.READY_STATE_CHANGE]
* @param {JSON} [error=null] The error object thrown when there is a failure in retrieval.
* If received as null, it means that there is no errors.
* @param {Number} error.status Http status when retrieving information.
* May be empty for other errors.
* @param {Number} error.errorCode The
* READY_STATE_CHANGE_ERROR
* if there is an readyStateChange
* event error that caused the failure for initialising Skylink.
* [Rel: Skylink.READY_STATE_CHANGE_ERROR]
* @param {Object} error.content The exception thrown that caused the failure
* for initialising Skylink.
* @param {Number} error.status The XMLHttpRequest status code received
* when exception is thrown that caused the failure for initialising Skylink.
* @param {String} room The selected room connection information that Skylink is attempting
* to retrieve the information for to start connection to.
* @component Events
* @for Skylink
* @since 0.4.0
*/
readyStateChange: [],
/**
* Event triggered when a Peer handshaking state has changed.
* - This event may trigger state HANDSHAKE_PROGRESS.ENTER for
* self to indicate that broadcast to ping for any existing Peers in the room has
* been made.
* - This event is a debugging feature, and it's used to check the
* Peer handshaking connection status.
* - This starts the Peer connection handshaking, where it retrieves all the Peer
* information and then proceeds to start the ICE connection.
* @event handshakeProgress
* @param {String} state The Peer connection handshake state.
* [Rel: Skylink.HANDSHAKE_PROGRESS]
* @param {String} peerId The Peer ID associated with the connection
* handshake state.
* @param {Object|String} [error] The error object thrown when there is a failure in
* the connection handshaking.
* @component Events
* @for Skylink
* @since 0.3.0
*/
handshakeProgress: [],
/**
* Event triggered when a Peer connection ICE gathering state has changed.
* - This event is a debugging feature, and it's used to check the
* Peer ICE candidate gathering status.
* - This indicates if the ICE gathering has been completed to
* start ICE connection for DataChannel and media streaming connection.
* @event candidateGenerationState
* @param {String} state The current ICE gathering state.
* See the list of available triggered states in the related link.
* [Rel: Skylink.CANDIDATE_GENERATION_STATE]
* @param {String} peerId The Peer ID associated with the connection
* @component Events
* @for Skylink
* @since 0.1.0
*/
candidateGenerationState: [],
/**
* Event triggered when a Peer connection signaling state has changed.
* - This event is a debugging feature, and it's used to check the
* Peer signaling connection status.
* - This event indicates if the session description is received
* to start ICE gathering for DataChannel and media streaming connection.
* @event peerConnectionState
* @param {String} state The current connection signaling state.
* [Rel: Skylink.PEER_CONNECTION_STATE]
* @param {String} peerId The Peer ID associated with the current connection
* signaling state.
* @component Events
* @for Skylink
* @since 0.1.0
*/
peerConnectionState: [],
/**
* Event triggered when a Peer connection ICE connection state has changed.
* - This event is a debugging feature, and it's used to check the
* Peer ICE connection of added ICE candidates status.
* - This event indicates if the ICE connection is established for successful
* DataChannel and media streaming connection.
* @event iceConnectionState
* @param {String} state The current ICE connection state.
* [Rel: Skylink.ICE_CONNECTION_STATE]
* @param {String} peerId The Peer ID associated with the current ICE connection state.
* @component Events
* @for Skylink
* @since 0.1.0
*/
iceConnectionState: [],
/**
* Event triggered when access to self user media stream has failed.
* - If audioFallback is enabled in init(),
* it will throw an error if audio only user media stream failed after
* a failed attempt to retrieve video and audio user media.
* @event mediaAccessError
* @param {Object|String} error The error object thrown that caused the failure.
* @param {Boolean} isScreensharing The flag that indicates if self
* Stream object is a screensharing stream or not.
* @param {Boolean} isAudioFallbackError The flag that indicates if Skylink throws
* the error after an audio fallback has been attempted.
* @component Events
* @for Skylink
* @since 0.1.0
*/
mediaAccessError: [],
/**
* Event triggered when attempt to fallback to retrieve audio only user media stream
* has been made.
* - If audioFallback is enabled in init(),
* and if there is a failed attempt to retrieve video and audio user media,
* it will attempt to do the audio fallback.
* @event mediaAccessFallback
* @param {Object|String} error The error object thrown that caused the failure
* from retrieve video and audio user media stream.
* @component Events
* @for Skylink
* @since 0.6.3
*/
mediaAccessFallback: [],
/**
* Event triggered when access to self user media stream is successfully
* attached to Skylink.
* @event mediaAccessSuccess
* @param {Object} stream The self user [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream_API)
* object. To display the MediaStream object to a video or audio, simply invoke:

* attachMediaStream(domElement, stream);.
* @param {Boolean} isScreensharing The flag that indicates if self
* Stream object is a screensharing stream or not.
* @component Events
* @for Skylink
* @since 0.1.0
*/
mediaAccessSuccess: [],
/**
* Event triggered when the application requires to retrieve self
* user media stream manually instead of doing it automatically in
* {{#crossLink "Skylink/joinRoom:method"}}joinRoom(){{/crossLink}}.
* - This event triggers based on the configuration of manualGetUserMedia
* in the joinRoom() configuration settings.
* - Developers must manually invoke getUserMedia()
* to retrieve the user media stream before self would join the room.
* Once the user media stream is attached, self would proceed to join the room
* automatically.
* @event mediaAccessRequired
* @component Events
* @for Skylink
* @since 0.5.5
*/
mediaAccessRequired: [],
/**
* Event triggered when self user media stream attached to Skylink has been stopped.
* @event mediaAccessStopped
* @param {Boolean} isScreensharing The flag that indicates if self
* Stream object is a screensharing stream or not.
* @component Events
* @for Skylink
* @since 0.5.6
*/
mediaAccessStopped: [],
/**
* Event triggered when a Peer joins the room.
* @event peerJoined
* @param {String} peerId The Peer ID of the new peer
* that has joined the room.
* @param {Object} peerInfo The peer information associated
* with the Peer Connection.
* @param {String|JSON} peerInfo.userData The custom user data
* information set by developer. This custom user data can also
* be set in setUserData().
* @param {JSON} peerInfo.settings The Peer Stream
* streaming settings information. If both audio and video
* option is false, there should be no
* receiving remote Stream object from this associated Peer.
* @param {Boolean|JSON} [peerInfo.settings.audio=false] The
* Peer Stream streaming audio settings. If
* false, it means that audio streaming is disabled in
* the remote Stream of the Peer.
* @param {Boolean} [peerInfo.settings.audio.stereo] The flag that indicates if
* stereo option should be explictly enabled to an OPUS enabled audio stream.
* Check the audioCodec configuration settings in
* init()
* to enable OPUS as the audio codec. Note that stereo is already enabled
* for OPUS codecs, this only adds a stereo flag to the SDP to explictly
* enable stereo in the audio streaming.
* @param {Boolean|JSON} [peerInfo.settings.video=false] The Peer
* Stream streaming video settings. If false, it means that
* video streaming is disabled in the remote Stream of the Peer.
* @param {JSON} [peerInfo.settings.video.resolution] The Peer
* Stream streaming video resolution settings. Setting the resolution may
* not force set the resolution provided as it depends on the how the
* browser handles the resolution. [Rel: Skylink.VIDEO_RESOLUTION]
* @param {Number} [peerInfo.settings.video.resolution.width] The Peer
* Stream streaming video resolution width.
* @param {Number} [peerInfo.settings.video.resolution.height] The Peer
* Stream streaming video resolution height.
* @param {Number} [peerInfo.settings.video.frameRate] The Peer
* Stream streaming video maximum frameRate.
* @param {Boolean} [peerInfo.settings.video.screenshare=false] The flag
* that indicates if the Peer connection Stream object sent
* is a screensharing stream or not.
* @param {String} [peerInfo.settings.bandwidth] The Peer
* streaming bandwidth settings. Setting the bandwidth flags may not
* force set the bandwidth for each connection stream channels as it depends
* on how the browser handles the bandwidth bitrate. Values are configured
* in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.audio] The configured
* audio stream channel for the remote Stream object bandwidth
* that audio streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.video] The configured
* video stream channel for the remote Stream object bandwidth
* that video streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.data] The configured
* datachannel channel for the DataChannel connection bandwidth
* that datachannel connection per packet should be able use in <var>kb/s</var>.
* @param {JSON} peerInfo.mediaStatus The Peer Stream mute
* settings for both audio and video streamings.
* @param {Boolean} [peerInfo.mediaStatus.audioMuted=true] The flag that
* indicates if the remote Stream object audio streaming is muted. If
* there is no audio streaming enabled for the Peer, by default,
* it is set to true.
* @param {Boolean} [peerInfo.mediaStatus.videoMuted=true] The flag that
* indicates if the remote Stream object video streaming is muted. If
* there is no video streaming enabled for the Peer, by default,
* it is set to true.
* @param {JSON} peerInfo.agent The Peer platform agent information.
* @param {String} peerInfo.agent.name The Peer platform browser or agent name.
* @param {Number} peerInfo.agent.version The Peer platform browser or agent version.
* @param {Number} peerInfo.agent.os The Peer platform name.
* @param {String} peerInfo.room The current room that the Peer is in.
* @param {Boolean} isSelf The flag that indicates if self is the Peer.
* @component Events
* @for Skylink
* @since 0.5.2
*/
peerJoined: [],
/**
* Event triggered when a Peer connection has been restarted for
* a reconnection.
* @event peerRestart
* @param {String} peerId The Peer ID of the connection that
* is restarted for a reconnection.
* @param {Object} peerInfo The peer information associated
* with the Peer Connection.
* @param {String|JSON} peerInfo.userData The custom user data
* information set by developer. This custom user data can also
* be set in setUserData().
* @param {JSON} peerInfo.settings The Peer Stream
* streaming settings information. If both audio and video
* option is false, there should be no
* receiving remote Stream object from this associated Peer.
* @param {Boolean|JSON} [peerInfo.settings.audio=false] The
* Peer Stream streaming audio settings. If
* false, it means that audio streaming is disabled in
* the remote Stream of the Peer.
* @param {Boolean} [peerInfo.settings.audio.stereo] The flag that indicates if
* stereo option should be explictly enabled to an OPUS enabled audio stream.
* Check the audioCodec configuration settings in
* init()
* to enable OPUS as the audio codec. Note that stereo is already enabled
* for OPUS codecs, this only adds a stereo flag to the SDP to explictly
* enable stereo in the audio streaming.
* @param {Boolean|JSON} [peerInfo.settings.video=false] The Peer
* Stream streaming video settings. If false, it means that
* video streaming is disabled in the remote Stream of the Peer.
* @param {JSON} [peerInfo.settings.video.resolution] The Peer
* Stream streaming video resolution settings. Setting the resolution may
* not force set the resolution provided as it depends on the how the
* browser handles the resolution. [Rel: Skylink.VIDEO_RESOLUTION]
* @param {Number} [peerInfo.settings.video.resolution.width] The Peer
* Stream streaming video resolution width.
* @param {Number} [peerInfo.settings.video.resolution.height] The Peer
* Stream streaming video resolution height.
* @param {Number} [peerInfo.settings.video.frameRate] The Peer
* Stream streaming video maximum frameRate.
* @param {Boolean} [peerInfo.settings.video.screenshare=false] The flag
* that indicates if the Peer connection Stream object sent
* is a screensharing stream or not.
* @param {String} [peerInfo.settings.bandwidth] The Peer
* streaming bandwidth settings. Setting the bandwidth flags may not
* force set the bandwidth for each connection stream channels as it depends
* on how the browser handles the bandwidth bitrate. Values are configured
* in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.audio] The configured
* audio stream channel for the remote Stream object bandwidth
* that audio streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.video] The configured
* video stream channel for the remote Stream object bandwidth
* that video streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.data] The configured
* datachannel channel for the DataChannel connection bandwidth
* that datachannel connection per packet should be able use in <var>kb/s</var>.
* @param {JSON} peerInfo.mediaStatus The Peer Stream mute
* settings for both audio and video streamings.
* @param {Boolean} [peerInfo.mediaStatus.audioMuted=true] The flag that
* indicates if the remote Stream object audio streaming is muted. If
* there is no audio streaming enabled for the Peer, by default,
* it is set to true.
* @param {Boolean} [peerInfo.mediaStatus.videoMuted=true] The flag that
* indicates if the remote Stream object video streaming is muted. If
* there is no video streaming enabled for the Peer, by default,
* it is set to true.
* @param {JSON} peerInfo.agent The Peer platform agent information.
* @param {String} peerInfo.agent.name The Peer platform browser or agent name.
* @param {Number} peerInfo.agent.version The Peer platform browser or agent version.
* @param {Number} peerInfo.agent.os The Peer platform name.
* @param {String} peerInfo.room The current room that the Peer is in.
* @param {Boolean} isSelfInitiateRestart The flag that indicates if self is
* the one who have initiated the Peer connection restart.
* @component Events
* @for Skylink
* @since 0.5.5
*/
peerRestart: [],
/**
* Event triggered when a Peer information have been updated.
* - This event would only be triggered if self is in the room.
* - This event triggers when the peerInfo data is updated,
* like peerInfo.mediaStatus or the peerInfo.userData,
* which is invoked through muteStream() or
* setUserData().
* @event peerUpdated
* @param {String} peerId The Peer ID of the peer with updated information.
* @param {Object} peerInfo The peer information associated
* with the Peer Connection.
* @param {String|JSON} peerInfo.userData The custom user data
* information set by developer. This custom user data can also
* be set in setUserData().
* @param {JSON} peerInfo.settings The Peer Stream
* streaming settings information. If both audio and video
* option is false, there should be no
* receiving remote Stream object from this associated Peer.
* @param {Boolean|JSON} [peerInfo.settings.audio=false] The
* Peer Stream streaming audio settings. If
* false, it means that audio streaming is disabled in
* the remote Stream of the Peer.
* @param {Boolean} [peerInfo.settings.audio.stereo] The flag that indicates if
* stereo option should be explictly enabled to an OPUS enabled audio stream.
* Check the audioCodec configuration settings in
* init()
* to enable OPUS as the audio codec. Note that stereo is already enabled
* for OPUS codecs, this only adds a stereo flag to the SDP to explictly
* enable stereo in the audio streaming.
* @param {Boolean|JSON} [peerInfo.settings.video=false] The Peer
* Stream streaming video settings. If false, it means that
* video streaming is disabled in the remote Stream of the Peer.
* @param {JSON} [peerInfo.settings.video.resolution] The Peer
* Stream streaming video resolution settings. Setting the resolution may
* not force set the resolution provided as it depends on the how the
* browser handles the resolution. [Rel: Skylink.VIDEO_RESOLUTION]
* @param {Number} [peerInfo.settings.video.resolution.width] The Peer
* Stream streaming video resolution width.
* @param {Number} [peerInfo.settings.video.resolution.height] The Peer
* Stream streaming video resolution height.
* @param {Number} [peerInfo.settings.video.frameRate] The Peer
* Stream streaming video maximum frameRate.
* @param {Boolean} [peerInfo.settings.video.screenshare=false] The flag
* that indicates if the Peer connection Stream object sent
* is a screensharing stream or not.
* @param {String} [peerInfo.settings.bandwidth] The Peer
* streaming bandwidth settings. Setting the bandwidth flags may not
* force set the bandwidth for each connection stream channels as it depends
* on how the browser handles the bandwidth bitrate. Values are configured
* in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.audio] The configured
* audio stream channel for the remote Stream object bandwidth
* that audio streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.video] The configured
* video stream channel for the remote Stream object bandwidth
* that video streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.data] The configured
* datachannel channel for the DataChannel connection bandwidth
* that datachannel connection per packet should be able use in <var>kb/s</var>.
* @param {JSON} peerInfo.mediaStatus The Peer Stream mute
* settings for both audio and video streamings.
* @param {Boolean} [peerInfo.mediaStatus.audioMuted=true] The flag that
* indicates if the remote Stream object audio streaming is muted. If
* there is no audio streaming enabled for the Peer, by default,
* it is set to true.
* @param {Boolean} [peerInfo.mediaStatus.videoMuted=true] The flag that
* indicates if the remote Stream object video streaming is muted. If
* there is no video streaming enabled for the Peer, by default,
* it is set to true.
* @param {JSON} peerInfo.agent The Peer platform agent information.
* @param {String} peerInfo.agent.name The Peer platform browser or agent name.
* @param {Number} peerInfo.agent.version The Peer platform browser or agent version.
* @param {Number} peerInfo.agent.os The Peer platform name.
* @param {String} peerInfo.room The current room that the Peer is in.
* @param {Boolean} isSelf The flag that indicates if self is the Peer.
* @component Events
* @for Skylink
* @since 0.5.2
*/
peerUpdated: [],
/**
* Event triggered when a Peer leaves the room.
* @event peerLeft
* @param {String} peerId The Peer ID of the peer
* that had left the room.
* @param {Object} peerInfo The peer information associated
* with the Peer Connection.
* @param {String|JSON} peerInfo.userData The custom user data
* information set by developer. This custom user data can also
* be set in setUserData().
* @param {JSON} peerInfo.settings The Peer Stream
* streaming settings information. If both audio and video
* option is false, there should be no
* receiving remote Stream object from this associated Peer.
* @param {Boolean|JSON} [peerInfo.settings.audio=false] The
* Peer Stream streaming audio settings. If
* false, it means that audio streaming is disabled in
* the remote Stream of the Peer.
* @param {Boolean} [peerInfo.settings.audio.stereo] The flag that indicates if
* stereo option should be explictly enabled to an OPUS enabled audio stream.
* Check the audioCodec configuration settings in
* init()
* to enable OPUS as the audio codec. Note that stereo is already enabled
* for OPUS codecs, this only adds a stereo flag to the SDP to explictly
* enable stereo in the audio streaming.
* @param {Boolean|JSON} [peerInfo.settings.video=false] The Peer
* Stream streaming video settings. If false, it means that
* video streaming is disabled in the remote Stream of the Peer.
* @param {JSON} [peerInfo.settings.video.resolution] The Peer
* Stream streaming video resolution settings. Setting the resolution may
* not force set the resolution provided as it depends on the how the
* browser handles the resolution. [Rel: Skylink.VIDEO_RESOLUTION]
* @param {Number} [peerInfo.settings.video.resolution.width] The Peer
* Stream streaming video resolution width.
* @param {Number} [peerInfo.settings.video.resolution.height] The Peer
* Stream streaming video resolution height.
* @param {Number} [peerInfo.settings.video.frameRate] The Peer
* Stream streaming video maximum frameRate.
* @param {Boolean} [peerInfo.settings.video.screenshare=false] The flag
* that indicates if the Peer connection Stream object sent
* is a screensharing stream or not.
* @param {String} [peerInfo.settings.bandwidth] The Peer
* streaming bandwidth settings. Setting the bandwidth flags may not
* force set the bandwidth for each connection stream channels as it depends
* on how the browser handles the bandwidth bitrate. Values are configured
* in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.audio] The configured
* audio stream channel for the remote Stream object bandwidth
* that audio streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.video] The configured
* video stream channel for the remote Stream object bandwidth
* that video streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.data] The configured
* datachannel channel for the DataChannel connection bandwidth
* that datachannel connection per packet should be able use in <var>kb/s</var>.
* @param {JSON} peerInfo.mediaStatus The Peer Stream mute
* settings for both audio and video streamings.
* @param {Boolean} [peerInfo.mediaStatus.audioMuted=true] The flag that
* indicates if the remote Stream object audio streaming is muted. If
* there is no audio streaming enabled for the Peer, by default,
* it is set to true.
* @param {Boolean} [peerInfo.mediaStatus.videoMuted=true] The flag that
* indicates if the remote Stream object video streaming is muted. If
* there is no video streaming enabled for the Peer, by default,
* it is set to true.
* @param {JSON} peerInfo.agent The Peer platform agent information.
* @param {String} peerInfo.agent.name The Peer platform browser or agent name.
* @param {Number} peerInfo.agent.version The Peer platform browser or agent version.
* @param {Number} peerInfo.agent.os The Peer platform name.
* @param {String} peerInfo.room The current room that the Peer is in.
* @param {Boolean} isSelf The flag that indicates if self is the Peer.
* @component Events
* @for Skylink
* @since 0.5.2
*/
peerLeft: [],
/**
* Event triggered when a Stream is sent by Peer.
* - This event may trigger for self, which indicates that self has joined the room
* and is sending this Stream object to other Peers connected in the room.
* @event incomingStream
* @param {String} peerId The Peer ID associated to the Stream object.
* @param {Object} stream The Peer
* [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream_API)
* object that is sent in this connection.
* To display the MediaStream object to a video or audio, simply invoke:

* attachMediaStream(domElement, stream);.
* @param {Object} peerInfo The peer information associated
* with the Peer Connection.
* @param {String|JSON} peerInfo.userData The custom user data
* information set by developer. This custom user data can also
* be set in setUserData().
* @param {JSON} peerInfo.settings The Peer Stream
* streaming settings information. If both audio and video
* option is false, there should be no
* receiving remote Stream object from this associated Peer.
* @param {Boolean|JSON} [peerInfo.settings.audio=false] The
* Peer Stream streaming audio settings. If
* false, it means that audio streaming is disabled in
* the remote Stream of the Peer.
* @param {Boolean} [peerInfo.settings.audio.stereo] The flag that indicates if
* stereo option should be explictly enabled to an OPUS enabled audio stream.
* Check the audioCodec configuration settings in
* init()
* to enable OPUS as the audio codec. Note that stereo is already enabled
* for OPUS codecs, this only adds a stereo flag to the SDP to explictly
* enable stereo in the audio streaming.
* @param {Boolean|JSON} [peerInfo.settings.video=false] The Peer
* Stream streaming video settings. If false, it means that
* video streaming is disabled in the remote Stream of the Peer.
* @param {JSON} [peerInfo.settings.video.resolution] The Peer
* Stream streaming video resolution settings. Setting the resolution may
* not force set the resolution provided as it depends on the how the
* browser handles the resolution. [Rel: Skylink.VIDEO_RESOLUTION]
* @param {Number} [peerInfo.settings.video.resolution.width] The Peer
* Stream streaming video resolution width.
* @param {Number} [peerInfo.settings.video.resolution.height] The Peer
* Stream streaming video resolution height.
* @param {Number} [peerInfo.settings.video.frameRate] The Peer
* Stream streaming video maximum frameRate.
* @param {Boolean} [peerInfo.settings.video.screenshare=false] The flag
* that indicates if the Peer connection Stream object sent
* is a screensharing stream or not.
* @param {String} [peerInfo.settings.bandwidth] The Peer
* streaming bandwidth settings. Setting the bandwidth flags may not
* force set the bandwidth for each connection stream channels as it depends
* on how the browser handles the bandwidth bitrate. Values are configured
* in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.audio] The configured
* audio stream channel for the remote Stream object bandwidth
* that audio streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.video] The configured
* video stream channel for the remote Stream object bandwidth
* that video streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.data] The configured
* datachannel channel for the DataChannel connection bandwidth
* that datachannel connection per packet should be able use in <var>kb/s</var>.
* @param {JSON} peerInfo.mediaStatus The Peer Stream mute
* settings for both audio and video streamings.
* @param {Boolean} [peerInfo.mediaStatus.audioMuted=true] The flag that
* indicates if the remote Stream object audio streaming is muted. If
* there is no audio streaming enabled for the Peer, by default,
* it is set to true.
* @param {Boolean} [peerInfo.mediaStatus.videoMuted=true] The flag that
* indicates if the remote Stream object video streaming is muted. If
* there is no video streaming enabled for the Peer, by default,
* it is set to true.
* @param {JSON} peerInfo.agent The Peer platform agent information.
* @param {String} peerInfo.agent.name The Peer platform browser or agent name.
* @param {Number} peerInfo.agent.version The Peer platform browser or agent version.
* @param {Number} peerInfo.agent.os The Peer platform name.
* @param {String} peerInfo.room The current room that the Peer is in.
* @param {Boolean} isSelf The flag that indicates if self is the Peer.
* @component Events
* @for Skylink
* @since 0.5.5
*/
incomingStream: [],
/**
* Event triggered when message data is received from Peer.
* - This event may trigger for self when sending message data to Peer,
* which indicates that self has sent the message data.
* @event incomingMessage
* @param {JSON} message The message object received from Peer.
* @param {JSON|String} message.content The message object content. This is the
* message data content passed in {{#crossLink "Skylink/sendMessage:method"}}sendMessage(){{/crossLink}}
* and {{#crossLink "Skylink/sendP2PMessage:method"}}sendP2PMessage(){{/crossLink}}.
* @param {String} message.senderPeerId The Peer ID of the peer who
* sent the message object.
* @param {String|Array} [message.targetPeerId=null] The array of targeted Peer
* peers or the single targeted Peer the message is
* targeted to received the message object. If the value is null, the message
* object is broadcasted to all Peer peers in the room.
* @param {Boolean} message.isPrivate The flag that indicates if the message object is sent to
* targeted Peer peers and not broadcasted to all Peer peers.
* @param {Boolean} message.isDataChannel The flag that indicates if the message object is sent
* from the platform signaling socket connection or P2P channel connection (DataChannel connection).
* @param {String} peerId The Peer ID of peer who sent the
* message object.
* @param {Object} peerInfo The peer information associated
* with the Peer Connection.
* @param {String|JSON} peerInfo.userData The custom user data
* information set by developer. This custom user data can also
* be set in setUserData().
* @param {JSON} peerInfo.settings The Peer Stream
* streaming settings information. If both audio and video
* option is false, there should be no
* receiving remote Stream object from this associated Peer.
* @param {Boolean|JSON} [peerInfo.settings.audio=false] The
* Peer Stream streaming audio settings. If
* false, it means that audio streaming is disabled in
* the remote Stream of the Peer.
* @param {Boolean} [peerInfo.settings.audio.stereo] The flag that indicates if
* stereo option should be explictly enabled to an OPUS enabled audio stream.
* Check the audioCodec configuration settings in
* init()
* to enable OPUS as the audio codec. Note that stereo is already enabled
* for OPUS codecs, this only adds a stereo flag to the SDP to explictly
* enable stereo in the audio streaming.
* @param {Boolean|JSON} [peerInfo.settings.video=false] The Peer
* Stream streaming video settings. If false, it means that
* video streaming is disabled in the remote Stream of the Peer.
* @param {JSON} [peerInfo.settings.video.resolution] The Peer
* Stream streaming video resolution settings. Setting the resolution may
* not force set the resolution provided as it depends on the how the
* browser handles the resolution. [Rel: Skylink.VIDEO_RESOLUTION]
* @param {Number} [peerInfo.settings.video.resolution.width] The Peer
* Stream streaming video resolution width.
* @param {Number} [peerInfo.settings.video.resolution.height] The Peer
* Stream streaming video resolution height.
* @param {Number} [peerInfo.settings.video.frameRate] The Peer
* Stream streaming video maximum frameRate.
* @param {Boolean} [peerInfo.settings.video.screenshare=false] The flag
* that indicates if the Peer connection Stream object sent
* is a screensharing stream or not.
* @param {String} [peerInfo.settings.bandwidth] The Peer
* streaming bandwidth settings. Setting the bandwidth flags may not
* force set the bandwidth for each connection stream channels as it depends
* on how the browser handles the bandwidth bitrate. Values are configured
* in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.audio] The configured
* audio stream channel for the remote Stream object bandwidth
* that audio streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.video] The configured
* video stream channel for the remote Stream object bandwidth
* that video streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.data] The configured
* datachannel channel for the DataChannel connection bandwidth
* that datachannel connection per packet should be able use in <var>kb/s</var>.
* @param {JSON} peerInfo.mediaStatus The Peer Stream mute
* settings for both audio and video streamings.
* @param {Boolean} [peerInfo.mediaStatus.audioMuted=true] The flag that
* indicates if the remote Stream object audio streaming is muted. If
* there is no audio streaming enabled for the Peer, by default,
* it is set to true.
* @param {Boolean} [peerInfo.mediaStatus.videoMuted=true] The flag that
* indicates if the remote Stream object video streaming is muted. If
* there is no video streaming enabled for the Peer, by default,
* it is set to true.
* @param {JSON} peerInfo.agent The Peer platform agent information.
* @param {String} peerInfo.agent.name The Peer platform browser or agent name.
* @param {Number} peerInfo.agent.version The Peer platform browser or agent version.
* @param {Number} peerInfo.agent.os The Peer platform name.
* @param {String} peerInfo.room The current room that the Peer is in.
* @param {Boolean} isSelf The flag that indicates if self is the Peer.
* @component Events
* @for Skylink
* @since 0.5.2
*/
incomingMessage: [],
/**
* Event triggered when a data transfer is completed.
* - This event may trigger for self when transferring data to Peer,
* which indicates that self has transferred the data successfully.
* - For more extensive states like the outgoing and incoming
* data transfer progress and rejection of data transfer requests,
* you may subscribe to the dataTransferState event.
* - If enableDataChannel disabled in init() configuration
* settings, this event will not be triggered at all.
* @event incomingData
* @param {Blob|String} data The transferred data object.

* For Blob data object, see the
* [createObjectURL](https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL)
* method on how you can convert the Blob data object to a download link.
* @param {String} transferId The transfer ID of the completed data transfer.
* @param {String} peerId The Peer ID associated with the data transfer.
* @param {JSON} transferInfo The transfer data object information.
* @param {String} [transferInfo.name=transferId] The transfer data object name.
* If there is no name based on the Blob given, the name would be the transfer ID.
* @param {Number} transferInfo.size The transfer data size.
* @param {String} transferInfo.dataType The type of data transfer initiated.
* Available types are "dataURL" and "blob".
* @param {String} transferInfo.timeout The waiting timeout in seconds that the DataChannel
* connection data transfer should wait before throwing an exception and terminating the data transfer.
* @param {Boolean} transferInfo.isPrivate The flag to indicate if the data transferred
* targeted Peer peers and not broadcasted to all Peer peers.
* @param {Boolean} isSelf The flag that indicates if the data transfer is from self or from
* associated Peer.
* @component Events
* @for Skylink
* @since 0.6.1
*/
incomingData: [],
/**
* Event triggered when there is a request to start a data transfer.
* - This event may trigger for self when requesting a data transfer to Peer,
* which indicates that self has sent the data transfer request.
* - For more extensive states like the outgoing and incoming
* data transfer progress and rejection of data transfer requests,
* you may subscribe to the dataTransferState event.
* - If enableDataChannel disabled in init() configuration
* settings, this event will not be triggered at all.
* - DATA TRANSFER STAGE

*
* dataTransferState →
* incomingDataRequest →
* incomingData
*
* @event incomingDataRequest
* @param {String} transferId The transfer ID of the data transfer request.
* @param {String} peerId The Peer ID associated with the data transfer request.
* @param {JSON} transferInfo The transfer data object information.
* @param {String} [transferInfo.name=transferId] The transfer data object name.
* If there is no name based on the Blob given, the name would be the transfer ID.
* @param {Number} transferInfo.size The transfer data size.
* @param {String} transferInfo.dataType The type of data transfer initiated.
* Available types are "dataURL" and "blob".
* @param {String} transferInfo.timeout The waiting timeout in seconds that the DataChannel
* connection data transfer should wait before throwing an exception and terminating the data transfer.
* @param {Boolean} transferInfo.isPrivate The flag to indicate if the data transferred
* targeted Peer peers and not broadcasted to all Peer peers.
* @param {Boolean} isSelf The flag that indicates if the data transfer request is from self or from
* associated Peer.
* @component Events
* @for Skylink
* @since 0.6.1
*/
incomingDataRequest: [],
/**
* Event triggered when the currently connected room lock status have been updated.
* - If this event is triggered, this means that the room is locked / unlocked which
* may allow or prevent any other Peers from joining the room.
* @event roomLock
* @param {Boolean} isLocked The flag that indicates if the currently connected room is locked.
* @param {String} peerId The Peer ID of the peer that updated the
* currently connected room lock status.
* @param {Object} peerInfo The peer information associated
* with the Peer Connection.
* @param {String|JSON} peerInfo.userData The custom user data
* information set by developer. This custom user data can also
* be set in setUserData().
* @param {JSON} peerInfo.settings The Peer Stream
* streaming settings information. If both audio and video
* option is false, there should be no
* receiving remote Stream object from this associated Peer.
* @param {Boolean|JSON} [peerInfo.settings.audio=false] The
* Peer Stream streaming audio settings. If
* false, it means that audio streaming is disabled in
* the remote Stream of the Peer.
* @param {Boolean} [peerInfo.settings.audio.stereo] The flag that indicates if
* stereo option should be explictly enabled to an OPUS enabled audio stream.
* Check the audioCodec configuration settings in
* init()
* to enable OPUS as the audio codec. Note that stereo is already enabled
* for OPUS codecs, this only adds a stereo flag to the SDP to explictly
* enable stereo in the audio streaming.
* @param {Boolean|JSON} [peerInfo.settings.video=false] The Peer
* Stream streaming video settings. If false, it means that
* video streaming is disabled in the remote Stream of the Peer.
* @param {JSON} [peerInfo.settings.video.resolution] The Peer
* Stream streaming video resolution settings. Setting the resolution may
* not force set the resolution provided as it depends on the how the
* browser handles the resolution. [Rel: Skylink.VIDEO_RESOLUTION]
* @param {Number} [peerInfo.settings.video.resolution.width] The Peer
* Stream streaming video resolution width.
* @param {Number} [peerInfo.settings.video.resolution.height] The Peer
* Stream streaming video resolution height.
* @param {Number} [peerInfo.settings.video.frameRate] The Peer
* Stream streaming video maximum frameRate.
* @param {Boolean} [peerInfo.settings.video.screenshare=false] The flag
* that indicates if the Peer connection Stream object sent
* is a screensharing stream or not.
* @param {String} [peerInfo.settings.bandwidth] The Peer
* streaming bandwidth settings. Setting the bandwidth flags may not
* force set the bandwidth for each connection stream channels as it depends
* on how the browser handles the bandwidth bitrate. Values are configured
* in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.audio] The configured
* audio stream channel for the remote Stream object bandwidth
* that audio streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.video] The configured
* video stream channel for the remote Stream object bandwidth
* that video streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.data] The configured
* datachannel channel for the DataChannel connection bandwidth
* that datachannel connection per packet should be able use in <var>kb/s</var>.
* @param {JSON} peerInfo.mediaStatus The Peer Stream mute
* settings for both audio and video streamings.
* @param {Boolean} [peerInfo.mediaStatus.audioMuted=true] The flag that
* indicates if the remote Stream object audio streaming is muted. If
* there is no audio streaming enabled for the Peer, by default,
* it is set to true.
* @param {Boolean} [peerInfo.mediaStatus.videoMuted=true] The flag that
* indicates if the remote Stream object video streaming is muted. If
* there is no video streaming enabled for the Peer, by default,
* it is set to true.
* @param {JSON} peerInfo.agent The Peer platform agent information.
* @param {String} peerInfo.agent.name The Peer platform browser or agent name.
* @param {Number} peerInfo.agent.version The Peer platform browser or agent version.
* @param {Number} peerInfo.agent.os The Peer platform name.
* @param {String} peerInfo.room The current room that the Peer is in.
* @param {Boolean} isSelf The flag that indicates if self is the Peer.
* @component Events
* @for Skylink
* @since 0.5.2
*/
roomLock: [],
/**
* Event triggered when a Peer connection DataChannel connection state has changed.
* - This event is a debugging feature, and it's used to check the
* Peer DataChannel connection, which is used for P2P messaging and transfers for
* methods like sendBlobData(),
* sendURLData() and
* sendP2PMessage().
* - If enableDataChannel disabled in init() configuration
* settings, this event will not be triggered at all.
* @event dataChannelState
* @param {String} state The current DataChannel connection state.
* [Rel: Skylink.DATA_CHANNEL_STATE]
* @param {String} peerId The Peer ID associated with the current DataChannel connection state.
* @param {Object} [error=null] The error object thrown when there is a failure in
* the DataChannel connection.
* If received as null, it means that there is no errors.
* @param {String} channelName The DataChannel connection ID.
* @param {String} channelType The DataChannel connection functionality type.
* [Rel: Skylink.DATA_CHANNEL_TYPE]
* @component Events
* @for Skylink
* @since 0.1.0
*/
dataChannelState: [],
/**
* Event triggered when a data transfer state has changed.
* - This event triggers more extensive states like the outgoing and incoming
* data transfer progress and rejection of data transfer requests.
* For simplified events, you may subscribe to the
* incomingDataRequest and
* incomingData events.
* - If enableDataChannel disabled in init() configuration
* settings, this event will not be triggered at all.
* @event dataTransferState
* @param {String} state The data transfer made to Peer
* in a DataChannel connection state.
* [Rel: Skylink.DATA_TRANSFER_STATE]
* @param {String} transferId The transfer ID of the completed data transfer.
* @param {String} peerId The Peer ID associated with the data transfer.
* @param {JSON} transferInfo The transfer data object information.
* @param {Blob|String} transferInfo.data The transfer data object. This is defined
* only after the transfer data is completed, when the state is
* DATA_TRANSFER_STATE.DOWNLOAD_COMPLETED and
* DATA_TRANSFER_STATE.UPLOAD_STARTED

* For Blob data object, see the
* [createObjectURL](https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL)
* method on how you can convert the Blob data object to a download link.
* @param {String} [transferInfo.name=transferId] The transfer data object name.
* If there is no name based on the Blob given, the name would be the transfer ID.
* @param {Number} transferInfo.size The transfer data size.
* @param {String} transferInfo.dataType The type of data transfer initiated.
* Available types are "dataURL" and "blob".
* @param {String} transferInfo.timeout The waiting timeout in seconds that the DataChannel
* connection data transfer should wait before throwing an exception and terminating the data transfer.
* @param {Boolean} transferInfo.isPrivate The flag to indicate if the data transferred
* targeted Peer peers and not broadcasted to all Peer peers.
* @param {JSON} [error] The error object thrown when there is a failure in transferring data.
* @param {Object} error.message The exception thrown that caused the failure
* for transferring data.
* @param {String} error.transferType The data transfer type to indicate if the DataChannel is
* uploading or downloading the data transfer when the exception occurred.
* [Rel: Skylink.DATA_TRANSFER_TYPE]
* @component Events
* @for Skylink
* @since 0.4.1
*/
dataTransferState: [],
/**
* Event triggered when Skylink receives an system action from the platform signaling.
* @event systemAction
* @param {String} action The system action that is received from the platform signaling.
* [Rel: Skylink.SYSTEM_ACTION]
* @param {String} message The message received from the platform signaling when
* the system action and reason is given.
* @param {String} reason The reason received from the platform signaling behind the
* system action given.
* [Rel: Skylink.SYSTEM_ACTION_REASON]
* @component Events
* @for Skylink
* @since 0.5.1
*/
systemAction: [],
/**
* Event triggered when a server Peer joins the room.
* @event serverPeerJoined
* @param {String} peerId The Peer ID of the new server peer
* that has joined the room.
* @param {String} serverPeerType The server Peer type
* [Rel: Skylink.SERVER_PEER_TYPE]
* @component Events
* @for Skylink
* @since 0.6.1
*/
serverPeerJoined: [],
/**
* Event triggered when a server Peer leaves the room.
* @event serverPeerLeft
* @param {String} peerId The Peer ID of the new server peer
* that has left the room.
* @param {String} serverPeerType The server Peer type
* [Rel: Skylink.SERVER_PEER_TYPE]
* @component Events
* @for Skylink
* @since 0.6.1
*/
serverPeerLeft: [],
/**
* Event triggered when a sever Peer connection has been restarted for
* a reconnection.
* @event serverPeerRestart
* @param {String} peerId The Peer ID of the new server peer
* that has joined the room.
* @param {String} serverPeerType The server Peer type
* [Rel: Skylink.SERVER_PEER_TYPE]
* @component Events
* @for Skylink
* @since 0.6.1
*/
serverPeerRestart: [],
/**
* Event triggered when a Peer connection Stream streaming has stopped.
* @event streamEnded
* @param {String} [peerId=null] The Peer ID associated to the Stream object.
* If self is not in the room, the value returned would be null.
* @param {Object} peerInfo The peer information associated
* with the Peer Connection.
* @param {String|JSON} peerInfo.userData The custom user data
* information set by developer. This custom user data can also
* be set in setUserData().
* @param {JSON} peerInfo.settings The Peer Stream
* streaming settings information. If both audio and video
* option is false, there should be no
* receiving remote Stream object from this associated Peer.
* @param {Boolean|JSON} [peerInfo.settings.audio=false] The
* Peer Stream streaming audio settings. If
* false, it means that audio streaming is disabled in
* the remote Stream of the Peer.
* @param {Boolean} [peerInfo.settings.audio.stereo] The flag that indicates if
* stereo option should be explictly enabled to an OPUS enabled audio stream.
* Check the audioCodec configuration settings in
* init()
* to enable OPUS as the audio codec. Note that stereo is already enabled
* for OPUS codecs, this only adds a stereo flag to the SDP to explictly
* enable stereo in the audio streaming.
* @param {Boolean|JSON} [peerInfo.settings.video=false] The Peer
* Stream streaming video settings. If false, it means that
* video streaming is disabled in the remote Stream of the Peer.
* @param {JSON} [peerInfo.settings.video.resolution] The Peer
* Stream streaming video resolution settings. Setting the resolution may
* not force set the resolution provided as it depends on the how the
* browser handles the resolution. [Rel: Skylink.VIDEO_RESOLUTION]
* @param {Number} [peerInfo.settings.video.resolution.width] The Peer
* Stream streaming video resolution width.
* @param {Number} [peerInfo.settings.video.resolution.height] The Peer
* Stream streaming video resolution height.
* @param {Number} [peerInfo.settings.video.frameRate] The Peer
* Stream streaming video maximum frameRate.
* @param {Boolean} [peerInfo.settings.video.screenshare=false] The flag
* that indicates if the Peer connection Stream object sent
* is a screensharing stream or not.
* @param {String} [peerInfo.settings.bandwidth] The Peer
* streaming bandwidth settings. Setting the bandwidth flags may not
* force set the bandwidth for each connection stream channels as it depends
* on how the browser handles the bandwidth bitrate. Values are configured
* in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.audio] The configured
* audio stream channel for the remote Stream object bandwidth
* that audio streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.video] The configured
* video stream channel for the remote Stream object bandwidth
* that video streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.data] The configured
* datachannel channel for the DataChannel connection bandwidth
* that datachannel connection per packet should be able use in <var>kb/s</var>.
* @param {JSON} peerInfo.mediaStatus The Peer Stream mute
* settings for both audio and video streamings.
* @param {Boolean} [peerInfo.mediaStatus.audioMuted=true] The flag that
* indicates if the remote Stream object audio streaming is muted. If
* there is no audio streaming enabled for the Peer, by default,
* it is set to true.
* @param {Boolean} [peerInfo.mediaStatus.videoMuted=true] The flag that
* indicates if the remote Stream object video streaming is muted. If
* there is no video streaming enabled for the Peer, by default,
* it is set to true.
* @param {JSON} peerInfo.agent The Peer platform agent information.
* @param {String} peerInfo.agent.name The Peer platform browser or agent name.
* @param {Number} peerInfo.agent.version The Peer platform browser or agent version.
* @param {Number} peerInfo.agent.os The Peer platform name.
* @param {String} peerInfo.room The current room that the Peer is in.
* @param {Boolean} isSelf The flag that indicates if self is the Peer.
* @param {Boolean} isScreensharing The flag that indicates if Peer connection
* Stream object is a screensharing stream or not.
* @component Events
* @for Skylink
* @since 0.5.10
*/
streamEnded: [],
/**
* Event triggered when a Peer connection Stream streaming audio or video
* stream muted status have been updated.
* @event streamMuted
* @param {String} peerId The Peer ID associated to the Stream object.
* If self is not in the room, the value returned would be null.
* @param {Object} peerInfo The peer information associated
* with the Peer Connection.
* @param {String|JSON} peerInfo.userData The custom user data
* information set by developer. This custom user data can also
* be set in setUserData().
* @param {JSON} peerInfo.settings The Peer Stream
* streaming settings information. If both audio and video
* option is false, there should be no
* receiving remote Stream object from this associated Peer.
* @param {Boolean|JSON} [peerInfo.settings.audio=false] The
* Peer Stream streaming audio settings. If
* false, it means that audio streaming is disabled in
* the remote Stream of the Peer.
* @param {Boolean} [peerInfo.settings.audio.stereo] The flag that indicates if
* stereo option should be explictly enabled to an OPUS enabled audio stream.
* Check the audioCodec configuration settings in
* init()
* to enable OPUS as the audio codec. Note that stereo is already enabled
* for OPUS codecs, this only adds a stereo flag to the SDP to explictly
* enable stereo in the audio streaming.
* @param {Boolean|JSON} [peerInfo.settings.video=false] The Peer
* Stream streaming video settings. If false, it means that
* video streaming is disabled in the remote Stream of the Peer.
* @param {JSON} [peerInfo.settings.video.resolution] The Peer
* Stream streaming video resolution settings. Setting the resolution may
* not force set the resolution provided as it depends on the how the
* browser handles the resolution. [Rel: Skylink.VIDEO_RESOLUTION]
* @param {Number} [peerInfo.settings.video.resolution.width] The Peer
* Stream streaming video resolution width.
* @param {Number} [peerInfo.settings.video.resolution.height] The Peer
* Stream streaming video resolution height.
* @param {Number} [peerInfo.settings.video.frameRate] The Peer
* Stream streaming video maximum frameRate.
* @param {Boolean} [peerInfo.settings.video.screenshare=false] The flag
* that indicates if the Peer connection Stream object sent
* is a screensharing stream or not.
* @param {String} [peerInfo.settings.bandwidth] The Peer
* streaming bandwidth settings. Setting the bandwidth flags may not
* force set the bandwidth for each connection stream channels as it depends
* on how the browser handles the bandwidth bitrate. Values are configured
* in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.audio] The configured
* audio stream channel for the remote Stream object bandwidth
* that audio streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.video] The configured
* video stream channel for the remote Stream object bandwidth
* that video streaming should use in <var>kb/s</var>.
* @param {String} [peerInfo.settings.bandwidth.data] The configured
* datachannel channel for the DataChannel connection bandwidth
* that datachannel connection per packet should be able use in <var>kb/s</var>.
* @param {JSON} peerInfo.mediaStatus The Peer Stream mute
* settings for both audio and video streamings.
* @param {Boolean} [peerInfo.mediaStatus.audioMuted=true] The flag that
* indicates if the remote Stream object audio streaming is muted. If
* there is no audio streaming enabled for the Peer, by default,
* it is set to true.
* @param {Boolean} [peerInfo.mediaStatus.videoMuted=true] The flag that
* indicates if the remote Stream object video streaming is muted. If
* there is no video streaming enabled for the Peer, by default,
* it is set to true.
* @param {JSON} peerInfo.agent The Peer platform agent information.
* @param {String} peerInfo.agent.name The Peer platform browser or agent name.
* @param {Number} peerInfo.agent.version The Peer platform browser or agent version.
* @param {Number} peerInfo.agent.os The Peer platform name.
* @param {String} peerInfo.room The current room that the Peer is in.
* @param {Boolean} isSelf The flag that indicates if self is the Peer.
* @param {Boolean} isScreensharing The flag that indicates if Peer connection
* Stream object is a screensharing stream or not.
* @component Events
* @for Skylink
* @since 0.6.1
*/
streamMuted: [],
/**
* Event triggered when the retrieval of the list of rooms and peers under the same realm based
* on the Application Key configured in init()
* from the platform signaling state has changed.
* - This requires that the provided alias Application Key has privileged feature configured.
* @event getPeersStateChange
* @param {String} state The retrieval current status.
* @param {String} privilegedPeerId The Peer ID of the privileged Peer.
* @param {JSON} peerList The retrieved list of rooms and peers under the same realm based on
* the Application Key configured in init().
* @component Events
* @for Skylink
* @since 0.6.1
*/
getPeersStateChange: [],
/**
* Event triggered when introductory state of two Peer peers to each other
* selected by the privileged Peer state has changed.
* - This requires that the provided alias Application Key has privileged feature configured.
* @event introduceStateChange
* @param {String} state The Peer introduction state.
* @param {String} privilegedPeerId The Peer ID of the privileged Peer.
* @param {String} sendingPeerId The Peer ID of the peer
* that initiates the connection with the introduced Peer.
* @param {String} receivingPeerId The Peer ID of the
* introduced peer who would be introduced to the initiator Peer.
* @param {String} reason The error object thrown when there is a failure in
* the introduction with the two Peer peers.
* If received as null, it means that there is no errors.
* @component Events
* @for Skylink
* @since 0.6.1
*/
introduceStateChange: []
};
/**
* Stores the list of {{#crossLink "Skylink/once:method"}}once(){{/crossLink}}
* event subscription handlers.
* @attribute _onceEvents
* @param {Array} (#eventName) The array of event subscription handlers that is
* subscribed using {{#crossLink "Skylink/once:method"}}once() method{{/crossLink}}
* associated with the event name.
* @param {Function} (#eventName).(#index) The event subscription handler
* associated with the event name. This is to be triggered once when condition is met.
* Alternatively, the once() event subscription handler can be
* unsubscribed with {{#crossLink "Skylink/off:method"}}off(){{/crossLink}} before
* condition is met.
* @type JSON
* @private
* @required
* @component Events
* @for Skylink
* @since 0.5.4
*/
Skylink.prototype._onceEvents = {};
/**
* The throttling function datetime stamp in
* [(ISO 8601 format)](https://en.wikipedia.org/wiki/ISO_8601).
* @attribute _timestamp
* @type JSON
* @private
* @required
* @component Events
* @for Skylink
* @since 0.5.8
*/
Skylink.prototype._timestamp = {
now: Date.now() || function() { return +new Date(); }
};
/**
* Triggers event subscription handlers that is associated with the event name.
* {{#crossLink "Skylink/on:method"}}on() event subscription handlers{{/crossLink}}
* will be triggered always, but
* {{#crossLink "Skylink/once:method"}}once() event subscription hadlers{{/crossLink}}
* will only be triggered once the condition is met.
* @method _trigger
* @param {String} eventName The Skylink event name to trigger that would trigger event subscription
* handlers associated to the event name with the arguments parameters payload.
* @for Skylink
* @private
* @component Events
* @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][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']);
};
/**
* Subscribes an event handler associated to the event name.
* This event handler will always be triggered when the event name is triggered. If you
* are looking for subscription event handler to be triggered once, check out
* {{#crossLink "Skylink/once:method"}}once() event subscription{{/crossLink}}.
* @method on
* @param {String} eventName The Skylink event name to subscribe to.
* @param {Function} callback The event handler to subsribe to the associated
* Skylink event name that would be triggered once the event name is triggered.
* @example
* SkylinkDemo.on("peerJoined", function (peerId, peerInfo) {
* alert(peerId + " has joined the room");
* });
* @component Events
* @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']);
}
};
/**
* Subscribes an event handler associated to the event name that
* would only be triggered once the provided condition function has been met.
* @method once
* @param {String} eventName The Skylink event name to subscribe to.
* @param {Function} callback The event handler to subscribe to the associated
* Skylink event name to trigger once the condition has met. If
* fireAlways option is set toe true, this will
* always be fired when condition is met.
* @param {Function} [condition] The condition function that once the condition has
* been met, trigger the event handler once. Return in the condition function true
* to pass as meeting the condition.
* If the condition function is not provided, the event handler will be triggered
* once the Skylink event name is triggered.
* @param {Boolean} [fireAlways=false] The flag that indicates if Skylink should interrupt this
* once() function once the function has been triggered to not unsubscribe the
* event handler but to always trigger when the condition has been met.
* @example
* SkylinkDemo.once("peerConnectionState", function (state, peerId) {
* alert("Peer has left");
* }, function (state, peerId) {
* return state === SkylinkDemo.PEER_CONNECTION_STATE.CLOSED;
* });
* @component Events
* @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._EVENTS[eventName] = this._EVENTS[eventName] || [];
// prevent undefined error
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']);
}
};
/**
* Unsubscribes an event handler associated to the event name.
* @method off
* @param {String} eventName The Skylink event name to unsubscribe to.
* @param {Function} [callback] The event handler to unsubscribe to the associated
* Skylink event name. If the event handler is not provided, Skylink would
* unsubscribe all event handlers subscribed to the associated event name.
* @example
* // Example 1: Unsubscribe all event handlers related to the event
* SkylinkDemo.off("peerJoined");
*
* // Example 2: Unsubscribe to one event handler
* SkylinkDemo.off("peerJoined", callback);
* @component Events
* @for Skylink
* @since 0.5.5
*/
Skylink.prototype.off = function(eventName, callback) {
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;
}
}
}
};
/**
* Checks if the first condition is already met before doing an event
* handler subscription to wait for the second condition to be met.
* This method will do a event subscription with
* {{#crossLink "Skylink/once:method"}}once(){{/crossLink}} as this
* _condition() would only trigger once, unless fireAlways
* is set to true.
* @method _condition
* @param {String} eventName The Skylink event name to subscribe to.
* @param {Function} callback The event handler to subscribe to the associated
* Skylink event name to trigger once the condition has met. If
* fireAlways option is set to true, this will
* always be fired when condition is met.
* @param {Function} [checkFirst] The first condition to check before
* doing an event subscription to wait for second condition to meet.
* Return in the first condition function true to pass as meeting the condition.
* If the first condition is met, the event handler would be triggered
* and the event handler will not be subscribed to the event or wait
* for second condition to pass.
* @param {Function} [condition] The second condition function that once the it has
* been met, it will trigger the event handler once.
* Return in the second condition function true to pass as meeting the condition.
* If the second condition is met, the event handler would be triggered and
* depending if fireAlways option is set to true, this will
* always be fired when condition is met.
* @param {Boolean} [fireAlways=false] The flag that indicates if Skylink should interrupt the
* second condition function once the function has been triggered to not unsubscribe the
* event handler but to always trigger when the second condition has been met.
* @private
* @component Events
* @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']);
}
};
/**
* Starts the interval check for the condition provided to meet before clearing
* the interval and triggering the callback provided.
* This utilises setInterval() function.
* @method _wait
* @param {Function} callback The callback fired after the condition provided
* has been met.
* @param {Function} condition The condition function that once the condition has
* been met, trigger the callback. Return in the condition function true
* to pass as meeting the condition.
* @param {Number} [intervalTime=50] The interval loop timeout that the interval
* check should iterate based on the timeout provided (in ms).
* By default, if the value is not configured, it is 50ms.
* @for Skylink
* @private
* @component Events
* @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']);
}
}
};
/**
* Returns a wrapper of the original function, which fires only once during
* a specified amount of time.
* @method _throttle
* @param {Function} func The function that should be throttled.
* @param {Number} wait The amount of time that function need to throttled (in ms).
* @return {Function} The throttled function.
* @private
* @component Events
* @for Skylink
* @since 0.5.8
*/
Skylink.prototype._throttle = function(func, wait){
var self = this;
return function () {
if (!self._timestamp.func){
//First time run, need to force timestamp to skip condition
self._timestamp.func = self._timestamp.now - wait;
}
var now = Date.now();
if (now - self._timestamp.func < wait) {
return;
}
func.apply(self, arguments);
self._timestamp.func = now;
};
};


Akan names are derived from Ghanaian culture.In Ghana, children are named based on a day of the week that they were born
The Akan generator will give your Ghanaian Akan Name based on your birth day and gender


Toggle navigation
Project Newcastle
{{ authCtrl.username }}
Logout
Login
Dashboard
Products
Build Configs
Build Configs
Build Group Configs
Projects Metadata
Builds
Builds
Build Groups
Import
Product
Processing...


This version (0.97) of PgAccess has changed the form API : variable handling, query results interface and control bindings naming convention. Please read it carefully, download the database demo and practice a while before trying to design your own forms.
For the moment, it has only some basic widgets : labels, entries, buttons , listboxes , checkboxes and radiobuttons.
Also there is a pseudo data control widget that allows you yo have access to a query results.
How do you generate widgets :
Renaming, resizing items are possible (for the moment) only by modifying appropriate parameters in attribute window. You must press Enter in the edit field after changing a value in order to be accepted.
You can also move items by dragging them or delete them by pressing Del key after selecting them.
In attribute window, there are some fields named Command and Variable.
The field Command have meaning only for Button widgets and holds the command that will be invoked when the button is pressed.
The field Variable have meaning only for EditField , Label widgets , checkboxes and radiobuttons and it is the name of the global variable that will hold the value for that widget. For checkboxes the values are t and f (from true and false) in order to simplify binding to logical data fields (PgAccess 0.82 used 0 and 1).
For radiobuttons, it is usual to assign the same variable to the same radiobuttons within the same group. That variable will contain the name of the widget of the radiobutton that has been pressed. Let's presume that you have entered 3 radiobuttons named red, green and blue, all of them having the same variable named color. If you will press them, they will assign their names to global variable.
In order to make a simple test, put an entry field
and set it's variable to v1 and a button who's command is "set v1
whisky". Press the button "Test form" and click on the button. In that
entry should appear whisky.
Another test is defining in Script module a script called "My first
script" having the following commands:
tk_messageBox -title Warning -message "This is my
first message!"
and then define a button who's command is execute_script
"My first script".
Also, any widget created inside this window (form) will have the name prefixed by .mf ,so we will have .mf.button1 or .mf.listbox1 .
We can name the data control widget dc for example.
The fully qualified name for that "virtual widget" will be .mf.dc
then. A new namespace called DataControl(.mf.dc) will be
automatically defined.
The Command property of the data control widget must
contain the SQL command that will be executed.
When the form will be in run-time, automatically you will have access
to the following procedures and functions from the namespace:
open - opens the connection and execute the query (returns
nothing)
setSQL newsql - set the command query that will be
executed at the next open
getRowCount - returns the number of records of the
result set
getRowIndex - returns the current record number inside
the result set
getFieldList - returns a Tcl list containing the fields
names from the current result set
moveFirst - move the cursor to the first record in
the recordset
moveLast , moveNext , movePrevious-
moves the cursor there
moveTo newrecno - move the cursor to that new record
number (first is 0)
updateDataSet - update the variables inside the designed
form that have a particular name (I'll explain later)
clearDataSet - clear the associated DataSet variables
fill listbox field - fill the named listbox (whole
widget name as .mf.listbox1) with the all the values of
that field from the current result set
close - close the result set (if
you don't close it, you will loose some memory)
These procedures and functions should be called in the normal Tcl namespace mode as in the following example:
DataControl(.mf.dc)::setSQL "select * from phonebook"
DataControl(.mf.dc)::open
set nrecs [DataControl(.mf.dc)::getRowCount]
If you complaint about writting to many DataControl(...) you can include many commands into a single namespace eval as in the following example :
namespace eval DataControl(.mf.dc) {
setSQL "select * from phonebook"
open
set nrecs [getRowCount]
moveLast
updateDataSet
}
It's no need to close a query-result set if you want to assign it a
new SQL command and open it again. That will be done automatically releasing
the memory used for the last result set.
Opening a new DataControl will automatically position the current
row index of the result set on the first row (index 0) and will define
a new global associative array named DataSet that will hold data
from the current row. The key into that array will be the fully qualified
name of the data control widget followed by a comma and the name of every
field in the selected rows.
Example:
DataSet(.mf.dc,name)
DataSet(.mf.dc,city)
If you want to bound some controls to the fields of the recordset, you will have to name their associate variable like that :
DataSet(.mf.dc,salary) to get the "salary" field , or
DataSet(.mf.dc,name) to get the "name" field. Using the
data control procedures DataControl(.mf.dc)::moveNext or
movePrevious will automatically update the DataSet(.mf.dc,...)
array so the database information from entries in the form will be refreshed.
Here it is a dumped sample database
that contains a demo database. What should you do ?
Shift-click the above URL in order to download that tiny file (4 Kb).
Create a empty database and psql yourdatabase <formdemo.sql
You should find a single table called "phonebook" a form called "Phone book" and another "A simple demo form".
First of all enter and view the phonebook table in table view. Note
the fields and their values.
Open the "Phone book" form and enter a letter (a, e or i) in the field
to the left of "Find" button then press Find. It's fine to enter one letter
in order to get more records in query result. You will get information
about the number of records selected, in the listbox you will see all the
values of field "name" from the current data set. Use buttons to move to
first, next, previous or last record within the record set.
In order to add a new record, press the "New" button in order to get new, clean entries. Fill them with your data and press "Add new" button. A new phonebook record will be added. Also, if you want to update a record, change it's values in the displayed fields after finding it and press "Update" button. The values will be updated in the database BUT NOT IN THE CURRENT QUERY RESULT . If you want to see them modified, make a new query trying to find it again.
Before using the results from a query you should know that the information that has been retrieved could be found only in your computer client memory. It has no live connection to the data from the database. That's why it isn't possible to develop a simple update function as interface to that query-result widget. More than that : a query result could be obtained from a SQL command that return a non-updatable data set !!! For example fields gathered from multiple tables or summary fields. It isn't just simple to make an automatic update procedure. The programmer must know how to make the update or the append procedure, sometimes using key fields to point to the desired record or an OID. There are examples in the demo database in "Phone book" form. It may be possible that in the future, I will develop another pseudo-widget describing a table. It would be more simple than to implement an update or append or even a delete procedure.
There is in the demo database also another simple form called "A simple demo form". It will show you how to handle variables from checkboxes, radiobuttons, how to use listboxes, open another forms and so on. I think they will help you.
In order to avoid naming user defined forms with a particular name of another PgAccess form, I would recommend naming them as udf0, udf1 (user defined form 0 , 1 )
Please feel free to send me your opinion at<EMAIL_ADDRESS>on forms designing and usage.
KEEP IN MIND !
THE FORM API MAY CHANGE IN ORDER TO BE MORE SIMPLE AND BETTER!

ALSO ...


Provides functions to draw spatially balanced samples. It contains fast implementations (C++ via 'Rcpp') of the included sampling methods. In particular, the algorithms to draw spatially balanced samples are pwd() and swd(). These methods use a probability distribution, proportional to the within sample distance. See Benedetti R and Piersimoni F (2017) <doi:10.1002/bimj.201600194> for details. Moreover, there is a function hpwd(), which is a heuristic method to achieve approximated samples obtained by pwd() in a faster way. See Benedetti R and Piersimoni F (2017) <arXiv:1710.09116> for details. Finally, there are two functions, stprod() and stsum(), useful to standardize distance matrices in order to achieve fixed sample size using, respectively, the functions pwd() and swd().
| Version: | 1.0.0 |
| Depends: | R (≥ 3.1) |
| Imports: | Rcpp, Rdpack |
| LinkingTo: | Rcpp |
| Published: | 2018-05-30 |
| Author: | Francesco Pantalone, Roberto Benedetti, Federica Piersimoni |
| Maintainer: | Francesco Pantalone <pantalone.fra at gmail.com> |
| License: | GPL-3 |
| NeedsCompilation: | yes |
| CRAN checks: | Spbsampling results |
| Reference manual: | Spbsampling.pdf |
| Package source: | Spbsampling_1.0.0.tar.gz |
| Windows binaries: | r-devel: Spbsampling_1.0.0.zip, r-release: Spbsampling_1.0.0.zip, r-oldrel: Spbsampling_1.0.0.zip |
| OS X binaries: | r-release: Spbsampling_1.0.0.tgz, r-oldrel: Spbsampling_1.0.0.tgz |
Please use the canonical form https://CRAN.R-project.org/package=Spbsampling to link to this page.


Vote For Wakanda UN Officials
Candidate:
Select Candidate
Leaderboard:
Show Leads
Current WKND Balance:
Check Balance
Voting Fee:
VOTE


Preliminaries¶
Launching¶
The easiest way to launch the GUI is from Python or iPython:
>>> import mwarp1d
>>> mwarp1d.launch_gui()
launch_gui
optionally accepts various input arguments as described here.
Alternatively you can launch the GUI using ./mwwarp1d/ui/main.py
as follows:
python main.py
Importing data¶
After launching mwarp1d, its main window will appear:
To import data, drag-and-drop a CSV file on the “Drop Data File Here” box.
The CSV file must be formatted as follows:
Only numbers (no column or row headers)
Rows = observations
Columns = domain nodes
Thus eight observations, each with 100 domain nodes, would require an (8 x 100) CSV file.
Specifying output directory¶
After dropping a CSV data file on the “Drop Data File Here” box, the output (Results) file will be automatically set to mwarp1d.npz
, in the same directory as the CSV folder, like this:
To change the output directory and/or results file name, simply click on the label. A file dialog will appear.
Note that all warping results are automatically saved to the NPZ file.
This NPZ file can be used to restore previous sessions.


TABLE OF INTERACTIONS WITH
NON-CONTRACEPTIVE PROGESTOGENS, COMBINED WITH AN ESTROGEN OR NOT
From the French ANSM drug interactions document of September 2016, p. 183
NON-CONTRACEPTIVE PROGESTOGENS, COMBINED WITH AN ESTROGEN OR NOT CLASS CODE: G03-003 |
BOSENTAN RxNorm: 75207 ATC: C02KX01 |
Risk of decrease of the effectiveness of the progestogen |
Precaution for use Clinical monitoring and possible adjustment of the dosage of the hormonal treatment during the administration of the bosentan and after it is stopped |
NON-CONTRACEPTIVE PROGESTOGENS, COMBINED WITH AN ESTROGEN OR NOT CLASS CODE: G03-003 |
ENZYME INDUCERS CLASS CODE: N03-J05-001 |
Decrease of the effectiveness of the progestogen |
Precaution for use Clinical monitoring and possible adjustment of the dosage of the hormonal treatment during the administration of the inducer and after it is stopped. |
NON-CONTRACEPTIVE PROGESTOGENS, COMBINED WITH AN ESTROGEN OR NOT CLASS CODE: G03-003 |
ULIPRISTAL RxNorm: 1005921 ATC: G03AD02 |
Risk of antagonism of the effects of the progestogen |
Not recommended Use an additional contraceptive method of the barrier type for several days after the ulipristal is stopped |


When you work with us, you are part of committed collaborators.All aspects of our software development process are intergrated, interactive and agile.
Our approach utilises design, development and product management to create exceptional products.
We start each project by understanding your business goals, the user's needs and the product requirements
Then we help translate them into effective and elegant solutions
Our design practice offers a full range of services including brand strategy, interaction and visual design and user experience testing.
Throughout your project, our designers create and implement visual design and workflows, solicit user feedback and work with you to make sure what gets built is what is needed.
All engineers are fluent in the latest enterprise, mobile and web development technologies.
They collaborate with your team to write, and improve code on a daily basis, using proven practices such as self-driven development and pair programming.
Planning and development is iterative. Because we are constantly coding and testing, the products we build are always ready to go live.
This iterative process allows for changes as business requirements evolve.
DELANI STUDIO
2019


Page not found
Uh-oh, you seem to have taken a wrong turn! It looks like this was the result of either:
- A mistyped URL, or a copy-and-paste mistake
- A broken link on a web pages or in an email
- Moved or deleted content
I suggest that you head to my Home page from here.


The conference is now an online only event. It will take place from 23rd August to 26th August.
The virtual space of the online conference is hosted on Moodle system.
All registered participants have been invited to get access to the virtual space by email.
If you are registered but have not received the invitation, please contact the Executive Organisation Chair
Prof. Hong Zhu by email at<EMAIL_ADDRESS>news
Oct. 26 2020:
Please check the the new Announcement on participating the online conferences.
For further details about the online conferences, please take a look at the online venue page.
Online Venue
IEEE Big Data Service
As computing systems become increasingly larger, more complex, distributed, and integrated, Big Data technologies and services are ever more vital. IEEE BigDataService 2021 provides an internationally leading forum for researchers and practitioners in academia and industry to exchange innovative ideas and share latest results, experiences and lessons learned in this crucial domain. The conference will take place online on the 23rd-26th of August 2021, will be co-located with IEEE SOSE 2021, IEEE MobileCloud 2021 and IEEE DAPPS 2021, and IEEE AITest 2021, and will consist of a main track and special tracks. The conference also welcomes workshop proposals – with a deadline on March 1st 2021 and seeks the submission of high-quality papers limited to up to 10 pages (IEEE format) in length. All accepted papers will be included in the proceedings. Selected papers will be invited for extension and published in journals (SCI-Index).
Papers must be written in English. All papers must be prepared in the IEEE double column proceedings format. Please see the following link for details: http://www.ieee.org/conferences_events/conferences/publishing/templates.html. Research papers are limited to 8 pages, survey papers are limited to 10 pages, and experience/industry papers are limited to 6 pages. Authors must submit their papers at the Easychair platform. Authors must submit their papers at: Submit paper
All accepted papers will be published by IEEE Computer Society Press (EI‐Index) and included in IEEE Digital Library. For publication, at least one author is required to register at the full rate and present the paper at the conference for the paper to be included in the final technical program and the IEEE Digital Library. Selected papers will be invited for extension and published in journals (SCI-Index).
IEEE Big Data Service - Workshops and Tutorials
Workshop proposals should include a 1-2 page summary of the topic and the names
and affiliations of 3-4 chairs and program committee members who have made a
commitment to participate, where it should be stated clearly the primary contact
person to whom correspondence should be directed. A mix of industry and academic
panel members are recommended.
In the page summary the organizers should present clearly:
Tutorial proposals should include a 1-2 page summary of the topic and the names,
affiliations and short cvs of the presenters. They should clearly state the
primary contact person to whom correspondence should be directed and the
importance and relevance of the tutorial to the conference. An estimated
duration must also be provided and the expected audience. Finally, any special
equipment required for the presentation (besides a laptop and a projector that
will be available anyway) must be noticed in advance.
Co-Located Conferences and Workshops
Submit to Conference and Workshops
SUBMIT PAPERDates
Full paper submission:
Mar. 1, 2021
Workshop/Tutorial proposals:
May. 1, 2021
Notification:
Jun. 20, 2021
Final Paper and Registration:
Jul. 15, 2021
Conference:
Aug. 23-26, 2021
Sponsors
Contacts


Note:
Demand Price: Pay for compute capacity by the second, with no long-term commitment or upfront payments. Increase or decrease compute capacity on demand. Start or stop at any time and only pay for what you use.
Reserved Instances (RI): The commitment is made up front, and in return, you get up to 72 percent price savings compared to pay-as-you-go pricing. Reserved Virtual Machine Instances are flexible and can easily be exchanged or returned.


Chord Creation Page
Pick up to six notes that you want in your chord from the left list and to remove selected notes from your list simply click on them in the right list:
{% for note in notes %}
{{note.alphaValue}}
{% endfor %}
Check the box if the first note in the list is the bass note
Enter the fret number you want the chord to be build around
Do not Care
{% for x in range (0, 1+(numFrets|int)) %}
{{x}}
{% endfor %}


{% extends 'layouts/main.html' %} {% block title %}Home{% endblock %} {% block content %}
Operator Dashboard for Experience Lighting, Sound, And Scene Control


should not catch a non-link element
should catch an element childed to a link
should not catch an element that does not pass filter
should catch an element bound from a second docclick
show screen D with themed element


Part 1: Getting Set Up
- Set up the website. Follow the instructions here to get your website and message board set up, and set up a chat room by following the instructions here; if you have any trouble, don't hesitate to ask for help! Also, let us know you're starting a study group by opening an issue, and we'll put you and your website on the Study Group Map.
- Book your first event. Make it a hacky hour to invite people to come out and discuss this new Study Group's goals and plans. Instructions for listing an event on your website are in the README of the repository you forked in the previous step, or you can see them here.
- Start your outreach communication.
- Get an announcement about your new Study Group into the next departmental email. Here's a template to get you started - feel free to remix!
- Announce on mailing lists of groups you think will be interested.
- Look for opportunities to mention your Study Group in other meetings or events.
- One week before your first event, tweet a link to the details daily, at different prominent Twitter users in your field & local region.
- All communications should have a link to your website, a link to the issue tracker in your repository encouraging people to start conversations there as well as watch that repo, a pointer to your Code of Conduct, and a reminder that beginners are very welcome.
Part 2: Your First Events
- Event 1: Welcome Hacky Hour (Week 0) This is the event you booked in part 1, step 2 above. Make sure the community knows that all are welcome, and that you'll be discussing starting a Study Group for coding in research.
Your Goals:- Identify co-facilitators & delegate. The people who come out to an initial event are likely to be enthusiastic and good candidates for people to collaborate with on organizing your Study Group; try and find as many as possible at this stage to help organize and get the word out. Remember to add them as Collaborators on your GitHub repo!
- Find out what the community wants. Take the opportunity to talk to people about what they would find most useful in a Study Group. What languages are interesting to your community? Do they want more guided lessons, or more coworking opportunities?
- Set the tone. Your first event will set the tone for your Study Group. Hand out copies of your code of conduct, and do not underestimate the power of baking cookies.
- Event 2: Intro Code Along (Week 1) For your first classroom event, organize a code-along for beginners; for this event, the simpler the content, the better, in order to include as many curious people as possible.
Your Goals:- Start the event by going around the room with lightning introductions: name and current research interest (tweet length!)
- Let everyone at the event know what the goals of the Study Group are.
- Make sure they know how to find your chat room and issue tracker, encourage them to ask questions & make suggestions there, and watch your repository so they get email updates of new events.
- Invite everyone to lead a code-along or suggest an event.
- If the demo leader creates a new lesson for this session, make sure the notes get posted somewhere on GitHub, and add the link to a list of lesson material in your repository.
- Event 3: Topic Code Along (Week 2-3) Encourage one of the people who suggested or volunteered a code-along on a particular package or tool to lead a demo. Make sure the event is listed on the website with date, place and any dependencies needed at least a week in advance.
Your Goals:- Before the lesson, have a chat with the demo leader about audience: this session should be interesting for intermediate users who would like an introduction to the package in question, but also be explicit enough to be followed by a beginner.
- Remember to encourage the demo leader to post their lessons somewhere you can link to, or submit them to the Mozilla Science Lab if people don't want to host them themselves.
- As always, encourage everyone to propose or lead a session on the issue tracker.
- Event 4: Coworking Session & Hacky Hour (Week 3-4) The week following your first couple of code-alongs, try out a coworking session, and follow it up with another hacky hour.
Your Goals:- At the start of the coworking session, ask ask everyone to call out what they're working on that day, and what tools they're using.
- During the session, keep an eye out for someone who might need help, and take the time to work with them in order to set an example of collaborating and asking questions.
- At the end of the coworking session, ask everyone to give a quick update on what they worked on, and invite them to show a demo if they like.
- Reconvene at the pub for hacky hour - make sure to announce beforehand when hacky hour is starting, so those who can't make the coworking session can meet you there.
After completing this first month of activities, you should have an idea of what your community likes, a pattern of communication about your events established, and a group of people helping co-organize. From here on, you're in the driver's seat! Remember to make sure everyone feels included and welcome, and let us know how things are going.


Xschem slides
INDEX
- What is XSCHEM
- Install XSCHEM
- Run XSCHEM
- XSCHEM elements
- Symbols
- XSCHEM properties
- Component instantiation
- Symbol properties syntax
- Component properties syntax
- Creating a circuit schematic
- Creating symbols
- Component parameters
- Editor commands
- Netlisting
- Net Probes
- Simulation
- Developer Info, XSCHEM file format specification
- XSCHEM remote interface specification
TUTORIALS
- Step by step instructions: Install XSCHEM
- Run a simulation with XSCHEM
- Create a symbol with XSCHEM
- Manage XSCHEM design libraries / symbol librares
- Use bus / vector notation for signal bundles / arrays of instances
- Backannotation of Ngspice simulation data into xschem
- Use symgen.awk to create symbols from 'djboxsym' compatible text files
- [Video] Install Xschem, Xschem_sky130, skywater-pdk and ngspice: step by step instructions
- [Video] Editing commands and simulation
- [Video] Editing component attributes
- [Video] Copying objects across xschem windows
- [Video] Symbols with inherited connections
- [Video] Search / replace function
- [Video] How to stretch objects
- [Video] Parameters in subcircuits
- [Video] Create pins from net labels, fix grid align issues, wires
- [Video] Link documentation to components/symbols
- [Video] Use rawtovcd to show ngspice waveforms in gtkwave
- [Video] Run a Verilog simulation with XSCHEM and icarus Verilog
- [Video] See logic propagation of nets live in xschem without using a backend simulator
- [Video] Probe xschem nets into the GAW waveform viewer
- [Video] Creating a symbol
- [Video] Instantiating schematics instead of symbols (LCC, Local Custom Cell)
- [Video] Using more schematic views of a symbol to do simulation at different abstraction levels
- [Video] Let components display the name of the net attached to their pins


Paste in Remote SDP Offer (as a base64 string)
Start
Local SDP Answer will appear here (as a base64 string)
Close


Before Change
ping_results[self.slow_netloc], Pinger.UNREACHABLE, msg=self.message)
def test_global_pinger_memo(self):
fast_pinger = Pinger(timeout=self.fast_timeout_seconds, tries=2)
slow_pinger = Pinger(timeout=self.slow_timeout_seconds, tries=2)
self.assertEqual(
fast_pinger.pings([self.slow_netloc])[0][1], Pinger.UNREACHABLE, msg=self.message)
self.assertNotEqual(
After Change
urls = [self.slow_url]
with self.pinger(timeout=0.2, urls=urls) as fast_pinger:
self.assertEqual(fast_pinger.pings([self.slow_url])[0][1], Pinger.UNREACHABLE)
with self.pinger(timeout=0.4, urls=urls) as slow_pinger:
self.assertLess(slow_pinger.pings([self.slow_url])[0][1], Pinger.UNREACHABLE)
def test_https_external_pinger(self):
// NB(gmalmquist): I spent quite some time trying to spin up an HTTPS server and get it to work
// with this test, but it appears to be more trouble than it"s worth. If you"re feeling
// ambitious, feel free to give it a try.