[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