1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | import * as coreHttp from 'http';
|
11 | import * as coreHttps from 'https';
|
12 | import { Writable } from 'stream';
|
13 |
|
14 | export 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 | }
|
25 | export interface WrappableResponse {
|
26 | statusCode?: number | undefined;
|
27 | headers: {
|
28 | location?: string | undefined
|
29 | };
|
30 | destroy(): any;
|
31 | }
|
32 |
|
33 | export interface Scheme<Options, Request extends WrappableRequest, Response> {
|
34 | request(options: Options, callback?: (res: Response) => any): Request;
|
35 | }
|
36 |
|
37 | export 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 |
|
72 | export 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 |
|
83 | export type Override<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U;
|
84 | export 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 |
|
96 | export interface FollowResponse {
|
97 | responseUrl: string;
|
98 | redirects: Redirect[];
|
99 | }
|
100 |
|
101 | export interface Redirect {
|
102 | url: string;
|
103 | headers: coreHttp.IncomingHttpHeaders;
|
104 | statusCode: number;
|
105 | }
|
106 |
|
107 | export interface ResponseDetails {
|
108 | headers: coreHttp.IncomingHttpHeaders;
|
109 | }
|
110 |
|
111 | export const http: Override<typeof coreHttp, RedirectScheme<
|
112 | coreHttp.RequestOptions,
|
113 | coreHttp.ClientRequest,
|
114 | coreHttp.IncomingMessage
|
115 | >>;
|
116 | export const https: Override<typeof coreHttps, RedirectScheme<
|
117 | coreHttps.RequestOptions,
|
118 | coreHttp.ClientRequest,
|
119 | coreHttp.IncomingMessage
|
120 | >>;
|
121 |
|
122 | export 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 |
|
128 | export 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 |