瀏覽代碼

Perf: speed up public folder setup / remove unused mkdir call

SukkaW 2 年之前
父節點
當前提交
38be4ab0c6

+ 1 - 4
Build/build-internal-cdn-rules.ts

@@ -1,4 +1,3 @@
-import fsp from 'fs/promises';
 import path from 'path';
 import * as tldts from 'tldts';
 import { processLine } from './lib/process-line';
@@ -67,9 +66,7 @@ export const buildInternalCDNDomains = task(import.meta.path, async () => {
     processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/stream.conf')),
     processLocalRuleSet(path.resolve(import.meta.dir, '../List/non_ip/telegram.conf')),
     processLocalDomainSet(path.resolve(import.meta.dir, '../List/domainset/cdn.conf')),
-    processLocalDomainSet(path.resolve(import.meta.dir, '../List/domainset/download.conf')),
-
-    fsp.mkdir(path.resolve(import.meta.dir, '../List/internal'), { recursive: true })
+    processLocalDomainSet(path.resolve(import.meta.dir, '../List/domainset/download.conf'))
   ]))[0];
 
   return compareAndWriteFile(

+ 1 - 5
Build/build-internal-reverse-chn-cidr.ts

@@ -1,7 +1,6 @@
 import { fetchRemoteTextAndReadByLine } from './lib/fetch-text-by-line';
 import { processLineFromReadline } from './lib/process-line';
 import path from 'path';
-import fsp from 'fs/promises';
 import { task } from './lib/trace-runner';
 
 import { exclude, merge } from 'fast-cidr-tools';
@@ -27,10 +26,7 @@ const RESERVED_IPV4_CIDR = [
 ];
 
 export const buildInternalReverseChnCIDR = task(import.meta.path, async () => {
-  const cidr = (await Promise.all([
-    processLineFromReadline(await fetchRemoteTextAndReadByLine('https://raw.githubusercontent.com/misakaio/chnroutes2/master/chnroutes.txt')),
-    fsp.mkdir(path.resolve(import.meta.dir, '../List/internal'), { recursive: true })
-  ]))[0];
+  const cidr = await processLineFromReadline(await fetchRemoteTextAndReadByLine('https://raw.githubusercontent.com/misakaio/chnroutes2/master/chnroutes.txt'));
 
   const reversedCidr = merge(
     exclude(

+ 20 - 14
Build/build-public.ts

@@ -1,31 +1,37 @@
 import path from 'path';
-import fsp from 'fs/promises';
 import { task } from './lib/trace-runner';
 import { treeDir } from './lib/tree-dir';
 import type { TreeType, TreeTypeArray } from './lib/tree-dir';
+import listDir from '@sukka/listdir';
 
 const rootPath = path.resolve(import.meta.dir, '../');
 const publicPath = path.resolve(import.meta.dir, '../public');
 
 const folderAndFilesToBeDeployed = [
-  'Mock',
-  'List',
-  'Clash',
-  'Modules',
-  'Script',
+  `Mock${path.sep}`,
+  `List${path.sep}`,
+  `Clash${path.sep}`,
+  `Modules${path.sep}`,
+  `Script${path.sep}`,
   'LICENSE'
 ];
 
 export const buildPublic = task(import.meta.path, async () => {
-  await fsp.mkdir(publicPath, { recursive: true });
-  await Promise.all(folderAndFilesToBeDeployed.map(dir => fsp.cp(
-    path.resolve(rootPath, dir),
-    path.resolve(publicPath, dir),
-    { force: true, recursive: true }
-  )));
+  const filesToBeCopied = (await listDir(
+    rootPath, {
+      ignoreHidden: true,
+      ignorePattern: /node_modules|Build|public/
+    }
+  )).filter(file => folderAndFilesToBeDeployed.some(folderOrFile => file.startsWith(folderOrFile)));
 
-  const html = generateHtml(await treeDir(publicPath));
+  await Promise.all(filesToBeCopied.map(file => {
+    const src = path.resolve(rootPath, file);
+    const dest = path.resolve(publicPath, file);
 
+    return Bun.write(dest, Bun.file(src));
+  }));
+
+  const html = generateHtml(await treeDir(publicPath));
   return Bun.write(path.join(publicPath, 'index.html'), html);
 });
 
@@ -99,7 +105,7 @@ function generateHtml(tree: TreeTypeArray) {
     <p>
       Made by <a href="https://skk.moe">Sukka</a> | <a href="https://github.com/SukkaW/Surge/">Source @ GitHub</a> | Licensed under <a href="/LICENSE" target="_blank">AGPL-3.0</a>
     </p>
-    <p>Last Build: 2023-12-03T16:54:15.820Z</p>
+    <p>Last Build: ${new Date().toISOString()}</p>
     <br>`;
 
   html += '<ul class="directory-list">';

+ 0 - 2
Build/build-sspanel-appprofile.ts

@@ -101,8 +101,6 @@ export const buildSSPanelUIMAppProfile = task(import.meta.path, async () => {
     ]
   );
 
-  await fsp.mkdir(path.resolve(import.meta.dir, '../List/internal'), { recursive: true });
-
   await compareAndWriteFile(
     output,
     path.resolve(import.meta.dir, '../List/internal/appprofile.php')

+ 9 - 13
Build/download-previous-build.ts

@@ -47,19 +47,20 @@ export const downloadPreviousBuild = task(import.meta.path, async () => {
     return;
   }
 
-  const extractedPath = path.join(os.tmpdir(), `sukka-surge-last-build-extracted-${Date.now()}`);
   const filesList = buildOutputList.map(f => path.join('ruleset.skk.moe-master', f));
 
   await traceAsync(
     'Download and extract previous build',
     async () => {
-      const resp = (await Promise.all([
-        fetchWithRetry('https://codeload.github.com/sukkalab/ruleset.skk.moe/tar.gz/master', defaultRequestInit),
-        fsp.mkdir(extractedPath, { recursive: true })
-      ]))[0];
+      const resp = await fetchWithRetry('https://codeload.github.com/sukkalab/ruleset.skk.moe/tar.gz/master', defaultRequestInit);
+
+      if (!resp.body) {
+        throw new Error('Download previous build failed! No body found');
+      }
 
       const extract = tarStream.extract();
-      Readable.fromWeb(resp.body!).pipe(zlib.createGunzip()).pipe(extract);
+      Readable.fromWeb(resp.body).pipe(zlib.createGunzip()).pipe(extract);
+
       for await (const entry of extract) {
         if (entry.header.type !== 'file') {
           entry.resume(); // Drain the entry
@@ -85,13 +86,8 @@ export const downloadPreviousBuild = task(import.meta.path, async () => {
 });
 
 export const downloadPublicSuffixList = task(import.meta.path, async () => {
-  const publicSuffixDir = path.resolve(import.meta.dir, '../node_modules/.cache');
-  const publicSuffixPath = path.join(publicSuffixDir, 'public_suffix_list_dat.txt');
-
-  const resp = (await Promise.all([
-    fetchWithRetry('https://publicsuffix.org/list/public_suffix_list.dat', defaultRequestInit),
-    fsp.mkdir(publicSuffixDir, { recursive: true })
-  ]))[0];
+  const publicSuffixPath = path.resolve(import.meta.dir, '../node_modules/.cache/public_suffix_list_dat.txt');
+  const resp = await fetchWithRetry('https://publicsuffix.org/list/public_suffix_list.dat', defaultRequestInit);
 
   return Bun.write(publicSuffixPath, resp as Response);
 }, 'download-publicsuffixlist');