File size: 1,279 Bytes
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
import { env } from '$env/dynamic/private';
import { fetchHfBucketManifest } from './client';
import type { HfBucketManifestResult } from './types';

const DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;

type CacheEntry = {
	result: HfBucketManifestResult;
	expiresAt: number;
};

let cached: CacheEntry | undefined;
let inFlight: Promise<HfBucketManifestResult> | undefined;

function cacheTtlMs() {
	const configured = Number(env.HF_BUCKET_CACHE_TTL_MS);
	return Number.isInteger(configured) && configured > 0 ? configured : DEFAULT_CACHE_TTL_MS;
}

async function refreshManifest() {
	const manifest = await fetchHfBucketManifest();
	const result: HfBucketManifestResult = {
		manifest,
		fetchedAt: new Date().toISOString(),
		source: 'remote'
	};
	cached = { result, expiresAt: Date.now() + cacheTtlMs() };
	return result;
}

export async function getHfBucketManifest(options?: { forceRefresh?: boolean }) {
	if (!options?.forceRefresh && cached && cached.expiresAt > Date.now()) {
		return { ...cached.result, source: 'cache' as const };
	}

	if (!inFlight) {
		inFlight = refreshManifest().finally(() => {
			inFlight = undefined;
		});
	}

	try {
		return await inFlight;
	} catch (error) {
		if (cached) return { ...cached.result, source: 'stale' as const };
		throw error;
	}
}