wsevent.js
function ReconnectingWebSocket(url, opts) {
    if (!(this instanceof ReconnectingWebSocket)) {
      throw new TypeError('Cannot call a constructor as a function');
    }

    opts = opts || {};

    var self = this;
    function getOpt(name, def) {
      return opts.hasOwnProperty(name)? opts[name] : def;
    }
    var timeout = getOpt('timeout', 100);
    var maxRetries = getOpt('maxRetries', 5);
    var curRetries = 0;

    // External event callbacks
    self.onmessage = noop;
    self.onopen = noop;
    self.onclose = noop;

    function unreliableOnOpen(e) {
      self.onopen(e);
      curRetries = 0;
    }

    function unreliableOnClose(e) {
      self.onclose(e);

      if (curRetries < maxRetries) {
        ++curRetries;
        setTimeout(connect, timeout);
      }
    }

    function unreliableOnMessage(e) {
      self.onmessage(e);
    }

    function connect() {
      // Constructing a WebSocket() with opts.protocols === undefined
      // does NOT behave the same as calling it with only one argument
      // (specifically, it throws security errors).
      if (opts.protocols) {
        self.ws = new WebSocket(url, opts.protocols);
      } else {
        self.ws = new WebSocket(url);
      }

      // onerror isn't necessary: it is always accompanied by onclose
      self.ws.onopen = unreliableOnOpen;
      self.ws.onclose = unreliableOnClose;
      self.ws.onmessage = unreliableOnMessage;
    }

    connect();
    this.connect = connect;
  }
function ReconnectingWebSocket(url, opts) {
    if (!(this instanceof ReconnectingWebSocket)) {
      throw new TypeError('Cannot call a constructor as a function');
    }

    opts = opts || {};

    var self = this;
    function getOpt(name, def) {
      return opts.hasOwnProperty(name)? opts[name] : def;
    }
    var timeout = getOpt('timeout', 100);
    var maxRetries = getOpt('maxRetries', 5);
    var curRetries = 0;

    // External event callbacks
    self.onmessage = noop;
    self.onopen = noop;
    self.onclose = noop;

    function unreliableOnOpen(e) {
      self.onopen(e);
      curRetries = 0;
    }

    function unreliableOnClose(e) {
      self.onclose(e);

      if (curRetries < maxRetries) {
        ++curRetries;
        setTimeout(connect, timeout);
      }
    }

    function unreliableOnMessage(e) {
      self.onmessage(e);
    }

    function connect() {
      // Constructing a WebSocket() with opts.protocols === undefined
      // does NOT behave the same as calling it with only one argument
      // (specifically, it throws security errors).
      if (opts.protocols) {
        self.ws = new WebSocket(url, opts.protocols);
      } else {
        self.ws = new WebSocket(url);
      }

      // onerror isn't necessary: it is always accompanied by onclose
      self.ws.onopen = unreliableOnOpen;
      self.ws.onclose = unreliableOnClose;
      self.ws.onmessage = unreliableOnMessage;
    }

    connect();
    this.connect = connect;
  }
function ReconnectingWebSocket ( url , opts ) { if ( ! ( this instanceof ReconnectingWebSocket ) ) { throw new TypeError ( 'Cannot call a constructor as a function' ) ; } opts = opts || { } ; var self = this ; function getOpt ( name , def ) { return opts . hasOwnProperty ( name ) ? opts [ name ] : def ; } var timeout = getOpt ( 'timeout' , 100 ) ; var maxRetries = getOpt ( 'maxRetries' , 5 ) ; var curRetries = 0 ; // External event callbacks self . onmessage = noop ; self . onopen = noop ; self . onclose = noop ; function unreliableOnOpen ( e ) { self . onopen ( e ) ; curRetries = 0 ; } function unreliableOnClose ( e ) { self . onclose ( e ) ; if ( curRetries < maxRetries ) { ++ curRetries ; setTimeout ( connect , timeout ) ; } } function unreliableOnMessage ( e ) { self . onmessage ( e ) ; } function connect ( ) { // Constructing a WebSocket() with opts.protocols === undefined // does NOT behave the same as calling it with only one argument // (specifically, it throws security errors). if ( opts . protocols ) { self . ws = new WebSocket ( url , opts . protocols ) ; } else { self . ws = new WebSocket ( url ) ; } // onerror isn't necessary: it is always accompanied by onclose self . ws . onopen = unreliableOnOpen ; self . ws . onclose = unreliableOnClose ; self . ws . onmessage = unreliableOnMessage ; } connect ( ) ; this . connect = connect ; }
Extend WebSocket to automatically reconnect
Extend WebSocket to automatically reconnect