diff --git a/Build/build-internal-reverse-chn-cidr.ts b/Build/build-internal-reverse-chn-cidr.ts index d288bdba..190c4c68 100644 --- a/Build/build-internal-reverse-chn-cidr.ts +++ b/Build/build-internal-reverse-chn-cidr.ts @@ -5,6 +5,8 @@ import { exclude, merge } from 'fast-cidr-tools'; import { getChnCidrPromise } from './build-chn-cidr'; import { NON_CN_CIDR_INCLUDED_IN_CHNROUTE, RESERVED_IPV4_CIDR } from './constants/cidr'; +import fsp from 'fs/promises'; + export const buildInternalReverseChnCIDR = task(import.meta.main, import.meta.path)(async () => { const cidr = await getChnCidrPromise(); @@ -19,5 +21,9 @@ export const buildInternalReverseChnCIDR = task(import.meta.main, import.meta.pa ) ); - return Bun.write(path.resolve(import.meta.dir, '../Internal/reversed-chn-cidr.txt'), `${reversedCidr.join('\n')}\n`); + return fsp.writeFile( + path.resolve(import.meta.dir, '../Internal/reversed-chn-cidr.txt'), + reversedCidr.join('\n') + '\n', + { encoding: 'utf-8' } + ); }); diff --git a/Build/build-public.ts b/Build/build-public.ts index 2d53cf4a..10d44f84 100644 --- a/Build/build-public.ts +++ b/Build/build-public.ts @@ -1,4 +1,5 @@ import path from 'path'; +import fsp from 'fs/promises'; import { task } from './trace'; import { treeDir } from './lib/tree-dir'; import type { TreeType, TreeTypeArray } from './lib/tree-dir'; @@ -41,7 +42,7 @@ export const buildPublic = task(import.meta.main, import.meta.path)(async (span) const src = path.join(rootPath, file); const dest = path.join(publicPath, file); - return Bun.write(dest, Bun.file(src)); + return fsp.copyFile(src, dest); })); }); @@ -49,7 +50,7 @@ export const buildPublic = task(import.meta.main, import.meta.path)(async (span) .traceChild('generate index.html') .traceAsyncFn(() => treeDir(publicPath).then(generateHtml)); - return Bun.write(path.join(publicPath, 'index.html'), html); + return fsp.writeFile(path.join(publicPath, 'index.html'), html); }); const priorityOrder: Record<'default' | string & {}, number> = { diff --git a/Build/build-sgmodule-always-realip.ts b/Build/build-sgmodule-always-realip.ts index 8482867f..333e7ef3 100644 --- a/Build/build-sgmodule-always-realip.ts +++ b/Build/build-sgmodule-always-realip.ts @@ -1,4 +1,5 @@ import path from 'path'; +import fsp from 'fs/promises'; import { task } from './trace'; import { compareAndWriteFile } from './lib/create-file'; import { DIRECTS, LANS } from '../Source/non_ip/direct'; @@ -60,7 +61,7 @@ export const buildAlwaysRealIPModule = task(import.meta.main, import.meta.path)( ], path.resolve(import.meta.dir, '../Modules/sukka_common_always_realip.sgmodule') ), - Bun.write( + fsp.writeFile( path.resolve(import.meta.dir, '../Internal/clash_fake_ip_filter.yaml'), yaml.stringify( { diff --git a/Build/download-mock-assets.ts b/Build/download-mock-assets.ts index c3c803ca..6a729d1f 100644 --- a/Build/download-mock-assets.ts +++ b/Build/download-mock-assets.ts @@ -1,5 +1,8 @@ import { task } from './trace'; import path from 'path'; +import fs from 'fs'; +import { Readable } from 'stream'; +import { pipeline } from 'stream/promises'; import { fetchWithRetry } from './lib/fetch-retry'; const ASSETS_LIST = { @@ -15,5 +18,16 @@ const mockDir = path.resolve(import.meta.dir, '../Mock'); export const downloadMockAssets = task(import.meta.main, import.meta.path)((span) => Promise.all(Object.entries(ASSETS_LIST).map( ([filename, url]) => span .traceChild(url) - .traceAsyncFn(() => fetchWithRetry(url).then(res => Bun.write(path.join(mockDir, filename), res))) + .traceAsyncFn(() => fetchWithRetry(url).then(res => { + const src = path.join(mockDir, filename); + if (!res.body) { + throw new Error(`Empty body from ${url}`); + } + + const writeStream = fs.createWriteStream(src, { encoding: 'utf-8' }); + return pipeline( + Readable.fromWeb(res.body), + writeStream + ); + })) ))); diff --git a/Build/lib/create-file.ts b/Build/lib/create-file.ts index 07f32cbe..0262b641 100644 --- a/Build/lib/create-file.ts +++ b/Build/lib/create-file.ts @@ -4,6 +4,8 @@ import { surgeDomainsetToClashDomainset, surgeRulesetToClashClassicalTextRuleset import picocolors from 'picocolors'; import type { Span } from '../trace'; import path from 'path'; +import fs from 'fs'; +import fsp from 'fs/promises'; import { sort } from './timsort'; import { fastStringArrayJoin } from './misc'; @@ -13,7 +15,7 @@ export async function compareAndWriteFile(span: Span, linesA: string[], filePath const linesALen = linesA.length; - if (!(await file.exists())) { + if (!fs.existsSync(filePath)) { console.log(`${filePath} does not exists, writing...`); isEqual = false; } else if (linesALen === 0) { @@ -70,7 +72,7 @@ export async function compareAndWriteFile(span: Span, linesA: string[], filePath await span.traceChildAsync(`writing ${filePath}`, async () => { // if (linesALen < 10000) { - return Bun.write(file, fastStringArrayJoin(linesA, '\n') + '\n'); + return fsp.writeFile(filePath, fastStringArrayJoin(linesA, '\n') + '\n'); // } // const writer = file.writer(); diff --git a/Build/trim-source.ts b/Build/trim-source.ts index ea23f697..58d48a93 100644 --- a/Build/trim-source.ts +++ b/Build/trim-source.ts @@ -1,4 +1,5 @@ import path from 'path'; +import fsp from 'fs/promises'; import { fdir as Fdir } from 'fdir'; import { readFileByLine } from './lib/fetch-text-by-line'; @@ -43,5 +44,5 @@ async function trimFileLines(file: string) { result += line.trim() + '\n'; } - return Bun.write(file, result); + return fsp.writeFile(file, result); }