Skip to content

Commit fa232b9

Browse files
committed
add selectRangeStrategy
1 parent 12a50c0 commit fa232b9

File tree

6 files changed

+38
-26
lines changed

6 files changed

+38
-26
lines changed

src/get/manager/DownloadManger.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export class DownloadManger {
2424
requestConfig.logger.info(`Workers Count: ${this.workers.length}`)
2525

2626
const contentLength = getContentLength(metadata.headers)
27-
this.rangeProvider = new RangeProvider(contentLength, this.requestConfig.segmentStrategy)
27+
this.rangeProvider = new RangeProvider(contentLength, this.requestConfig.segmentStrategy, this.requestConfig.selectRangeStrategy)
2828
requestConfig.logger.info(`Content length: ${contentLength}`)
2929

3030
this.streamer = new DownloadStreamer(this.rangeProvider.maxRangeIndex, requestConfig?.init?.signal)

src/get/range/selectRangeStrategy.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { RangeIndex } from './types'
2-
import { getMapMinOrZero } from './utils'
32

43
const threshold = 10
54

@@ -15,3 +14,24 @@ export function defaultSelectRangeStrategy (
1514

1615
return minRangeIndex
1716
}
17+
18+
function getMapMinOrZero<T> (map: Map<T, number>): T {
19+
let minKey: T | undefined
20+
let minVal: number | undefined
21+
for (const [key, val] of map) {
22+
if (val === 0) {
23+
return key
24+
}
25+
26+
if (minVal === undefined || val < minVal) {
27+
minKey = key
28+
minVal = val
29+
}
30+
}
31+
32+
if (minKey === undefined) {
33+
throw new Error('Map is empty')
34+
}
35+
36+
return minKey
37+
}

src/get/range/utils.ts

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/get/request/RequestConfig.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,14 @@ export class GETRequestConfig {
3939
}
4040

4141
get chunkCallback (): ChunkCallback {
42-
return this.fastFetchConfig?.chunkCallback ?? (() => undefined)
42+
return this.fastFetchConfig?.chunkCallback ?? defaultConfig.chunkCallback
4343
}
4444

45-
get segmentStrategy (): ((contentLength: number) => Array<[number, number]>) | undefined {
46-
return this.fastFetchConfig?.segmentStrategy
45+
get segmentStrategy (): ((contentLength: number) => Array<[number, number]>) {
46+
return this.fastFetchConfig?.segmentStrategy ?? defaultConfig.segmentStrategy
47+
}
48+
49+
get selectRangeStrategy (): ((downloaderCounter: Map<number, number>) => number) {
50+
return this.fastFetchConfig?.selectRangeStrategy ?? defaultConfig.selectRangeStrategy
4751
}
4852
}

src/get/request/defaultConfig.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1+
import { defaultSelectRangeStrategy } from '../range/selectRangeStrategy'
2+
import { defaultSegmentStrategy } from '../range/segmentStrategy'
3+
14
export const defaultConfig = {
25
maxRetries: 5,
3-
retryDelay: 3000
6+
retryDelay: 3000,
7+
sequential: false,
8+
chunkCallback: () => undefined,
9+
selectRangeStrategy: defaultSelectRangeStrategy,
10+
segmentStrategy: defaultSegmentStrategy
411
} as const

src/get/request/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface FastFetchGetConfig {
1111
logger?: Partial<Logger>
1212
chunkCallback?: ChunkCallback
1313
segmentStrategy?: (contentLength: number) => Array<[number, number]>
14+
selectRangeStrategy?: (downloaderCounter: Map<number, number>) => number
1415
}
1516

1617
interface FastFetchGETInit {

0 commit comments

Comments
 (0)