Source: addresses.js

/**
 * Network parameters Q4S module. Implements storing and updating for network
 * parameters of a Q4S session.
 * @module addreses
 * @license Apache-2.0
 */

/** Network Parameters Class*/
class Addresses {
  /**
   * Constructor for the QualityParameters class. Does not validate input data
   * coherence.
   * @param {number} clientAddressType - Ip version of the client
   * @param {String} clientAddress - Ip of the client.
   * @param {number} serverAddressType - Ip version of the server.
   * @param {String} serverAddress - Ip of the server
   * @param {Object} q4sClientPorts - Ports opened for Q4S communication at
   * client side
   * @param {Number} q4sClientPorts.TCP
   * @param {Number} q4sClientPorts.UDP
   * @param {Object} q4sServerPorts - Ports opened for Q4S communication at
   * server side
   * @param {Number} q4sServerPorts.TCP
   * @param {Number} q4sServerPorts.UDP
   * @param {Object} appClientPorts - Ports opened for app communication at
   * client side
   * @param {String} appClientPorts.TCP
   * @param {String} appClientPorts.UDP
   * @param {Object} appServerPorts - Ports opened for app communication at
   * server side
   * @param {String} appServerPorts.TCP
   * @param {String} appServerPorts.UDP
   */
  constructor(clientAddressType, clientAddress, serverAddressType,
      serverAddress, q4sClientPorts, q4sServerPorts, appClientPorts,
      appServerPorts) {
    /**
     * @member {Number}
     */
    this.clientAddressType = clientAddressType;
    /**
     * Client IP
     * @member {String}
     */
    this.clientAddress = clientAddress;
    /**
     * Ip version of the server.
     * @member {Number}
     */
    this.serverAddressType = serverAddressType;
    /**
     * Server IP
     * @member {String}
     */
    this.serverAddress = serverAddress;
    if (!q4sClientPorts) {
      /**
       * Opened ports for the client q4s  cumunication
       * @member {Object}
       */
      this.q4sClientPorts = {};
    } else {
      this.q4sClientPorts = q4sClientPorts;
    }
    if (!q4sServerPorts) {
      /**
       * Opened ports for the server q4s cumunication
       * @member {Object}
       */
      this.q4sServerPorts = {};
    } else {
      this.q4sServerPorts = q4sServerPorts;
    }
    if (!appClientPorts) {
      /**
       * Opened ports for the client app cumunication
       * @member {Object}
       */
      this.appClientPorts = {};
    } else {
      this.appClientPorts = appClientPorts;
    }
    if (!appServerPorts) {
      /**
       * Opened ports for the server app cumunication
       * @member {Object}
       */
      this.appServerPorts = {};
    } else {
      this.appServerPorts = appServerPorts;
    }
  }

  /**
   * Updates the current Network parameters with data coming from an sdp.
   * @param  {String} sdp - The sdp representation of this parameters.
   */
  updateFromSDP(sdp) {
    const lines = sdp.split('\r\n');
    lines.forEach((line) => {
      if (line.indexOf('a=public-address:client') === 0) {
        const type = parseInt(line.substring(24, 26));
        if (!isNaN(type)) {
          this.clientAddressType = type;
        }
        this.clientAddress = line.substring(26);
      } else if (line.indexOf('a=public-address:server') === 0) {
        const type = parseInt(line.substring(24, 26));
        if (!isNaN(type)) {
          this.serverAddressType = type;
        }
        this.serverAddress = line.substring(26);
      } else if (line.indexOf('a=flow:app clientListeningPort TCP/') === 0) {
        this.appClientPorts.TCP = line.substring(35);
      } else if (line.indexOf('a=flow:app clientListeningPort UDP/') === 0) {
        this.appClientPorts.UDP = line.substring(35);
      } else if (line.indexOf('a=flow:app serverListeningPort TCP/') === 0) {
        this.appServerPorts.TCP = line.substring(35);
      } else if (line.indexOf('a=flow:app serverListeningPort UDP/') === 0) {
        this.appServerPorts.UDP = line.substring(35);
      } else if (line.indexOf('a=flow:q4s clientListeningPort TCP/') === 0) {
        const port = parseInt(line.substring(35));
        if (!isNaN(port)) {
          this.q4sClientPorts.TCP = port;
        }
      } else if (line.indexOf('a=flow:q4s clientListeningPort UDP/') === 0) {
        const port = parseInt(line.substring(35));
        if (!isNaN(port)) {
          this.q4sClientPorts.UDP = port;
        }
      } else if (line.indexOf('a=flow:q4s serverListeningPort TCP/') === 0) {
        const port = parseInt(line.substring(35));
        if (!isNaN(port)) {
          this.q4sServerPorts.TCP = port;
        }
      } else if (line.indexOf('a=flow:q4s serverListeningPort UDP/') === 0) {
        const port = parseInt(line.substring(35));
        if (!isNaN(port)) {
          this.q4sServerPorts.UDP = port;
        }
      }
    });
  }

  /**
   * Return an string representation of the addreses contained within this
   * object.
   * @return {String} - The String representation of this object.
   */
  ipToSdp() {
    let sdp = '';
    if (this.clientAddress) {
      sdp = sdp + 'a=public-address:client ' + this.clientAddressType +
        ' ' + this.clientAddress + '\r\n';
    }
    if (this.serverAddress) {
      sdp = sdp + 'a=public-address:server ' + this.serverAddressType +
        ' ' + this.serverAddress + '\r\n';
    }
    return sdp;
  }
  /**
   * Return an string representation of tthe flow ports contained within this
   * object.
   * @return {String} - The String representation of this object.
   */
  portToSDP() {
    let sdp = '';
    if (this.appClientPorts.TCP) {
      sdp = sdp + 'a=flow:app clientListeningPort TCP/' +
        this.appClientPorts.TCP + '\r\n';
    }
    if (this.appClientPorts.UDP) {
      sdp = sdp + 'a=flow:app clientListeningPort UDP/' +
        this.appClientPorts.UDP + '\r\n';
    }
    if (this.appServerPorts.TCP) {
      sdp = sdp + 'a=flow:app serverListeningPort TCP/' +
        this.appServerPorts.TCP + '\r\n';
    }
    if (this.appServerPorts.UDP) {
      sdp = sdp + 'a=flow:app serverListeningPort UDP/' +
        this.appServerPorts.UDP + '\r\n';
    }
    if (this.q4sClientPorts.TCP) {
      sdp = sdp + 'a=flow:q4s clientListeningPort TCP/' +
        this.q4sClientPorts.TCP + '\r\n';
    }
    if (this.q4sClientPorts.UDP) {
      sdp = sdp + 'a=flow:q4s clientListeningPort UDP/' +
        this.q4sClientPorts.UDP + '\r\n';
    }
    if (this.q4sServerPorts.TCP) {
      sdp = sdp + 'a=flow:q4s serverListeningPort TCP/' +
        this.q4sServerPorts.TCP + '\r\n';
    }
    if (this.q4sServerPorts.UDP) {
      sdp = sdp + 'a=flow:q4s serverListeningPort UDP/' +
        this.q4sServerPorts.UDP + '\r\n';
    }
    return sdp;
  }
}

module.exports = Addresses;