[Pkg-javascript-commits] [sockjs-client] 117/350: Change to EventEmitter for all internals

tonnerre at ancient-solutions.com tonnerre at ancient-solutions.com
Fri Aug 5 01:03:49 UTC 2016


This is an automated email from the git hooks/post-receive script.

tonnerre-guest pushed a commit to branch upstream
in repository sockjs-client.

commit 7c532f4fe20cc3539443feadab3a7f63bd4db9bd
Author: Bryce Kahle <bkahle at gmail.com>
Date:   Fri Oct 10 16:49:58 2014 -0400

    Change to EventEmitter for all internals
---
 lib/facade.js                                |  5 +-
 lib/info-receiver-iframe.js                  | 30 ++++++----
 lib/info-receiver.js                         |  3 +-
 lib/main.js                                  | 23 +++----
 lib/transport/facade/info-receiver-iframe.js | 12 ++--
 lib/transport/iframe.js                      | 17 +++---
 lib/transport/jsonp-polling.js               | 17 ++++--
 lib/transport/lib/ajax-based.js              | 15 +++--
 lib/transport/lib/buffered-sender.js         | 19 +++---
 lib/transport/lib/polling.js                 | 31 +++++-----
 lib/transport/receiver/eventsource.js        | 12 ++--
 lib/transport/receiver/htmlfile.js           | 24 ++++----
 lib/transport/receiver/jsonp.js              | 17 +++---
 lib/transport/receiver/xhr.js                | 19 +++---
 lib/transport/websocket.js                   | 17 +++---
 tests/receivers.js                           | 90 ++++++++++++++--------------
 tests/transports.js                          |  2 +-
 17 files changed, 188 insertions(+), 165 deletions(-)

