github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/themes/wind/static/libs/sockjs-client-1.1.0/lib/transport/receiver/eventsource.js (about) 1 'use strict'; 2 3 var inherits = require('inherits') 4 , EventEmitter = require('events').EventEmitter 5 , EventSourceDriver = require('eventsource') 6 ; 7 8 var debug = function() {}; 9 if (process.env.NODE_ENV !== 'production') { 10 debug = require('debug')('sockjs-client:receiver:eventsource'); 11 } 12 13 function EventSourceReceiver(url) { 14 debug(url); 15 EventEmitter.call(this); 16 17 var self = this; 18 var es = this.es = new EventSourceDriver(url); 19 es.onmessage = function(e) { 20 debug('message', e.data); 21 self.emit('message', decodeURI(e.data)); 22 }; 23 es.onerror = function(e) { 24 debug('error', es.readyState, e); 25 // ES on reconnection has readyState = 0 or 1. 26 // on network error it's CLOSED = 2 27 var reason = (es.readyState !== 2 ? 'network' : 'permanent'); 28 self._cleanup(); 29 self._close(reason); 30 }; 31 } 32 33 inherits(EventSourceReceiver, EventEmitter); 34 35 EventSourceReceiver.prototype.abort = function() { 36 debug('abort'); 37 this._cleanup(); 38 this._close('user'); 39 }; 40 41 EventSourceReceiver.prototype._cleanup = function() { 42 debug('cleanup'); 43 var es = this.es; 44 if (es) { 45 es.onmessage = es.onerror = null; 46 es.close(); 47 this.es = null; 48 } 49 }; 50 51 EventSourceReceiver.prototype._close = function(reason) { 52 debug('close', reason); 53 var self = this; 54 // Safari and chrome < 15 crash if we close window before 55 // waiting for ES cleanup. See: 56 // https://code.google.com/p/chromium/issues/detail?id=89155 57 setTimeout(function() { 58 self.emit('close', null, reason); 59 self.removeAllListeners(); 60 }, 200); 61 }; 62 63 module.exports = EventSourceReceiver;