import fetch from 'isomorphic-unfetch' import pkg from './package.json' export default class RequestWrapper { private static cache: Array> = [] public static getRequest(url: string) { let req = this.cache.find((req) => req.url === url) as Request|undefined if (!req) { req = new Request(url) this.cache.push(req) } return req } } export class Request { public static ttl = 1000 * 60 * 60 // 1 hour private response?: T private fetched?: Date public constructor( public url: string // url is public for quick url test ) {} public async get(): Promise { const now = new Date() // if reponse was already fetched and TTL was not passed if ( this.fetched && this.response && now.getTime() - this.fetched.getTime() < Request.ttl ) { return this.response } // Fetch Response const resp = await fetch(this.url, { headers: { 'user-agent': `${pkg.name}/${pkg.version}` } }) if (resp.status !== 200) { return undefined } this.response = await resp.json() this.fetched = now return this.response } }