media-stream/helpers/parseMediaOptions.js

import Skylink from '../../index';
import { BUNDLE_POLICY, RTCP_MUX_POLICY, PEER_CERTIFICATE } from '../../constants';

/**
 * @param {GetUserMediaOptions} options
 * @param {SkylinkState} roomState
 * @return {SkylinkState}
 * @memberOf MediaStreamHelpers
 * @private
 */
const parseMediaOptions = (options, roomState) => {
  const state = Skylink.getSkylinkState(roomState.room.id);
  const mediaOptions = options || {};

  state.userData = mediaOptions.userData || state.userData || '';
  state.streamsBandwidthSettings = {
    googleX: {},
    bAS: {},
  };
  state.publishOnly = false;
  state.sdpSettings = {
    connection: {
      audio: true,
      video: true,
      data: true,
    },
    direction: {
      audio: { send: true, receive: true },
      video: { send: true, receive: true },
    },
  };
  state.voiceActivityDetection = typeof mediaOptions.voiceActivityDetection === 'boolean' ? mediaOptions.voiceActivityDetection : true;
  state.peerConnectionConfig = {
    bundlePolicy: BUNDLE_POLICY.BALANCED,
    rtcpMuxPolicy: RTCP_MUX_POLICY.REQUIRE,
    iceCandidatePoolSize: 0,
    certificate: PEER_CERTIFICATE.AUTO,
    disableBundle: false,
  };
  state.bandwidthAdjuster = null;

  if (mediaOptions.bandwidth) {
    if (typeof mediaOptions.bandwidth.audio === 'number') {
      state.streamsBandwidthSettings.bAS.audio = mediaOptions.bandwidth.audio;
    }

    if (typeof mediaOptions.bandwidth.video === 'number') {
      state.streamsBandwidthSettings.bAS.video = mediaOptions.bandwidth.video;
    }

    if (typeof mediaOptions.bandwidth.data === 'number') {
      state.streamsBandwidthSettings.bAS.data = mediaOptions.bandwidth.data;
    }
  }

  if (mediaOptions.googleXBandwidth) {
    if (typeof mediaOptions.googleXBandwidth.min === 'number') {
      state.streamsBandwidthSettings.googleX.min = mediaOptions.googleXBandwidth.min;
    }

    if (typeof mediaOptions.googleXBandwidth.max === 'number') {
      state.streamsBandwidthSettings.googleX.max = mediaOptions.googleXBandwidth.max;
    }
  }

  if (mediaOptions.sdpSettings) {
    if (mediaOptions.sdpSettings.direction) {
      if (mediaOptions.sdpSettings.direction.audio) {
        state.sdpSettings.direction.audio.receive = typeof mediaOptions.sdpSettings.direction.audio.receive === 'boolean' ? mediaOptions.sdpSettings.direction.audio.receive : true;
        state.sdpSettings.direction.audio.send = typeof mediaOptions.sdpSettings.direction.audio.send === 'boolean' ? mediaOptions.sdpSettings.direction.audio.send : true;
      }

      if (mediaOptions.sdpSettings.direction.video) {
        state.sdpSettings.direction.video.receive = typeof mediaOptions.sdpSettings.direction.video.receive === 'boolean' ? mediaOptions.sdpSettings.direction.video.receive : true;
        state.sdpSettings.direction.video.send = typeof mediaOptions.sdpSettings.direction.video.send === 'boolean' ? mediaOptions.sdpSettings.direction.video.send : true;
      }
    }
    if (mediaOptions.sdpSettings.connection) {
      state.sdpSettings.connection.audio = typeof mediaOptions.sdpSettings.connection.audio === 'boolean' ? mediaOptions.sdpSettings.connection.audio : true;
      state.sdpSettings.connection.video = typeof mediaOptions.sdpSettings.connection.video === 'boolean' ? mediaOptions.sdpSettings.connection.video : true;
      state.sdpSettings.connection.data = typeof mediaOptions.sdpSettings.connection.data === 'boolean' ? mediaOptions.sdpSettings.connection.data : true;
    }
  }

  if (mediaOptions.publishOnly) {
    state.sdpSettings.direction.audio.send = true;
    state.sdpSettings.direction.audio.receive = false;
    state.sdpSettings.direction.video.send = true;
    state.sdpSettings.direction.video.receive = false;
    state.publishOnly = true;
  }

  /* eslint-disable no-restricted-syntax */
  /* eslint-disable no-prototype-builtins */
  if (mediaOptions.peerConnection && typeof mediaOptions.peerConnection === 'object') {
    if (typeof mediaOptions.peerConnection.bundlePolicy === 'string') {
      for (const bpProp in BUNDLE_POLICY) {
        if (BUNDLE_POLICY.hasOwnProperty(bpProp) && BUNDLE_POLICY[bpProp] === mediaOptions.peerConnection.bundlePolicy) {
          state.peerConnectionConfig.bundlePolicy = mediaOptions.peerConnection.bundlePolicy;
        }
      }
    }
    if (typeof mediaOptions.peerConnection.rtcpMuxPolicy === 'string') {
      for (const rmpProp in RTCP_MUX_POLICY) {
        if (RTCP_MUX_POLICY.hasOwnProperty(rmpProp) && RTCP_MUX_POLICY[rmpProp] === mediaOptions.peerConnection.rtcpMuxPolicy) {
          state.peerConnectionConfig.rtcpMuxPolicy = mediaOptions.peerConnection.rtcpMuxPolicy;
        }
      }
    }
    if (typeof mediaOptions.peerConnection.iceCandidatePoolSize === 'number' && mediaOptions.peerConnection.iceCandidatePoolSize > 0) {
      state.peerConnectionConfig.iceCandidatePoolSize = mediaOptions.peerConnection.iceCandidatePoolSize;
    }
    if (typeof mediaOptions.peerConnection.certificate === 'string') {
      for (const pcProp in PEER_CERTIFICATE) {
        if (PEER_CERTIFICATE.hasOwnProperty(pcProp) && PEER_CERTIFICATE[pcProp] === mediaOptions.peerConnection.certificate) {
          state.peerConnectionConfig.certificate = mediaOptions.peerConnection.certificate;
        }
      }
    }
    state.peerConnectionConfig.disableBundle = mediaOptions.peerConnection.disableBundle === true;
  }

  if (mediaOptions.autoBandwidthAdjustment) {
    state.bandwidthAdjuster = {
      interval: 10,
      limitAtPercentage: 100,
      useUploadBwOnly: false,
    };

    if (typeof mediaOptions.autoBandwidthAdjustment === 'object') {
      if (typeof mediaOptions.autoBandwidthAdjustment.interval === 'number' && mediaOptions.autoBandwidthAdjustment.interval >= 10) {
        state.bandwidthAdjuster.interval = mediaOptions.autoBandwidthAdjustment.interval;
      }
      if (typeof mediaOptions.autoBandwidthAdjustment.limitAtPercentage === 'number' && (mediaOptions.autoBandwidthAdjustment.limitAtPercentage >= 0 && mediaOptions.autoBandwidthAdjustment.limitAtPercentage <= 100)) {
        state.bandwidthAdjuster.limitAtPercentage = mediaOptions.autoBandwidthAdjustment.limitAtPercentage;
      }
      if (typeof mediaOptions.autoBandwidthAdjustment.useUploadBwOnly === 'boolean') {
        state.bandwidthAdjuster.useUploadBwOnly = mediaOptions.autoBandwidthAdjustment.useUploadBwOnly;
      }
    }
  }
  return state;
};

export default parseMediaOptions;