1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | import * as coreHttp from 'http';
|
11 | import * as coreHttps from 'https';
|
12 | import { URL } from 'url';
|
13 | import { Writable } from 'stream';
|
14 |
|
15 | export 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 | }
|
26 | export interface WrappableResponse {
|
27 | statusCode?: number | undefined;
|
28 | headers: {
|
29 | location?: string | undefined;
|
30 | };
|
31 | destroy(): any;
|
32 | }
|
33 |
|
34 | export interface Scheme<Options, Request extends WrappableRequest, Response> {
|
35 | request(options: Options, callback?: (res: Response) => any): Request;
|
36 | }
|
37 |
|
38 | export 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 |
|
73 | export interface RedirectScheme<Options, Request extends WrappableRequest, Response> {
|
74 | |
75 |
|
76 |
|
77 |
|
78 |
|
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 |
|
88 |
|
89 |
|
90 |
|
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 |
|
100 | export type Override<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U;
|
101 | export 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 |
|
117 | export interface FollowResponse {
|
118 | responseUrl: string;
|
119 | redirects: Redirect[];
|
120 | }
|
121 |
|
122 | export interface Redirect {
|
123 | url: string;
|
124 | headers: coreHttp.IncomingHttpHeaders;
|
125 | statusCode: number;
|
126 | }
|
127 |
|
128 | export interface ResponseDetails {
|
129 | headers: coreHttp.IncomingHttpHeaders;
|
130 | }
|
131 |
|
132 | export const http: Override<
|
133 | typeof coreHttp,
|
134 | RedirectScheme<coreHttp.RequestOptions, coreHttp.ClientRequest, coreHttp.IncomingMessage>
|
135 | >;
|
136 | export const https: Override<
|
137 | typeof coreHttps,
|
138 | RedirectScheme<coreHttps.RequestOptions, coreHttp.ClientRequest, coreHttp.IncomingMessage>
|
139 | >;
|
140 |
|
141 | export 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 |
|
150 | export 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 |