mirror of
https://github.com/SukkaW/Surge.git
synced 2025-12-13 01:30:37 +08:00
68 lines
2.1 KiB
TypeScript
68 lines
2.1 KiB
TypeScript
import path from 'node:path';
|
|
import { isCI } from 'ci-info';
|
|
|
|
import picocolors from 'picocolors';
|
|
import { Cache } from './cache-filesystem';
|
|
import { createMemoize } from 'foxts/serialized-memo';
|
|
import type { MemoizeStorageProvider } from 'foxts/serialized-memo';
|
|
|
|
const fsMemoCache = new Cache({ cachePath: path.resolve(__dirname, '../../.cache'), tableName: 'fs_memo_cache' });
|
|
|
|
const fsMemoCacheProvider: MemoizeStorageProvider = {
|
|
has(key) {
|
|
return fsMemoCache.get(key) !== null;
|
|
},
|
|
delete() {
|
|
// noop
|
|
},
|
|
get(key) {
|
|
return fsMemoCache.get(key) ?? undefined;
|
|
},
|
|
set(key, value, ttl) {
|
|
fsMemoCache.set(key, value, ttl);
|
|
},
|
|
updateTtl(key, ttl) {
|
|
fsMemoCache.updateTtl(key, ttl);
|
|
}
|
|
};
|
|
|
|
const TTL = isCI
|
|
// We run CI daily, so 1.5 days TTL is enough to persist the cache across runs
|
|
? 1.5 * 86400 * 1000
|
|
// We run locally less frequently, so we need to persist the cache for longer, 7 days
|
|
: 7 * 86400 * 1000;
|
|
|
|
export const cache = createMemoize(fsMemoCacheProvider, {
|
|
defaultTtl: TTL,
|
|
onCacheMiss(key, { humanReadableName, isUseCachedIfFail }) {
|
|
const cacheName = picocolors.gray(humanReadableName);
|
|
if (isUseCachedIfFail) {
|
|
console.log(picocolors.red('[fail] and no cache, throwing'), cacheName);
|
|
} else {
|
|
console.log(picocolors.yellow('[cache] miss'), cacheName);
|
|
}
|
|
},
|
|
onCacheUpdate(key, { humanReadableName, isUseCachedIfFail }) {
|
|
const cacheName = picocolors.gray(humanReadableName);
|
|
if (isUseCachedIfFail) {
|
|
console.log(picocolors.gray('[cache] update'), cacheName);
|
|
}
|
|
},
|
|
onCacheHit(key, { humanReadableName, isUseCachedIfFail }) {
|
|
const cacheName = picocolors.gray(humanReadableName);
|
|
if (isUseCachedIfFail) {
|
|
console.log(picocolors.yellow('[fail] try cache'), cacheName);
|
|
} else {
|
|
console.log(picocolors.green('[cache] hit'), cacheName);
|
|
}
|
|
}
|
|
});
|
|
|
|
export const cachedOnlyFail = createMemoize(fsMemoCacheProvider, {
|
|
defaultTtl: TTL,
|
|
onlyUseCachedIfFail: true
|
|
});
|
|
|
|
// export const cache = createCache(false);
|
|
// export const cachedOnlyFail = createCache(true);
|