peer-data/helpers/getPeerInfo.js

import clone from 'clone';
import Skylink from '../../index';
import logger from '../../logger';
import messages from '../../messages';
import { DATA_CHANNEL_STATE, PEER_TYPE } from '../../constants';
import PeerData from '../index';

const isUser = (peerId, roomState) => {
  const { user } = roomState;
  return peerId === user.sid;
};

/**
 * @description Function that returns the User / Peer current session information.
 * @private
 * @param {String} peerId
 * @param {SkylinkRoom} room
 * @return {peerInfo}
 * @memberOf PeerDataHelpers
 */
const getPeerInfo = (peerId, room) => {
  let peerInfo = null;
  if (!peerId) {
    return null;
  }
  const state = Skylink.getSkylinkState(room.id);

  if (!state) {
    Skylink.logNoRoomState(room.id);
    return peerInfo;
  }

  if (isUser(peerId, state)) {
    return PeerData.getCurrentSessionInfo(room);
  }

  peerInfo = clone(state.peerInformations[peerId]);

  if (!peerInfo) {
    logger.log.ERROR(`${messages.PEER_INFORMATIONS.NO_PEER_INFO} ${peerId}`);
    return peerInfo;
  }

  // FIXME: would there ever be a case of !peerInfo.settings?
  // if (!peerInfo.settings) {
  //   peerInfo.settings = {};
  // }

  // if (!peerInfo.mediaStatus) {
  //   peerInfo.mediaStatus = {};
  // }

  peerInfo.room = clone(room.roomName);

  peerInfo.settings.data = !!(state.dataChannels[peerId] && state.dataChannels[peerId].main && state.dataChannels[peerId].main.channel && state.dataChannels[peerId].main.channel.readyState === DATA_CHANNEL_STATE.OPEN);
  peerInfo.connected = state.peerConnStatus[peerId] && !!state.peerConnStatus[peerId].connected;
  peerInfo.init = state.peerConnStatus[peerId] && !!state.peerConnStatus[peerId].init;

  // peerInfo.settings.bandwidth = peerInfo.settings.bandwidth || {};
  // peerInfo.settings.googleXBandwidth = peerInfo.settings.googleXBandwidth || {};

  // if (!(typeof peerInfo.settings.video === 'boolean' || typeof peerInfo.settings.video === 'object')) {
  //   // peerInfo.settings.video = false;
  //   peerInfo.mediaStatus.audioMuted = true;
  // }

  // if (!(typeof peerInfo.settings.audio === 'boolean' || typeof peerInfo.settings.audio === 'object')) {
  //   // peerInfo.settings.audio = false;
  //   peerInfo.mediaStatus.audioMuted = true;
  // }

  // if (typeof peerInfo.mediaStatus.audioMuted !== 'boolean') {
  //   peerInfo.mediaStatus.audioMuted = true;
  // }

  // if (typeof peerInfo.mediaStatus.videoMuted !== 'boolean') {
  //   peerInfo.mediaStatus.videoMuted = true;
  // }

  // if (peerInfo.settings.maxBandwidth) {
  //   peerInfo.settings.bandwidth = clone(peerInfo.settings.maxBandwidth);
  //   delete peerInfo.settings.maxBandwidth;
  // }

  // if (peerInfo.settings.video && typeof peerInfo.settings.video === 'object' && peerInfo.settings.video.customSettings && typeof peerInfo.settings.video.customSettings === 'object') {
  // // if (peerInfo.settings.video.customSettings && typeof peerInfo.settings.video.customSettings === 'object') {
  //   if (peerInfo.settings.video.customSettings.frameRate) {
  //     peerInfo.settings.video.frameRate = clone(peerInfo.settings.video.customSettings.frameRate);
  //   }
  //   if (peerInfo.settings.video.customSettings.facingMode) {
  //     peerInfo.settings.video.facingMode = clone(peerInfo.settings.video.customSettings.facingMode);
  //   }
  //   if (peerInfo.settings.video.customSettings.width) {
  //     peerInfo.settings.video.resolution = peerInfo.settings.video.resolution || {};
  //     peerInfo.settings.video.resolution.width = clone(peerInfo.settings.video.customSettings.width);
  //   }
  //   if (peerInfo.settings.video.customSettings.height) {
  //     peerInfo.settings.video.resolution = peerInfo.settings.video.resolution || {};
  //     peerInfo.settings.video.resolution.height = clone(peerInfo.settings.video.customSettings.height);
  //   }
  // }

  // if (peerInfo.settings.audio && typeof peerInfo.settings.audio === 'object') {
  //   peerInfo.settings.audio.stereo = peerInfo.settings.audio.stereo === true;
  // }

  // TODO: check if receiveOnly and publishOnly is required
  if (peerId === PEER_TYPE.MCU) {
    peerInfo.config.receiveOnly = true;
    peerInfo.config.publishOnly = false;
  } else if (state.hasMCU) {
    peerInfo.config.receiveOnly = false;
    peerInfo.config.publishOnly = true;
  }

  // TODO: check if the sdp parsing is required
  // parse sdp to update media settings and status
  // if (!state.sdpSettings.direction.audio.receive) {
  //   peerInfo.settings.audio = false;
  //   peerInfo.mediaStatus.audioMuted = true;
  // }
  //
  // if (!state.sdpSettings.direction.video.receive) {
  //   peerInfo.settings.video = false;
  //   peerInfo.mediaStatus.videoMuted = true;
  // }
  //
  // if (!state.sdpSettings.connection.audio) {
  //   peerInfo.settings.audio = false;
  //   peerInfo.mediaStatus.audioMuted = true;
  // }
  //
  // if (!state.sdpSettings.connection.video) {
  //   peerInfo.settings.video = false;
  //   peerInfo.mediaStatus.videoMuted = true;
  // }

  // Makes sense to be send direction since we are retrieving information if Peer is sending anything to us
  // if (state.sdpSessions[peerId] && state.sdpSessions[peerId].remote && state.sdpSessions[peerId].remote.connection && typeof state.sdpSessions[peerId].remote.connection === 'object') {
  //   if (!(state.sdpSessions[peerId].remote.connection.audio && state.sdpSessions[peerId].remote.connection.audio.indexOf('send') > -1)) {
  //     peerInfo.settings.audio = false;
  //     peerInfo.mediaStatus.audioMuted = true;
  //   }
  //   if (!(state.sdpSessions[peerId].remote.connection.video && state.sdpSessions[peerId].remote.connection.video.indexOf('send') > -1)) {
  //     peerInfo.settings.video = false;
  //     peerInfo.mediaStatus.videoMuted = true;
  //   }
  //   if (!(state.sdpSessions[peerId].remote.connection.data && state.sdpSessions[peerId].remote.connection.data.indexOf('send') > -1)) {
  //     peerInfo.settings.data = false;
  //   }
  // }

  // if (!(peerInfo.userData !== null && typeof peerInfo.userData !== 'undefined')) {
  //   peerInfo.userData = '';
  // }

  // if (!peerInfo.settings.audio) {
  //   peerInfo.mediaStatus.audioMuted = true;
  // }
  //
  // if (!peerInfo.settings.video) {
  //   peerInfo.mediaStatus.videoMuted = true;
  // }

  if (!peerInfo.settings.audio && !peerInfo.settings.video) {
    peerInfo.config.receiveOnly = true;
    peerInfo.config.publishOnly = false;
  }

  return peerInfo;
};

export default getPeerInfo;