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