File: source/peer-privileged.js
/**
* These are the list of Peer list retrieval states that Skylink would trigger.
* - This relates to and requires the Privileged Key feature where Peers using
* that Privileged alias Key becomes a privileged Peer with privileged functionalities.
* @attribute GET_PEERS_STATE
* @type JSON
* @param {String} ENQUIRED <small>Value <code>"enquired"</code></small>
* The state when the privileged Peer already enquired signaling for list of peers.
* @param {String} RECEIVED <small>Value <code>"received"</code></small>
* The state when the privileged Peer received list of peers from signaling.
* @readOnly
* @component Peer
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype.GET_PEERS_STATE = {
ENQUIRED: 'enquired',
RECEIVED: 'received',
};
/**
* These are the list of Peer introduction states that Skylink would trigger.
* - This relates to and requires the Privileged Key feature where Peers using
* that Privileged alias Key becomes a privileged Peer with privileged functionalities.
* @attribute INTRODUCE_STATE
* @type JSON
* @param {String} INTRODUCING <small>Value <code>"enquired"</code></small>
* The state when the privileged Peer have sent the introduction signal.
* @param {String} ERROR <small>Value <code>"error"</code></small>
* The state when the Peer introduction has occurred an exception.
* @readOnly
* @component Peer
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype.INTRODUCE_STATE = {
INTRODUCING: 'introducing',
ERROR: 'error'
};
/**
* Whether this user automatically introduce to other peers.
* @attribute _autoIntroduce
* @type Boolean
* @default true
* @private
* @component Peer
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype._autoIntroduce = true;
/**
* Whether this user is a privileged user.
* @attribute isPrivileged
* @type Boolean
* @default false
* @private
* @component Peer
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype._isPrivileged = false;
/**
* Parent key in case the current key is alias.
* If the current key is not alias, this is the same as _appKey
* @attribute _parentKey
* @type String
* @default null
* @private
* @component Peer
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype._parentKey = null;
/**
* List of peers retrieved from signaling
* @attribute _peerList
* @type Object
* @default null
* @private
* @component Peer
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype._peerList = null;
/**
* Retrieves the list of rooms and peers under the same realm based
* on the Application Key configured in {{#crossLink "Skylink/init:method"}}init(){{/crossLink}}
* from the platform signaling.
* This will only work if self is a privileged Peer.
* @method getPeers
* @param {Boolean} [showAll=false] The flag that indicates if returned list should
* also include privileged and standard in the list. By default, the value is <code>false</code>.
* Which means only unprivileged peers' ID (isPrivileged = autoIntroduce = false) is included.
* @param {Function} [callback] The callback fired after the receiving the current
* list of Peers from platform signaling or have met with an exception.
* The callback signature is <code>function (error, success)</code>.
* @param {Object} callback.error The error object received in the callback.
* This is the exception thrown that caused the failure for getting self user media.
* If received as <code>null</code>, it means that there is no errors.
* @param {JSON} callback.success The success object received in the callback.
* If received as <code>null</code>, it means that there are errors.
* @example
*
* // To get list of unprivileged peers only
* SkylinkDemo.getPeers();
*
* // To get list of all peers, including other privileged peers
* SkylinkDemo.getPeers(true);
*
* // To get a list of unprivileged peers then invoke the callback
* SkylinkDemo.getPeers(function(error, success){
* if (error){
* console.log("Error happened. Can not retrieve list of peers");
* }
* else{
* console.log("Success fully retrieved list of peers", success);
* }
* });
*
* // To get a list of all peers then invoke the callback
* SkylinkDemo.getPeers(true, function(error, success){
* if (error){
* console.log("Error happened. Can not retrieve list of peers");
* }
* else{
* console.log("Success fully retrieved list of peers", success);
* }
* });
*
* @trigger getPeersStateChange
* @component Peer
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype.getPeers = function(showAll, callback){
var self = this;
if (!self._isPrivileged){
log.warn('Please upgrade your key to privileged to use this function');
return;
}
if (!self._appKey){
log.warn('App key is not defined. Please authenticate again.');
return;
}
if (!self._parentKey){
log.warn('Parent key is not defined. Please authenticate again.');
return;
}
// Only callback is provided
if (typeof showAll === 'function'){
callback = showAll;
showAll = false;
}
self._sendChannelMessage({
type: self._SIG_MESSAGE_TYPE.GET_PEERS,
privilegedKey: self._appKey,
parentKey: self._parentKey,
showAll: showAll || false
});
self._trigger('getPeersStateChange',self.GET_PEERS_STATE.ENQUIRED, self._user.sid, null);
log.log('Enquired server for peers within the realm');
if (typeof callback === 'function'){
self.once('getPeersStateChange', function(state, privilegedPeerId, peerList){
callback(null, peerList);
}, function(state, privilegedPeerId, peerList){
return state === self.GET_PEERS_STATE.RECEIVED;
});
}
};
/**
* Introduces two Peers to each other to start a connection with each other.
* This will only work if self is a privileged Peer.
* @method introducePeer
* @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.
* @trigger introduceStateChange
* @component Peer
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype.introducePeer = function(sendingPeerId, receivingPeerId){
var self = this;
if (!self._isPrivileged){
log.warn('Please upgrade your key to privileged to use this function');
self._trigger('introduceStateChange', self.INTRODUCE_STATE.ERROR, self._user.sid, sendingPeerId, receivingPeerId, 'notPrivileged');
return;
}
self._sendChannelMessage({
type: self._SIG_MESSAGE_TYPE.INTRODUCE,
sendingPeerId: sendingPeerId,
receivingPeerId: receivingPeerId
});
self._trigger('introduceStateChange', self.INTRODUCE_STATE.INTRODUCING, self._user.sid, sendingPeerId, receivingPeerId, null);
log.log('Introducing',sendingPeerId,'to',receivingPeerId);
};