1 |
|
2 |
|
3 | import * as coreHttp from "http";
|
4 | import * as coreHttps from "https";
|
5 | import { Writable } from "stream";
|
6 | import { URL } from "url";
|
7 |
|
8 | export 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 | }
|
19 | export interface WrappableResponse {
|
20 | statusCode?: number | undefined;
|
21 | headers: {
|
22 | location?: string | undefined;
|
23 | };
|
24 | destroy(): any;
|
25 | }
|
26 |
|
27 | export interface Scheme<Options, Request extends WrappableRequest, Response> {
|
28 | request(options: Options, callback?: (res: Response) => any): Request;
|
29 | }
|
30 |
|
31 | export 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 |
|
66 | export interface RedirectScheme<Options, Request extends WrappableRequest, Response> {
|
67 | |
68 |
|
69 |
|
70 |
|
71 |
|
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 |
|
81 |
|
82 |
|
83 |
|
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 |
|
93 | export type Override<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U;
|
94 | export 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 |
|
110 | export interface FollowResponse {
|
111 | responseUrl: string;
|
112 | redirects: Redirect[];
|
113 | }
|
114 |
|
115 | export interface Redirect {
|
116 | url: string;
|
117 | headers: coreHttp.IncomingHttpHeaders;
|
118 | statusCode: number;
|
119 | }
|
120 |
|
121 | export interface ResponseDetails {
|
122 | headers: coreHttp.IncomingHttpHeaders;
|
123 | }
|
124 |
|
125 | export const http: Override<
|
126 | typeof coreHttp,
|
127 | RedirectScheme<coreHttp.RequestOptions, coreHttp.ClientRequest, coreHttp.IncomingMessage>
|
128 | >;
|
129 | export const https: Override<
|
130 | typeof coreHttps,
|
131 | RedirectScheme<coreHttps.RequestOptions, coreHttp.ClientRequest, coreHttp.IncomingMessage>
|
132 | >;
|
133 |
|
134 | export 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 |
|
143 | export 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 |