Skip to content

Commit d88ef93

Browse files
committed
Merge pull request #49 from nnevala/handle-econnrefused
Handle socket errors occurring before connection is established
2 parents d712120 + 889be8f commit d88ef93

File tree

2 files changed

+53
-15
lines changed

2 files changed

+53
-15
lines changed

lib/ddp-client.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ var DDPClient = function(opts) {
4040
}
4141

4242
// internal stuff to track callbacks
43+
self._isConnecting = false;
44+
self._isReconnecting = false;
4345
self._nextId = 0;
4446
self._callbacks = {};
4547
self._updatedCallbacks = {};
@@ -65,6 +67,11 @@ DDPClient.prototype._prepareHandlers = function() {
6567
});
6668

6769
self.socket.on("error", function(error) {
70+
// error received before connection was established
71+
if (self._isConnecting) {
72+
self.emit("failed", error.message);
73+
}
74+
6875
self.emit("socket-error", error);
6976
});
7077

@@ -283,6 +290,7 @@ DDPClient.prototype._removeObserver = function(observer) {
283290
*/
284291
DDPClient.prototype.connect = function(connected) {
285292
var self = this;
293+
self._isConnecting = true;
286294
self._connectionFailed = false;
287295
self._isClosing = false;
288296

@@ -291,9 +299,11 @@ DDPClient.prototype.connect = function(connected) {
291299
self._clearReconnectTimeout();
292300

293301
connected(undefined, self._isReconnecting);
302+
self._isConnecting = false;
294303
self._isReconnecting = false;
295304
});
296305
self.addListener("failed", function(error) {
306+
self._isConnecting = false;
297307
self._connectionFailed = true;
298308
connected(error, self._isReconnecting);
299309
});

test/ddp-client.js

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,49 @@ describe("Connect to remote server", function() {
4747
new DDPClient({'host': 'myserver.com', 'port': 443}).connect();
4848
assert.deepEqual(wsConstructor.args, [['wss://myserver.com:443/websocket']]);
4949
});
50+
51+
it('should clear event listeners on close', function(done) {
52+
var ddpclient = new DDPClient();
53+
var callback = sinon.stub();
54+
55+
ddpclient.connect(callback);
56+
ddpclient.close();
57+
ddpclient.connect(callback);
58+
59+
setTimeout(function() {
60+
assert.equal(ddpclient.listeners('connected').length, 1);
61+
assert.equal(ddpclient.listeners('failed').length, 1);
62+
done();
63+
}, 15);
64+
});
65+
66+
it('should call the connection callback when connection is established', function(done) {
67+
var ddpclient = new DDPClient();
68+
var callback = sinon.spy();
69+
70+
ddpclient.connect(callback);
71+
wsMock.emit('message', { data: '{ "msg": "connected" }' });
72+
73+
setTimeout(function() {
74+
assert(callback.calledWith(undefined, false));
75+
done();
76+
}, 15);
77+
});
78+
79+
it('should pass socket errors occurring during connection to the connection callback', function(done) {
80+
var ddpclient = new DDPClient();
81+
var callback = sinon.spy();
82+
83+
var socketError = "Network error: ws://localhost:3000/websocket: connect ECONNREFUSED";
84+
85+
ddpclient.connect(callback);
86+
wsMock.emit('error', { message: socketError });
87+
88+
setTimeout(function() {
89+
assert(callback.calledWith(socketError, false));
90+
done();
91+
}, 15);
92+
});
5093
});
5194

5295

@@ -91,21 +134,6 @@ describe('Automatic reconnection', function() {
91134
done();
92135
}, 15);
93136
});
94-
95-
it('should clear event listeners on close', function(done) {
96-
var ddpclient = new DDPClient();
97-
var callback = sinon.stub();
98-
99-
ddpclient.connect(callback);
100-
ddpclient.close();
101-
ddpclient.connect(callback);
102-
103-
setTimeout(function() {
104-
assert.equal(ddpclient.listeners('connected').length, 1);
105-
assert.equal(ddpclient.listeners('failed').length, 1);
106-
done();
107-
}, 15);
108-
})
109137
});
110138

111139

0 commit comments

Comments
 (0)