alvarocastro/backoff

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# Backoff

[![NPM](https://img.shields.io/npm/v/@alvarocastro/backoff)](https://www.npmjs.com/package/@alvarocastro/backoff)
[![Build status](https://img.shields.io/github/workflow/status/alvarocastro/backoff/build)](https://github.com/alvarocastro/backoff/actions?query=workflow%3Abuild)
[![Maintainability status](https://img.shields.io/codeclimate/maintainability/alvarocastro/backoff)](https://codeclimate.com/github/alvarocastro/backoff/maintainability)
[![Coverage status](https://img.shields.io/coveralls/github/alvarocastro/backoff)](https://coveralls.io/github/alvarocastro/backoff?branch=master)
[![Bundle size](https://img.shields.io/bundlephobia/min/@alvarocastro/backoff)](https://bundlephobia.com/result?p=@alvarocastro/backoff)
[![Code style: XO](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo)
[![Release: Semantic](https://img.shields.io/badge/%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)

A simple implementation of a backoff utility.

- [Install](#install)
- [Usage](#usage)
- [Contributing](#contributing)
- [Support](#support)

## Install

```bash
npm install @alvarocastro/backoff
```

## Usage

```js
const Backoff = require('@alvarocastro/backoff');
const backoff = new Backoff();

const connect = function () {
    console.log('Connecting...');
    const rand = Math.random();

    if (rand < 0.2) {
        console.log('Success!');
        backoff.reset();
        return true;
    }
    
    const delay = backoff.duration();
    console.log(`Failed. Retrying in ${delay}ms`);
    setTimeout(function () {
        connect();
    }, delay);
};

connect();
```

### Backoff(options = {min: 1000, max: 60000, factor: 2, jitter: 0})

Receives an optional `options` object.

#### options.min

Type: `Number`<br>
Default: 1000

Minimum duration.

#### options.max

Type: `Number`<br>
Default: 6000

Maximum duration.

#### options.factor

Type: `Number`<br>
Default: 2

Factor in which the duration increases each time.

#### options.jitter

Type: `Number`<br>
Default: 0

Randomizes the duration. For example with a value of `0.5` the initial default duration will be between 500 and 1500.
The randomization when used in a reconnection helps smooth the load induced by the reconnection attempts of multiple clients, in case a server goes down.
Use `0` for no randomization.

### duration()

Returns the next time to wait in milliseconds.

### reset()

Resets the internal attempts count, bringing the next `duration()` time back to the starting value.

## Contributing

Contributions are always welcome! Please run `npm test` beforehand to ensure everything is ok.

## Support

If you use this package please consider starring it :)