diff --git a/lib/eventsource.js b/lib/eventsource.js index a7bb478..ac8f6c8 100644 --- a/lib/eventsource.js +++ b/lib/eventsource.js @@ -45,6 +45,7 @@ function EventSource (url, eventSourceInitDict) { var self = this self.reconnectInterval = 1000 + self.connectionInProgress = false function onConnectionClosed (message) { if (readyState === EventSource.CLOSED) return @@ -58,9 +59,10 @@ function EventSource (url, eventSourceInitDict) { reconnectUrl = null } setTimeout(function () { - if (readyState !== EventSource.CONNECTING) { + if (readyState !== EventSource.CONNECTING || self.connectionInProgress) { return } + self.connectionInProgress = true connect() }, self.reconnectInterval) } @@ -131,6 +133,7 @@ function EventSource (url, eventSourceInitDict) { } req = (isSecure ? https : http).request(options, function (res) { + self.connectionInProgress = false // Handle HTTP errors if (res.statusCode === 500 || res.statusCode === 502 || res.statusCode === 503 || res.statusCode === 504) { _emit('error', new Event('error', {status: res.statusCode, message: res.statusMessage})) diff --git a/test/eventsource_test.js b/test/eventsource_test.js index a547b32..180f704 100644 --- a/test/eventsource_test.js +++ b/test/eventsource_test.js @@ -873,6 +873,36 @@ describe('Reconnection', function () { } }) }) + + it('attempts to reconnect are deduplicated on sequential erorrs', function (done) { + createServer(function (err, server) { + if (err) return done(err) + var events = ['data: Hello'] + var eventsSent = 0 + var errorOccurred = false + server.on('request', function (req, res) { + if (eventsSent === 0) { + var fn = writeEvents(events) + fn(req, res) + eventsSent++ + // now cause a few errors + fn(req, res) + eventsSent++ + } else { + assert.equal(EventSource.CONNECTING, es.readyState) + assert.ok(errorOccurred) + server.close(done) + } + }) + + var es = new EventSource(server.url) + assert.equal(EventSource.CONNECTING, es.readyState) + es.reconnectInterval = 0 + es.onerror = function (err) { + errorOccurred = !!(errorOccurred || err) + } + }) + }) }) describe('readyState', function () {