peer-privileged/index.js

import Skylink, { SkylinkConstants } from '../index';
import logger from '../logger';
import messages from '../messages';
import { GET_PEERS_STATE } from '../constants';
import SkylinkSignalingServer from '../server-communication/signaling-server';
import { dispatchEvent, removeEventListener, addEventListener } from '../utils/skylinkEventManager';
import { getPeersStateChange } from '../skylink-events';

/**
 * @classdesc Class that represents a Privilege Peer methods
 * @class
 * @private
 */
class PeerPrivileged {
  static shouldProceed(state, appKey, reject) {
    let errMsg = null;

    if (!state.isPrivileged) {
      errMsg = messages.PEER_PRIVILEGED.not_privileged;
    }

    if (!appKey) {
      errMsg = messages.PEER_PRIVILEGED.no_appkey;
    }

    if (errMsg) {
      logger.log.DEBUG(errMsg);
      reject(new Error(errMsg));
    }

    return !errMsg;
  }

  /**
   * Function that retrieves the list of Peer IDs from Rooms within the same App space.
   * @param {SkylinkRoom} room
   * @param {boolean} showAll
   * @return {Promise<object>}
   * @fires getPeersStateChange
   */
  static getPeerList(room, showAll) {
    return new Promise((resolve, reject) => {
      try {
        const state = Skylink.getSkylinkState(room.id);
        const initOptions = Skylink.getInitOptions();
        const pShowAll = showAll || false;

        const executeCallbackAndRemoveEvtListener = (evt) => {
          const result = evt.detail;

          if (result.state === GET_PEERS_STATE.DISPATCHED) {
            removeEventListener(SkylinkConstants.EVENTS.GET_PEERS_STATE_CHANGE, executeCallbackAndRemoveEvtListener);

            dispatchEvent(getPeersStateChange({
              state: GET_PEERS_STATE.RECEIVED,
              privilegePeerId: state.user.sid,
              peerList: result.peerList,
            }));

            resolve(result.peerList);
          }
        };

        if (this.shouldProceed(state, initOptions.appKey, reject)) {
          new SkylinkSignalingServer().getPeerList(pShowAll);

          dispatchEvent(getPeersStateChange({
            state: GET_PEERS_STATE.ENQUIRED,
            privilegePeerId: state.user.sid,
            peerList: null,
          }));

          logger.log.INFO(messages.PEER_PRIVILEGED.getPeerListFromServer);

          addEventListener(SkylinkConstants.EVENTS.GET_PEERS_STATE_CHANGE, executeCallbackAndRemoveEvtListener);
        }
      } catch (error) {
        logger.log.ERROR(error);
        reject(error);
      }
    });
  }
}

export default PeerPrivileged;