online-listener
Version:
RXJS Observable based tool to identify when your browser if offline/online
3 lines (2 loc) • 1.14 kB
JavaScript
import{ReplaySubject,interval,from}from"rxjs";import{filter,switchMap}from"rxjs/operators";const onlineSubject$=new ReplaySubject(1),online$=onlineSubject$.asObservable();let urlToHit;onlineSubject$.next(navigator.onLine);function updateOnlineStatus(){navigator&&navigator.onLine!=null&&onlineSubject$.next(navigator.onLine)}window.addEventListener("offline",updateOnlineStatus),window.addEventListener("online",()=>createPoll());function checkIfOnline(){return urlToHit?fetch(urlToHit).catch(a=>(console.warn("polling failed",a),{})):(console.warn("polling url needs to be set"),Promise.resolve({}))}let pollingSubscription;function createPoll(){clearPoll(),pollingSubscription=interval(1e3).pipe(filter(a=>{if(0===a)return!0;return 15>=a?0==a%5:20<=a?0==a%10:void 0}),switchMap(()=>from(checkIfOnline()))).subscribe(a=>{200===a.status&&(onlineSubject$.next(!0),clearPoll())})}function clearPoll(){pollingSubscription&&pollingSubscription.unsubscribe&&pollingSubscription.unsubscribe()}function setPollingUrl(a){urlToHit=a}const onlineListener=online$;export{onlineListener,setPollingUrl};
//# sourceMappingURL=online-listener.esm.js.map