Browse Source

Fix corrupt local cache

SukkaW 1 year ago
parent
commit
8a0a50d049

+ 1 - 1
Build/index.ts

@@ -125,8 +125,8 @@ process.on('unhandledRejection', (reason) => {
     wtf.dump();
     process.exit(0);
   } catch (e) {
-    console.trace(e);
     console.error('Something went wrong!');
+    console.trace(e);
     process.exit(1);
   }
 })();

+ 24 - 14
Build/lib/cache-filesystem.ts

@@ -350,13 +350,15 @@ export class Cache<S = string> {
         this.set(getETagKey(url), serverETag, TTL.ONE_WEEK_STATIC);
       }
       // If we do not have a cached value, we ignore 304
-      if (res.statusCode === 304 && typeof previouslyCached === 'string') {
-        controller.abort();
-        throw new Custom304NotModifiedError(url, previouslyCached);
+      if (res.statusCode === 304 && typeof previouslyCached === 'string' && previouslyCached.length > 1) {
+        const err = new Custom304NotModifiedError(url, previouslyCached);
+        controller.abort(err);
+        throw err;
       }
       if (!serverETag && !this.get(getETagKey(primaryUrl)) && typeof previouslyCached === 'string') {
-        controller.abort();
-        throw new CustomNoETagFallbackError(previouslyCached);
+        const err = new CustomNoETagFallbackError(previouslyCached);
+        controller.abort(err);
+        throw err;
       }
 
       // either no etag and not cached
@@ -386,18 +388,26 @@ export class Cache<S = string> {
 
       return value;
     } catch (e) {
-      if (e instanceof AggregateError) {
+      if (e && typeof e === 'object' && 'errors' in e && Array.isArray(e.errors)) {
         const deserializer = 'deserializer' in opt ? opt.deserializer : identity as any;
 
-        for (const error of e.errors) {
-          if (error instanceof Custom304NotModifiedError) {
-            console.log(picocolors.green('[cache] http 304'), picocolors.gray(primaryUrl));
-            this.updateTtl(cachedKey, TTL.ONE_WEEK_STATIC);
-            return deserializer(error.data);
+        console.log(e.errors);
+
+        for (let i = 0, len = e.errors.length; i < len; i++) {
+          const error = e.errors[i];
+          if ('name' in error && (error.name === 'CustomAbortError' || error.name === 'AbortError')) {
+            continue;
           }
-          if (error instanceof CustomNoETagFallbackError) {
-            console.log(picocolors.green('[cache] hit'), picocolors.gray(primaryUrl));
-            return deserializer(error.data);
+          if ('digest' in error) {
+            if (error.digest === 'Custom304NotModifiedError') {
+              console.log(picocolors.green('[cache] http 304'), picocolors.gray(primaryUrl));
+              this.updateTtl(cachedKey, TTL.ONE_WEEK_STATIC);
+              return deserializer(error.data);
+            }
+            if (error.digest === 'CustomNoETagFallbackError') {
+              console.log(picocolors.green('[cache] hit'), picocolors.gray(primaryUrl));
+              return deserializer(error.data);
+            }
           }
         }
       }

+ 4 - 3
Build/lib/fetch-text-by-line.ts

@@ -22,8 +22,9 @@ export const readFileByLine: ((file: string | FileHandle) => AsyncIterable<strin
   .pipeThrough(new TextDecoderStream())
   .pipeThrough(new TextLineStream());
 
-function ensureResponseBody<T extends Response | NodeFetchResponse | UndiciResponseData>(resp: T): NonNullable<T['body']> {
-  if (!resp.body) {
+function ensureResponseBody<T extends NodeFetchResponse | UndiciResponseData>(resp: T): NonNullable<T['body']> {
+  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- NodeFetchResponse['body'] is nullable
+  if (resp.body == null) {
     throw new Error('Failed to fetch remote text');
   }
   if ('bodyUsed' in resp && resp.bodyUsed) {
@@ -32,7 +33,7 @@ function ensureResponseBody<T extends Response | NodeFetchResponse | UndiciRespo
   return resp.body;
 }
 
-export const createReadlineInterfaceFromResponse: ((resp: Response | NodeFetchResponse | UndiciResponseData) => AsyncIterable<string>) = (resp) => {
+export const createReadlineInterfaceFromResponse: ((resp: NodeFetchResponse | UndiciResponseData) => AsyncIterable<string>) = (resp) => {
   const stream = ensureResponseBody(resp);
 
   const webStream: ReadableStream<Uint8Array> = 'getReader' in stream

+ 0 - 6
Build/lib/parse-dnsmasq.ts

@@ -1,6 +1,5 @@
 import { createReadlineInterfaceFromResponse } from './fetch-text-by-line';
 import { parse as tldtsParse } from 'tldts';
-import { $fetch } from './make-fetch-happen';
 import type { NodeFetchResponse } from './make-fetch-happen';
 import type { UndiciResponseData } from './fetch-retry';
 
@@ -28,8 +27,3 @@ export async function parseFelixDnsmasqFromResp(resp: NodeFetchResponse | Undici
 
   return results;
 }
-
-export async function parseFelixDnsmasq(url: string): Promise<string[]> {
-  const resp = await $fetch(url);
-  return parseFelixDnsmasqFromResp(resp);
-}

+ 6 - 1
Build/validate-domestic.ts

@@ -3,9 +3,14 @@ import { parse } from 'csv-parse/sync';
 import { createTrie } from './lib/trie';
 import path from 'node:path';
 import { processLine } from './lib/process-line';
-import { parseFelixDnsmasq } from './lib/parse-dnsmasq';
 import { SOURCE_DIR } from './constants/dir';
 import { $fetch } from './lib/make-fetch-happen';
+import { parseFelixDnsmasqFromResp } from './lib/parse-dnsmasq';
+
+async function parseFelixDnsmasq(url: string): Promise<string[]> {
+  const resp = await $fetch(url);
+  return parseFelixDnsmasqFromResp(resp);
+}
 
 export async function parseDomesticList() {
   const trie = createTrie(await parseFelixDnsmasq('https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf'));

+ 1 - 1
package.json

@@ -41,7 +41,7 @@
     "tar-fs": "^3.0.6",
     "tldts": "^6.1.51",
     "tldts-experimental": "^6.1.51",
-    "undici": "7.0.0-alpha.2",
+    "undici": "6.20.1",
     "wtfnode": "^0.9.3",
     "yaml": "^2.5.1"
   },

+ 5 - 5
pnpm-lock.yaml

@@ -75,8 +75,8 @@ importers:
         specifier: ^6.1.51
         version: 6.1.51
       undici:
-        specifier: 7.0.0-alpha.2
-        version: 7.0.0-alpha.2
+        specifier: 6.20.1
+        version: 6.20.1
       wtfnode:
         specifier: ^0.9.3
         version: 0.9.3
@@ -1771,8 +1771,8 @@ packages:
   undici-types@6.19.8:
     resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
 
-  undici@7.0.0-alpha.2:
-    resolution: {integrity: sha512-4Xn6pwsp6U8F9U7qdDhDwcHPvjcfwt3gbswRg30xgmkQ4Bpfbi6J1OrjTe8WIUVecbcGWOZMPAt6crf0PLliUw==}
+  undici@6.20.1:
+    resolution: {integrity: sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==}
     engines: {node: '>=18.17'}
 
   unique-filename@4.0.0:
@@ -3613,7 +3613,7 @@ snapshots:
 
   undici-types@6.19.8: {}
 
-  undici@7.0.0-alpha.2: {}
+  undici@6.20.1: {}
 
   unique-filename@4.0.0:
     dependencies: