From c7c93edd40c21abc0bc01ed7342041409b451a35 Mon Sep 17 00:00:00 2001 From: Sander Steenhuis Date: Thu, 15 Dec 2016 01:17:21 +0100 Subject: [PATCH 1/7] Add optional `delay` argument Optionally delay retries by the specified amount of milliseconds. ```javascript superagent .get('https://segment.io') .retry(2, 800) // retry twice with 0.8s delay before responding .end(onresponse); ``` Convenient for servers that only err when too busy. --- lib/index.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/index.js b/lib/index.js index 20d3095..3969437 100644 --- a/lib/index.js +++ b/lib/index.js @@ -22,26 +22,28 @@ module.exports.retries = retries; /** * Sets the amount of times to retry the request * @param {Number} count + * @param {Number} [delay] optional delay in ms */ -function retry (retries) { +function retry (retries, delay) { var self = this , oldEnd = this.end; - retries = retries || 1; + retries = retries === Number(retries) && retries || 1; + delay = delay === Number(delay) && delay || 0; this.end = function (fn) { var timeout = this._timeout; function attemptRetry () { return oldEnd.call(self, function (err, res) { - if (!retries || !shouldRetry(err, res)) return fn && fn(err, res); + if (!retries-- || !shouldRetry(err, res)) return fn && fn(err, res); - reset(self, timeout); - - retries--; - return attemptRetry(); + setTimeout(function() { + reset(self, timeout); + attemptRetry() + }, delay); }); } @@ -65,6 +67,7 @@ function reset (request, timeout) { request.timeout(timeout); delete request.req; delete request._timer; + delete request._endCalled; for (var k in headers) { request.set(k, headers[k]); From 07486fc12118b46958d5412d1f88868f728cd344 Mon Sep 17 00:00:00 2001 From: Sander Steenhuis Date: Thu, 15 Dec 2016 01:36:17 +0100 Subject: [PATCH 2/7] Missing semicolon --- lib/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index 3969437..4518538 100644 --- a/lib/index.js +++ b/lib/index.js @@ -42,7 +42,7 @@ function retry (retries, delay) { setTimeout(function() { reset(self, timeout); - attemptRetry() + attemptRetry(); }, delay); }); } From 1accae3cb14a7db400ba7ba8ce16655142ae2c50 Mon Sep 17 00:00:00 2001 From: "Sander @Redsandro Steenhuis" Date: Thu, 15 Dec 2016 10:10:43 +0100 Subject: [PATCH 3/7] Added test for delay argument --- test/test.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/test/test.js b/test/test.js index 111c201..3bb1beb 100644 --- a/test/test.js +++ b/test/test.js @@ -237,5 +237,34 @@ describe('superagent-retry', function () { done(); }) }); + + it('should retry with delay', function (done) { + var requests = 0; + var millisecs = Date.now(); + var url = 'http://localhost:' + port + '/timeout'; + + app.get('/timeout', function (req, res, next) { + requests++; + if (requests > 10) res.send('hi!'); + }); + + agent + .get(url) + .timeout(10) + .end(function (err, res) { + should.exist(err); + }); + + agent + .get(url) + .timeout(2) + .retry(10, 20) + .end(function (err, res) { + millisecs = Date.now() - millisecs; + res.text.should.eql('hi!'); + millisecs.should.above(200); + done(); + }); + }); }); }) From 77636a7c503f76537068910333b3ba116bbd5c31 Mon Sep 17 00:00:00 2001 From: "Sander @Redsandro Steenhuis" Date: Thu, 15 Dec 2016 10:15:56 +0100 Subject: [PATCH 4/7] Bump version to `0.7.0` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 55191b4..8cf0c05 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "superagent-retry", - "version": "0.6.0", + "version": "0.7.0", "description": "A retrying layer for a superagent request", "keywords": [ "superagent", From 570ad7cd5b9994a76871552514b39427738f14ae Mon Sep 17 00:00:00 2001 From: "Sander @Redsandro Steenhuis" Date: Thu, 15 Dec 2016 10:25:55 +0100 Subject: [PATCH 5/7] Updated readme --- Readme.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Readme.md b/Readme.md index bf50811..b26e61f 100644 --- a/Readme.md +++ b/Readme.md @@ -23,6 +23,15 @@ function onresponse (err, res) { } ``` +You can optionally add a delay to each retry. + +``` +superagent + .get('https://segment.io') + .retry(2, 500) // retry twice with 0.5 second delay + .end(onresponse); +``` + ## Retrying Cases Currently the retrying logic checks for: From 8ec61844192a0f7e24a3b7dcea002354ead127f9 Mon Sep 17 00:00:00 2001 From: "Sander @Redsandro Steenhuis" Date: Thu, 15 Dec 2016 10:26:56 +0100 Subject: [PATCH 6/7] Docs: code formatting --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index b26e61f..e8d5d02 100644 --- a/Readme.md +++ b/Readme.md @@ -25,7 +25,7 @@ function onresponse (err, res) { You can optionally add a delay to each retry. -``` +```javascript superagent .get('https://segment.io') .retry(2, 500) // retry twice with 0.5 second delay From dff7a855707e7fadec20ff8a55aeddadb7cd0318 Mon Sep 17 00:00:00 2001 From: "Sander @Redsandro Steenhuis" Date: Thu, 15 Dec 2016 10:38:36 +0100 Subject: [PATCH 7/7] Update History.md --- History.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/History.md b/History.md index ea94953..138c313 100644 --- a/History.md +++ b/History.md @@ -1,4 +1,9 @@ +0.7.0 / 2016-12-15 +================== + + * [FEATURE] Retry with optional delay + 0.6.0 / 2016-05-16 ==================