Perf: run a few task during downloading previous dist

This commit is contained in:
SukkaW 2025-01-04 04:01:47 +08:00
parent 16ecf378a6
commit a86308b69f
8 changed files with 79 additions and 82 deletions

View File

@ -48,18 +48,21 @@ const getS3OSSDomainsPromise = (async (): Promise<Set<string>> => {
return S3OSSDomains; return S3OSSDomains;
})(); })();
const cdnDomainsListPromise = readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/cdn.conf'));
const downloadDomainSetPromise = readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/download.conf'));
const steamDomainSetPromise = readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/game-download.conf'));
export const buildCdnDownloadConf = task(require.main === module, __filename)(async (span) => { export const buildCdnDownloadConf = task(require.main === module, __filename)(async (span) => {
const [ const [
S3OSSDomains, S3OSSDomains,
cdnDomainsList, cdnDomainsList,
downloadDomainSet, downloadDomainSet,
steamDomainSet steamDomainSet
] = await Promise.all([ ] = await Promise.all([
getS3OSSDomainsPromise, getS3OSSDomainsPromise,
readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/cdn.conf')), cdnDomainsListPromise,
readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/download.conf')), downloadDomainSetPromise,
readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/game-download.conf')) steamDomainSetPromise
]); ]);
// Move S3 domains to download domain set, since S3 files may be large // Move S3 domains to download domain set, since S3 files may be large

View File

@ -18,10 +18,7 @@ const MAGIC_COMMAND_SGMODULE_MITM_HOSTNAMES = '# $ sgmodule_mitm_hostnames ';
const domainsetSrcFolder = 'domainset' + path.sep; const domainsetSrcFolder = 'domainset' + path.sep;
export const buildCommon = task(require.main === module, __filename)(async (span) => { const clawSourceDirPromise = new Fdir()
const promises: Array<Promise<unknown>> = [];
const paths = await new Fdir()
.withRelativePaths() .withRelativePaths()
.filter((filepath, isDirectory) => { .filter((filepath, isDirectory) => {
if (isDirectory) return true; if (isDirectory) return true;
@ -33,6 +30,11 @@ export const buildCommon = task(require.main === module, __filename)(async (span
.crawl(SOURCE_DIR) .crawl(SOURCE_DIR)
.withPromise(); .withPromise();
export const buildCommon = task(require.main === module, __filename)(async (span) => {
const promises: Array<Promise<unknown>> = [];
const paths = await clawSourceDirPromise;
for (let i = 0, len = paths.length; i < len; i++) { for (let i = 0, len = paths.length; i < len; i++) {
const relativePath = paths[i]; const relativePath = paths[i];
const fullPath = SOURCE_DIR + path.sep + relativePath; const fullPath = SOURCE_DIR + path.sep + relativePath;

View File

@ -19,6 +19,8 @@ import { appendArrayInPlace } from './lib/append-array-in-place';
import { OUTPUT_INTERNAL_DIR, SOURCE_DIR } from './constants/dir'; import { OUTPUT_INTERNAL_DIR, SOURCE_DIR } from './constants/dir';
import { DomainsetOutput } from './lib/create-file'; import { DomainsetOutput } from './lib/create-file';
const readLocalNonIpRejectRulesetPromise = readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/reject_sukka.conf'));
export const buildRejectDomainSet = task(require.main === module, __filename)(async (span) => { export const buildRejectDomainSet = task(require.main === module, __filename)(async (span) => {
const rejectBaseDescription = [ const rejectBaseDescription = [
...SHARED_DESCRIPTION, ...SHARED_DESCRIPTION,
@ -98,7 +100,7 @@ export const buildRejectDomainSet = task(require.main === module, __filename)(as
addArrayElementsToSet(filterRuleWhitelistDomainSets, black); addArrayElementsToSet(filterRuleWhitelistDomainSets, black);
})), })),
getPhishingDomains(childSpan).then(appendArrayToRejectExtraOutput), getPhishingDomains(childSpan).then(appendArrayToRejectExtraOutput),
readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/reject_sukka.conf')).then(appendArrayToRejectOutput), readLocalNonIpRejectRulesetPromise.then(appendArrayToRejectOutput),
// Dedupe domainSets // Dedupe domainSets
// span.traceChildAsync('collect black keywords/suffixes', async () => // span.traceChildAsync('collect black keywords/suffixes', async () =>
/** /**

View File

@ -23,6 +23,8 @@ const POLICY_GROUPS: Array<[name: string, insertProxy: boolean, insertDirect: bo
['Final Match', true, true] ['Final Match', true, true]
]; ];
const steamDomainsPromise = readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/game-download.conf'));
/** /**
* This only generates a simplified version, for under-used users only. * This only generates a simplified version, for under-used users only.
*/ */
@ -56,7 +58,7 @@ export const buildSSPanelUIMAppProfile = task(require.main === module, __filenam
// stream - domains // stream - domains
AllStreamServices.flatMap((i) => i.rules), AllStreamServices.flatMap((i) => i.rules),
// steam - domains // steam - domains
readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/game-download.conf')), steamDomainsPromise,
// global - domains // global - domains
readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/global.conf')), readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/global.conf')),
readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/telegram.conf')), readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/telegram.conf')),

View File

@ -14,15 +14,30 @@ const ASSETS_LIST = {
'amazon-adsystem-com_amazon-apstag.js': 'https://unpkg.com/@adguard/scriptlets@latest/dist/redirect-files/amazon-apstag.js' 'amazon-adsystem-com_amazon-apstag.js': 'https://unpkg.com/@adguard/scriptlets@latest/dist/redirect-files/amazon-apstag.js'
} as const; } as const;
export const downloadMockAssets = task(require.main === module, __filename)((span) => Promise.all(Object.entries(ASSETS_LIST).map( export const downloadMockAssets = task(require.main === module, __filename)(async (span) => {
const p = mkdirp(OUTPUT_MOCK_DIR);
if (p) {
await p;
}
return Promise.all(Object.entries(ASSETS_LIST).map(
([filename, url]) => span ([filename, url]) => span
.traceChildAsync(url, async () => { .traceChildAsync(url, async () => {
const res = await $fetch(url); const res = await $fetch(url);
if (!res.body) { if (!res.ok) {
throw new Error(`Empty body from ${url}`); console.error(`Failed to download ${url}`);
// we can safely skip this since we can always use previous version
return;
}
if (!res.body) {
console.error(`Empty body from ${url}`);
// we can safely skip this since we can always use previous version
return;
} }
await mkdirp(OUTPUT_MOCK_DIR);
const src = path.join(OUTPUT_MOCK_DIR, filename); const src = path.join(OUTPUT_MOCK_DIR, filename);
return pipeline( return pipeline(
@ -30,4 +45,5 @@ export const downloadMockAssets = task(require.main === module, __filename)((spa
fs.createWriteStream(src, 'utf-8') fs.createWriteStream(src, 'utf-8')
); );
}) })
))); ));
});

View File

@ -7,14 +7,13 @@ import type { Headers as TarEntryHeaders } from 'tar-fs';
import zlib from 'node:zlib'; import zlib from 'node:zlib';
import undici from 'undici'; import undici from 'undici';
import picocolors from 'picocolors'; import picocolors from 'picocolors';
import { PUBLIC_DIR } from './constants/dir';
const GITHUB_CODELOAD_URL = 'https://codeload.github.com/sukkalab/ruleset.skk.moe/tar.gz/master'; const GITHUB_CODELOAD_URL = 'https://codeload.github.com/sukkalab/ruleset.skk.moe/tar.gz/master';
const GITLAB_CODELOAD_URL = 'https://gitlab.com/SukkaW/ruleset.skk.moe/-/archive/master/ruleset.skk.moe-master.tar.gz'; const GITLAB_CODELOAD_URL = 'https://gitlab.com/SukkaW/ruleset.skk.moe/-/archive/master/ruleset.skk.moe-master.tar.gz';
export const downloadPreviousBuild = task(require.main === module, __filename)(async (span) => { export const downloadPreviousBuild = task(require.main === module, __filename)(async (span) => {
const publicDir = path.resolve(__dirname, '..', 'public'); if (fs.existsSync(PUBLIC_DIR)) {
if (fs.existsSync(publicDir)) {
console.log(picocolors.blue('Public directory exists, skip downloading previous build')); console.log(picocolors.blue('Public directory exists, skip downloading previous build'));
return; return;
} }
@ -61,7 +60,7 @@ export const downloadPreviousBuild = task(require.main === module, __filename)(a
const gunzip = zlib.createGunzip(); const gunzip = zlib.createGunzip();
const extract = tarExtract( const extract = tarExtract(
publicDir, PUBLIC_DIR,
{ {
ignore(_: string, header?: TarEntryHeaders) { ignore(_: string, header?: TarEntryHeaders) {
if (header) { if (header) {

View File

@ -62,55 +62,30 @@ process.on('unhandledRejection', (reason) => {
try { try {
const downloadPreviousBuildPromise = downloadPreviousBuild(rootSpan); const downloadPreviousBuildPromise = downloadPreviousBuild(rootSpan);
const buildCommonPromise = downloadPreviousBuildPromise.then(() => buildCommon(rootSpan)); const buildCommonPromise = downloadPreviousBuildPromise.then(() => buildCommon(rootSpan));
const buildRejectIPListPromise = downloadPreviousBuildPromise.then(() => buildRejectIPList(rootSpan));
const buildAppleCdnPromise = downloadPreviousBuildPromise.then(() => buildAppleCdn(rootSpan));
const buildCdnConfPromise = downloadPreviousBuildPromise.then(() => buildCdnDownloadConf(rootSpan));
const buildRejectDomainSetPromise = downloadPreviousBuildPromise.then(() => buildRejectDomainSet(rootSpan));
const buildTelegramCIDRPromise = downloadPreviousBuildPromise.then(() => buildTelegramCIDR(rootSpan));
const buildChnCidrPromise = downloadPreviousBuildPromise.then(() => buildChnCidr(rootSpan));
const buildSpeedtestDomainSetPromise = downloadPreviousBuildPromise.then(() => buildSpeedtestDomainSet(rootSpan));
const buildInternalReverseChnCIDRPromise = buildInternalReverseChnCIDR(rootSpan);
// const buildInternalChnDomainsPromise = buildInternalChnDomains();
const buildDomesticRulesetPromise = downloadPreviousBuildPromise.then(() => buildDomesticRuleset(rootSpan));
const buildRedirectModulePromise = downloadPreviousBuildPromise.then(() => buildRedirectModule(rootSpan));
const buildAlwaysRealIPModulePromise = downloadPreviousBuildPromise.then(() => buildAlwaysRealIPModule(rootSpan));
const buildStreamServicePromise = downloadPreviousBuildPromise.then(() => buildStreamService(rootSpan));
const buildMicrosoftCdnPromise = downloadPreviousBuildPromise.then(() => buildMicrosoftCdn(rootSpan));
const buildSSPanelUIMAppProfilePromise = downloadPreviousBuildPromise.then(() => buildSSPanelUIMAppProfile(rootSpan));
const downloadMockAssetsPromise = downloadMockAssets(rootSpan);
const buildCloudMounterRulesPromise = downloadPreviousBuildPromise.then(() => buildCloudMounterRules(rootSpan));
await Promise.all([ await Promise.all([
downloadPreviousBuildPromise, downloadPreviousBuildPromise,
buildCommonPromise, buildCommonPromise,
buildRejectIPListPromise, downloadPreviousBuildPromise.then(() => buildRejectIPList(rootSpan)),
buildAppleCdnPromise, downloadPreviousBuildPromise.then(() => buildAppleCdn(rootSpan)),
buildCdnConfPromise, downloadPreviousBuildPromise.then(() => buildCdnDownloadConf(rootSpan)),
buildRejectDomainSetPromise, downloadPreviousBuildPromise.then(() => buildRejectDomainSet(rootSpan)),
buildTelegramCIDRPromise, downloadPreviousBuildPromise.then(() => buildTelegramCIDR(rootSpan)),
buildChnCidrPromise, downloadPreviousBuildPromise.then(() => buildChnCidr(rootSpan)),
buildSpeedtestDomainSetPromise, downloadPreviousBuildPromise.then(() => buildSpeedtestDomainSet(rootSpan)),
buildInternalReverseChnCIDRPromise, buildInternalReverseChnCIDR(rootSpan),
buildInternalReverseChnCIDRPromise, downloadPreviousBuildPromise.then(() => buildDomesticRuleset(rootSpan)),
// buildInternalChnDomainsPromise, downloadPreviousBuildPromise.then(() => buildRedirectModule(rootSpan)),
buildDomesticRulesetPromise, downloadPreviousBuildPromise.then(() => buildAlwaysRealIPModule(rootSpan)),
buildRedirectModulePromise, downloadPreviousBuildPromise.then(() => buildStreamService(rootSpan)),
buildAlwaysRealIPModulePromise, downloadPreviousBuildPromise.then(() => buildMicrosoftCdn(rootSpan)),
buildStreamServicePromise, Promise.all([
buildMicrosoftCdnPromise, downloadPreviousBuildPromise,
buildSSPanelUIMAppProfilePromise, buildCommonPromise
buildCloudMounterRulesPromise, ]).then(() => buildSSPanelUIMAppProfile(rootSpan)),
downloadMockAssetsPromise downloadPreviousBuildPromise.then(() => buildCloudMounterRules(rootSpan)),
downloadMockAssets(rootSpan)
]); ]);
await Promise.all([ await Promise.all([

View File

@ -219,8 +219,6 @@ export function getPhishingDomains(parentSpan: Span) {
return domainArr; return domainArr;
}); });
console.log({ len: domainArr.length });
return span.traceChildAsync( return span.traceChildAsync(
'process phishing domain set', 'process phishing domain set',
() => processPhihsingDomains(domainArr) () => processPhihsingDomains(domainArr)