acooks/jittertrap

View on GitHub
html5-client/src/js/jittertrap-websocket.js

Summary

Maintainability
A
0 mins
Test Coverage
/* jittertrap-websocket.js */

/* global JT:true */

JT = (function (my) {
  'use strict';

  my.ws = {};

  var selectedIface = {}; // set on dev_select message

  /* the websocket object, see my.ws.init() */
  var sock = {};

  /**
   * Websocket Callback Functions
   * i.e. Referred to in websocket.onmessage
   */

  var handleMsgUpdateStats = function (params) {
    JT.core.processDataMsg(params.s, params.ival_ns);
  };

  var handleMsgToptalk = function (params) {
    JT.core.processTopTalkMsg(params);
  };

  var handleMsgDevSelect = function(params) {
    var iface = params.iface;
    console.log("iface: " + iface);
    $('#dev_select').val(iface);
    selectedIface = $('#dev_select').val();
    JT.core.clearAllSeries();
    JT.charts.resetChart();
  };

  var handleMsgIfaces = function(params) {
    var ifaces = params.ifaces;
    $('#dev_select').empty();
    $.each(ifaces,
      function (ix, val) {
        var option = $('<option>').text(val).val(val);
        $('#dev_select').append(option);
      }
    );
  };

  var handleMsgNetemParams = function(params) {
    JT.programsModule.processNetemMsg(params);
  };

  var handleMsgSamplePeriod = function(params) {
    var period = params.period;
    my.core.samplePeriod(period);
    $("#jt-measure-sample-period").html(period / 1000.0 + "ms");
    console.log("sample period: " + period);
    my.charts.setUpdatePeriod();
    JT.core.clearAllSeries();
    JT.charts.resetChart();
  };


  /**
   * Websocket Sending Functions
   */

  var dev_select = function() {
    var msg = JSON.stringify({'msg':'dev_select',
                              'p': { 'iface': $("#dev_select").val()}});
    sock.send(msg);
  };

  var set_netem = function() {
    var msg = JSON.stringify(
      {'msg': 'set_netem',
       'p': {
         'dev': $("#dev_select").val(),
         'delay': parseInt($("#delay").val()),
         'jitter': parseInt($("#jitter").val()),
         /* convert the float to an integer representing 10ths of percent. */
         'loss': parseInt(Math.round(10 * $("#loss").val()))
       }
      });
    sock.send(msg);
    return false;
  };

  var clear_netem = function() {
    $("#delay").val(0);
    $("#jitter").val(0);
    $("#loss").val(0);
    set_netem();
    return false;
  };

  my.ws.init = function(uri) {
    // Initialize WebSocket
    sock = new WebSocket(uri, "jittertrap");

    sock.onopen = function(evt) {
      var msg = JSON.stringify({'msg': 'hello'});
      sock.send(msg);
    };

    sock.onclose = function(evt) {
      console.log("unhandled websocket onclose event: " + evt);
      $("#error-msg").html($("#error-msg").html()
                           + "<p>Websocket closed.</p>");
      $("#error-modal").modal('show');
    };

    sock.onerror = function(evt) {
      console.log("unhandled websocket onerror event: " + evt);
      $("#error-msg").html("<p>"
                           + "Websocket error."
                           + " (Sorry, that's all we know, but the javascript console might contain useful debug information.)"
                           + "</p>"
                           + "<p>Are you connecting through a proxy?</p>");
      $("#error-modal").modal('show');
    };

    sock.onmessage = function(evt) {
      var msg;
      try {
        msg = JSON.parse(evt.data);
      }
      catch (err) {
        console.log("Error: " + err.message);
      }

      if (!msg || !msg.msg) {
        console.log("unrecognised message: " + evt.data);
        return;
      }
      var msgType = msg.msg;

      if ((msgType === "stats") && msg.p.iface === selectedIface) {
        handleMsgUpdateStats(msg.p);
      } else if (msgType === "toptalk") {
        handleMsgToptalk(msg.p);
      } else if (msgType === "dev_select") {
        handleMsgDevSelect(msg.p);
      } else if (msgType === "iface_list") {
        handleMsgIfaces(msg.p);
      } else if (msgType === "netem_params") {
        handleMsgNetemParams(msg.p);
      } else if (msgType === "sample_period") {
        handleMsgSamplePeriod(msg.p);
      } else {
        console.log("unhandled message: " + evt.data);
      }
    };
  };

  /**
   * Websocket Sending Functions
   */
  my.ws.dev_select = dev_select;
  my.ws.set_netem = set_netem;
  my.ws.clear_netem = clear_netem;

  return my;
}(JT));
/* End of jittertrap-websocket.js */