diff --git a/Build/index.ts b/Build/index.ts index ef710882..486027dd 100644 --- a/Build/index.ts +++ b/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); } })(); diff --git a/Build/lib/cache-filesystem.ts b/Build/lib/cache-filesystem.ts index 1b00c554..db93c5af 100644 --- a/Build/lib/cache-filesystem.ts +++ b/Build/lib/cache-filesystem.ts @@ -350,13 +350,15 @@ export class Cache { 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 { 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); + } } } } diff --git a/Build/lib/fetch-text-by-line.ts b/Build/lib/fetch-text-by-line.ts index 3524e9d1..aca73cfa 100644 --- a/Build/lib/fetch-text-by-line.ts +++ b/Build/lib/fetch-text-by-line.ts @@ -22,8 +22,9 @@ export const readFileByLine: ((file: string | FileHandle) => AsyncIterable(resp: T): NonNullable { - if (!resp.body) { +function ensureResponseBody(resp: T): NonNullable { + // 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 AsyncIterable) = (resp) => { +export const createReadlineInterfaceFromResponse: ((resp: NodeFetchResponse | UndiciResponseData) => AsyncIterable) = (resp) => { const stream = ensureResponseBody(resp); const webStream: ReadableStream = 'getReader' in stream diff --git a/Build/lib/parse-dnsmasq.ts b/Build/lib/parse-dnsmasq.ts index cbdcd748..c52fc78e 100644 --- a/Build/lib/parse-dnsmasq.ts +++ b/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 { - const resp = await $fetch(url); - return parseFelixDnsmasqFromResp(resp); -} diff --git a/Build/validate-domestic.ts b/Build/validate-domestic.ts index dcd2adfa..9dc16fc2 100644 --- a/Build/validate-domestic.ts +++ b/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 { + 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')); diff --git a/package.json b/package.json index 6b09b7f8..3cb19182 100644 --- a/package.json +++ b/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" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad48754c..c295fb4a 100644 --- a/pnpm-lock.yaml +++ b/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: