Skip to content

Commit 4ff779d

Browse files
committed
feat: expose Defaults and MinigetError
1 parent 82cff9b commit 4ff779d

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

src/index.ts

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,34 @@ namespace Miniget {
2929
acceptEncoding?: { [key: string]: () => Transform };
3030
}
3131

32+
export type Defaults = Miniget.Options;
33+
export type MinigetError = Error;
34+
3235
export interface Stream extends PassThrough {
3336
abort: () => void;
3437
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;
3740
on(event: 'redirect', listener: (url: string) => void): this;
3841
on(event: string | symbol, listener: (...args: any) => void): this;
3942
}
4043
}
4144

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 = {
4352
maxRedirects: 10,
4453
maxRetries: 2,
4554
maxReconnects: 0,
4655
backoff: { inc: 100, max: 10000 },
4756
};
4857

4958
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);
5160
const stream = new PassThrough({ highWaterMark: opts.highWaterMark }) as Miniget.Stream;
5261
let activeRequest: ClientRequest | null;
5362
let activeDecodedStream: Transform | null;
@@ -80,7 +89,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
8089
const downloadHasStarted = () => activeDecodedStream && 0 < downloaded;
8190
const downloadEnded = () => !acceptRanges || downloaded == contentLength;
8291

83-
const reconnect = (err?: Error) => {
92+
const reconnect = (err?: Miniget.MinigetError) => {
8493
activeDecodedStream = null;
8594
retries = 0;
8695
let inc = opts.backoff.inc;
@@ -89,7 +98,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
8998
stream.emit('reconnect', reconnects, err);
9099
};
91100

92-
const reconnectIfEndedEarly = (err?: Error) => {
101+
const reconnectIfEndedEarly = (err?: Miniget.MinigetError) => {
93102
if (options.method != 'HEAD' && !downloadEnded() && reconnects++ < opts.maxReconnects) {
94103
reconnect(err);
95104
return true;
@@ -99,7 +108,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
99108

100109
interface RetryOptions {
101110
statusCode?: number;
102-
err?: Error;
111+
err?: Miniget.MinigetError;
103112
retryAfter?: number;
104113
}
105114
const retryRequest = (retryOptions: RetryOptions): boolean => {
@@ -118,7 +127,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
118127
return false;
119128
};
120129

121-
const onRequestError = (err: Error, statusCode?: number): void => {
130+
const onRequestError = (err: Miniget.MinigetError, statusCode?: number): void => {
122131
if (!retryRequest({ err, statusCode })) {
123132
stream.emit('error', err);
124133
}
@@ -140,7 +149,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
140149
// Let the error be caught by the if statement below.
141150
}
142151
if (!httpLib) {
143-
stream.emit('error', Error('Invalid URL: ' + url));
152+
stream.emit('error', new Miniget.MinigetError('Invalid URL: ' + url));
144153
return;
145154
}
146155

@@ -163,7 +172,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
163172
if (!parsed || parsed.protocol) {
164173
httpLib = httpLibs[parsed?.protocol];
165174
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'));
167176
return;
168177
}
169178
}
@@ -172,7 +181,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
172181
activeRequest = httpLib.get(parsed, (res: IncomingMessage) => {
173182
if (redirectStatusCodes.has(res.statusCode)) {
174183
if (redirects++ >= opts.maxRedirects) {
175-
stream.emit('error', Error('Too many redirects'));
184+
stream.emit('error', new Miniget.MinigetError('Too many redirects'));
176185
} else {
177186
url = res.headers.location;
178187
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 {
183192
// Check for rate limiting.
184193
} else if (retryStatusCodes.has(res.statusCode)) {
185194
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);
187196
stream.emit('error', err);
188197
}
189198
return;
190199
} 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);
192201
if (res.statusCode >= 500) {
193202
onRequestError(err, res.statusCode);
194203
} else {
@@ -211,7 +220,7 @@ function Miniget(url: string, options: Miniget.Options = {}): Miniget.Stream {
211220
stream.end();
212221
}
213222
};
214-
const onerror = (err: Error): void => {
223+
const onerror = (err: Miniget.MinigetError): void => {
215224
cleanup();
216225
onRequestError(err);
217226
};

0 commit comments

Comments
 (0)