peer-connection/helpers/peer-addition/addPeer.js

import Skylink from '../../../index';
import { SDP_SEMANTICS } from '../../../constants';
import logger from '../../../logger/index';
import createPeerConnection from './createPeerConnection';
import HandleIceConnectionStats from '../../../skylink-stats/handleIceConnectionStats';
import handleIceGatheringStats from '../../../skylink-stats/handleIceGatheringStats';

/**
 * Function that starts the Peer connection session.
 * @param {object} params - options required to create a PeerConnection
 * @param {SkylinkRoom} params.currentRoom - The currrent room
 * @param {String} params.targetMid - Peer's id
 * @param {Object} params.peerBrowser - Peer's user agent object
 * @param {RTCCertificate} params.cert - Represents a certificate that an RTCPeerConnection uses to authenticate.
 * @param {boolean} params.receiveOnly
 * @param {boolean} params.hasScreenshare - Is screenshare enabled
 * @memberOf PeerConnection.PeerConnectionHelpers
 */
const addPeer = (params) => {
  let connection = null;
  const {
    currentRoom,
    targetMid,
    peerBrowser,
    cert,
    receiveOnly,
    hasScreenShare,
  } = params;
  const initOptions = Skylink.getInitOptions();
  const state = Skylink.getSkylinkState(currentRoom.id);
  const { peerConnections, room } = state;
  const handleIceConnectionStats = new HandleIceConnectionStats();

  if (!peerConnections[targetMid]) {
    state.peerConnStatus[targetMid] = {
      connected: false,
      init: false,
    };

    logger.log.INFO([targetMid, null, null, 'Starting the connection to peer. Options provided:'], {
      peerBrowser,
      receiveOnly,
      enableDataChannel: initOptions.enableDataChannel,
    });

    connection = createPeerConnection({
      currentRoom,
      targetMid,
      hasScreenShare,
      cert,
      sdpSemantics: SDP_SEMANTICS.UNIFIED,
    });

    try {
      const config = connection.getConfiguration();
      // connection.addTransceiver("video");
      if (config.sdpSemantics === SDP_SEMANTICS.UNIFIED) {
        logger.log.INFO([targetMid, 'SDP Semantics', null, 'Peer Connection has Unified plan.']);
      } else if (config.sdpSemantics === SDP_SEMANTICS.PLAN_B) {
        logger.log.INFO([targetMid, 'SDP Semantics', null, 'Peer Connection has Plan-B.']);
      } else {
        logger.log.INFO([targetMid, 'SDP Semantics', null, 'The sdpSemantics parameter is not supported by this browser version.']);
      }
    } catch (ex) {
      logger.log.INFO([targetMid, 'SDP Semantics', null, 'getConfiguration() is not available in this browser version. Ex : '], ex);
    }

    state.peerConnections[targetMid] = connection;
    Skylink.setSkylinkState(state, currentRoom.id);
    handleIceConnectionStats.send(room.id, connection.iceConnectionState, targetMid);
    handleIceGatheringStats.send(room.id, 'new', targetMid, false);
  } else {
    logger.log.WARN([targetMid, null, null, 'Connection to peer has already been made.']);
  }

  return connection;
};

export default addPeer;