(packageName: string, startIso: string, endIso: string)
| 216 | } |
| 217 | |
| 218 | async function fetchDailyRangeCached(packageName: string, startIso: string, endIso: string) { |
| 219 | const cache = npmDailyRangeCache |
| 220 | |
| 221 | if (!cache) { |
| 222 | const response = await fetchNpmDownloadsRange(packageName, startIso, endIso) |
| 223 | return [...response.downloads] |
| 224 | .sort((a, b) => a.day.localeCompare(b.day)) |
| 225 | .map(d => ({ day: d.day, value: d.downloads })) |
| 226 | } |
| 227 | |
| 228 | const cacheKey = `${packageName}:${startIso}:${endIso}` |
| 229 | const cachedPromise = cache.get(cacheKey) |
| 230 | if (cachedPromise) return cachedPromise |
| 231 | |
| 232 | const promise = fetchNpmDownloadsRange(packageName, startIso, endIso) |
| 233 | .then(response => |
| 234 | [...response.downloads] |
| 235 | .sort((a, b) => a.day.localeCompare(b.day)) |
| 236 | .map(d => ({ day: d.day, value: d.downloads })), |
| 237 | ) |
| 238 | .catch(error => { |
| 239 | cache.delete(cacheKey) |
| 240 | throw error |
| 241 | }) |
| 242 | |
| 243 | cache.set(cacheKey, promise) |
| 244 | return promise |
| 245 | } |
| 246 | |
| 247 | /** |
| 248 | * API limit workaround: |
no test coverage detected