diff --git a/client/src/retry.rs b/client/src/retry.rs index dd009cb..beced3b 100644 --- a/client/src/retry.rs +++ b/client/src/retry.rs @@ -45,6 +45,7 @@ impl Iterator for ExponentialBackoff { { return None; } + self.retries += 1; let next = Duration::from_secs_f64(self.secs); self.secs *= self.factor; if let Some(max_secs) = self.max_secs { @@ -296,3 +297,28 @@ where ) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn exponential_backoff_stops_after_max_retries() { + let backoff = ExponentialBackoffBuilder { + start_delay: Duration::from_secs(1), + factor: 2., + max_delay: Some(Duration::from_secs(60)), + max_retries: Some(3), + } + .build(); + let delays: Vec<_> = backoff.take(10).collect(); + assert_eq!( + delays, + vec![ + Duration::from_secs(1), + Duration::from_secs(2), + Duration::from_secs(4), + ] + ); + } +} diff --git a/client/src/sleep.rs b/client/src/sleep.rs index b7777bf..4114196 100644 --- a/client/src/sleep.rs +++ b/client/src/sleep.rs @@ -32,10 +32,9 @@ mod wasm_impl { pub fn sleep(duration: Duration) -> Sleep { let millis = duration.as_millis() as i32; let mut cb = |resolve: Function, reject: Function| { - let _ = match global().set_timeout(&resolve, millis) { - Ok(i32) => resolve.call1(&JsValue::NULL, &i32.into()), - Err(err) => reject.call1(&JsValue::NULL, &err), - }; + if let Err(err) = global().set_timeout(&resolve, millis) { + let _ = reject.call1(&JsValue::NULL, &err); + } }; JsFuture::from(Promise::new(&mut cb)).map(throw) }