import { Observable, of } from 'rxjs'; const cacheAgeLimitInMilliseconds = 1000 * 60 * 60; export function isDataOutdated(name: string): boolean { const lastUpdated: number = +localStorage.getItem(name + '-timestamp'); const now: number = Date.now(); const elapsedTime: number = now - lastUpdated; return elapsedTime > cacheAgeLimitInMilliseconds; } export function storeInCache( data: Observable, name: string ): Observable { data.subscribe({ next: (response: T) => { localStorage.setItem(name, JSON.stringify(response)); localStorage.setItem(name + '-timestamp', `${Date.now()}`); }, }); return data; } export function readFromCache( name: string, callback: () => Observable ): Observable { let data: Observable; if (isDataOutdated(name)) { data = storeInCache(callback(), name); } else { let dataFromCache = localStorage.getItem(name); try { data = of(JSON.parse(dataFromCache)); } catch (err) { console.error( `Could not parse ${JSON.stringify( dataFromCache )}: ${err}. Fetching again data from callback function.` ); data = storeInCache(callback(), name); } } return data; }