A small library which handles decaying constant/linear/exponential backOff
The ConstantBackoff will make the websocket wait a constant time between each connection retry. To use the Constant Backoff with a wait-time of 1 second:
const backoff = new ConstantBackoff(1000) setTimeout(() => { // todo something }, backoff)
The LinearBackoff linearly increases the wait-time between connection-retries until an optional maximum is reached. To use the LinearBackoff to initially wait 0 seconds and increase the wait-time by 2 second with every retry until a maximum of 12 seconds is reached:
const backoff = new LinearBackoff(0, 2000, 12000) setTimeout(() => { // todo something }, backoff)
The ExponentialBackoff doubles the backoff with every retry until a maximum is reached. This is modelled after the binary exponential-backoff algorithm used in computer-networking. To use the ExponentialBackoff that will produce the series [100, 200, 400, 800, 1600, 3200, 6400]:
const backoff = new ExponentialBackoff(100, 7) setTimeout(() => { // todo something }, backoff)
import { LinearBackOff, BaseBackOff } from '@nixjs23n6/backoff-typescript' function* pollPriceSaga(backOff: BaseBackOff) { while (true) { try { const time = backOff.next() if (time === 15000) { backOff.reset() } const result = yield call(FETCH_PRICE) yield put(onFetchPriceSuccess(result)) if (time > 0) yield delay(time) yield delay(time) } catch (err) { yield put(onFetchPriceFailure(err)) } } } function* watchPriceSaga() { while (true) { yield take(coingeckoSlice.onStartFetchPrice) const backOff = new LinearBackOff(0, 10000, 15000) yield race({ task: call(pollPriceSaga, backOff), cancel: take(coingeckoSlice.onStopFetchPrice) }) } }