From c8b0d88b57f4e0f2398733019e7ab865b01e13e1 Mon Sep 17 00:00:00 2001 From: "S. Safayet" Date: Tue, 6 Dec 2022 10:35:43 +0600 Subject: [PATCH 1/3] Added a new option -retryTimeout to allow applying total timeout on a retry --- lib/index.js | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/lib/index.js b/lib/index.js index d8f0c8a..1ecaf25 100644 --- a/lib/index.js +++ b/lib/index.js @@ -2,15 +2,16 @@ var retrier = require('retry'); function retry(fn, opts) { + var options = opts || {}; + + // Default `randomize` to true + if (!('randomize' in options)) { + options.randomize = true; + } + function run(resolve, reject) { - var options = opts || {}; var op; - // Default `randomize` to true - if (!('randomize' in options)) { - options.randomize = true; - } - op = retrier.operation(options); // We allow the user to abort retrying @@ -55,7 +56,18 @@ function retry(fn, opts) { op.attempt(runAttempt); } - return new Promise(run); + // Setting up overall timeout for a retry + const { retryTimeout } = options; + return retryTimeout + ? Promise.race([ + new Promise(run), + new Promise((_, reject) => { + setTimeout(() => { + reject(new Error(`Retry timed out in ${retryTimeout}ms`)); + }, retryTimeout); + }), + ]) + : new Promise(run); } module.exports = retry; From 5f8d93e417af5130561bb96b7bab4623e992bfdc Mon Sep 17 00:00:00 2001 From: "S. Safayet" Date: Tue, 6 Dec 2022 10:36:20 +0600 Subject: [PATCH 2/3] Added a new test for retryTimeout --- test/index.js | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/test/index.js b/test/index.js index 81ec16b..4b87943 100644 --- a/test/index.js +++ b/test/index.js @@ -6,7 +6,7 @@ const sleep = require('then-sleep'); // Ours const retry = require('../lib'); -test('return value', async t => { +test('return value', async (t) => { const val = await retry(async (bail, num) => { if (num < 2) { throw new Error('woot'); @@ -19,12 +19,12 @@ test('return value', async t => { t.deepEqual('woot 2', val); }); -test('return value no await', async t => { +test('return value no await', async (t) => { const val = await retry(async (bail, num) => num); t.deepEqual(1, val); }); -test('chained promise', async t => { +test('chained promise', async (t) => { const res = await retry(async (bail, num) => { if (num < 2) { throw new Error('retry'); @@ -36,7 +36,7 @@ test('chained promise', async t => { t.deepEqual(200, res.status); }); -test('bail', async t => { +test('bail', async (t) => { try { await retry( async (bail, num) => { @@ -53,12 +53,12 @@ test('bail', async t => { } }); -test('bail + return', async t => { +test('bail + return', async (t) => { let error; try { await Promise.resolve( - retry(async bail => { + retry(async (bail) => { await sleep(200); await sleep(200); bail(new Error('woot')); @@ -71,7 +71,7 @@ test('bail + return', async t => { t.deepEqual(error.message, 'woot'); }); -test('bail error', async t => { +test('bail error', async (t) => { let retries = 0; try { @@ -92,7 +92,7 @@ test('bail error', async t => { t.deepEqual(retries, 1); }); -test('with non-async functions', async t => { +test('with non-async functions', async (t) => { try { await retry( (bail, num) => { @@ -105,12 +105,12 @@ test('with non-async functions', async t => { } }); -test('return non-async', async t => { +test('return non-async', async (t) => { const val = await retry(() => 5); t.deepEqual(5, val); }); -test('with number of retries', async t => { +test('with number of retries', async (t) => { let retries = 0; try { @@ -123,9 +123,25 @@ test('with number of retries', async t => { } retries = i; - } + }, }); } catch (err) { t.deepEqual(retries, 2); } }); + +test('with retry timeout', async (t) => { + const retryTimeout = 2000; + try { + await retry( + async () => { + await sleep(3000); + }, + { + retryTimeout, + } + ); + } catch (err) { + t.deepEqual(err.message, `Retry timed out in ${retryTimeout}ms`); + } +}); From 03903c14d86bb04df455b505627f9c9b2d9af5e7 Mon Sep 17 00:00:00 2001 From: "S. Safayet" Date: Tue, 6 Dec 2022 10:48:07 +0600 Subject: [PATCH 3/3] Removed uninteded code formatting --- test/index.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test/index.js b/test/index.js index 4b87943..3f7a26e 100644 --- a/test/index.js +++ b/test/index.js @@ -6,7 +6,7 @@ const sleep = require('then-sleep'); // Ours const retry = require('../lib'); -test('return value', async (t) => { +test('return value', async t => { const val = await retry(async (bail, num) => { if (num < 2) { throw new Error('woot'); @@ -19,12 +19,12 @@ test('return value', async (t) => { t.deepEqual('woot 2', val); }); -test('return value no await', async (t) => { +test('return value no await', async t => { const val = await retry(async (bail, num) => num); t.deepEqual(1, val); }); -test('chained promise', async (t) => { +test('chained promise', async t => { const res = await retry(async (bail, num) => { if (num < 2) { throw new Error('retry'); @@ -36,7 +36,7 @@ test('chained promise', async (t) => { t.deepEqual(200, res.status); }); -test('bail', async (t) => { +test('bail', async t => { try { await retry( async (bail, num) => { @@ -53,12 +53,12 @@ test('bail', async (t) => { } }); -test('bail + return', async (t) => { +test('bail + return', async t => { let error; try { await Promise.resolve( - retry(async (bail) => { + retry(async bail => { await sleep(200); await sleep(200); bail(new Error('woot')); @@ -71,7 +71,7 @@ test('bail + return', async (t) => { t.deepEqual(error.message, 'woot'); }); -test('bail error', async (t) => { +test('bail error', async t => { let retries = 0; try { @@ -92,7 +92,7 @@ test('bail error', async (t) => { t.deepEqual(retries, 1); }); -test('with non-async functions', async (t) => { +test('with non-async functions', async t => { try { await retry( (bail, num) => { @@ -105,12 +105,12 @@ test('with non-async functions', async (t) => { } }); -test('return non-async', async (t) => { +test('return non-async', async t => { const val = await retry(() => 5); t.deepEqual(5, val); }); -test('with number of retries', async (t) => { +test('with number of retries', async t => { let retries = 0; try { @@ -123,14 +123,14 @@ test('with number of retries', async (t) => { } retries = i; - }, + } }); } catch (err) { t.deepEqual(retries, 2); } }); -test('with retry timeout', async (t) => { +test('with retry timeout', async t => { const retryTimeout = 2000; try { await retry(