Skip to content

Commit 89202fb

Browse files
committed
move retry logic to manager
1 parent f4f6021 commit 89202fb

File tree

2 files changed

+12
-32
lines changed

2 files changed

+12
-32
lines changed

src/get/manager/DownloadManger.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,13 @@ export class DownloadManger {
5151
}
5252

5353
async assignWorkToWorker (worker: DownloadWorker, workerIndex: number): Promise<void> {
54+
let currentRetry = 0
55+
5456
while (true) {
5557
if (this.rangeProvider.done) {
5658
return
5759
}
5860

59-
if (!worker.working) {
60-
this.requestConfig.logger.warning(
61-
`Worker ${workerIndex} is not working.`
62-
)
63-
throw new Error('Worker is not working')
64-
}
65-
6661
const { range, rangeIndex, signal: rangeSignal } = this.rangeProvider.getRange()
6762
try {
6863
const workController = new AbortController()
@@ -98,6 +93,16 @@ export class DownloadManger {
9893
this.requestConfig.logger.error(
9994
`Worker ${workerIndex} failed to fetch range ${rangeIndex}: ${(e as DOMException).message}.`
10095
)
96+
currentRetry += 1
97+
if (currentRetry > this.requestConfig.maxRetries) {
98+
this.requestConfig.logger.error(
99+
`Worker ${workerIndex} failed to fetch range ${rangeIndex} after ${currentRetry} retries.`
100+
)
101+
throw new Error(`Worker ${workerIndex} failed to fetch range after retries ${currentRetry}`)
102+
}
103+
104+
// sleep for retryDelay
105+
await new Promise((resolve) => setTimeout(resolve, this.requestConfig.retryDelay))
101106
}
102107

103108
this.rangeProvider.removeDownloader(rangeIndex)

src/get/worker/DownloadWorker.ts

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,12 @@ export class DownloadWorker {
55
readonly input: FetchInput
66
readonly requestConfig: GETRequestConfig
77

8-
private errorPromise = Promise.resolve()
9-
private currentRetry = 0
10-
118
constructor (input: FetchInput, requestConfig: GETRequestConfig) {
129
this.input = input
1310
this.requestConfig = requestConfig
1411
}
1512

1613
async download (range: Range, signal: AbortSignal): Promise<Blob> {
17-
await this.errorPromise
1814
const [start, end] = range
1915

2016
const controller = new AbortController()
@@ -32,14 +28,12 @@ export class DownloadWorker {
3228
})
3329
if (!response.ok) {
3430
controller.abort()
35-
this.error()
3631
throw new Error(`Failed to download at range ${range[0]}-${range[1]}`)
3732
}
3833

3934
const blob = await response.blob()
4035

4136
if (blob.size !== end - start + 1) {
42-
this.error()
4337
throw new Error(
4438
`Failed to download at range ${range[0]}-${range[1]}, size mismatch`
4539
)
@@ -48,26 +42,7 @@ export class DownloadWorker {
4842
return blob
4943
}
5044

51-
private error (): void {
52-
this.currentRetry++
53-
this.errorPromise = new Promise((resolve) =>
54-
setTimeout(resolve, this.retryDelay)
55-
)
56-
}
57-
58-
get working (): boolean {
59-
return this.currentRetry < this.maxRetries
60-
}
61-
6245
get init (): GETInit {
6346
return this.requestConfig.init
6447
}
65-
66-
get maxRetries (): number {
67-
return this.requestConfig.maxRetries
68-
}
69-
70-
get retryDelay (): number {
71-
return this.requestConfig.retryDelay
72-
}
7348
}

0 commit comments

Comments
 (0)