Skip to content

Commit ae0e32b

Browse files
committed
move config from requests
1 parent fa232b9 commit ae0e32b

File tree

10 files changed

+99
-70
lines changed

10 files changed

+99
-70
lines changed

src/get/config/Config.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { defaultConfig } from './default'
2+
import type { FastFetchGetConfig, FetchInput, ChunkCallback, SegmentStrategy, Logger, SelectRangeStrategy } from './types'
3+
4+
export class Config {
5+
readonly config: FastFetchGetConfig
6+
7+
constructor (config: FastFetchGetConfig) {
8+
this.config = config
9+
}
10+
11+
get maxRetries (): number {
12+
return this.config.maxRetries ?? defaultConfig.maxRetries
13+
}
14+
15+
get retryDelay (): number {
16+
return this.config.retryDelay ?? defaultConfig.retryDelay
17+
}
18+
19+
get chunkCallback (): ChunkCallback {
20+
return this.config.chunkCallback ?? defaultConfig.chunkCallback
21+
}
22+
23+
get segmentStrategy (): SegmentStrategy {
24+
return this.config.segmentStrategy ?? defaultConfig.segmentStrategy
25+
}
26+
27+
get selectRangeStrategy (): SelectRangeStrategy {
28+
return this.config.selectRangeStrategy ?? defaultConfig.selectRangeStrategy
29+
}
30+
31+
get logger (): Logger {
32+
return {
33+
...defaultConfig.logger,
34+
...this.config.logger
35+
}
36+
}
37+
38+
get mirrorURLs (): FetchInput[] {
39+
return this.config.mirrorURLs ?? []
40+
}
41+
}
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
import { defaultSelectRangeStrategy } from '../range/selectRangeStrategy'
22
import { defaultSegmentStrategy } from '../range/segmentStrategy'
33

4+
const placeholder = (): void => {}
5+
46
export const defaultConfig = {
7+
mirrorURLs: [],
58
maxRetries: 5,
69
retryDelay: 3000,
7-
sequential: false,
810
chunkCallback: () => undefined,
911
selectRangeStrategy: defaultSelectRangeStrategy,
10-
segmentStrategy: defaultSegmentStrategy
12+
segmentStrategy: defaultSegmentStrategy,
13+
logger: {
14+
info: placeholder,
15+
error: placeholder,
16+
debug: placeholder,
17+
warning: placeholder
18+
}
1119
} as const

src/get/config/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export type { FastFetchGetConfig, FetchInput, ChunkCallback, SegmentStrategy, Logger, SelectRangeStrategy } from './types'
2+
export { Config } from './Config'

src/get/config/types.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
export interface Logger {
2+
info: (message: string) => void
3+
error: (message: string) => void
4+
debug: (message: string) => void
5+
warning: (message: string) => void
6+
}
7+
8+
type FetchParams = Parameters<typeof fetch>
9+
export type FetchInput = FetchParams[0]
10+
export type ChunkCallback = (chunk: Blob, range: [number, number], input: FetchInput) => void
11+
export type SegmentStrategy = (contentLength: number) => Array<[number, number]>
12+
export type SelectRangeStrategy = (downloaderCounter: Map<number, number>) => number
13+
14+
export interface FastFetchGetConfig {
15+
mirrorURLs?: FetchInput[]
16+
maxRetries?: number
17+
retryDelay?: number
18+
logger?: Partial<Logger>
19+
chunkCallback?: ChunkCallback
20+
segmentStrategy?: SegmentStrategy
21+
selectRangeStrategy?: SelectRangeStrategy
22+
}

src/get/get.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ export async function GET (input: FetchInput, init?: GETInit): Promise<Response>
1010

1111
if (metadata.status !== 200) {
1212
const message = `Status code is not 200: ${metadata.status}`
13-
requestConfig.logger.error(message)
13+
requestConfig.config.logger.error(message)
1414
throw new Error(message)
1515
}
1616

1717
const manager = new DownloadManger(requestConfig, metadata)
1818
return manager.response
1919
} catch {
20-
requestConfig.logger.error('Fallback to normal fetch')
20+
requestConfig.config.logger.error('Fallback to normal fetch')
2121
// fallback to normal fetch
2222
return await fetch(input, init)
2323
}

src/get/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export { GET } from './get'
2-
export type { GETInit, FastFetchGetConfig } from './request'
2+
export type { GETInit } from './request'
3+
export type { FastFetchGetConfig } from './config'

