interface StaticContent { content: string | Buffer, contentType: string, etag?: string, isShadowUIStylesheet?: boolean } interface ExternalProxySettingsRaw { url: string, bypassRules?: string[] } interface ExternalProxySettings { host: string; hostname: string; bypassRules?: string[]; port?: string; proxyAuth?: string; authHeader?: string; } interface Credentials { username: string; password: string; domain?: string; workstation?: string; } interface RequestTimeout { page?: number; ajax?: number; } interface SessionOptions { disablePageCaching: boolean; allowMultipleWindows: boolean; windowId: string; requestTimeout: RequestTimeout; proxyless: boolean; } interface RequestEventListenerError { error: Error; methodName: string; } interface RequestFilterRuleObjectInitializer { url: string | RegExp; method: string; isAjax: boolean; } type RequestFilterRuleOptions = RequestFilterRuleObjectInitializer interface RequestFilterRuleObjectInitializer { url: string | RegExp; method: string; isAjax: boolean; } type RequestFilterRulePredicate = (requestInfo: RequestInfo) => boolean | Promise; declare module 'testcafe-hammerhead' { import { IncomingHttpHeaders, OutgoingHttpHeaders, IncomingMessage, ServerResponse, } from 'http'; type StrictIncomingMessage = IncomingMessage & { statusCode: number, statusMessage: string }; export type RequestFilterRuleInit = string | RegExp | Partial | RequestFilterRulePredicate; enum RequestEventNames { onRequest = 'onRequest', onConfigureResponse = 'onConfigureResponse', onResponse = 'onResponse' } export interface RequestEventListenersData { listeners: RequestEventListeners; errorHandler: (event: RequestEventListenerError) => void; rule: RequestFilterRule; } interface RequestEventListeners { [RequestEventNames.onRequest]: Function; [RequestEventNames.onConfigureResponse]: Function; [RequestEventNames.onResponse]: Function; } interface UserScript { url: string; page: RequestFilterRule; } interface InjectableResources { scripts: string[]; styles: string[]; userScripts: UserScript[]; } interface StoragesSnapshot { localStorage: string; sessionStorage: string; } interface ExternalCookies { name: string; value: string; domain: string; path: string; expires: Date; maxAge: number | 'Infinity' | '-Infinity'; secure: boolean; httpOnly: boolean; sameSite: string; } interface Cookies { getCookies (externalCookies: ExternalCookies[], urls: string[]): Promise; setCookies (externalCookies: ExternalCookies[], url: string): Promise; deleteCookies (externalCookies: ExternalCookies[], urls: string[]): Promise; getHeader({ url, hostname }: { url: string, hostname: string }): string | null; copySyncCookies (syncCookie: string, toUrl: string): void; } /** Initialization options for the IncomingMessageLike object **/ export interface IncomingMessageLikeInitOptions { headers: { [name: string]: string|string[] }; trailers: { [key: string]: string | undefined }; statusCode: number; body: object|string|Buffer|null; } interface ResponseMockSetBodyMethod { add(res: IncomingMessageLikeInitOptions): void; remove(res: IncomingMessageLikeInitOptions): void; } export interface RequestOptionsParams { method: string; url: string; protocol: string; hostname: string; host: string; port?: string | void; path: string; auth?: string | void; headers: OutgoingHttpHeaders; externalProxySettings?: ExternalProxySettings; credentials?: Credentials; body: Buffer; isAjax?: boolean; rawHeaders?: string[]; requestId?: string; requestTimeout?: RequestTimeout; isWebSocket?: boolean; disableHttp2?: boolean; } interface ParsedUrl { protocol?: string; host?: string; hostname?: string; port?: string; partAfterHost?: string; auth?: string; } interface ParsedProxyUrl { destUrl: string; destResourceInfo: ParsedUrl; partAfterHost: string; sessionId: string; resourceType: string; charset?: string; reqOrigin?: string; windowId?: string; credentials?: number, proxy: { hostname: string; port: string; }; } export interface PageInjectableResources { stylesheets: string[]; scripts: string[]; embeddedScripts: string[]; userScripts?: string[]; } export interface PageRestoreStoragesOptions { host: string; sessionId: string; } export interface ServerInfo { hostname: string; port: number; crossDomainPort: number; protocol: string; domain: string; cacheRequests: boolean; } export interface RouterOptions { staticContentCaching?: object; } export interface ProxyOptions extends RouterOptions { ssl: object; developmentMode: boolean; cache: boolean; disableHttp2: boolean; proxyless: boolean; } export interface OnResponseEventData { rule: RequestFilterRule; opts: ConfigureResponseEventOptions; } export interface ModifyResponseFunctions { setHeader: (name: string, value: string) => void; removeHeader: (name: string) => void; } /** Base class for emitting request hook events **/ export class RequestHookEventProvider { /** Adds request event listeners **/ addRequestEventListeners (rule: RequestFilterRule, listeners: RequestEventListeners, errorHandler: (event: RequestEventListenerError) => void): Promise; /** Removes request event listeners **/ removeRequestEventListeners (rule: RequestFilterRule): Promise; /** Remove request event listeners for all request filter rules **/ clearRequestEventListeners(): void; /** Returns whether provider has request event listeners **/ hasRequestEventListeners (): boolean; requestEventListeners: Map; } /** The Session class is used to create a web-proxy session **/ export abstract class Session extends RequestHookEventProvider { /** Unique identifier of the Session instance **/ id: string; /** Session's injectable resources **/ injectable: InjectableResources; /** Session's cookie API **/ cookies: Cookies; /** Contains all infrastructure for emitting request events **/ requestHookEventProvider: RequestHookEventProvider; /** Creates a session instance **/ protected constructor (uploadRoots: string[], options: Partial) /** Abstract method that must return a payload script for iframe **/ abstract getIframePayloadScript (iframeWithoutSrc: boolean): Promise; /** Abstract method that must return a payload script **/ abstract getPayloadScript (): Promise; /** Abstract method that must handle a file download **/ abstract handleFileDownload (): void; /** Apply the cookie, sessionStorage and localStorage snapshot to the session **/ useStateSnapshot (snapshot: StateSnapshot): void; /** Get the cookie, sessionStorage and localStorage snapshot of current session **/ getStateSnapshot (): Promise | StateSnapshot; /** Generates main hammerhead starting script **/ // getTaskScript (options: TaskScriptOpts): Promise; /** Set RequestMock on the specified ResponseEvent event **/ setMock (responseEventId: string, mock: ResponseMock): Promise; /** Set ConfigureResponseEvent options which are applied during the request pipeline execution**/ setConfigureResponseEventOptions (eventId: string, opts: ConfigureResponseEventOptions): Promise; /** Change the header on the specified ConfigureResponseEvent **/ setHeaderOnConfigureResponseEvent (eventId: string, headerName: string, headerValue: string): Promise; /** Remove the header on the specified ConfigureResponseEvent **/ removeHeaderOnConfigureResponseEvent (eventId: string, headerName: string): Promise; /** Check disabling http2 **/ isHttp2Disabled (): boolean; } /** The Proxy class is used to create a web-proxy **/ export class Proxy { /** Creates a web proxy instance **/ constructor (); /** Proxy options **/ options: ProxyOptions; /** Information about server1 **/ server1Info: ServerInfo; /** Information about server2 **/ server2Info: ServerInfo; /** Close the proxy instance */ close (): void; /** Opens a new test run session **/ openSession(url: string, session: Session, externalProxySettings: ExternalProxySettingsRaw): string; /** Closes the specified test run session **/ closeSession (session: Session): void; /** Register a new route for the GET HTTP method **/ GET (route: string, handler: StaticContent | Function): void; /** Register a new route for the POST HTTP method **/ POST (route: string, handler: StaticContent | Function): void; /** Unregister the route **/ unRegisterRoute (route: string, method: string): void; /** Resolve relative service url **/ resolveRelativeServiceUrl (relativeServiceUrl: string, domain?: string): string; } /** The RequestFilterRule class is used to create URL filtering rules for request hook **/ export class RequestFilterRule { /** Creates a request filter rule instance **/ constructor (options: RequestFilterRuleInit); /** Prepared request filter rule options **/ options: (requestInfo: RequestInfo) => Promise | RequestFilterRuleOptions; /** Returns the value that accepts any request **/ static ANY: RequestFilterRule; /** Check whether the specified RequestFilterRule instance accepts any request **/ static isANY (instance: any): boolean; /** Creates a RequestFilterRule instance from the RequestFilterRule initializer **/ static from (rule?: RequestFilterRuleInit): RequestFilterRule; /** Creates RequestFilterRule instances from RequestFilterRule initializers **/ static fromArray (rules?: RequestFilterRuleInit | RequestFilterRuleInit[]): RequestFilterRule[]; /** Unique identifier of the RequestFilterRule instance **/ id: string; /** Indicates that request filter rule defines as a function **/ isPredicate: boolean; } /** The StateSnapshot class is used to create page state snapshot **/ export class StateSnapshot { constructor (cookies: string | null, storages: StoragesSnapshot | null); /** Creates a empty page state snapshot **/ static empty (): StateSnapshot; /** The cookie part of snapshot **/ cookies: string; /** The storages part of snapshot **/ storages: StoragesSnapshot; } /** The ConfigureResponseEventOptions contains options to set up ResponseEvent **/ export class ConfigureResponseEventOptions { /** Creates an instance of ConfigureResponseEventOptions **/ constructor(includeHeaders: boolean, includeBody: boolean); /** Specified whether to include headers to ResponseEvent **/ includeHeaders: boolean; /** Specified whether to include body to Response **/ includeBody: boolean; } /** The ConfigureResponseEvent is used to set up the ResponseEvent **/ export class ConfigureResponseEvent { /** The unique identifier of the event **/ id: string; /** The options to configure ResponseEvent **/ opts: ConfigureResponseEventOptions; /** RequestFilterRule associated with event **/ requestFilterRule: RequestFilterRule; /** Creates an instance of ConfigureResponseEvent **/ constructor (requestFilterRule: RequestFilterRule, modifyResponseFunctions: ModifyResponseFunctions | null, opts?: ConfigureResponseEventOptions); /** Set header of the result response **/ setHeader(name: string, value: string): Promise; /** Remove header from result response **/ removeHeader (name: string): Promise; /** Creates a new ConfigureResponseEvent using the passed data **/ static from (data: unknown): ConfigureResponseEvent; } /** The RequestInfo class contains information about query request **/ export class RequestInfo { /** Creates a RequestInfo instance **/ constructor(init: RequestInfo); /** Request unique identifier **/ requestId: string; /** Session unique identifier **/ sessionId: string; /** The user agent of the query request **/ userAgent: string; /** The url of the query request **/ url: string; /** The method of the query request **/ method: string; /** The headers of the query request **/ headers: IncomingHttpHeaders; /** The body of the query request **/ body: Buffer; /** Determines whether the request is xhr or fetch request **/ isAjax: boolean; static getUserAgent(headers: any): string; } /** The RequestEvent describes the request part of the query captured with request hook **/ export class RequestEvent { /** The unique identifier of the event **/ id: string; /** The information of the query request **/ _requestInfo: RequestInfo; /** The filter rule for the query **/ requestFilterRule: RequestFilterRule; /** Set up the mock for the query response **/ setMock(mock: ResponseMock): Promise; /** Creates a new RequestEvent using the passed data **/ static from (data: unknown): RequestEvent; } /** The ResponseInfo class is necessary for construction ResponseEvent class **/ export class ResponseInfo { requestId: string; statusCode: number; sessionId: string; headers: OutgoingHttpHeaders; body: Buffer; isSameOriginPolicyFailed: boolean; constructor (init: ResponseInfo); } /** The ResponseEvent describes the response part of the query captured with request hook **/ export class ResponseEvent { /** The unique identifier of the event **/ id: string; /** The filter rule for the query **/ requestFilterRule: RequestFilterRule; /** Request unique identifier **/ requestId: string; /** The status code of the query **/ statusCode: number; /** The headers of the query response **/ headers: IncomingHttpHeaders; /** The body of the query response **/ body: Buffer; /** The same origin policy check **/ isSameOriginPolicyFailed: boolean; /** Creates a new ResponseEvent using the passed data **/ static from (data: unknown): ResponseEvent; } /** The ResponseMock class is used to construct the response of the mocked request **/ export class ResponseMock { /** Creates a ResponseMock instance **/ constructor(body: string | Function, statusCode?: number, headers?: object); /** Creates an ResponseMock instance from object **/ static from (val: object): ResponseMock; /** The unique identifier of the response mock **/ id: string; /** Indicates that response defines as a function **/ isPredicate: boolean; /** The body of the response mock **/ body:string | Function; /** Determine whether an error occurs on calculation response **/ hasError: boolean; /** An error occurs on calculation response **/ error: Error | null; } /** RequestHookMethodError raises on error occurred during request hook method execution **/ export class RequestHookMethodError { /** The origin error **/ error: Error; /** The executed request hook method name **/ methodName: string; } /** The RequestOptions class is used to construct the request options **/ export class RequestOptions { /** Request url **/ url: string; /** Request method **/ method: string; /** Request headers **/ headers: OutgoingHttpHeaders; /** Determines whether the request is xhr or fetch request **/ isAjax: boolean; /** Creates a RequestOptions instance **/ constructor (params: RequestOptionsParams); } /** The ResponseMock class is used to send request **/ export class DestinationRequest { /** Creates a DestinationRequest instance **/ constructor (opts: RequestOptions, cache?: boolean); /** Response event **/ on(event: 'response', listener: (res: StrictIncomingMessage) => void): this; /** Error event **/ on(event: 'error', listener: (err: Error) => void): this; /** Fatal error event **/ on(event: 'fatalError', listener: (err: string) => void): this; } /** Generates an URL friendly string identifier **/ export function generateUniqueId(length?: number): string; /** Inject into specified text the service scripts instructions **/ export function processScript(src: string, withHeader?: boolean, wrapLastExprWithProcessHtml?: boolean, resolver?: Function): string; /** Check whether specified code contains the service script instructions **/ export function isScriptProcessed (code: string): boolean; /** The URL of the service blank page **/ export const SPECIAL_BLANK_PAGE: string; /** The URL of the service error page **/ export const SPECIAL_ERROR_PAGE: string; /** The set of utility methods to manipulate with ResponseMock.setBody method **/ export const responseMockSetBodyMethod: ResponseMockSetBodyMethod; /** Promisify steam **/ export function promisifyStream(s: NodeJS.ReadableStream, contentLength?: string): Promise; /** Parse proxy url **/ export function parseProxyUrl(url: string): ParsedProxyUrl; /** Check checkedUrl has the same origin with location **/ export function sameOriginCheck(location: string, checkedUrl: string): boolean; /** Inject specified stuff to the page **/ export function injectResources (html: string, resources: PageInjectableResources, options?: PageRestoreStoragesOptions): string; /** Proxy injectable scripts **/ export const INJECTABLE_SCRIPTS: string[]; /** Allows to accept cross-origin request for proxy routes **/ function acceptCrossOrigin (res: ServerResponse): void; /** Calculates the asset path depending on the run mode (production or development) **/ function getAssetPath(originPath: string, developmentMode: boolean): string; /** Return whether the HTTP status code is a redirect status code **/ function isRedirectStatusCode (code?: number): boolean; /** **/ export class IncomingMessageLike { /** The headers of the instance **/ headers: IncomingHttpHeaders; /** The trailers of the instance **/ trailers: { [key: string]: string | undefined }; /** The status code of the instance **/ statusCode: number; /** Get body **/ getBody (): Buffer | null; } /** Base class for creating event classes for request hook events **/ export abstract class BaseRequestHookEventFactory { /** Creates a new RequestInfo instance **/ public abstract createRequestInfo (): RequestInfo; /** Creates a new RequestEvent instance **/ public abstract createRequestOptions (): RequestOptions; /** Creates a new ConfigureResponseEvent instance **/ public abstract createConfigureResponseEvent (rule: RequestFilterRule): ConfigureResponseEvent; /** Create a new ResponseInfo instance **/ public abstract createResponseInfo (): ResponseInfo; } /** Base class for building request pipeline contexts **/ export abstract class BaseRequestPipelineContext { /** Returns a mock associated with the current context **/ mock: ResponseMock; /** Returns request options associated with the current context **/ reqOpts: RequestOptions; protected constructor (requestId: string); /** Request filter rules associated with the request **/ requestFilterRules: RequestFilterRule[]; /** Request identifier **/ requestId: string; /** Information for generating the response events **/ onResponseEventData: OnResponseEventData[]; /** The target injectable user scripts **/ injectableUserScripts: string[]; /** Set request options for the current context **/ setRequestOptions (eventFactory: BaseRequestHookEventFactory): void; /** Raise onRequest event **/ onRequestHookRequest (eventProvider: RequestHookEventProvider, eventFactory: BaseRequestHookEventFactory): Promise; /** Raise onConfigureResponse event **/ onRequestHookConfigureResponse (eventProvider: RequestHookEventProvider, eventFactory: BaseRequestHookEventFactory): Promise; /** Raise onResponse event **/ onRequestHookResponse (eventProvider: RequestHookEventProvider, eventFactory: BaseRequestHookEventFactory, rule: RequestFilterRule, opts: ConfigureResponseEventOptions): Promise; /** Get mock response **/ getMockResponse (): Promise; /** Handle mock error **/ handleMockError (eventProvider: RequestHookEventProvider): Promise; /** Get OnResponseEventData depending on specified filter **/ getOnResponseEventData ({ includeBody }: { includeBody: boolean }): OnResponseEventData[]; /** Prepare the target injectable user scripts for the current route **/ prepareInjectableUserScripts (eventFactory: BaseRequestHookEventFactory, userScripts: UserScript[]): Promise; } }