UNPKG

5.61 kBTypeScriptView Raw
1// Type definitions for follow-redirects 1.14
2// Project: https://github.com/follow-redirects/follow-redirects
3// Definitions by: Emily Klassen <https://github.com/forivall>
4// Claas Ahlrichs <https://github.com/claasahl>
5// Piotr Błażejewicz <https://github.com/peterblazejewicz>
6// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
7
8/// <reference types="node" />
9
10import * as coreHttp from 'http';
11import * as coreHttps from 'https';
12import { URL } from 'url';
13import { Writable } from 'stream';
14
15export interface WrappableRequest {
16 getHeader?(...args: any[]): any;
17 setHeader(...args: any[]): any;
18 removeHeader(...args: any[]): any;
19
20 abort?(...args: any[]): any;
21 flushHeaders?(...args: any[]): any;
22 setNoDelay?(...args: any[]): any;
23 setSocketKeepAlive?(...args: any[]): any;
24 setTimeout?(...args: any[]): any;
25}
26export interface WrappableResponse {
27 statusCode?: number | undefined;
28 headers: {
29 location?: string | undefined;
30 };
31 destroy(): any;
32}
33
34export interface Scheme<Options, Request extends WrappableRequest, Response> {
35 request(options: Options, callback?: (res: Response) => any): Request;
36}
37
38export interface RedirectableRequest<Request extends WrappableRequest, Response> extends Writable {
39 setHeader: Request['setHeader'];
40 removeHeader: Request['removeHeader'];
41 abort: Request['abort'];
42 flushHeaders: Request['flushHeaders'];
43 getHeader: Request['getHeader'];
44 setNoDelay: Request['setNoDelay'];
45 setSocketKeepAlive: Request['setSocketKeepAlive'];
46 setTimeout: Request['setTimeout'];
47
48 addListener(event: string, listener: (...args: any[]) => void): this;
49 addListener(event: 'response', listener: (response: Response) => void): this;
50 addListener(event: 'error', listener: (err: Error) => void): this;
51
52 emit(event: string | symbol, ...args: any[]): boolean;
53 emit(event: 'response', response: Response): boolean;
54 emit(event: 'error', err: Error): boolean;
55
56 on(event: string, listener: (...args: any[]) => void): this;
57 on(event: 'response', listener: (response: Response) => void): this;
58 on(event: 'error', listener: (err: Error) => void): this;
59
60 once(event: string, listener: (...args: any[]) => void): this;
61 once(event: 'response', listener: (response: Response) => void): this;
62 once(event: 'error', listener: (err: Error) => void): this;
63
64 prependListener(event: string, listener: (...args: any[]) => void): this;
65 prependListener(event: 'response', listener: (response: Response) => void): this;
66 prependListener(event: 'error', listener: (err: Error) => void): this;
67
68 prependOnceListener(event: string, listener: (...args: any[]) => void): this;
69 prependOnceListener(event: 'response', listener: (response: Response) => void): this;
70 prependOnceListener(event: 'error', listener: (err: Error) => void): this;
71}
72
73export interface RedirectScheme<Options, Request extends WrappableRequest, Response> {
74 /**
75 * This function has two overloads:
76 * ```typescript
77 * request(options: string | URL | Options, callback)
78 * request(url: string | URL, options: Options, callback)
79 * ```
80 */
81 request(
82 url: string | URL | (Options & FollowOptions<Options>),
83 options?: (Options & FollowOptions<Options>) | ((res: Response & FollowResponse) => void),
84 callback?: (res: Response & FollowResponse) => void,
85 ): RedirectableRequest<Request, Response>;
86 /**
87 * This function has two overloads:
88 * ```typescript
89 * get(options: string | URL | Options, callback)
90 * get(url: string | URL, options: Options, callback)
91 * ```
92 */
93 get(
94 url: string | URL | (Options & FollowOptions<Options>),
95 options?: (Options & FollowOptions<Options>) | ((res: Response & FollowResponse) => void),
96 callback?: (res: Response & FollowResponse) => void,
97 ): RedirectableRequest<Request, Response>;
98}
99
100export type Override<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U;
101export interface FollowOptions<Options> {
102 followRedirects?: boolean | undefined;
103 maxRedirects?: number | undefined;
104 maxBodyLength?: number | undefined;
105 beforeRedirect?:
106 | ((options: Options & FollowOptions<Options>, responseDetails: ResponseDetails) => void)
107 | undefined;
108 agents?:
109 | {
110 http?: coreHttp.Agent | undefined;
111 https?: coreHttps.Agent | undefined;
112 }
113 | undefined;
114 trackRedirects?: boolean | undefined;
115}
116
117export interface FollowResponse {
118 responseUrl: string;
119 redirects: Redirect[];
120}
121
122export interface Redirect {
123 url: string;
124 headers: coreHttp.IncomingHttpHeaders;
125 statusCode: number;
126}
127
128export interface ResponseDetails {
129 headers: coreHttp.IncomingHttpHeaders;
130}
131
132export const http: Override<
133 typeof coreHttp,
134 RedirectScheme<coreHttp.RequestOptions, coreHttp.ClientRequest, coreHttp.IncomingMessage>
135>;
136export const https: Override<
137 typeof coreHttps,
138 RedirectScheme<coreHttps.RequestOptions, coreHttp.ClientRequest, coreHttp.IncomingMessage>
139>;
140
141export type WrappedScheme<T extends Scheme<any, any, any>> = Override<
142 T,
143 RedirectScheme<
144 T extends Scheme<infer Options, any, any> ? Options : never,
145 T extends Scheme<any, infer Request, any> ? Request : never,
146 T extends Scheme<any, any, infer Response> ? Response : never
147 >
148>;
149
150export function wrap<T extends { [key: string]: Scheme<any, any, any> }>(
151 protocols: T,
152): {
153 [K in keyof T]: WrappedScheme<T[K]>;
154};
155
\No newline at end of file