UNPKG

4.88 kBTypeScriptView Raw
1// Type definitions for follow-redirects 1.13
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 { Writable } from 'stream';
13
14export interface WrappableRequest {
15 getHeader?(...args: any[]): any;
16 setHeader(...args: any[]): any;
17 removeHeader(...args: any[]): any;
18
19 abort?(...args: any[]): any;
20 flushHeaders?(...args: any[]): any;
21 setNoDelay?(...args: any[]): any;
22 setSocketKeepAlive?(...args: any[]): any;
23 setTimeout?(...args: any[]): any;
24}
25export interface WrappableResponse {
26 statusCode?: number | undefined;
27 headers: {
28 location?: string | undefined
29 };
30 destroy(): any;
31}
32
33export interface Scheme<Options, Request extends WrappableRequest, Response> {
34 request(options: Options, callback?: (res: Response) => any): Request;
35}
36
37export interface RedirectableRequest<Request extends WrappableRequest, Response> extends Writable {
38 setHeader: Request['setHeader'];
39 removeHeader: Request['removeHeader'];
40 abort: Request['abort'];
41 flushHeaders: Request['flushHeaders'];
42 getHeader: Request['getHeader'];
43 setNoDelay: Request['setNoDelay'];
44 setSocketKeepAlive: Request['setSocketKeepAlive'];
45 setTimeout: Request['setTimeout'];
46
47 addListener(event: string, listener: (...args: any[]) => void): this;
48 addListener(event: "response", listener: (response: Response) => void): this;
49 addListener(event: "error", listener: (err: Error) => void): this;
50
51 emit(event: string | symbol, ...args: any[]): boolean;
52 emit(event: "response", response: Response): boolean;
53 emit(event: "error", err: Error): boolean;
54
55 on(event: string, listener: (...args: any[]) => void): this;
56 on(event: "response", listener: (response: Response) => void): this;
57 on(event: "error", listener: (err: Error) => void): this;
58
59 once(event: string, listener: (...args: any[]) => void): this;
60 once(event: "response", listener: (response: Response) => void): this;
61 once(event: "error", listener: (err: Error) => void): this;
62
63 prependListener(event: string, listener: (...args: any[]) => void): this;
64 prependListener(event: "response", listener: (response: Response) => void): this;
65 prependListener(event: "error", listener: (err: Error) => void): this;
66
67 prependOnceListener(event: string, listener: (...args: any[]) => void): this;
68 prependOnceListener(event: "response", listener: (response: Response) => void): this;
69 prependOnceListener(event: "error", listener: (err: Error) => void): this;
70}
71
72export interface RedirectScheme<Options, Request extends WrappableRequest, Response> {
73 request(
74 options: string | Options & FollowOptions<Options>,
75 callback?: (res: Response & FollowResponse) => void
76 ): RedirectableRequest<Request, Response>;
77 get(
78 options: string | Options & FollowOptions<Options>,
79 callback?: (res: Response & FollowResponse) => void
80 ): RedirectableRequest<Request, Response>;
81}
82
83export type Override<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U;
84export interface FollowOptions<Options> {
85 followRedirects?: boolean | undefined;
86 maxRedirects?: number | undefined;
87 maxBodyLength?: number | undefined;
88 beforeRedirect?: ((options: Options & FollowOptions<Options>, responseDetails: ResponseDetails) => void) | undefined;
89 agents?: {
90 http?: coreHttp.Agent | undefined;
91 https?: coreHttps.Agent | undefined;
92 } | undefined;
93 trackRedirects?: boolean | undefined;
94}
95
96export interface FollowResponse {
97 responseUrl: string;
98 redirects: Redirect[];
99}
100
101export interface Redirect {
102 url: string;
103 headers: coreHttp.IncomingHttpHeaders;
104 statusCode: number;
105}
106
107export interface ResponseDetails {
108 headers: coreHttp.IncomingHttpHeaders;
109}
110
111export const http: Override<typeof coreHttp, RedirectScheme<
112 coreHttp.RequestOptions,
113 coreHttp.ClientRequest,
114 coreHttp.IncomingMessage
115>>;
116export const https: Override<typeof coreHttps, RedirectScheme<
117 coreHttps.RequestOptions,
118 coreHttp.ClientRequest,
119 coreHttp.IncomingMessage
120>>;
121
122export type WrappedScheme<T extends Scheme<any, any, any>> = Override<T, RedirectScheme<
123 T extends Scheme<infer Options, any, any> ? Options : never,
124 T extends Scheme<any, infer Request, any> ? Request : never,
125 T extends Scheme<any, any, infer Response> ? Response : never
126>>;
127
128export function wrap<T extends {[key: string]: Scheme<any, any, any>}>(protocols: T): {
129 [K in keyof T]: WrappedScheme<T[K]>
130};
131
\No newline at end of file