File size: 1,838 Bytes
c6afb12
 
 
614eca7
c6afb12
 
 
 
a290b8b
c6afb12
 
 
a290b8b
c85bc2e
 
 
 
614eca7
c85bc2e
 
a290b8b
c85bc2e
c6afb12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import type { BucketDataState } from '$lib/types/bucket-state';
import type { RankingDataset } from '$lib/types/ranking-data';
import { adaptBucketRanking } from './adapt-ranking';
import { fetchBucketDetailsSnapshot } from './details-snapshot';
import { emptyRankingDataset } from './fallback-data';
import { toPublicBucketError } from './public-error';
import { fetchBucketRankingSnapshot } from './ranking-snapshot';

let cached: { value: RankingDataset; snapshotId: string } | undefined;
let inFlight: Promise<RankingDataset> | undefined;

async function refreshRanking() {
	const snapshot = await fetchBucketRankingSnapshot({ refreshManifest: true });
	if (cached?.snapshotId === snapshot.manifest.snapshot_id) {
		return cached.value;
	}

	const value = adaptBucketRanking(await fetchBucketDetailsSnapshot(snapshot));
	cached = {
		value,
		snapshotId: snapshot.manifest.snapshot_id
	};
	return value;
}

export async function getHfBucketRanking() {
	const state = await getHfBucketRankingState();
	if (state.status === 'unavailable') throw new Error(state.error.message);
	return state.data;
}

export async function getHfBucketRankingState(): Promise<BucketDataState<RankingDataset>> {
	if (!inFlight) {
		inFlight = refreshRanking().finally(() => {
			inFlight = undefined;
		});
	}

	try {
		return {
			status: 'ok',
			source: 'remote',
			data: await inFlight
		};
	} catch (error) {
		if (cached) {
			console.warn('[hf-bucket] Serving stale Ranking data after refresh failure.', error);
			return {
				status: 'stale',
				source: 'stale',
				data: cached.value,
				error: toPublicBucketError(error)
			};
		}
		console.error('[hf-bucket] Ranking data is unavailable.', error);
		return {
			status: 'unavailable',
			source: 'unavailable',
			data: emptyRankingDataset(),
			error: toPublicBucketError(error)
		};
	}
}