feat(housekeeping): integrate studio operations
CI / check (pull_request) Successful in 38s
CI / release (pull_request) Skipped
CI / deploy (pull_request) Skipped

This commit is contained in:
Simo committed 2026-08-30 15:29:58 +02:00
1 parent 020c06f172
commit 2e95a106e0
36 files changed
+2296 -60

No files matched your search

+14 -3
View File
@@ -22,9 +22,11 @@ export async function tryDownloadCandidates(
urls: string[],
destPath: string,
kind: "swf" | "png",
signal?: AbortSignal,
): Promise<boolean> {
for (const url of urls) {
const res = await downloadFile(url, destPath, { validate: kind });
signal?.throwIfAborted();
const res = await downloadFile(url, destPath, { validate: kind, signal });
if (res.ok) return true;
}
return false;
@@ -33,18 +35,26 @@ export async function tryDownloadCandidates(
export async function downloadFile(
url: string,
destPath: string,
options?: { maxRetries?: number; validate?: "swf" | "png" },
options?: {
maxRetries?: number;
validate?: "swf" | "png";
signal?: AbortSignal;
},
): Promise<{ ok: boolean; size: number }> {
const maxRetries = options?.maxRetries ?? 3;
const baseDelay = 1000;
for (let attempt = 0; attempt <= maxRetries; attempt++) {
try {
options?.signal?.throwIfAborted();
if (attempt > 0) {
await new Promise((r) => setTimeout(r, baseDelay * 2 ** (attempt - 1)));
}
const timeout = AbortSignal.timeout(15000);
const res = await fetch(url, {
signal: AbortSignal.timeout(15000),
signal: options?.signal
? AbortSignal.any([options.signal, timeout])
: timeout,
headers: browserHeaders("image", {
Accept: "image/png,image/*,*/*;q=0.8",
}),
@@ -82,6 +92,7 @@ export async function downloadFile(
await fs.writeFile(/*turbopackIgnore: true*/ destPath, buffer);
return { ok: true, size: buffer.length };
} catch (err) {
if (options?.signal?.aborted) throw err;
if (attempt === maxRetries) {
console.warn(
`[import-download] Download error ${url}:`,