import setProxy from './Network/index' interface RequestData { body: string | null headers: Record } interface ResponseData { body: any headers: Record } export interface RequestResponseData { readonly status: number readonly method: string url: string request: RequestData response: ResponseData } type Sanitizer = (data: RequestResponseData) => RequestResponseData export interface Options { ignoreHeaders: Array | boolean capturePayload: boolean captureInIframes: boolean sanitizer?: Sanitizer tokenUrlMatcher?: (url: string) => boolean } export default function (context = global, sendMessage: (args: any[]) => void, isServiceUrl: (url: string) => boolean, opts: Partial = {}) { const options: Options = Object.assign( { failuresOnly: false, ignoreHeaders: ['cookie', 'set-cookie', 'authorization'], capturePayload: false, captureInIframes: true, axiosInstances: undefined, useProxy: true, }, opts, ) function sanitize(reqResInfo: RequestResponseData) { if (!options.capturePayload) { // @ts-ignore delete reqResInfo.request.body delete reqResInfo.response.body } if (options.sanitizer) { const resBody = reqResInfo.response.body if (typeof resBody === 'string') { // Parse response in order to have handy view in sanitization function try { reqResInfo.response.body = JSON.parse(resBody) } catch {} } return options.sanitizer(reqResInfo) } return reqResInfo } return setProxy( context, options.ignoreHeaders, sanitize, sendMessage, (url) => isServiceUrl(url), options.tokenUrlMatcher, ) }