Программный интерфейс

Показывать:
/**
 * Обмен сообщениями через вебсокеты
 *
 * © Evgeniy Malyarov http://www.oknosoft.ru 2014-2016
 *
 * @module  common
 * @submodule socket
 *
 */


/**
 * Устанавливает соединение с вебсокет-сервером, обеспечивает приём и отправку сообщений
 * @class SocketMsg
 * @constructor
 */
function SocketMsg(){

  var socket_uid, ws, opened, attempt = 0, t = this;

  function reflect_react(data){
    if(data && data.type == "react"){
      try{
        var mgr = _md ? _md.mgr_by_class_name(data.class_name) : null;
        if(mgr)
          mgr.load_array([data.obj], true);

      }catch(err){
        $p.record_log(err);
      }
    }
  }

  t.connect = function(reset_attempt){

    // http://builder.local/debug.html#socket_uid=4e8b16b6-89b0-11e2-9c06-da48b440c859

    if(!socket_uid)
      socket_uid = $p.job_prm.parse_url().socket_uid || "";

    if(reset_attempt)
      attempt = 0;
    attempt++;

    // проверяем состояние и пытаемся установить ws соединение с Node
    if($p.job_prm.ws_url){
      if(!ws || !opened){
        try{
          ws = new WebSocket($p.job_prm.ws_url);

          ws.onopen = function() {
            opened = true;
            ws.send(JSON.stringify({
              socket_uid: socket_uid,
              zone: $p.wsql.get_user_param("zone"),
              browser_uid: $p.wsql.get_user_param("browser_uid"),
              _side: "js",
              _mirror: true
            }));
          };

          ws.onclose = function() {
            opened = false;
            setTimeout(t.connect, attempt < 3 ? 30000 : 600000);
          };

          ws.onmessage = function(ev) {
            var data;

            try{
              data = JSON.parse(ev.data);
            }catch(err){
              data = ev.data;
            }

            $p.eve.callEvent("socket_msg", [data]);
          };

          ws.onerror = $p.record_log;

        }catch(err){
          setTimeout(t.connect, attempt < 3 ? 30000 : 600000);
          $p.record_log(err);
        }
      }
    }
  };

  t.send = function (data) {
    if(ws && opened){
      if(!data)
        data = {};
      else if("object" != typeof data)
        data = {data: data};
      data.socket_uid = socket_uid;
      data._side = "js";
      ws.send(JSON.stringify(data));
    }
  };

  $p.eve.attachEvent("socket_msg", reflect_react);

}

/**
 * Интерфейс асинхронного обмена сообщениями
 * @property socket
 * @type {SocketMsg}
 */
$p.eve.socket = new SocketMsg();