| '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; |