diff --git a/lib/facade.js b/lib/facade.js
index 44b3192..f02703a 100644
--- a/lib/facade.js
+++ b/lib/facade.js
@@ -6,8 +6,8 @@ var frameDefs = require('./transport/lib/frames')
 
 function FacadeJS(transport) {
   this._transport = transport;
-  transport.onmessage = this._transportMessage;
-  transport.onclose = this._transportClose;
+  transport.on('message', this._transportMessage.bind(this));
+  transport.on('close', this._transportClose.bind(this));
 }
 
 FacadeJS.prototype._transportClose = function (code, reason) {
@@ -21,6 +21,7 @@ FacadeJS.prototype._send = function (data) {
 };
 FacadeJS.prototype._close = function () {
   this._transport.close();
+  this._transport.removeAllListeners();
 };
 
 module.exports = FacadeJS;
diff --git a/lib/info-receiver-iframe.js b/lib/info-receiver-iframe.js
index 4b6c8a3..de74847 100644
--- a/lib/info-receiver-iframe.js
+++ b/lib/info-receiver-iframe.js
@@ -12,20 +12,24 @@ function InfoReceiverIframe(method, url) {
   EventEmitter.call(this);
 
   var go = function() {
-    var ifr = new IframeTransport('w-iframe-info-receiver', url, url);
-    var fun = function(e) {
-      if (e.data && e.data.substr(0,1) === 'm') {
-        var d = JSON3.parse(e.data.substr(1));
+    var ifr = self.ifr = new IframeTransport('w-iframe-info-receiver', url, url);
+
+    ifr.on('message', function (msg) {
+      if (msg && msg.substr(0,1) === 'm') {
+        var d = JSON3.parse(msg.substr(1));
         var info = d[0], rtt = d[1];
         self.emit('finish', info, rtt);
-      } else {
-        self.emit('finish');
       }
-      ifr.doCleanup();
-      ifr = null;
-    };
-    ifr.onmessage = ifr.onclose = fun;
+      self.close();
+    });
+
+    ifr.on('close', function () {
+      self.emit('finish');
+      self.close();
+    });
   };
+
+  // this seems the same as the 'needBody' from transports
   if (!global.document.body) {
     utils.attachEvent('load', go);
   } else {
@@ -36,7 +40,11 @@ function InfoReceiverIframe(method, url) {
 util.inherits(InfoReceiverIframe, EventEmitter);
 
 InfoReceiverIframe.prototype.close = function () {
-  // TODO maybe cleanup ifr?
+  if (this.ifr) {
+    this.ifr.close();
+  }
+  this.removeAllListeners();
+  this.ifr = null;
 };
 
 module.exports = InfoReceiverIframe;
diff --git a/lib/info-receiver.js b/lib/info-receiver.js
index a3d9d1f..0b9baaf 100644
--- a/lib/info-receiver.js
+++ b/lib/info-receiver.js
@@ -66,8 +66,7 @@ InfoReceiver.prototype.doXhr = function(baseUrl, AjaxObject) {
     } else if (typeof status === 'object' && typeof text === 'number') {
       // pass through data
       self.emit('finish', status, text);
-    }
-     else {
+    } else {
       self.emit('finish');
     }
   });
diff --git a/lib/main.js b/lib/main.js
index 4d16c01..c704bf9 100644
--- a/lib/main.js
+++ b/lib/main.js
@@ -174,8 +174,8 @@ SockJS.prototype._connect = function() {
 
     var transportUrl = this._transUrl + '/' + this._server + '/' + random.string(8);
     var transport = new Transport(transportUrl, this._transUrl);
-    transport.onmessage = this._transportMessage.bind(this);
-    transport.onclose = this._transportClose.bind(this);
+    transport.on('message', this._transportMessage.bind(this));
+    transport.on('close', this._transportClose.bind(this));
     this._transport = transport;
 
     return;
@@ -189,26 +189,26 @@ SockJS.prototype._transportTimeout = function() {
   }
 };
 
-SockJS.prototype._transportMessage = function(e) {
+SockJS.prototype._transportMessage = function(msg) {
   var self = this;
-  var type = e.data.slice(0, 1);
+  var type = msg.slice(0, 1);
   var payload;
   switch (type) {
     case 'o':
       this._open();
       break;
     case 'a':
-      payload = JSON3.parse(e.data.slice(1) || '[]');
+      payload = JSON3.parse(msg.slice(1) || '[]');
       payload.forEach(function (p) {
         self._dispatchMessage(p);
       });
       break;
     case 'm':
-      payload = JSON3.parse(e.data.slice(1) || 'null');
+      payload = JSON3.parse(msg.slice(1) || 'null');
       this._dispatchMessage(payload);
       break;
     case 'c':
-      payload = JSON3.parse(e.data.slice(1) || '[]');
+      payload = JSON3.parse(msg.slice(1) || '[]');
       this._close(payload[0], payload[1]);
       break;
     case 'h':
@@ -217,8 +217,8 @@ SockJS.prototype._transportMessage = function(e) {
   }
 };
 
-SockJS.prototype._transportClose = function(e) {
-  this._close(e.code, e.reason);
+SockJS.prototype._transportClose = function(code, reason) {
+  this._close(code, reason);
 };
 
 SockJS.prototype._open = function() {
@@ -253,8 +253,8 @@ SockJS.prototype._close = function(code, reason, wasClean) {
   }
   if (this._transport) {
     this._transport.close();
-    this._transport.onmessage = null;
-    this._transport.onclose = null;
+    // strictly not necessary because each transport should do this, but good cleanup
+    this._transport.removeAllListeners();
     this._transport = null;
   }
 
@@ -274,6 +274,7 @@ SockJS.prototype._close = function(code, reason, wasClean) {
     e.reason = reason;
 
     this.dispatchEvent(e);
+    this.onmessage = this.onclose = this.onerror = null;
   }.bind(this));
 };
 
diff --git a/lib/transport/facade/info-receiver-iframe.js b/lib/transport/facade/info-receiver-iframe.js
index 864f798..ff5e1fa 100644
--- a/lib/transport/facade/info-receiver-iframe.js
+++ b/lib/transport/facade/info-receiver-iframe.js
@@ -4,23 +4,21 @@ var XHRLocalObject = require('../sender/xhr-local')
   , JSON3 = require('json3')
   , InfoReceiver = require('../../info-receiver')
   , util = require('util')
-  , EventTarget = require('../../polyfills/eventtarget')
-  , TransportMessageEvent = require('../lib/trans-message-event')
-  , CloseEvent = require('../lib/closeevent')
+  , EventEmitter = require('events').EventEmitter
   ;
 
 function WInfoReceiverIframe(transUrl, baseUrl) {
   var self = this;
-  EventTarget.call(this);
+  EventEmitter.call(this);
 
   var ir = new InfoReceiver(baseUrl, XHRLocalObject);
   ir.on('finish', function(info, rtt) {
-    self.dispatchEvent(new TransportMessageEvent('m' + JSON3.stringify([info, rtt])));
-    self.dispatchEvent(new CloseEvent());
+    self.emit('message', 'm' + JSON3.stringify([info, rtt]) );
+    self.emit('close');
   });
 }
 
-util.inherits(WInfoReceiverIframe, EventTarget);
+util.inherits(WInfoReceiverIframe, EventEmitter);
 
 WInfoReceiverIframe.transportName = 'w-iframe-info-receiver';
 
diff --git a/lib/transport/iframe.js b/lib/transport/iframe.js
index c8d70ba..550992e 100644
--- a/lib/transport/iframe.js
+++ b/lib/transport/iframe.js
@@ -10,9 +10,7 @@
 
 var util = require('util')
   , JSON3 = require('json3')
-  , EventTarget = require('../polyfills/eventtarget')
-  , CloseEvent = require('./lib/closeevent')
-  , TransportMessageEvent = require('./lib/trans-message-event')
+  , EventEmitter = require('events').EventEmitter
   , originUtils = require('../utils/origin')
   , iframeUtils = require('../utils/iframe')
   , eventUtils = require('../utils/event')
@@ -21,7 +19,7 @@ var util = require('util')
   ;
 
 function IframeTransport(transport, transUrl, baseUrl) {
-  EventTarget.call(this);
+  EventEmitter.call(this);
 
   var self = this;
   this.origin = originUtils.getOrigin(baseUrl);
@@ -38,17 +36,15 @@ function IframeTransport(transport, transUrl, baseUrl) {
   iframeUrl += '#' + this.windowId;
 
   this.iframeObj = iframeUtils.createIframe(iframeUrl, function(r) {
-    var closeEvent = new CloseEvent();
-    closeEvent.code = 1006;
-    closeEvent.reason = 'Unable to load an iframe (' + r + ')';
-    self.dispatchEvent(closeEvent);
+    self.emit('close', 1006, 'Unable to load an iframe (' + r + ')');
+    self.removeAllListeners();
   });
 
   this.onmessageCallback = this._message.bind(this);
   eventUtils.attachMessage(this.onmessageCallback);
 }
 
-util.inherits(IframeTransport, EventTarget);
+util.inherits(IframeTransport, EventEmitter);
 
 IframeTransport.prototype.close = function() {
   if (this.iframeObj) {
@@ -62,6 +58,7 @@ IframeTransport.prototype.close = function() {
     this.iframeObj = null;
     this.onmessageCallback = this.iframeObj = null;
   }
+  this.removeAllListeners();
 };
 
 IframeTransport.prototype._message = function(e) {
@@ -89,7 +86,7 @@ IframeTransport.prototype._message = function(e) {
     ]));
     break;
   case 't':
-    this.dispatchEvent(new TransportMessageEvent(data));
+    this.emit('message', data);
     break;
   }
 };
diff --git a/lib/transport/jsonp-polling.js b/lib/transport/jsonp-polling.js
index 2e55479..f37e9a9 100644
--- a/lib/transport/jsonp-polling.js
+++ b/lib/transport/jsonp-polling.js
@@ -15,14 +15,22 @@ var util = require('util')
   , jsonpSender = require('./sender/jsonp')
   ;
 
+// TODO this logic is very similar to ajax-based. See if we could combine.
+
 function JsonPTransport(transUrl) {
   var self = this;
   BufferedSender.call(this, transUrl, jsonpSender);
 
   this.poll = new Polling(JsonpReceiver, this.transUrl + '/jsonp');
-  this.poll.onmessage = this.poll.onclose = function (e) {
-    self.dispatchEvent(e);
-  };
+  this.poll.on('message', function (msg) {
+    self.emit('message', msg);
+  });
+  this.poll.once('close', function (code, reason) {
+    self.poll = null;
+    self.stop();
+    self.emit('close', code, reason);
+    self.removeAllListeners();
+  });
 }
 
 util.inherits(JsonPTransport, BufferedSender);
@@ -30,10 +38,11 @@ util.inherits(JsonPTransport, BufferedSender);
 JsonPTransport.prototype.close = function() {
   if (this.poll) {
     this.poll.abort();
-    this.poll.onmessage = this.poll.onclose = null;
     this.poll = null;
   }
   this.stop();
+  this.emit('close', null, 'user');
+  this.removeAllListeners();
 };
 
 JsonPTransport.enabled = function() {
diff --git a/lib/transport/lib/ajax-based.js b/lib/transport/lib/ajax-based.js
index 03b37b0..9e92f4e 100644
--- a/lib/transport/lib/ajax-based.js
+++ b/lib/transport/lib/ajax-based.js
@@ -29,9 +29,15 @@ function AjaxBasedTransport(transUrl, urlSuffix, Receiver, AjaxObject) {
   BufferedSender.call(this, transUrl, createAjaxSender(AjaxObject));
 
   this.poll = new Polling(Receiver, transUrl + urlSuffix, AjaxObject);
-  this.poll.onmessage = this.poll.onclose = function (e) {
-    self.dispatchEvent(e);
-  };
+  this.poll.on('message', function (msg) {
+    self.emit('message', msg);
+  });
+  this.poll.once('close', function (code, reason) {
+    self.poll = null;
+    self.stop();
+    self.emit('close', code, reason);
+    self.removeAllListeners();
+  });
 }
 
 util.inherits(AjaxBasedTransport, BufferedSender);
@@ -39,10 +45,11 @@ util.inherits(AjaxBasedTransport, BufferedSender);
 AjaxBasedTransport.prototype.close = function() {
   if (this.poll) {
     this.poll.abort();
-    this.poll.onmessage = this.poll.onclose = null;
     this.poll = null;
   }
   this.stop();
+  this.emit('close', null, 'user');
+  this.removeAllListeners();
 };
 
 module.exports = AjaxBasedTransport;
diff --git a/lib/transport/lib/buffered-sender.js b/lib/transport/lib/buffered-sender.js
index 86e870d..5cf309f 100644
--- a/lib/transport/lib/buffered-sender.js
+++ b/lib/transport/lib/buffered-sender.js
@@ -1,18 +1,17 @@
 'use strict';
 
 var util = require('util')
-  , EventTarget = require('../../polyfills/eventtarget')
-  , CloseEvent = require('./closeevent')
+  , EventEmitter = require('events').EventEmitter
   ;
 
 function BufferedSender(url, sender) {
-  EventTarget.call(this);
+  EventEmitter.call(this);
   this.sendBuffer = [];
   this.sender = sender;
   this.url = url;
 }
 
-util.inherits(BufferedSender, EventTarget);
+util.inherits(BufferedSender, EventEmitter);
 
 BufferedSender.prototype.send = function(message) {
   this.sendBuffer.push(message);
@@ -49,10 +48,8 @@ BufferedSender.prototype.sendSchedule = function() {
     this.sendStop = this.sender(this.url, payload, function(err) {
       self.sendStop = null;
       if (err) {
-        var closeEvent = new CloseEvent();
-        closeEvent.code = err.code || 1006;
-        closeEvent.reason = 'Sending error: ' + err;
-        self.dispatchEvent(closeEvent);
+        self.emit('close', err.code || 1006, 'Sending error: ' + err);
+        self._cleanup();
       } else {
         self.sendScheduleWait();
       }
@@ -61,11 +58,17 @@ BufferedSender.prototype.sendSchedule = function() {
   }
 };
 
+BufferedSender.prototype._cleanup = function () {
+  this.removeAllListeners();
+};
+
 BufferedSender.prototype.stop = function() {
   if (this.sendStop) {
+    // TODO I think this will call the callback from above with no error, and thus will call sendScheduleWait again
     this.sendStop();
   }
   this.sendStop = null;
+  this._cleanup();
 };
 
 module.exports = BufferedSender;
diff --git a/lib/transport/lib/polling.js b/lib/transport/lib/polling.js
index 802ce84..4e0185a 100644
--- a/lib/transport/lib/polling.js
+++ b/lib/transport/lib/polling.js
@@ -1,40 +1,38 @@
 'use strict';
 
 var util = require('util')
-  , EventTarget = require('../../polyfills/eventtarget')
-  , TransMessageEvent = require('./trans-message-event')
-  , CloseEvent = require('./closeevent')
+  , EventEmitter = require('events').EventEmitter
   ;
 
 function Polling(Receiver, receiveUrl, AjaxObject) {
-  EventTarget.call(this);
+  EventEmitter.call(this);
   this.Receiver = Receiver;
   this.receiveUrl = receiveUrl;
   this.AjaxObject = AjaxObject;
   this._scheduleReceiver();
 }
 
-util.inherits(Polling, EventTarget);
+util.inherits(Polling, EventEmitter);
 
 Polling.prototype._scheduleReceiver = function() {
   var self = this;
   var poll = this.poll = new this.Receiver(this.receiveUrl, this.AjaxObject);
-  poll.onmessage = function(e) {
-    self.dispatchEvent(new TransMessageEvent(e.data));
-  };
-  poll.onclose = function(e) {
-    self.poll = poll = poll.onmessage = poll.onclose = null;
+
+  poll.on('message', function(msg) {
+    self.emit('message', msg);
+  });
+
+  poll.on('close', function(code, reason) {
+    self.poll = poll = null;
+
     if (!self.pollIsClosing) {
-      if (e.reason === 'network') {
+      if (reason === 'network') {
         self._scheduleReceiver();
       } else {
-        var ce = new CloseEvent();
-        ce.code = e.code || 1000;
-        ce.reason = e.reason;
-        self.dispatchEvent(ce);
+        self.emit('close', code || 1000, reason);
       }
     }
-  };
+  });
 };
 
 Polling.prototype.abort = function() {
@@ -42,6 +40,7 @@ Polling.prototype.abort = function() {
   if (this.poll) {
     this.poll.abort();
   }
+  this.removeAllListeners();
 };
 
 module.exports = Polling;
diff --git a/lib/transport/receiver/eventsource.js b/lib/transport/receiver/eventsource.js
index b15a607..5de91ae 100644
--- a/lib/transport/receiver/eventsource.js
+++ b/lib/transport/receiver/eventsource.js
@@ -1,17 +1,16 @@
 'use strict';
 
 var util = require('util')
-  , SimpleEvent = require('../../simpleevent')
-  , EventTarget = require('../../polyfills/eventtarget')
+  , EventEmitter = require('events').EventEmitter
   ;
 
 function EventSourceReceiver(url) {
-  EventTarget.call(this);
+  EventEmitter.call(this);
 
   var self = this;
   var es = new global.EventSource(url);
   es.onmessage = function(e) {
-    self.dispatchEvent(new SimpleEvent('message', {'data': decodeURI(e.data)}));
+    self.emit('message', decodeURI(e.data));
   };
   this.esClose = es.onerror = function(e, abortReason) {
     // ES on reconnection has readyState = 0 or 1.
@@ -26,12 +25,13 @@ function EventSourceReceiver(url) {
     // waiting for ES cleanup. See:
     //   https://code.google.com/p/chromium/issues/detail?id=89155
     setTimeout(function() {
-      self.dispatchEvent(new SimpleEvent('close', {reason: reason}));
+      self.emit('close', null, reason);
+      self.removeAllListeners();
     }, 200);
   };
 }
 
-util.inherits(EventSourceReceiver, EventTarget);
+util.inherits(EventSourceReceiver, EventEmitter);
 
 EventSourceReceiver.prototype.abort = function() {
   if (this.esClose) {
diff --git a/lib/transport/receiver/htmlfile.js b/lib/transport/receiver/htmlfile.js
index a8026cf..b920eb4 100644
--- a/lib/transport/receiver/htmlfile.js
+++ b/lib/transport/receiver/htmlfile.js
@@ -1,9 +1,8 @@
 'use strict';
 
 var util = require('util')
-  , utils = require('../../utils/iframe')
-  , SimpleEvent = require('../../simpleevent')
-  , EventTarget = require('../../polyfills/eventtarget')
+  , iframeUtils = require('../../utils/iframe')
+  , EventEmitter = require('events').EventEmitter
   , random = require('../../utils/random')
   ;
 
@@ -23,24 +22,24 @@ var isIeHtmlfileCapable = function() {
 
 
 function HtmlfileReceiver(url) {
-  EventTarget.call(this);
+  EventEmitter.call(this);
   var self = this;
-  utils.polluteGlobalNamespace();
+  iframeUtils.polluteGlobalNamespace();
 
   this.id = 'a' + random.string(6);
   url += ((url.indexOf('?') === -1) ? '?' : '&') +
-      'c=' + decodeURIComponent(utils.WPrefix + '.' + this.id);
+      'c=' + decodeURIComponent(iframeUtils.WPrefix + '.' + this.id);
 
   var constructor = isIeHtmlfileCapable() ?
-      utils.createHtmlfile : utils.createIframe;
+      iframeUtils.createHtmlfile : iframeUtils.createIframe;
 
   var iframeObj;
-  global[utils.WPrefix][this.id] = {
+  global[iframeUtils.WPrefix][this.id] = {
     start: function () {
       iframeObj.loaded();
     },
     message: function (data) {
-      self.dispatchEvent(new SimpleEvent('message', {'data': data}));
+      self.emit('message', data);
     },
     stop: function () {
       self.iframeClose({}, 'network');
@@ -49,15 +48,16 @@ function HtmlfileReceiver(url) {
   this.iframeClose = function(e, abortReason) {
     iframeObj.cleanup();
     self.iframeClose = iframeObj = null;
-    delete global[utils.WPrefix][self.id];
-    self.dispatchEvent(new SimpleEvent('close', {reason: abortReason}));
+    delete global[iframeUtils.WPrefix][self.id];
+    self.emit('close', null, abortReason);
+    self.removeAllListeners();
   };
   iframeObj = constructor(url, function() {
     self.iframeClose({}, 'permanent');
   });
 }
 
-util.inherits(HtmlfileReceiver, EventTarget);
+util.inherits(HtmlfileReceiver, EventEmitter);
 
 HtmlfileReceiver.prototype.abort = function() {
   if (this.iframeClose) {
diff --git a/lib/transport/receiver/jsonp.js b/lib/transport/receiver/jsonp.js
index bd46d3c..88d16f4 100644
--- a/lib/transport/receiver/jsonp.js
+++ b/lib/transport/receiver/jsonp.js
@@ -4,13 +4,12 @@ var utils = require('../../utils/iframe')
   , random = require('../../utils/random')
   , browser = require('../../utils/browser')
   , util = require('util')
-  , SimpleEvent = require('../../simpleevent')
-  , EventTarget = require('../../polyfills/eventtarget')
+  , EventEmitter = require('events').EventEmitter
   ;
 
 function JsonpReceiver(url) {
   var self = this;
-  EventTarget.call(this);
+  EventEmitter.call(this);
 
   utils.polluteGlobalNamespace();
 
@@ -26,7 +25,7 @@ function JsonpReceiver(url) {
   }, JsonpReceiver.timeout);
 }
 
-util.inherits(JsonpReceiver, EventTarget);
+util.inherits(JsonpReceiver, EventEmitter);
 
 JsonpReceiver.prototype.abort = function () {
   if (global[utils.WPrefix][this.id]) {
@@ -48,17 +47,17 @@ JsonpReceiver.prototype._callback = function (data) {
   }
 
   if (data) {
-    this.dispatchEvent(new SimpleEvent('message', { data: data }));
+    this.emit('message', data);
   }
-  this.dispatchEvent(new SimpleEvent('close', { reason: 'network' }));
-  this.onmessage = this.onclose = null;
+  this.emit('close', null, 'network');
+  this.removeAllListeners();
 };
 
 JsonpReceiver.prototype._abort = function (err) {
   this._cleanup();
   this.aborting = true;
-  this.dispatchEvent(new SimpleEvent('close', { code: err.code, reason: err.message }));
-  this.onmessage = this.onclose = null;
+  this.emit('close', err.code, err.message);
+  this.removeAllListeners();
 };
 
 JsonpReceiver.prototype._cleanup = function () {
diff --git a/lib/transport/receiver/xhr.js b/lib/transport/receiver/xhr.js
index 7721a39..542320c 100644
--- a/lib/transport/receiver/xhr.js
+++ b/lib/transport/receiver/xhr.js
@@ -1,12 +1,11 @@
 'use strict';
 
 var util = require('util')
-  , SimpleEvent = require('../../simpleevent')
-  , EventTarget = require('../../polyfills/eventtarget')
+  , EventEmitter = require('events').EventEmitter
   ;
 
 function XhrReceiver(url, AjaxObject) {
-  EventTarget.call(this);
+  EventEmitter.call(this);
   var self = this;
 
   this.xo = new AjaxObject('POST', url, null);
@@ -15,11 +14,12 @@ function XhrReceiver(url, AjaxObject) {
     self._chunkHandler(status, text);
     self.xo = null;
     var reason = status === 200 ? 'network' : 'permanent';
-    self.dispatchEvent(new SimpleEvent('close', {reason: reason}));
+    self.emit('close', null, reason);
+    self._cleanup();
   });
 }
 
-util.inherits(XhrReceiver, EventTarget);
+util.inherits(XhrReceiver, EventEmitter);
 
 XhrReceiver.prototype._chunkHandler = function (status, text) {
   if (status !== 200 || !text) {
@@ -32,16 +32,21 @@ XhrReceiver.prototype._chunkHandler = function (status, text) {
     if (!msg) {
       return;
     }
-    self.dispatchEvent(new SimpleEvent('message', {data: msg}));
+    self.emit('message', msg);
   });
 };
 
+XhrReceiver.prototype._cleanup = function () {
+  this.removeAllListeners();
+};
+
 XhrReceiver.prototype.abort = function() {
   if (this.xo) {
     this.xo.close();
-    this.dispatchEvent(new SimpleEvent('close', {reason: 'user'}));
+    this.emit('close', null, 'user');
     this.xo = null;
   }
+  this._cleanup();
 };
 
 module.exports = XhrReceiver;
diff --git a/lib/transport/websocket.js b/lib/transport/websocket.js
index 154e761..b49be52 100644
--- a/lib/transport/websocket.js
+++ b/lib/transport/websocket.js
@@ -2,14 +2,12 @@
 
 var utils = require('../utils/event')
   , util = require('util')
-  , EventTarget = require('../polyfills/eventtarget')
-  , TransportMessageEvent = require('./lib/trans-message-event')
-  , CloseEvent = require('./lib/closeevent')
+  , EventEmitter = require('events').EventEmitter
   , WebsocketDriver = require('./driver/websocket')
   ;
 
 function WebSocketTransport(transUrl) {
-  EventTarget.call(this);
+  EventEmitter.call(this);
 
   var self = this;
   var url = transUrl + '/websocket';
@@ -22,7 +20,7 @@ function WebSocketTransport(transUrl) {
 
   this.ws = new WebsocketDriver(this.url);
   this.ws.onmessage = function(e) {
-    self.dispatchEvent(new TransportMessageEvent(e.data));
+    self.emit('message', e.data);
   };
   // Firefox has an interesting bug. If a websocket connection is
   // created after onunload, it stays alive even when user
@@ -34,14 +32,12 @@ function WebSocketTransport(transUrl) {
     self.ws.close();
   });
   this.ws.onclose = this.ws.onerror = function() {
-    var closeEvent = new CloseEvent();
-    closeEvent.code = 1006;
-    closeEvent.reason = 'WebSocket connection broken';
-    self.dispatchEvent(closeEvent);
+    self.emit('close', 1006, 'WebSocket connection broken');
+    self.removeAllListeners();
   };
 }
 
-util.inherits(WebSocketTransport, EventTarget);
+util.inherits(WebSocketTransport, EventEmitter);
 
 WebSocketTransport.prototype.send = function(data) {
   this.ws.send('[' + data + ']');
@@ -55,6 +51,7 @@ WebSocketTransport.prototype.close = function() {
     utils.unloadDel(this.unloadRef);
     this.unloadRef = this.ws = null;
   }
+  this.removeAllListeners();
 };
 
 WebSocketTransport.enabled = function() {
diff --git a/tests/receivers.js b/tests/receivers.js
index 09a2457..c8cd611 100644
--- a/tests/receivers.js
+++ b/tests/receivers.js
@@ -22,13 +22,13 @@ describe('Receivers', function () {
         }, 5);
       };
       var jpr = new JsonpReceiver('test');
-      jpr.onclose = function (e) {
-        expect(e.reason).to.eql('network');
+      jpr.on('close', function (code, reason) {
+        expect(reason).to.eql('network');
         done();
-      };
-      jpr.onmessage = function (e) {
-        expect(e.data).to.eql('datadata');
-      };
+      });
+      jpr.on('message', function (msg) {
+        expect(msg).to.eql('datadata');
+      });
     });
 
     it('will timeout', function (done) {
@@ -41,13 +41,13 @@ describe('Receivers', function () {
       };
 
       var jpr = new JsonpReceiver('test');
-      jpr.onclose = function (e) {
-        expect(e.reason).to.contain('timeout');
+      jpr.on('close', function (code, reason) {
+        expect(reason).to.contain('timeout');
         done();
-      };
-      jpr.onmessage = function () {
+      });
+      jpr.on('message', function () {
         expect().fail('No message should be sent');
-      };
+      });
     });
 
     it('aborts without sending a message', function (done) {
@@ -58,13 +58,13 @@ describe('Receivers', function () {
         }, 200);
       };
       var jpr = new JsonpReceiver('test');
-      jpr.onclose = function (e) {
-        expect(e.reason).to.contain('aborted');
+      jpr.on('close', function (code, reason) {
+        expect(reason).to.contain('aborted');
         done();
-      };
-      jpr.onmessage = function () {
+      });
+      jpr.on('message', function () {
         expect().fail('No message should be sent');
-      };
+      });
       jpr.abort();
     });
 
@@ -80,13 +80,13 @@ describe('Receivers', function () {
       };
 
       var jpr = new JsonpReceiver('test');
-      jpr.onclose = function (e) {
-        expect(e.reason).to.eql('network');
+      jpr.on('close', function (code, reason) {
+        expect(reason).to.eql('network');
         done();
-      };
-      jpr.onmessage = function (e) {
-        expect(e.data).to.eql('datadata');
-      };
+      });
+      jpr.on('message', function (msg) {
+        expect(msg).to.eql('datadata');
+      });
 
       // simulate script error
       jpr._scriptError();
@@ -104,13 +104,13 @@ describe('Receivers', function () {
       };
 
       var jpr = new JsonpReceiver('test');
-      jpr.onclose = function (e) {
-        expect(e.reason).to.eql('network');
+      jpr.on('close', function (code, reason) {
+        expect(reason).to.eql('network');
         done();
-      };
-      jpr.onmessage = function (e) {
-        expect(e.data).to.eql('datadata');
-      };
+      });
+      jpr.on('message', function (msg) {
+        expect(msg).to.eql('datadata');
+      });
 
       // simulate script error
       setTimeout(function () {
@@ -127,41 +127,41 @@ describe('Receivers', function () {
     it('emits multiple messages for multi-line response', function (done) {
       var xhr = new XhrReceiver('test', XhrFake);
       var i = 0, responses = ['test', 'multiple', 'lines', '{}'];
-      xhr.onmessage = function (e) {
-        expect(e.data).to.be.eql(responses[i]);
+      xhr.on('message', function (msg) {
+        expect(msg).to.be.eql(responses[i]);
         i++;
-      };
-      xhr.onclose = function (e) {
-        expect(e.reason).to.be.eql('network');
+      });
+      xhr.on('close', function (code, reason) {
+        expect(reason).to.be.eql('network');
         done();
-      };
+      });
       xhr._chunkHandler(200, 'test\nmultiple\nlines');
     });
 
     it('emits no messages for an empty string response', function (done) {
       var xhr = new XhrReceiver('test', XhrFake);
       var i = 0, responses = ['{}'];
-      xhr.onmessage = function (e) {
+      xhr.on('message', function (msg) {
         expect(i).to.be.lessThan(responses.length);
-        expect(e.data).to.be.eql(responses[i]);
+        expect(msg).to.be.eql(responses[i]);
         i++;
-      };
-      xhr.onclose = function (e) {
-        expect(e.reason).to.be.eql('network');
+      });
+      xhr.on('close', function (code, reason) {
+        expect(reason).to.be.eql('network');
         done();
-      };
+      });
       xhr._chunkHandler(200, '');
     });
 
     it('aborts without sending a message', function (done) {
       var xhr = new XhrReceiver('test', XhrFake);
-      xhr.onmessage = function () {
+      xhr.on('message', function () {
         expect().fail();
-      };
-      xhr.onclose = function (e) {
-        expect(e.reason).to.be.eql('user');
+      });
+      xhr.on('close', function (code, reason) {
+        expect(reason).to.be.eql('user');
         done();
-      };
+      });
       xhr.abort();
     });
   });
diff --git a/tests/transports.js b/tests/transports.js
index 2156903..9c4ca20 100644
--- a/tests/transports.js
+++ b/tests/transports.js
@@ -26,7 +26,7 @@ describe('Transports', function () {
         expect(Trans.prototype).to.have.property('close');
         expect(Trans.prototype.close).to.be.a('function');
 
-        //expect().to.be.an(EventTarget);
+        //expect().to.be.an(EventEmitter);
         // TODO tests for event emitting
       });
     });

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/sockjs-client.git



More information about the Pkg-javascript-commits mailing list