64 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
var inherits = require('inherits')
 | 
						|
  , EventEmitter = require('events').EventEmitter
 | 
						|
  , EventSourceDriver = require('eventsource')
 | 
						|
  ;
 | 
						|
 | 
						|
var debug = function() {};
 | 
						|
if (process.env.NODE_ENV !== 'production') {
 | 
						|
  debug = require('debug')('sockjs-client:receiver:eventsource');
 | 
						|
}
 | 
						|
 | 
						|
function EventSourceReceiver(url) {
 | 
						|
  debug(url);
 | 
						|
  EventEmitter.call(this);
 | 
						|
 | 
						|
  var self = this;
 | 
						|
  var es = this.es = new EventSourceDriver(url);
 | 
						|
  es.onmessage = function(e) {
 | 
						|
    debug('message', e.data);
 | 
						|
    self.emit('message', decodeURI(e.data));
 | 
						|
  };
 | 
						|
  es.onerror = function(e) {
 | 
						|
    debug('error', es.readyState, e);
 | 
						|
    // ES on reconnection has readyState = 0 or 1.
 | 
						|
    // on network error it's CLOSED = 2
 | 
						|
    var reason = (es.readyState !== 2 ? 'network' : 'permanent');
 | 
						|
    self._cleanup();
 | 
						|
    self._close(reason);
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
inherits(EventSourceReceiver, EventEmitter);
 | 
						|
 | 
						|
EventSourceReceiver.prototype.abort = function() {
 | 
						|
  debug('abort');
 | 
						|
  this._cleanup();
 | 
						|
  this._close('user');
 | 
						|
};
 | 
						|
 | 
						|
EventSourceReceiver.prototype._cleanup = function() {
 | 
						|
  debug('cleanup');
 | 
						|
  var es = this.es;
 | 
						|
  if (es) {
 | 
						|
    es.onmessage = es.onerror = null;
 | 
						|
    es.close();
 | 
						|
    this.es = null;
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
EventSourceReceiver.prototype._close = function(reason) {
 | 
						|
  debug('close', reason);
 | 
						|
  var self = this;
 | 
						|
  // Safari and chrome < 15 crash if we close window before
 | 
						|
  // waiting for ES cleanup. See:
 | 
						|
  // https://code.google.com/p/chromium/issues/detail?id=89155
 | 
						|
  setTimeout(function() {
 | 
						|
    self.emit('close', null, reason);
 | 
						|
    self.removeAllListeners();
 | 
						|
  }, 200);
 | 
						|
};
 | 
						|
 | 
						|
module.exports = EventSourceReceiver;
 |