From 181c5cb4a4b1ea232fde46756685a31937935504 Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 8 Dec 2024 12:50:23 +0800 Subject: [PATCH] ui: add download retry --- packages/hydrooj/src/service/storage.ts | 2 +- packages/ui-default/components/zipDownloader/index.ts | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/hydrooj/src/service/storage.ts b/packages/hydrooj/src/service/storage.ts index f11126622..f825d868b 100644 --- a/packages/hydrooj/src/service/storage.ts +++ b/packages/hydrooj/src/service/storage.ts @@ -210,7 +210,7 @@ class RemoteStorageService { ResponseContentDisposition: filename ? `attachment; filename="${encodeRFC5987ValueChars(filename)}"` : '', }), { // aliyun s3 will reject download if expires >= 7 days - expiresIn: noExpire ? 24 * 60 * 60 * 7 - 1 : 10 * 60, + expiresIn: noExpire ? 24 * 60 * 60 * 7 - 1 : 30 * 60, }); // using something like /fs/ if (useAlternativeEndpointFor && this.replaceWithAlternativeUrlFor[useAlternativeEndpointFor]) { diff --git a/packages/ui-default/components/zipDownloader/index.ts b/packages/ui-default/components/zipDownloader/index.ts index daab9a7d8..b06549776 100644 --- a/packages/ui-default/components/zipDownloader/index.ts +++ b/packages/ui-default/components/zipDownloader/index.ts @@ -1,3 +1,4 @@ +import { sleep } from '@hydrooj/utils/lib/common'; import { dump } from 'js-yaml'; import PQueue from 'p-queue'; import streamsaver from 'streamsaver'; @@ -31,7 +32,7 @@ export default async function download(filename, targets) { const abortCallbackReceiver: any = {}; function stopDownload() { abortCallbackReceiver.abort?.(); } let i = 0; - async function downloadFile(target) { + async function downloadFile(target, retry = 5) { try { let stream; if (target.url) { @@ -46,6 +47,11 @@ export default async function download(filename, targets) { stream, }; } catch (e) { + if (retry) { + Notification.warn(i18n('Download Error: {0} {1}, retry in 3 secs...', [target.filename, e.toString()])); + await sleep(3000); + return await downloadFile(target, retry - 1); + } window.captureException?.(e); stopDownload(); Notification.error(i18n('Download Error: {0} {1}', [target.filename, e.toString()]));