redux-saga-network-status
Version:
Network status detection with server ping and backoff for redux-saga
95 lines (77 loc) • 3.15 kB
Markdown
Network status detection with server ping and backoff for [redux-saga][].
Monitors network status using a combination of [NavigatorOnLine.onLine](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine), [Online and offline events](https://developer.mozilla.org/en/docs/Online_and_offline_events), and pinging a server (with an HTTP GET request). Server pings are retried using a fibonacci [backoff interval](https://en.wikipedia.org/wiki/Exponential_backoff) with a randomization factor to prevent network congestion.
```shell
npm install redux-saga-network-status
```
redux-saga-network-status exports its saga by default. Start it as part of your root saga, e.g.
```js
// sagas.js
import watchNetworkStatus from 'redux-saga-network-status';
export default function* rootSaga() {
yield fork(watchNetworkStatus);
// ... more sagas
}
```
And connect the reducer to your root reducer:
```js
// reducers.js
import { combineReducers } from 'redux';
import { reducer as network } from 'redux-saga-network-status';
export default combineReducers({
network,
// ... more reducers
});
```
```js
// main.js
import { createStore, applyMiddleware } from 'redux';
import createSagaMiddleware from 'redux-saga';
import reducer from './reducers';
import rootSaga from './sagas';
const sagaMiddleware = createSagaMiddleware();
const store = createStore(
reducer,
applyMiddleware(sagaMiddleware),
);
sagaMiddleware.run(rootSaga);
```
Then dispatch the `startWatchNetworkStatus` action to begin monitoring network status using the provided ping URL:
```jsx
import { actions as networkActions } from 'redux-saga-network-status';
class AppContainer extends Component {
componentWillMount() {
const { startWatchNetworkStatus } = this.props;
startWatchNetworkStatus('/api/ping');
}
render() { /* ... */ }
}
export default connect(null, {
startWatchNetworkStatus: networkActions.startWatchNetworkStatus,
})(AppContainer);
```
The `network` reducer we connected above will provide the following state in your store:
```js
// True when we have been online at least once
state.network.hasBeenOnline;
// Whether we have pinged the server at least once
state.network.hasDetectedNetworkStatus;
// Whether the browser is connected to a network
state.network.isNavigatorOnline;
// Whether the server is reachable over the network
state.network.isOnline;
// Whether we are currently pinging the server
state.network.isPinging;
// Number of milliseconds until the next ping attempt
state.network.msUntilNextPing;
// The most recent ping error
state.network.pingError;
```
[]: https://circleci.com/gh/EventMobi/redux-saga-network-status
[]: https://circleci.com/gh/EventMobi/redux-saga-network-status.svg?style=svg&circle-token=d193707e16cb7e5184e89a552f27008850bccc3d
[]: https://img.shields.io/npm/v/redux-saga-network-status.svg
[]: https://www.npmjs.com/package/redux-saga-network-status
[]: http://yelouafi.github.io/redux-saga/