@@ -3,31 +3,46 @@ import fs from 'node:fs'
3
3
4
4
import { handleConfig , random , sleep } from './utils'
5
5
6
- import { IFetchConfig , IFetchFileConfig , IRequestConfig } from './types'
6
+ import {
7
+ IFetchConfig ,
8
+ IFetchFileConfig ,
9
+ IRequest ,
10
+ IRequestConfig
11
+ } from './types'
7
12
8
13
function request ( config : IRequestConfig ) {
9
- return new Promise < Buffer > ( ( resolve , reject ) => {
14
+ return new Promise < IRequest > ( ( resolve , reject ) => {
10
15
const data = ( config . data = JSON . stringify ( config . data ?? '' ) )
11
- const requestConfig = handleConfig ( config )
12
- // console.log('requestConfig: ', requestConfig)
16
+ const handleConfigRes = handleConfig ( config )
13
17
14
- const req = https . request ( requestConfig , ( res ) => {
15
- const content : Buffer [ ] = [ ]
18
+ const req = https . request ( handleConfigRes , ( res ) => {
19
+ const container : Buffer [ ] = [ ]
16
20
17
- res . on ( 'data' , ( chunk ) => content . push ( chunk ) )
21
+ res . on ( 'data' , ( chunk ) => container . push ( chunk ) )
18
22
19
23
res . on ( 'end' , ( ) => {
20
- resolve ( Buffer . concat ( content ) )
24
+ const data = Buffer . concat ( container )
25
+ const resolveRes : IRequest = {
26
+ contentType : res . headers [ 'content-type' ] ,
27
+ contentLength : res . headers [ 'content-length' ] ,
28
+ data
29
+ }
30
+ resolve ( resolveRes )
21
31
} )
22
32
} )
23
33
34
+ req . on ( 'timeout' , ( ) => {
35
+ console . log ( `Timeout Error` )
36
+ reject ( new Error ( 'Timeout' ) )
37
+ } )
38
+
24
39
req . on ( 'error' , ( err ) => {
25
- console . log ( 'err : ' , err . message )
40
+ console . log ( 'Error : ' , err . message )
26
41
reject ( err )
27
42
} )
28
43
29
- if ( requestConfig . method . toLowerCase ( ) === 'post' ) {
30
- // console.log('requestConfig data: ', data)
44
+ // 其他处理
45
+ if ( handleConfigRes . method === 'POST' ) {
31
46
req . write ( data )
32
47
}
33
48
@@ -37,27 +52,27 @@ function request(config: IRequestConfig) {
37
52
38
53
export async function fetch < T = any > ( config : IFetchConfig ) : Promise < T > {
39
54
const { requestConifg, intervalTime } = config
40
- let res
41
-
42
- async function getValue ( req : IRequestConfig ) {
43
- const bufferRes = await request ( req )
44
- return JSON . parse ( bufferRes . toString ( ) )
45
- }
46
55
56
+ let res
47
57
if ( Array . isArray ( requestConifg ) ) {
48
58
res = [ ]
49
59
50
60
for ( const item of requestConifg ) {
51
- const value = await getValue ( item )
52
- res . push ( value )
61
+ const requestRes = await request ( item )
62
+ res . push ( JSON . parse ( requestRes . data . toString ( ) ) )
63
+
64
+ if ( typeof intervalTime !== 'undefined' ) {
65
+ const timeout =
66
+ typeof intervalTime === 'number'
67
+ ? intervalTime
68
+ : random ( intervalTime . max , intervalTime . min )
53
69
54
- if ( intervalTime ) {
55
- const timeout = random ( intervalTime . max , intervalTime . min )
56
70
await sleep ( timeout )
57
71
}
58
72
}
59
73
} else {
60
- res = getValue ( requestConifg )
74
+ const requestRes = await request ( requestConifg )
75
+ res = JSON . parse ( requestRes . data . toString ( ) )
61
76
}
62
77
63
78
return res
@@ -66,29 +81,52 @@ export async function fetch<T = any>(config: IFetchConfig): Promise<T> {
66
81
export async function fetchFile ( config : IFetchFileConfig ) {
67
82
const { requestConifg, intervalTime, fileConfig } = config
68
83
69
- const isRqeArr = Array . isArray ( requestConifg )
70
- const requestConifgArr = isRqeArr ? requestConifg : [ requestConifg ]
84
+ const requestConifgArr = Array . isArray ( requestConifg )
85
+ ? requestConifg
86
+ : [ requestConifg ]
71
87
72
- const sum = requestConifgArr . length
88
+ const total = requestConifgArr . length
73
89
let currentCount = 0
90
+ let successCount = 0
91
+
92
+ await Promise . resolve ( )
74
93
75
- console . log ( `开始下载, 总数 : ${ sum } ` )
94
+ console . log ( `Start downloading, total : ${ total } ` )
76
95
77
96
for ( const item of requestConifgArr ) {
78
97
currentCount ++
79
98
80
- const res = await request ( item )
81
- const filename = new Date ( ) . getTime ( ) + fileConfig . suffix
82
- const path = fileConfig . storeDir + '/' + filename
99
+ const requestRes = await request ( item )
83
100
84
- fs . createWriteStream ( path , 'binary' ) . write ( res )
85
- console . log ( `当前: ${ currentCount } ` )
101
+ const { contentType, data } = requestRes
102
+ const filename = `${ new Date ( ) . getTime ( ) } .${ contentType ?. split ( '/' ) . pop ( ) } `
103
+ const path = `${ fileConfig . storeDir } /${ filename } `
104
+
105
+ fs . createWriteStream ( path , 'binary' ) . write ( data , ( err ) => {
106
+ if ( err ) {
107
+ return console . log (
108
+ `File save error requested for the ${ currentCount } : ${ err . message } `
109
+ )
110
+ }
111
+
112
+ if ( ++ successCount === total ) {
113
+ console . log ( 'All files downloaded successfully!' )
114
+ }
115
+ } )
116
+
117
+ if ( typeof intervalTime !== 'undefined' && currentCount !== total ) {
118
+ const timeout =
119
+ typeof intervalTime === 'number'
120
+ ? intervalTime
121
+ : random ( intervalTime . max , intervalTime . min )
122
+
123
+ console . log (
124
+ `The ${ currentCount } request is success, sleep for ${ timeout } ms`
125
+ )
86
126
87
- if ( intervalTime && isRqeArr && currentCount !== sum ) {
88
- const timeout = random ( intervalTime . max , intervalTime . min )
89
127
await sleep ( timeout )
128
+ } else {
129
+ console . log ( `The ${ currentCount } request is success` )
90
130
}
91
131
}
92
-
93
- console . log ( '下载完成' )
94
132
}
0 commit comments