Chore: add cache key to fs cache

This commit is contained in:
SukkaW
2024-08-04 23:13:23 +08:00
parent 32ef8ef7b6
commit f761546a05
7 changed files with 85 additions and 16 deletions

View File

@@ -6,6 +6,8 @@ import { mkdirSync } from 'fs';
import picocolors from 'picocolors';
import { fastStringArrayJoin } from './misc';
import { performance } from 'perf_hooks';
import fs from 'fs';
import { stringHash } from './string-hash';
const identity = (x: any) => x;
@@ -213,3 +215,8 @@ export const serializeSet = (set: Set<string>) => fastStringArrayJoin(Array.from
export const deserializeSet = (str: string) => new Set(str.split(separator));
export const serializeArray = (arr: string[]) => fastStringArrayJoin(arr, separator);
export const deserializeArray = (str: string) => str.split(separator);
export const createCacheKey = (filename: string) => {
const fileHash = stringHash(fs.readFileSync(filename, 'utf-8'));
return (key: string) => key + '$' + fileHash;
};

View File

@@ -1,9 +1,11 @@
import { TTL, deserializeArray, fsFetchCache, serializeArray } from './cache-filesystem';
import { TTL, deserializeArray, fsFetchCache, serializeArray, createCacheKey } from './cache-filesystem';
import { defaultRequestInit, fetchWithRetry } from './fetch-retry';
import { createMemoizedPromise } from './memo-promise';
const cacheKey = createCacheKey(__filename);
export const getPublicSuffixListTextPromise = createMemoizedPromise(() => fsFetchCache.apply(
'https://publicsuffix.org/list/public_suffix_list.dat array',
cacheKey('https://publicsuffix.org/list/public_suffix_list.dat'),
() => fetchWithRetry('https://publicsuffix.org/list/public_suffix_list.dat', defaultRequestInit)
.then(r => r.text()).then(text => text.split('\n')),
{

View File

@@ -7,7 +7,7 @@ import tldts from 'tldts-experimental';
import picocolors from 'picocolors';
import { normalizeDomain } from './normalize-domain';
import { fetchAssets } from './fetch-assets';
import { deserializeArray, fsFetchCache, serializeArray } from './cache-filesystem';
import { deserializeArray, fsFetchCache, serializeArray, createCacheKey } from './cache-filesystem';
import type { Span } from '../trace';
import createKeywordFilter from './aho-corasick';
import { looseTldtsOpt } from '../constants/loose-tldts-opt';
@@ -31,9 +31,11 @@ const domainListLineCb = (l: string, set: string[], includeAllSubDomain: boolean
set.push(includeAllSubDomain ? `.${line}` : line);
};
const cacheKey = createCacheKey(__filename);
export function processDomainLists(span: Span, domainListsUrl: string, mirrors: string[] | null, includeAllSubDomain = false, ttl: number | null = null) {
return span.traceChild(`process domainlist: ${domainListsUrl}`).traceAsyncFn((childSpan) => fsFetchCache.apply(
domainListsUrl,
cacheKey(domainListsUrl),
async () => {
const domainSets: string[] = [];
@@ -88,7 +90,7 @@ const hostsLineCb = (l: string, set: string[], includeAllSubDomain: boolean, met
export function processHosts(span: Span, hostsUrl: string, mirrors: string[] | null, includeAllSubDomain = false, ttl: number | null = null) {
return span.traceChild(`processhosts: ${hostsUrl}`).traceAsyncFn((childSpan) => fsFetchCache.apply(
hostsUrl,
cacheKey(hostsUrl),
async () => {
const domainSets: string[] = [];
@@ -140,7 +142,7 @@ export async function processFilterRules(
black: string[],
warningMessages: string[]
]>>(
filterRulesUrl,
cacheKey(filterRulesUrl),
async () => {
const whitelistDomainSets = new Set<string>();
const blacklistDomainSets = new Set<string>();

48
Build/lib/string-hash.ts Normal file
View File

@@ -0,0 +1,48 @@
/**
* FNV-1a Hash implementation
* @author Travis Webb (tjwebb) <me@traviswebb.com>
*
* Ported from https://github.com/tjwebb/fnv-plus/blob/master/index.js
*
* Simplified, optimized and add modified for 52 bit, which provides a larger hash space
* and still making use of Javascript's 53-bit integer space.
*/
export const fnv1a52 = (str: string) => {
const len = str.length;
let i = 0,
t0 = 0,
v0 = 0x2325,
t1 = 0,
v1 = 0x8422,
t2 = 0,
v2 = 0x9CE4,
t3 = 0,
v3 = 0xCBF2;
while (i < len) {
v0 ^= str.charCodeAt(i++);
t0 = v0 * 435;
t1 = v1 * 435;
t2 = v2 * 435;
t3 = v3 * 435;
t2 += v0 << 8;
t3 += v1 << 8;
t1 += t0 >>> 16;
v0 = t0 & 65535;
t2 += t1 >>> 16;
v1 = t1 & 65535;
v3 = (t3 + (t2 >>> 16)) & 65535;
v2 = t2 & 65535;
}
return (
(v3 & 15) * 281_474_976_710_656
+ v2 * 4_294_967_296
+ v1 * 65536
+ (v0 ^ (v3 >> 4))
);
};
export const stringHash = (payload: string) => {
return fnv1a52(payload).toString(36) + payload.length.toString(36);
};