@@ -29,25 +29,34 @@ namespace Miniget {
29
29
acceptEncoding ?: { [ key : string ] : ( ) => Transform } ;
30
30
}
31
31
32
+ export type Defaults = Miniget . Options ;
33
+ export type MinigetError = Error ;
34
+
32
35
export interface Stream extends PassThrough {
33
36
abort : ( ) => void ;
34
37
text : ( ) => Promise < string > ;
35
- on ( event : 'reconnect' , listener : ( attempt : number , err ?: Error ) => void ) : this;
36
- on ( event : 'retry' , listener : ( attempt : number , err ?: Error ) => void ) : this;
38
+ on ( event : 'reconnect' , listener : ( attempt : number , err ?: Miniget . MinigetError ) => void ) : this;
39
+ on ( event : 'retry' , listener : ( attempt : number , err ?: Miniget . MinigetError ) => void ) : this;
37
40
on ( event : 'redirect' , listener : ( url : string ) => void ) : this;
38
41
on ( event : string | symbol , listener : ( ...args : any ) => void ) : this;
39
42
}
40
43
}
41
44
42
- const defaults : Miniget . Options = {
45
+ Miniget . MinigetError = class MinigetError extends Error {
46
+ constructor ( message : string ) {
47
+ super ( message ) ;
48
+ }
49
+ } ;
50
+
51
+ Miniget . Defaults = Miniget . Options = {
43
52
maxRedirects : 10 ,
44
53
maxRetries : 2 ,
45
54
maxReconnects : 0 ,
46
55
backoff : { inc : 100 , max : 10000 } ,
47
56
} ;
48
57
49
58
function Miniget ( url : string , options : Miniget . Options = { } ) : Miniget . Stream {
50
- const opts : Miniget . Options = Object . assign ( { } , defaults , options ) ;
59
+ const opts : Miniget . Options = Object . assign ( { } , Miniget . Defaults , options ) ;
51
60
const stream = new PassThrough ( { highWaterMark : opts . highWaterMark } ) as Miniget . Stream ;
52
61
let activeRequest : ClientRequest | null ;
53
62
let activeDecodedStream : Transform | null ;
@@ -80,7 +89,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
80
89
const downloadHasStarted = ( ) => activeDecodedStream && 0 < downloaded ;
81
90
const downloadEnded = ( ) => ! acceptRanges || downloaded == contentLength ;
82
91
83
- const reconnect = ( err ?: Error ) => {
92
+ const reconnect = ( err ?: Miniget . MinigetError ) => {
84
93
activeDecodedStream = null ;
85
94
retries = 0 ;
86
95
let inc = opts . backoff . inc ;
@@ -89,7 +98,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
89
98
stream . emit ( 'reconnect' , reconnects , err ) ;
90
99
} ;
91
100
92
- const reconnectIfEndedEarly = ( err ?: Error ) => {
101
+ const reconnectIfEndedEarly = ( err ?: Miniget . MinigetError ) => {
93
102
if ( options . method != 'HEAD' && ! downloadEnded ( ) && reconnects ++ < opts . maxReconnects ) {
94
103
reconnect ( err ) ;
95
104
return true ;
@@ -99,7 +108,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
99
108
100
109
interface RetryOptions {
101
110
statusCode ?: number ;
102
- err ?: Error ;
111
+ err ?: Miniget . MinigetError ;
103
112
retryAfter ?: number ;
104
113
}
105
114
const retryRequest = ( retryOptions : RetryOptions ) : boolean => {
@@ -118,7 +127,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
118
127
return false ;
119
128
} ;
120
129
121
- const onRequestError = ( err : Error , statusCode ?: number ) : void => {
130
+ const onRequestError = ( err : Miniget . MinigetError , statusCode ?: number ) : void => {
122
131
if ( ! retryRequest ( { err, statusCode } ) ) {
123
132
stream . emit ( 'error' , err ) ;
124
133
}
@@ -140,7 +149,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
140
149
// Let the error be caught by the if statement below.
141
150
}
142
151
if ( ! httpLib ) {
143
- stream . emit ( 'error' , Error ( 'Invalid URL: ' + url ) ) ;
152
+ stream . emit ( 'error' , new Miniget . MinigetError ( 'Invalid URL: ' + url ) ) ;
144
153
return ;
145
154
}
146
155
@@ -163,7 +172,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
163
172
if ( ! parsed || parsed . protocol ) {
164
173
httpLib = httpLibs [ parsed ?. protocol ] ;
165
174
if ( ! httpLib ) {
166
- stream . emit ( 'error' , Error ( 'Invalid URL object from `transform` function' ) ) ;
175
+ stream . emit ( 'error' , new Miniget . MinigetError ( 'Invalid URL object from `transform` function' ) ) ;
167
176
return ;
168
177
}
169
178
}
@@ -172,7 +181,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
172
181
activeRequest = httpLib . get ( parsed , ( res : IncomingMessage ) => {
173
182
if ( redirectStatusCodes . has ( res . statusCode ) ) {
174
183
if ( redirects ++ >= opts . maxRedirects ) {
175
- stream . emit ( 'error' , Error ( 'Too many redirects' ) ) ;
184
+ stream . emit ( 'error' , new Miniget . MinigetError ( 'Too many redirects' ) ) ;
176
185
} else {
177
186
url = res . headers . location ;
178
187
setTimeout ( doDownload , res . headers [ 'retry-after' ] ? parseInt ( res . headers [ 'retry-after' ] , 10 ) * 1000 : 0 ) ;
@@ -183,12 +192,12 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
183
192
// Check for rate limiting.
184
193
} else if ( retryStatusCodes . has ( res . statusCode ) ) {
185
194
if ( ! retryRequest ( { retryAfter : parseInt ( res . headers [ 'retry-after' ] , 10 ) } ) ) {
186
- let err = Error ( 'Status code: ' + res . statusCode ) ;
195
+ let err = new Miniget . MinigetError ( 'Status code: ' + res . statusCode ) ;
187
196
stream . emit ( 'error' , err ) ;
188
197
}
189
198
return ;
190
199
} else if ( res . statusCode < 200 || 400 <= res . statusCode ) {
191
- let err = Error ( 'Status code: ' + res . statusCode ) ;
200
+ let err = new Miniget . MinigetError ( 'Status code: ' + res . statusCode ) ;
192
201
if ( res . statusCode >= 500 ) {
193
202
onRequestError ( err , res . statusCode ) ;
194
203
} else {
@@ -211,7 +220,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
211
220
stream . end ( ) ;
212
221
}
213
222
} ;
214
- const onerror = ( err : Error ) : void => {
223
+ const onerror = ( err : Miniget . MinigetError ) : void => {
215
224
cleanup ( ) ;
216
225
onRequestError ( err ) ;
217
226
} ;
0 commit comments