11const test = require ( 'ava' )
2- const {
3- createLinear,
4- createExponential,
5- createRetrierFn,
6- } = require ( '../src/retrier' )
2+ const { createRetrierFn } = require ( '../src/retrier' )
73
84test ( 'createRetrierFn - retries async errors with delay' , async function ( t ) {
9- const sleep = x => new Promise ( r => setTimeout ( r , x ) )
5+ const sleep = ms => new Promise ( r => setTimeout ( r , ms ) )
106
117 /**
128 * Given 'i', create function that will return a promise
@@ -22,146 +18,40 @@ test('createRetrierFn - retries async errors with delay', async function (t) {
2218 i --
2319 throw new Error ( i )
2420 }
25- return true
26- }
27- }
28-
29- // Will retry three times.
30- const succeeder = createRetrierFn ( createFailer ( 2 ) , ( ) => 15 , 3 )
31- t . true ( typeof succeeder === 'function' )
32-
33- const start = new Date ( ) . getTime ( )
34- const success = await succeeder ( )
35- t . true ( success )
36- t . true ( new Date ( ) . getTime ( ) - start >= 30 )
3721
38- const failer = createRetrierFn ( createFailer ( 4 ) , 2 )
39- t . true ( typeof succeeder === 'function' )
40-
41- let failure
42- try {
43- failure = await failer ( )
44- } catch ( { message } ) {
45- failure = + message // Coerce.
22+ return i
23+ }
4624 }
4725
48- t . true ( failure === 2 )
49- } )
50-
51- test ( 'createRetrierFn - retries sync errors' , async function ( t ) {
52- const responses = [
53- new Error ( 'fail' ) ,
54- true ,
55- ]
26+ // NOTE: This serves as an example of a curve function.
27+ const createCurve = function ( limit , ms ) {
28+ const curve = function ( err , count ) {
29+ if ( count > limit ) throw err
30+ return ms
31+ }
5632
57- function failOnce ( ) {
58- const response = responses . shift ( )
59- if ( response instanceof Error ) throw response
60- return response
33+ return curve
6134 }
6235
63- const fn = createRetrierFn ( failOnce , 2 )
64- t . true ( await fn ( ) )
65- } )
66-
67- test ( 'createRetrierFn - allows opt out of retries' , async function ( t ) {
68- const shouldRetry = ( ) => false
69- const responses = [
70- new Error ( 'fail' ) ,
71- true ,
72- ]
36+ const succeeder = createRetrierFn ( createFailer ( 2 ) , createCurve ( 3 , 200 ) )
37+ t . true ( typeof succeeder === 'function' )
7338
74- function failOnce ( ) {
75- const response = responses . shift ( )
76- if ( response instanceof Error ) throw response
77- return response
78- }
39+ const ts = new Date ( ) . getTime ( )
7940
80- const fn = createRetrierFn ( failOnce , 2 , undefined , shouldRetry )
81- try {
82- await fn ( )
83- t . fail ( )
84- } catch ( error ) {
85- t . pass ( )
86- }
87- } )
41+ const success = await succeeder ( )
42+ t . true ( success === 0 )
43+ t . true ( ( new Date ( ) . getTime ( ) - ts ) >= 400 )
8844
89- test ( 'createRetrierFn - allows indefinite retries' , async function ( t ) {
90- const responses = [
91- new Error ( 'fail' ) ,
92- new Error ( 'fail' ) ,
93- new Error ( 'fail' ) ,
94- new Error ( 'fail' ) ,
95- true ,
96- ]
45+ const failer = createRetrierFn ( createFailer ( 5 ) , createCurve ( 2 , 200 ) )
46+ t . true ( typeof failer === 'function' )
9747
98- function failMany ( ) {
99- const response = responses . shift ( )
100- if ( response instanceof Error ) throw response
101- return response
102- }
48+ let value
10349
104- const fn = createRetrierFn ( failMany , 0 , 0 )
10550 try {
106- await fn ( )
107- t . pass ( )
108- } catch ( error ) {
109- t . fail ( )
110- }
111- } )
112-
113- test ( 'createRetrierFn - supports curves' , async function ( t ) {
114- const sleep = x => new Promise ( r => setTimeout ( r , x ) )
115-
116- const cache = [ ]
117- const createFn = function ( ) {
118- let failed = false
119-
120- const fn = async function ( value ) {
121- await sleep ( 100 )
122- cache . push ( value )
123-
124- if ( ! failed ) {
125- failed = true
126- throw new Error ( '' )
127- }
128-
129- return value
130- }
131-
132- return fn
133- }
134-
135- let f = createFn ( )
136- let fn = createRetrierFn ( f , 2 )
137-
138- t . true ( await fn ( 'x' ) === 'x' )
139- t . true ( cache . length === 2 )
140-
141- cache . length = 0
142- f = createFn ( )
143- fn = createRetrierFn ( f , x => x , 2 )
144-
145- t . true ( await fn ( 'x' ) === 'x' )
146- t . true ( cache . length === 2 )
147- } )
148-
149- test ( 'createRetrierFn - and inbuilt curves' , async function ( t ) {
150- const range = function * ( len ) {
151- let count = 0
152- while ( count < len ) {
153- yield count
154- count ++
155- }
51+ await failer ( )
52+ } catch ( { message } ) {
53+ value = + message // Coerce.
15654 }
15755
158- let fx = createLinear ( { m : 2 , b : 0 } )
159- t . deepEqual ( [ ...range ( 4 ) ] . map ( fx ) , [ 0 , 2 , 4 , 6 ] )
160-
161- fx = createExponential ( { a : 2 , b : 1 } , 1 )
162- t . deepEqual ( [ ...range ( 6 ) ] . map ( fx ) , [ 1 , 2 , 4 , 8 , 16 , 32 ] )
163-
164- fx = createExponential ( { a : 2 , b : 1 } , 1000 )
165- t . deepEqual ( [ ...range ( 6 ) ] . map ( fx ) , [ 1000 , 2000 , 4000 , 8000 , 16000 , 32000 ] )
56+ t . true ( value === 2 )
16657} )
167-
0 commit comments