UNPKG

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