src/get/manager/DownloadManger.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ export class DownloadManger {
2121
this.workers = workerInputs.map(
2222
(input) => new DownloadWorker(input, requestConfig)
2323
)
24-
requestConfig.logger.info(`Workers Count: ${this.workers.length}`)
24+
requestConfig.config.logger.info(`Workers Count: ${this.workers.length}`)
2525

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

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

@@ -35,16 +35,16 @@ export class DownloadManger {
3535

3636
// start fetching
3737
private async startFetching (): Promise<void> {
38-
this.requestConfig.logger.info('Start fetching.')
38+
this.requestConfig.config.logger.info('Start fetching.')
3939

4040
const promises = this.workers.map(async (worker, idx) =>
4141
await this.assignWorkToWorker(worker, idx)
4242
)
4343
try {
4444
await Promise.any(promises)
45-
this.requestConfig.logger.info('Fetching done.')
45+
this.requestConfig.config.logger.info('Fetching done.')
4646
} catch {
47-
this.requestConfig.logger.error('All workers failed, stream aborted.')
47+
this.requestConfig.config.logger.error('All workers failed, stream aborted.')
4848
// all workers failed
4949
this.streamer.abort('All workers failed')
5050
}
@@ -73,13 +73,13 @@ export class DownloadManger {
7373
})
7474
}
7575

76-
this.requestConfig.logger.debug(
76+
this.requestConfig.config.logger.debug(
7777
`Worker ${workerIndex} is fetching range ${rangeIndex}.`
7878
)
7979
const blob = await worker.download(range, workSignal)
80-
this.requestConfig.chunkCallback(blob, range, worker.input)
80+
this.requestConfig.config.chunkCallback(blob, range, worker.input)
8181

82-
this.requestConfig.logger.debug(
82+
this.requestConfig.config.logger.debug(
8383
`Worker ${workerIndex} fetched range ${rangeIndex} successfully.`
8484
)
8585

@@ -90,12 +90,12 @@ export class DownloadManger {
9090
} catch (e) {
9191
if ((e as DOMException)?.name !== 'AbortError') {
9292
// worker failed other than AbortError
93-
this.requestConfig.logger.error(
93+
this.requestConfig.config.logger.error(
9494
`Worker ${workerIndex} failed to fetch range ${rangeIndex}: ${(e as DOMException).message}.`
9595
)
9696
currentRetry += 1
97-
if (currentRetry > this.requestConfig.maxRetries) {
98-
this.requestConfig.logger.error(
97+
if (currentRetry > this.requestConfig.config.maxRetries) {
98+
this.requestConfig.config.logger.error(
9999
`Worker ${workerIndex} failed to fetch range ${rangeIndex} after ${currentRetry} retries.`
100100
)
101101
throw new Error(`Worker ${workerIndex} failed to fetch range after retries ${currentRetry}`)
@@ -104,7 +104,7 @@ export class DownloadManger {
104104
this.rangeProvider.removeDownloader(rangeIndex)
105105

106106
// sleep for retryDelay
107-
await new Promise((resolve) => setTimeout(resolve, this.requestConfig.retryDelay))
107+
await new Promise((resolve) => setTimeout(resolve, this.requestConfig.config.retryDelay))
108108
continue
109109
}
110110

src/get/request/RequestConfig.ts

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,18 @@
1-
import type { FetchInput, GETInit, FastFetchGetConfig, ChunkCallback } from './types'
2-
import type { Logger } from '../logger'
3-
import { defaultConfig } from './defaultConfig'
1+
import type { FetchInput, GETInit } from './types'
2+
import { Config } from '../config'
43

54
export class GETRequestConfig {
65
readonly input: FetchInput
76
readonly init: GETInit
7+
readonly config: Config
88

99
constructor (input: FetchInput, init: GETInit) {
1010
this.input = input
1111
this.init = init
12+
this.config = new Config(init?.fastFetch ?? {})
1213
}
1314

1415
get inputs (): FetchInput[] {
15-
return [this.input, ...(this.init?.fastFetch?.mirrorURLs ?? [])]
16-
}
17-
18-
private get fastFetchConfig (): FastFetchGetConfig | undefined {
19-
return this.init?.fastFetch
20-
}
21-
22-
get logger (): Logger {
23-
const placeholder = (): void => {}
24-
25-
return {
26-
info: this.fastFetchConfig?.logger?.info ?? placeholder,
27-
error: this.fastFetchConfig?.logger?.error ?? placeholder,
28-
debug: this.fastFetchConfig?.logger?.debug ?? placeholder,
29-
warning: this.fastFetchConfig?.logger?.warning ?? placeholder
30-
}
31-
}
32-
33-
get maxRetries (): number {
34-
return this.fastFetchConfig?.maxRetries ?? defaultConfig.maxRetries
35-
}
36-
37-
get retryDelay (): number {
38-
return this.fastFetchConfig?.retryDelay ?? defaultConfig.retryDelay
39-
}
40-
41-
get chunkCallback (): ChunkCallback {
42-
return this.fastFetchConfig?.chunkCallback ?? defaultConfig.chunkCallback
43-
}
44-
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
16+
return [this.input, ...(this.config.mirrorURLs)]
5117
}
5218
}

src/get/request/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
export { GETRequestConfig } from './RequestConfig'
2-
export type { GETInit, FetchInput, FastFetchGetConfig } from './types'
2+
export type { GETInit, FetchInput } from './types'

src/get/request/types.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,7 @@
1-
import type { Logger } from '../logger'
1+
import type { FastFetchGetConfig } from '../config'
22

33
type FetchParams = Parameters<typeof fetch>
44
export type FetchInput = FetchParams[0]
5-
export type ChunkCallback = (chunk: Blob, range: [number, number], input: FetchInput) => void
6-
7-
export interface FastFetchGetConfig {
8-
mirrorURLs?: FetchInput[]
9-
maxRetries?: number
10-
retryDelay?: number
11-
logger?: Partial<Logger>
12-
chunkCallback?: ChunkCallback
13-
segmentStrategy?: (contentLength: number) => Array<[number, number]>
14-
selectRangeStrategy?: (downloaderCounter: Map<number, number>) => number
15-
}
165

176
interface FastFetchGETInit {
187
fastFetch?: FastFetchGetConfig

0 commit comments

Comments
 (0)