Reconnect Websocket after connection loss

1

I use this code to connect to my server with WebSockets :

(function(nameSpace) {
  function createMethod(method, options, stateCallback) {
    var that = this;
    this[method] = function() {
      if (stateCallback && stateCallback.apply) {
        stateCallback(method);
      }
      console.info(method);
      if (options[method] && options[method].apply) {
        options[method].apply(that, arguments);
      }
    };
  }

  function SocketWrapper(options) {
    var ws,
      events = ['onopen', 'onmessage', 'onclose', 'onerror'],
      i, len, prop = {
        opened: false,
        closed: false,
        error: false
      },
      method;

    if (typeof options === 'undefined' || !options) {
      throw 'ArgumentException: please add default constructor options';
    }

    this.queue = [];

    this.onEventTrigger = function(eventName) {
      var i, len;
      if (eventName === 'onopen') {
        prop.opened = true;
        prop.closed = false;
        // openend send queue
        if (this.queue.length > 0) {
          for (i = this.queue.length; --i >= 0;) {
            this.send.apply(this, this.queue[0]);
            this.queue.splice(0, 1);
          }
        }
      }
      if (eventName === 'onerror') {
        prop.error = true;
      }
      if (eventName === 'onclosed') {
        prop.opened = false;
        prop.closed = true;
      }
    };

    this.init = function() {
      var cb = this.onEventTrigger.bind(this);
      ws = new WebSocket(options.url);

      for (i = 0; i < events.length; i++) {
        method = events[i];
        createMethod.apply(ws, [method, options, cb]);
      }
    };

    this.send = function() {
      if (prop.closed) {
        throw 'InvalidOperation: Cannot send messages to a closed Websocket!';
      }
      if (!prop.opened) {
        this.queue.push(arguments);
      } else {
        ws.send.apply(ws, arguments);
      }
    };

    this.init();
    return this;
  }

  window.SocketWrapper = SocketWrapper;
}(window));

var socket = new window.SocketWrapper({
  url: 'ws://127.0.0.1:1805',
  onopen: function() {
    this.send('message', 'hi');
  },
  onmessage: function() {
    console.log(arguments);
  },
  onclose: function() {
    socket = null;
  },
  onerror: function() {
    console.log('error occured, oh no!');
    console.error(arguments);
  }
});
socket.send('i am message send to soon, but since i check the state of the ws object, i will be queued and send when appropriate');

This code suits me, it was the solution that I found for my case, but I wanted it to reconnect as soon as the connection was lost, it would try to reconnect until I can. I do not know much how to adapt because it is not mine , how to proceed?

    
asked by anonymous 20.03.2015 / 23:01

1 answer

3

When the connection is lost the event onclose is triggered, to reconnect you must work on that event.

One way you can use to connect again is through the setTimeout , it will perform an action every n seconds.

Instead of declaring the variable socket with all that code, do this in a function:

function CreateSocketWrapper(){
    return new window.SocketWrapper({
      url: 'ws://127.0.0.1:1805',
      onopen: function() {
        this.send('message', 'hi');
      },
      onmessage: function() {
        console.log(arguments);
      },
      onclose: function() {
        setTimeout(function(){CreateSocketWrapper()}, 5000); // 5 segundos
      },
      onerror: function() {
        console.log('error occured, oh no!');
        console.error(arguments);
      }
    });
}

And to use it:

var socket = CreateSocketWrapper();
socket.send('i am message send to soon, but since i check the state of...');
    
21.03.2015 / 01:07