interface XMLHttpRequestProxy extends XMLHttpRequest { responseText: string, readyState: number; response: any; responseURL: string; responseXML: Document | null; status: number; statusText: string; xhr: OriginXMLHttpRequest } interface OriginXMLHttpRequest extends XMLHttpRequest { getProxy(): XMLHttpRequestProxy; } interface AttrGetterAndSetter { getter?: (value: T, xhr: OriginXMLHttpRequest) => T; setter?: (value: T, xhr: OriginXMLHttpRequest) => T; } interface XhrRequestConfig { method: string, url: string, headers: any, body: any, async: boolean, user: string, password: string, withCredentials: boolean xhr: OriginXMLHttpRequest, } interface XhrResponse { config: XhrRequestConfig, headers: any, response: any, status: number, statusText?: string, } type XhrErrorType = 'error' | 'timeout' | 'abort' interface XhrError { config: XhrRequestConfig, type: XhrErrorType } interface Hooks { onreadystatechange?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; onabort?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; onerror?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; onload?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; onloadend?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; onloadstart?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; onprogress?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; ontimeout?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; abort?: ((args: Array, xhr: OriginXMLHttpRequest) => any); getAllResponseHeaders?: (args: Array, xhr: OriginXMLHttpRequest) => any; getResponseHeader?: (args: Array, xhr: OriginXMLHttpRequest) => any; open?: (args: Array, xhr: OriginXMLHttpRequest) => any; overrideMimeType?: (args: Array, xhr: OriginXMLHttpRequest) => any; send?: (args: Array, xhr: OriginXMLHttpRequest) => any; setRequestHeader?: (args: Array, xhr: OriginXMLHttpRequest) => any; addEventListener?: (args: Array, xhr: OriginXMLHttpRequest) => any; removeEventListener?: (args: Array, xhr: OriginXMLHttpRequest) => any; response?: AttrGetterAndSetter, responseText?: AttrGetterAndSetter, readyState?: AttrGetterAndSetter, responseType?: AttrGetterAndSetter; responseURL?: AttrGetterAndSetter; responseXML?: AttrGetterAndSetter; status?: AttrGetterAndSetter; statusText?: AttrGetterAndSetter; timeout?: AttrGetterAndSetter; upload?: AttrGetterAndSetter; withCredentials?: AttrGetterAndSetter; } interface XhrHandler { resolve(response: XhrResponse): void reject(err: XhrError): void } interface XhrRequestHandler extends XhrHandler { next(config: XhrRequestConfig): void } interface XhrResponseHandler extends XhrHandler { next(response: XhrResponse): void } interface XhrErrorHandler extends XhrHandler { next(error: XhrError): void } interface Proxy { onRequest?: (config: XhrRequestConfig, handler: XhrRequestHandler) => void, onResponse?: (response: XhrResponse, handler: XhrResponseHandler) => void, onError?: (err: XhrError, handler: XhrErrorHandler) => void, } export function proxy(proxy: Proxy, win?: Window): { originXhr: XMLHttpRequest, unProxy: () => void }; export function unProxy(win?: Window); export function hook(hooks: Hooks,win?: Window): { originXhr: XMLHttpRequest, unHook: () => void }; export function unHook(win?: Window);