Chore: do not write tar.gz to disk

This commit is contained in:
SukkaW 2023-11-23 12:04:04 +08:00
parent 8e4ec2eb05
commit 07b8350048
2 changed files with 39 additions and 22 deletions

View File

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

View File

@ -51,31 +51,49 @@ export const downloadPreviousBuild = task(__filename, async () => {
await traceAsync( await traceAsync(
'Download and extract previous build', 'Download and extract previous build',
() => Promise.all([ async () => {
fetchWithRetry('https://codeload.github.com/sukkalab/ruleset.skk.moe/tar.gz/master', defaultRequestInit), const [resp] = await Promise.all([
fsp.mkdir(extractedPath, { recursive: true }) fetchWithRetry('https://codeload.github.com/sukkalab/ruleset.skk.moe/tar.gz/master', defaultRequestInit),
]).then(([resp]) => pipeline( fsp.mkdir(extractedPath, { recursive: true })
Readable.fromWeb(resp.body!), ]);
tar.x({ await pipeline(
cwd: extractedPath, Readable.fromWeb(resp.body!),
filter(p) { tar.t({
return filesList.some(f => p.startsWith(f)); 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;
}
await Promise.all(buildOutputList.map(async p => { const relativeEntryPath = entry.path.replace('ruleset.skk.moe-master' + path.sep, '');
const src = path.join(extractedPath, 'ruleset.skk.moe-master', p);
if (fs.existsSync(src)) { // Bun.file().exists() doesn't check directory const targetPath = path.join(__dirname, '..', relativeEntryPath);
return fsp.cp( await fsp.mkdir(path.dirname(targetPath), { recursive: true });
src,
path.join(__dirname, '..', p), const targetFile = Bun.file(targetPath);
{ force: true, recursive: true } 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 () => { export const downloadPublicSuffixList = task(__filename, async () => {