Browse Source

Perf: run a few task during downloading previous dist

SukkaW 1 year ago
parent
commit
a86308b69f

+ 7 - 4
Build/build-cdn-download-conf.ts

@@ -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')),
-    readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/download.conf')),
-    readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/game-download.conf'))
+    cdnDomainsListPromise,
+    downloadDomainSetPromise,
+    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

+ 13 - 11
Build/build-common.ts

@@ -18,20 +18,22 @@ 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 promises: Array<Promise<unknown>> = [];
+const clawSourceDirPromise = new Fdir()
+  .withRelativePaths()
+  .filter((filepath, isDirectory) => {
+    if (isDirectory) return true;
+
+    const extname = path.extname(filepath);
 
 
-  const paths = await new Fdir()
-    .withRelativePaths()
-    .filter((filepath, isDirectory) => {
-      if (isDirectory) return true;
+    return !(extname === '.js' || extname === '.ts');
+  })
+  .crawl(SOURCE_DIR)
+  .withPromise();
 
 
-      const extname = path.extname(filepath);
+export const buildCommon = task(require.main === module, __filename)(async (span) => {
+  const promises: Array<Promise<unknown>> = [];
 
 
-      return !(extname === '.js' || extname === '.ts');
-    })
-    .crawl(SOURCE_DIR)
-    .withPromise();
+  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];

+ 3 - 1
Build/build-reject-domainset.ts

@@ -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 () =>
         /**
         /**

+ 3 - 1
Build/build-sspanel-appprofile.ts

@@ -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')),

+ 33 - 17
Build/download-mock-assets.ts

@@ -14,20 +14,36 @@ 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(
-  ([filename, url]) => span
-    .traceChildAsync(url, async () => {
-      const res = await $fetch(url);
-      if (!res.body) {
-        throw new Error(`Empty body from ${url}`);
-      }
-
-      await mkdirp(OUTPUT_MOCK_DIR);
-      const src = path.join(OUTPUT_MOCK_DIR, filename);
-
-      return pipeline(
-        res.body,
-        fs.createWriteStream(src, 'utf-8')
-      );
-    })
-)));
+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
+      .traceChildAsync(url, async () => {
+        const res = await $fetch(url);
+        if (!res.ok) {
+          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;
+        }
+
+        const src = path.join(OUTPUT_MOCK_DIR, filename);
+
+        return pipeline(
+          res.body,
+          fs.createWriteStream(src, 'utf-8')
+        );
+      })
+  ));
+});

+ 3 - 4
Build/download-previous-build.ts

@@ -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(publicDir)) {
+  if (fs.existsSync(PUBLIC_DIR)) {
     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) {

+ 19 - 44
Build/index.ts

@@ -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,
-      buildAppleCdnPromise,
-      buildCdnConfPromise,
-      buildRejectDomainSetPromise,
-      buildTelegramCIDRPromise,
-      buildChnCidrPromise,
-      buildSpeedtestDomainSetPromise,
-      buildInternalReverseChnCIDRPromise,
-      buildInternalReverseChnCIDRPromise,
-      // buildInternalChnDomainsPromise,
-      buildDomesticRulesetPromise,
-      buildRedirectModulePromise,
-      buildAlwaysRealIPModulePromise,
-      buildStreamServicePromise,
-      buildMicrosoftCdnPromise,
-      buildSSPanelUIMAppProfilePromise,
-      buildCloudMounterRulesPromise,
-      downloadMockAssetsPromise
+      downloadPreviousBuildPromise.then(() => buildRejectIPList(rootSpan)),
+      downloadPreviousBuildPromise.then(() => buildAppleCdn(rootSpan)),
+      downloadPreviousBuildPromise.then(() => buildCdnDownloadConf(rootSpan)),
+      downloadPreviousBuildPromise.then(() => buildRejectDomainSet(rootSpan)),
+      downloadPreviousBuildPromise.then(() => buildTelegramCIDR(rootSpan)),
+      downloadPreviousBuildPromise.then(() => buildChnCidr(rootSpan)),
+      downloadPreviousBuildPromise.then(() => buildSpeedtestDomainSet(rootSpan)),
+      buildInternalReverseChnCIDR(rootSpan),
+      downloadPreviousBuildPromise.then(() => buildDomesticRuleset(rootSpan)),
+      downloadPreviousBuildPromise.then(() => buildRedirectModule(rootSpan)),
+      downloadPreviousBuildPromise.then(() => buildAlwaysRealIPModule(rootSpan)),
+      downloadPreviousBuildPromise.then(() => buildStreamService(rootSpan)),
+      downloadPreviousBuildPromise.then(() => buildMicrosoftCdn(rootSpan)),
+      Promise.all([
+        downloadPreviousBuildPromise,
+        buildCommonPromise
+      ]).then(() => buildSSPanelUIMAppProfile(rootSpan)),
+      downloadPreviousBuildPromise.then(() => buildCloudMounterRules(rootSpan)),
+      downloadMockAssets(rootSpan)
     ]);
     ]);
 
 
     await Promise.all([
     await Promise.all([

+ 0 - 2
Build/lib/get-phishing-domains.ts

@@ -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)