Chore: revert stream back to asyncgenerator

This commit is contained in:
SukkaW 2023-12-04 00:54:52 +08:00
parent 17d69a975a
commit da7c6764c5
5 changed files with 82 additions and 15 deletions

View File

@ -9,7 +9,7 @@ import { buildTelegramCIDR } from './build-telegram-cidr';
import { buildChnCidr } from './build-chn-cidr'; import { buildChnCidr } from './build-chn-cidr';
import { buildSpeedtestDomainSet } from './build-speedtest-domainset'; import { buildSpeedtestDomainSet } from './build-speedtest-domainset';
import { buildInternalCDNDomains } from './build-internal-cdn-rules'; import { buildInternalCDNDomains } from './build-internal-cdn-rules';
import { buildInternalChnDomains } from './build-internal-chn-domains'; // import { buildInternalChnDomains } from './build-internal-chn-domains';
import { buildDomesticRuleset } from './build-domestic-ruleset'; import { buildDomesticRuleset } from './build-domestic-ruleset';
import { buildStreamService } from './build-stream-service'; import { buildStreamService } from './build-stream-service';
import { buildRedirectModule } from './build-redirect-module'; import { buildRedirectModule } from './build-redirect-module';
@ -64,7 +64,7 @@ import { buildPublicHtml } from './build-public';
// buildInternalReverseChnCIDRWorker.postMessage('build'); // buildInternalReverseChnCIDRWorker.postMessage('build');
// }); // });
const buildInternalChnDomainsPromise = buildInternalChnDomains(); // const buildInternalChnDomainsPromise = buildInternalChnDomains();
const buildDomesticRulesetPromise = downloadPreviousBuildPromise.then(() => buildDomesticRuleset()); const buildDomesticRulesetPromise = downloadPreviousBuildPromise.then(() => buildDomesticRuleset());
const buildRedirectModulePromise = downloadPreviousBuildPromise.then(() => buildRedirectModule()); const buildRedirectModulePromise = downloadPreviousBuildPromise.then(() => buildRedirectModule());
@ -84,7 +84,7 @@ import { buildPublicHtml } from './build-public';
buildSpeedtestDomainSetPromise, buildSpeedtestDomainSetPromise,
buildInternalCDNDomainsPromise, buildInternalCDNDomainsPromise,
// buildInternalReverseChnCIDRPromise, // buildInternalReverseChnCIDRPromise,
buildInternalChnDomainsPromise, // buildInternalChnDomainsPromise,
buildDomesticRulesetPromise, buildDomesticRulesetPromise,
buildRedirectModulePromise, buildRedirectModulePromise,
buildStreamServicePromise buildStreamServicePromise

View File

@ -48,13 +48,25 @@ export async function compareAndWriteFile(linesA: string[], filePath: string) {
return; return;
} }
const writer = file.writer(); console.log(`Writing ${filePath}...`);
for (let i = 0; i < linesALen; i++) { const start = Bun.nanoseconds();
writer.write(`${linesA[i]}\n`);
if (linesALen < 10000) {
await Bun.write(file, `${linesA.join('\n')}\n`);
} else {
const writer = file.writer();
for (let i = 0; i < linesALen; i++) {
writer.write(linesA[i]);
writer.write('\n');
}
writer.flush();
await writer.end();
} }
return writer.end(); console.log(`Done writing ${filePath} in ${(Bun.nanoseconds() - start) / 1e6}ms`);
} }
export const withBannerArray = (title: string, description: string[], date: Date, content: string[]) => { export const withBannerArray = (title: string, description: string[], date: Date, content: string[]) => {

View File

@ -1,16 +1,54 @@
import type { BunFile } from 'bun'; import type { BunFile } from 'bun';
import { fetchWithRetry, defaultRequestInit } from './fetch-retry'; import { fetchWithRetry, defaultRequestInit } from './fetch-retry';
import { TextLineStream } from './text-line-transform-stream'; // import { TextLineStream } from './text-line-transform-stream';
import { PolyfillTextDecoderStream } from './text-decoder-stream'; // import { PolyfillTextDecoderStream } from './text-decoder-stream';
export function readFileByLine(file: string | BunFile) { // export function readFileByLine(file: string | BunFile) {
// if (typeof file === 'string') {
// file = Bun.file(file);
// }
// return file.stream().pipeThrough(new PolyfillTextDecoderStream()).pipeThrough(new TextLineStream());
// }
// export function createReadlineInterfaceFromResponse(resp: Response) {
// if (!resp.body) {
// throw new Error('Failed to fetch remote text');
// }
// if (resp.bodyUsed) {
// throw new Error('Body has already been consumed.');
// }
// return (resp.body as ReadableStream<Uint8Array>).pipeThrough(new PolyfillTextDecoderStream()).pipeThrough(new TextLineStream());
// }
const decoder = new TextDecoder('utf-8');
export async function *readFileByLine(file: string | BunFile): AsyncGenerator<string> {
if (typeof file === 'string') { if (typeof file === 'string') {
file = Bun.file(file); file = Bun.file(file);
} }
return file.stream().pipeThrough(new PolyfillTextDecoderStream()).pipeThrough(new TextLineStream());
let buf = '';
for await (const chunk of file.stream()) {
const chunkStr = decoder.decode(chunk).replaceAll('\r\n', '\n');
for (let i = 0, len = chunkStr.length; i < len; i++) {
const char = chunkStr[i];
if (char === '\n') {
yield buf;
buf = '';
} else {
buf += char;
}
}
}
if (buf) {
yield buf;
}
} }
export function createReadlineInterfaceFromResponse(resp: Response) { export async function *createReadlineInterfaceFromResponse(resp: Response): AsyncGenerator<string> {
if (!resp.body) { if (!resp.body) {
throw new Error('Failed to fetch remote text'); throw new Error('Failed to fetch remote text');
} }
@ -18,9 +56,26 @@ export function createReadlineInterfaceFromResponse(resp: Response) {
throw new Error('Body has already been consumed.'); throw new Error('Body has already been consumed.');
} }
return (resp.body as ReadableStream<Uint8Array>).pipeThrough(new PolyfillTextDecoderStream()).pipeThrough(new TextLineStream()); let buf = '';
for await (const chunk of resp.body) {
const chunkStr = decoder.decode(chunk).replaceAll('\r\n', '\n');
for (let i = 0, len = chunkStr.length; i < len; i++) {
const char = chunkStr[i];
if (char === '\n') {
yield buf;
buf = '';
} else {
buf += char;
}
}
}
if (buf) {
yield buf;
}
} }
export function fetchRemoteTextAndCreateReadlineInterface(url: string | URL) { export function fetchRemoteTextAndCreateReadlineInterface(url: string | URL) {
return fetchWithRetry(url, defaultRequestInit).then(res => createReadlineInterfaceFromResponse(res)); return fetchWithRetry(url, defaultRequestInit).then(res => createReadlineInterfaceFromResponse(res as Response));
} }

BIN
bun.lockb

Binary file not shown.

View File

@ -15,7 +15,7 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@cliqz/adblocker": "^1.26.12", "@cliqz/adblocker": "^1.26.12",
"@sukka/listdir": "^0.2.0", "@sukka/listdir": "^0.3.1",
"async-retry": "^1.3.3", "async-retry": "^1.3.3",
"async-sema": "^3.1.1", "async-sema": "^3.1.1",
"ci-info": "^4.0.0", "ci-info": "^4.0.0",