Browse Source

Chore: do not write tar.gz to disk

SukkaW 2 years ago
parent
commit
07b8350048
2 changed files with 41 additions and 24 deletions
  1. 0 1
      Build/build-telegram-cidr.ts
  2. 41 23
      Build/download-previous-build.ts

+ 0 - 1
Build/build-telegram-cidr.ts

@@ -8,7 +8,6 @@ import { createRuleset } from './lib/create-file';
 import { task } from './lib/trace-runner';
 
 export const buildTelegramCIDR = task(__filename, async () => {
-  /** @type {Response} */
   const resp = await fetchWithRetry('https://core.telegram.org/resources/cidr.txt', defaultRequestInit);
   const lastModified = resp.headers.get('last-modified');
   const date = lastModified ? new Date(lastModified) : new Date();

+ 41 - 23
Build/download-previous-build.ts

@@ -51,31 +51,49 @@ export const downloadPreviousBuild = task(__filename, async () => {
 
   await traceAsync(
     'Download and extract previous build',
-    () => Promise.all([
-      fetchWithRetry('https://codeload.github.com/sukkalab/ruleset.skk.moe/tar.gz/master', defaultRequestInit),
-      fsp.mkdir(extractedPath, { recursive: true })
-    ]).then(([resp]) => pipeline(
-      Readable.fromWeb(resp.body!),
-      tar.x({
-        cwd: extractedPath,
-        filter(p) {
-          return filesList.some(f => p.startsWith(f));
-        }
-      })
-    ))
-  );
-
-  await Promise.all(buildOutputList.map(async p => {
-    const src = path.join(extractedPath, 'ruleset.skk.moe-master', p);
-
-    if (fs.existsSync(src)) { // Bun.file().exists() doesn't check directory
-      return fsp.cp(
-        src,
-        path.join(__dirname, '..', p),
-        { force: true, recursive: true }
+    async () => {
+      const [resp] = await Promise.all([
+        fetchWithRetry('https://codeload.github.com/sukkalab/ruleset.skk.moe/tar.gz/master', defaultRequestInit),
+        fsp.mkdir(extractedPath, { recursive: true })
+      ]);
+      await pipeline(
+        Readable.fromWeb(resp.body!),
+        tar.t({
+          filter(p) {
+            return filesList.some(f => p.startsWith(f));
+          },
+          // onentry is async, so we close entry manually after consumed
+          noResume: true,
+          async onentry(entry) {
+            if (entry.type !== 'File') {
+              // not a file, throw away
+              console.log(entry.type, entry.path)
+              entry.resume();
+              return;
+            }
+
+            const relativeEntryPath = entry.path.replace('ruleset.skk.moe-master' + path.sep, '');
+
+            const targetPath = path.join(__dirname, '..', relativeEntryPath);
+            await fsp.mkdir(path.dirname(targetPath), { recursive: true });
+
+            const targetFile = Bun.file(targetPath);
+            const targetFileSink = targetFile.writer();
+
+            await new Promise<void>((resolve, reject) => {
+              entry.on('data', (chunk) => {
+                targetFileSink.write(chunk);
+              });
+              entry.on('end', resolve);
+              entry.on('error', reject);
+            });
+
+            await targetFileSink.end();
+          }
+        })
       );
     }
-  }));
+  );
 });
 
 export const downloadPublicSuffixList = task(__filename, async () => {