{"version":3,"file":"rrweb-plugin-network-record.cjs","sources":["../../../utils/dist/utils.js","../src/index.ts"],"sourcesContent":["const testableAccessors = {\n  Node: [\n    \"childNodes\",\n    \"parentNode\",\n    \"parentElement\",\n    \"textContent\",\n    \"ownerDocument\",\n    \"firstChild\",\n    \"lastChild\",\n    \"nextSibling\",\n    \"previousSibling\"\n  ],\n  ShadowRoot: [\"host\", \"styleSheets\"],\n  Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n  MutationObserver: []\n};\nconst testableMethods = {\n  Node: [\"contains\", \"getRootNode\"],\n  ShadowRoot: [\"getSelection\"],\n  Element: [],\n  MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst untaintedBaseIframeCleanup = {};\nconst isAngularZonePresent = () => {\n  return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n  if (untaintedBasePrototype[key])\n    return untaintedBasePrototype[key];\n  const defaultObj = globalThis[key];\n  const defaultPrototype = defaultObj.prototype;\n  const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n  const isUntaintedAccessors = Boolean(\n    accessorNames && // @ts-expect-error 2345\n    accessorNames.every(\n      (accessor) => {\n        var _a, _b;\n        return Boolean(\n          (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n        );\n      }\n    )\n  );\n  const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n  const isUntaintedMethods = Boolean(\n    methodNames && methodNames.every(\n      // @ts-expect-error 2345\n      (method) => {\n        var _a;\n        return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n      }\n    )\n  );\n  if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n    untaintedBasePrototype[key] = defaultObj.prototype;\n    return defaultObj.prototype;\n  }\n  try {\n    const iframeEl = document.createElement(\"iframe\");\n    iframeEl.style.display = \"none\";\n    document.body.appendChild(iframeEl);\n    const win = iframeEl.contentWindow;\n    if (!win) return defaultObj.prototype;\n    const untaintedObject = win[key].prototype;\n    if (!untaintedObject) {\n      iframeEl.remove();\n      return defaultPrototype;\n    }\n    const ua = navigator.userAgent;\n    if (ua.includes(\"Safari\") && !ua.includes(\"Chrome\")) {\n      iframeEl.classList.add(\"rr-block\");\n      iframeEl.setAttribute(\"__rrwebUntaintedMutationObserver\", \"\");\n      untaintedBaseIframeCleanup[key] = () => iframeEl.remove();\n    } else {\n      iframeEl.remove();\n    }\n    return untaintedBasePrototype[key] = untaintedObject;\n  } catch {\n    return defaultPrototype;\n  }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n  var _a, _b;\n  const cached = (_a = untaintedAccessorCache[key]) == null ? void 0 : _a[accessor];\n  if (cached) return cached.call(instance);\n  const untaintedPrototype = getUntaintedPrototype(key);\n  const untaintedAccessor = (_b = Object.getOwnPropertyDescriptor(\n    untaintedPrototype,\n    accessor\n  )) == null ? void 0 : _b.get;\n  if (!untaintedAccessor) return instance[accessor];\n  (untaintedAccessorCache[key] || (untaintedAccessorCache[key] = {}))[accessor] = untaintedAccessor;\n  return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n  const cacheKey = `${key}.${String(method)}`;\n  if (untaintedMethodCache[cacheKey])\n    return untaintedMethodCache[cacheKey].bind(\n      instance\n    );\n  const untaintedPrototype = getUntaintedPrototype(key);\n  const untaintedMethod = untaintedPrototype[method];\n  if (typeof untaintedMethod !== \"function\") return instance[method];\n  untaintedMethodCache[cacheKey] = untaintedMethod;\n  return untaintedMethod.bind(instance);\n}\nfunction ownerDocument(n) {\n  return getUntaintedAccessor(\"Node\", n, \"ownerDocument\");\n}\nfunction childNodes(n) {\n  return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n  return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n  return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n  return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction firstChild(n) {\n  return getUntaintedAccessor(\"Node\", n, \"firstChild\");\n}\nfunction lastChild(n) {\n  return getUntaintedAccessor(\"Node\", n, \"lastChild\");\n}\nfunction nextSibling(n) {\n  return getUntaintedAccessor(\"Node\", n, \"nextSibling\");\n}\nfunction previousSibling(n) {\n  return getUntaintedAccessor(\"Node\", n, \"previousSibling\");\n}\nfunction contains(n, other) {\n  return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n  return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n  if (!n || !(\"host\" in n)) return null;\n  return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n  return n.styleSheets;\n}\nfunction shadowRoot(n) {\n  if (!n || !(\"shadowRoot\" in n)) return null;\n  return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n  return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n  return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n  return [\n    getUntaintedPrototype(\"MutationObserver\").constructor,\n    untaintedBaseIframeCleanup[\"MutationObserver\"] ?? (() => {\n    })\n  ];\n}\nlet nowTimestamp = Date.now;\nif (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) {\n  nowTimestamp = () => (/* @__PURE__ */ new Date()).getTime();\n}\nfunction patch(source, name, replacement) {\n  try {\n    if (!(name in source)) {\n      return () => {\n      };\n    }\n    const original = source[name];\n    const wrapped = replacement(original);\n    if (typeof wrapped === \"function\") {\n      wrapped.prototype = wrapped.prototype || {};\n      Object.defineProperties(wrapped, {\n        __rrweb_original__: {\n          enumerable: false,\n          value: original\n        }\n      });\n    }\n    source[name] = wrapped;\n    return () => {\n      source[name] = original;\n    };\n  } catch {\n    return () => {\n    };\n  }\n}\nconst index = {\n  ownerDocument,\n  childNodes,\n  parentNode,\n  parentElement,\n  textContent,\n  firstChild,\n  lastChild,\n  nextSibling,\n  previousSibling,\n  contains,\n  getRootNode,\n  host,\n  styleSheets,\n  shadowRoot,\n  querySelector,\n  querySelectorAll,\n  nowTimestamp,\n  mutationObserverCtor,\n  patch\n};\nexport {\n  childNodes,\n  contains,\n  index as default,\n  firstChild,\n  getRootNode,\n  getUntaintedAccessor,\n  getUntaintedMethod,\n  getUntaintedPrototype,\n  host,\n  isAngularZonePresent,\n  lastChild,\n  mutationObserverCtor,\n  nextSibling,\n  nowTimestamp,\n  ownerDocument,\n  parentElement,\n  parentNode,\n  patch,\n  previousSibling,\n  querySelector,\n  querySelectorAll,\n  shadowRoot,\n  styleSheets,\n  textContent\n};\n//# sourceMappingURL=utils.js.map\n","import type {\n  listenerHandler,\n  RecordPlugin,\n  IWindow,\n  NetworkBody,\n  NetworkData,\n  NetworkHeaders,\n  NetworkInitiatorType,\n  NetworkRecordOptions,\n  NetworkRequest,\n} from '@rrweb/types';\nimport { patch } from '@rrweb/utils';\n\nexport type {\n  NetworkBody,\n  NetworkData,\n  NetworkHeaders,\n  NetworkInitiatorType,\n  NetworkRecordOptions,\n  NetworkRequest,\n} from '@rrweb/types';\n\nconst defaultNetworkOptions: NetworkRecordOptions = {\n  initiatorTypes: [\n    'audio',\n    'beacon',\n    'body',\n    'css',\n    'early-hint',\n    'embed',\n    'fetch',\n    'frame',\n    'iframe',\n    'icon',\n    'image',\n    'img',\n    'input',\n    'link',\n    'navigation',\n    'object',\n    'ping',\n    'script',\n    'track',\n    'video',\n    'xmlhttprequest',\n  ],\n  transformRequestFn: (request) => request,\n  recordHeaders: false,\n  recordBody: false,\n  recordInitialRequests: false,\n};\n\ntype networkCallback = (data: NetworkData) => void;\n\nconst isNavigationTiming = (\n  entry: PerformanceEntry,\n): entry is PerformanceNavigationTiming => entry.entryType === 'navigation';\nconst isResourceTiming = (\n  entry: PerformanceEntry,\n): entry is PerformanceResourceTiming => entry.entryType === 'resource';\n\ntype ObservedPerformanceEntry = (\n  | PerformanceNavigationTiming\n  | PerformanceResourceTiming\n) & {\n  responseStatus?: number;\n};\n\nfunction getPerformanceEntryInitiatorType(\n  entry: ObservedPerformanceEntry,\n): NetworkInitiatorType {\n  return isNavigationTiming(entry)\n    ? 'navigation'\n    : (entry.initiatorType as NetworkInitiatorType);\n}\n\nfunction shouldRecordPerformanceEntry(\n  entry: PerformanceEntry,\n  options: Required<NetworkRecordOptions>,\n): entry is ObservedPerformanceEntry {\n  return (\n    (isNavigationTiming(entry) || isResourceTiming(entry)) &&\n    options.initiatorTypes.includes(\n      getPerformanceEntryInitiatorType(entry as ObservedPerformanceEntry),\n    )\n  );\n}\n\nfunction initPerformanceObserver(\n  cb: networkCallback,\n  win: IWindow,\n  options: Required<NetworkRecordOptions>,\n) {\n  if (options.recordInitialRequests) {\n    const initialPerformanceEntries = win.performance\n      .getEntries()\n      .filter((entry): entry is ObservedPerformanceEntry =>\n        shouldRecordPerformanceEntry(entry, options),\n      );\n    cb({\n      requests: initialPerformanceEntries.map((entry) => ({\n        initiatorType: getPerformanceEntryInitiatorType(entry),\n        duration: entry.duration,\n        entryType: entry.entryType,\n        name: entry.name,\n        status: 'responseStatus' in entry ? entry.responseStatus : undefined,\n        startTime: Math.round(entry.startTime),\n        endTime: Math.round(entry.responseEnd),\n      })),\n      isInitial: true,\n    });\n  }\n  const observer = new win.PerformanceObserver((entries) => {\n    const shouldRecordViaPerformanceObserver = (\n      entry: ObservedPerformanceEntry,\n    ) =>\n      options.recordBody || options.recordHeaders\n        ? entry.initiatorType !== 'xmlhttprequest' &&\n          entry.initiatorType !== 'fetch'\n        : true;\n    const performanceEntries = entries\n      .getEntries()\n      .filter(\n        (entry): entry is ObservedPerformanceEntry =>\n          shouldRecordPerformanceEntry(entry, options) &&\n          shouldRecordViaPerformanceObserver(entry),\n      );\n    cb({\n      requests: performanceEntries.map((entry) => ({\n        initiatorType: getPerformanceEntryInitiatorType(entry),\n        status: 'responseStatus' in entry ? entry.responseStatus : undefined,\n        startTime: Math.round(entry.startTime),\n        endTime: Math.round(entry.responseEnd),\n        duration: entry.duration,\n        entryType: entry.entryType,\n        name: entry.name,\n      })),\n    });\n  });\n  observer.observe({ entryTypes: ['navigation', 'resource'] });\n  return () => {\n    observer.disconnect();\n  };\n}\n\nfunction shouldRecordHeaders(\n  type: 'request' | 'response',\n  recordHeaders: NetworkRecordOptions['recordHeaders'],\n) {\n  return (\n    !!recordHeaders &&\n    (typeof recordHeaders === 'boolean' || recordHeaders[type])\n  );\n}\n\nfunction shouldRecordBody(\n  type: 'request' | 'response',\n  recordBody: NetworkRecordOptions['recordBody'],\n  headers: NetworkHeaders,\n  url?: string | URL | RequestInfo,\n) {\n  function matchesContentType(contentTypes: string[]) {\n    const contentTypeHeader = Object.keys(headers).find(\n      (key) => key.toLowerCase() === 'content-type',\n    );\n    const contentType = contentTypeHeader && headers[contentTypeHeader];\n    return contentTypes.some((ct) => contentType?.includes(ct));\n  }\n  if (isBlobUrl(url)) return false;\n  if (!recordBody) return false;\n  if (typeof recordBody === 'boolean') return true;\n  if (Array.isArray(recordBody)) return matchesContentType(recordBody);\n  const recordBodyType = recordBody[type];\n  if (typeof recordBodyType === 'boolean') return recordBodyType;\n  return matchesContentType(recordBodyType);\n}\n\nfunction isRequest(value: unknown): value is Request {\n  if (typeof Request === 'undefined') {\n    return false;\n  }\n  if (value instanceof Request) {\n    return true;\n  }\n  try {\n    return Object.prototype.toString.call(value) === '[object Request]';\n  } catch {\n    return false;\n  }\n}\n\nfunction isBlobUrl(url?: string | URL | RequestInfo) {\n  try {\n    if (typeof url === 'string') {\n      return url.startsWith('blob:');\n    }\n    if (url instanceof URL) {\n      return url.protocol === 'blob:';\n    }\n    if (isRequest(url)) {\n      return isBlobUrl(url.url);\n    }\n  } catch {\n    //\n  }\n  return false;\n}\n\nfunction isReadableStreamBody(\n  body: unknown,\n): body is ReadableStream<Uint8Array> {\n  return (\n    typeof body === 'object' &&\n    body !== null &&\n    typeof (body as ReadableStream<Uint8Array>).getReader === 'function' &&\n    typeof (body as ReadableStream<Uint8Array>).tee === 'function'\n  );\n}\n\nfunction stringifyFormData(body: FormData) {\n  const searchParams = new URLSearchParams();\n  body.forEach((value, key) => {\n    searchParams.append(\n      key,\n      typeof File !== 'undefined' && value instanceof File\n        ? value.name\n        : String(value),\n    );\n  });\n  return searchParams.toString();\n}\n\nfunction readXhrBody(\n  body: Document | XMLHttpRequestBodyInit | unknown | null | undefined,\n): NetworkBody {\n  if (body === undefined || body === null) {\n    return null;\n  }\n  if (typeof body === 'string') {\n    return body;\n  }\n  if (body instanceof URLSearchParams) {\n    return body.toString();\n  }\n  if (typeof FormData !== 'undefined' && body instanceof FormData) {\n    return stringifyFormData(body);\n  }\n  if (typeof Document !== 'undefined' && body instanceof Document) {\n    return body.textContent;\n  }\n  if (typeof Blob !== 'undefined' && body instanceof Blob) {\n    return `[rrweb/network] Cannot synchronously read body of type ${body.constructor.name}`;\n  }\n  if (\n    body instanceof ArrayBuffer ||\n    ArrayBuffer.isView(body as ArrayBufferView)\n  ) {\n    return `[rrweb/network] Cannot read binary body`;\n  }\n  try {\n    return JSON.stringify(body);\n  } catch {\n    return `[rrweb/network] Failed to stringify body`;\n  }\n}\n\nasync function readFetchBody(requestOrResponse: Request | Response) {\n  return new Promise<NetworkBody>((resolve) => {\n    const timeout = setTimeout(\n      () => resolve('[rrweb/network] Timeout while reading body'),\n      500,\n    );\n    try {\n      requestOrResponse\n        .clone()\n        .text()\n        .then(\n          (text) => resolve(text),\n          (error: unknown) =>\n            resolve(`[rrweb/network] Failed to read body: ${String(error)}`),\n        )\n        .finally(() => clearTimeout(timeout));\n    } catch {\n      clearTimeout(timeout);\n      resolve('[rrweb/network] Failed to read body');\n    }\n  });\n}\n\nasync function getRequestPerformanceEntry(\n  win: IWindow,\n  initiatorType: string,\n  url: string,\n  after?: number,\n  before?: number,\n  attempt = 0,\n): Promise<PerformanceResourceTiming | null> {\n  if (attempt > 10) {\n    return null;\n  }\n  const urlPerformanceEntries = win.performance.getEntriesByName(\n    url,\n  ) as PerformanceResourceTiming[];\n  const performanceEntry = findLast(\n    urlPerformanceEntries,\n    (entry) =>\n      isResourceTiming(entry) &&\n      entry.initiatorType === initiatorType &&\n      (!after || entry.startTime >= after) &&\n      (!before || entry.startTime <= before),\n  );\n  if (!performanceEntry) {\n    await new Promise((resolve) => setTimeout(resolve, 50 * attempt));\n    return getRequestPerformanceEntry(\n      win,\n      initiatorType,\n      url,\n      after,\n      before,\n      attempt + 1,\n    );\n  }\n  return performanceEntry;\n}\n\nfunction initXhrObserver(\n  cb: networkCallback,\n  win: IWindow,\n  options: Required<NetworkRecordOptions>,\n): listenerHandler {\n  if (!options.initiatorTypes.includes('xmlhttprequest')) {\n    return () => {\n      //\n    };\n  }\n  const recordRequestHeaders = shouldRecordHeaders(\n    'request',\n    options.recordHeaders,\n  );\n  const recordResponseHeaders = shouldRecordHeaders(\n    'response',\n    options.recordHeaders,\n  );\n  const restorePatch = patch(win.XMLHttpRequest.prototype, 'open', ((\n    originalOpen: typeof XMLHttpRequest.prototype.open,\n  ) => {\n    return function (\n      this: XMLHttpRequest,\n      method: string,\n      url: string | URL,\n      async = true,\n      username?: string | null,\n      password?: string | null,\n    ) {\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      const xhr = this;\n      const req = new Request(url, { method });\n      const networkRequest: Partial<NetworkRequest> = {};\n      let after: number | undefined;\n      let before: number | undefined;\n      const requestHeaders: NetworkHeaders = {};\n      const originalSetRequestHeader = xhr.setRequestHeader.bind(xhr);\n      xhr.setRequestHeader = (header: string, value: string) => {\n        requestHeaders[header] = value;\n        return originalSetRequestHeader(header, value);\n      };\n      if (recordRequestHeaders) {\n        networkRequest.requestHeaders = requestHeaders;\n      }\n      const originalSend = xhr.send.bind(xhr);\n      xhr.send = (body) => {\n        if (\n          shouldRecordBody('request', options.recordBody, requestHeaders, url)\n        ) {\n          networkRequest.requestBody = readXhrBody(body);\n        }\n        after = win.performance.now();\n        return originalSend(body);\n      };\n      xhr.addEventListener('readystatechange', () => {\n        if (xhr.readyState !== xhr.DONE) {\n          return;\n        }\n        before = win.performance.now();\n        const responseHeaders: NetworkHeaders = {};\n        const rawHeaders = xhr.getAllResponseHeaders();\n        const headers = rawHeaders.trim().split(/[\\r\\n]+/);\n        headers.forEach((line) => {\n          const parts = line.split(': ');\n          const header = parts.shift();\n          const value = parts.join(': ');\n          if (header) {\n            responseHeaders[header] = value;\n          }\n        });\n        if (recordResponseHeaders) {\n          networkRequest.responseHeaders = responseHeaders;\n        }\n        if (\n          shouldRecordBody('response', options.recordBody, responseHeaders, url)\n        ) {\n          // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n          networkRequest.responseBody = readXhrBody(xhr.response);\n        }\n        getRequestPerformanceEntry(\n          win,\n          'xmlhttprequest',\n          req.url,\n          after,\n          before,\n        )\n          .then((entry) => {\n            if (!entry) {\n              // https://github.com/rrweb-io/rrweb/pull/1105#issuecomment-1953808336\n              const requests = prepareRequestWithoutPerformance(\n                req,\n                networkRequest,\n              );\n              cb({ requests });\n              return;\n            }\n\n            const requests = prepareRequest(\n              entry,\n              method,\n              xhr.status,\n              networkRequest,\n            );\n            cb({ requests });\n          })\n          .catch(() => {\n            //\n          });\n      });\n      originalOpen.call(xhr, method, url, async, username, password);\n    };\n  }) as (...args: unknown[]) => unknown);\n  return () => {\n    restorePatch();\n  };\n}\n\nfunction initFetchObserver(\n  cb: networkCallback,\n  win: IWindow,\n  options: Required<NetworkRecordOptions>,\n): listenerHandler {\n  if (!options.initiatorTypes.includes('fetch')) {\n    return () => {\n      //\n    };\n  }\n  const recordRequestHeaders = shouldRecordHeaders(\n    'request',\n    options.recordHeaders,\n  );\n  const recordResponseHeaders = shouldRecordHeaders(\n    'response',\n    options.recordHeaders,\n  );\n  const restorePatch = patch(win, 'fetch', ((originalFetch: typeof fetch) => {\n    return async function (\n      url: URL | RequestInfo,\n      init?: RequestInit | undefined,\n    ) {\n      const req = new Request(url, init);\n      let res: Response | undefined;\n      const networkRequest: Partial<NetworkRequest> = {};\n      let after: number | undefined;\n      let before: number | undefined;\n      try {\n        const requestHeaders: NetworkHeaders = {};\n        req.headers.forEach((value, header) => {\n          requestHeaders[header] = value;\n        });\n        if (recordRequestHeaders) {\n          networkRequest.requestHeaders = requestHeaders;\n        }\n        if (\n          !isReadableStreamBody(init?.body) &&\n          shouldRecordBody('request', options.recordBody, requestHeaders, url)\n        ) {\n          networkRequest.requestBody = await readFetchBody(req);\n        }\n        after = win.performance.now();\n        res = isRequest(url)\n          ? await originalFetch(req)\n          : await originalFetch(url, init);\n        before = win.performance.now();\n        const responseHeaders: NetworkHeaders = {};\n        res.headers.forEach((value, header) => {\n          responseHeaders[header] = value;\n        });\n        if (recordResponseHeaders) {\n          networkRequest.responseHeaders = responseHeaders;\n        }\n        if (\n          shouldRecordBody('response', options.recordBody, responseHeaders, url)\n        ) {\n          networkRequest.responseBody = await readFetchBody(res);\n        }\n        return res;\n      } finally {\n        getRequestPerformanceEntry(win, 'fetch', req.url, after, before)\n          .then((entry) => {\n            if (!entry) {\n              // https://github.com/rrweb-io/rrweb/pull/1105#issuecomment-1953808336\n              const requests = prepareRequestWithoutPerformance(\n                req,\n                networkRequest,\n              );\n              cb({ requests });\n              return;\n            }\n\n            const requests = prepareRequest(\n              entry,\n              req.method,\n              res?.status,\n              networkRequest,\n            );\n            cb({ requests });\n          })\n          .catch(() => {\n            //\n          });\n      }\n    };\n  }) as (...args: unknown[]) => unknown);\n  return () => {\n    restorePatch();\n  };\n}\n\nfunction initNetworkObserver(\n  callback: networkCallback,\n  win: IWindow, // top window or in an iframe\n  options: NetworkRecordOptions,\n): listenerHandler {\n  if (!('performance' in win)) {\n    return () => {\n      //\n    };\n  }\n  const networkOptions = (\n    options\n      ? Object.assign({}, defaultNetworkOptions, options)\n      : defaultNetworkOptions\n  ) as Required<NetworkRecordOptions>;\n\n  const cb: networkCallback = (data) => {\n    const requests = data.requests\n      .map((request) => networkOptions.transformRequestFn(request))\n      .filter(Boolean) as NetworkRequest[];\n\n    if (requests.length > 0 || data.isInitial) {\n      callback({ ...data, requests });\n    }\n  };\n  const performanceObserver = initPerformanceObserver(cb, win, networkOptions);\n  let xhrObserver: listenerHandler = () => {\n    //\n  };\n  let fetchObserver: listenerHandler = () => {\n    //\n  };\n  if (networkOptions.recordHeaders || networkOptions.recordBody) {\n    xhrObserver = initXhrObserver(cb, win, networkOptions);\n    fetchObserver = initFetchObserver(cb, win, networkOptions);\n  }\n  return () => {\n    performanceObserver();\n    xhrObserver();\n    fetchObserver();\n  };\n}\n\nfunction prepareRequest(\n  entry: PerformanceResourceTiming,\n  method: string | undefined,\n  status: number | undefined,\n  networkRequest: Partial<NetworkRequest>,\n): NetworkRequest[] {\n  const request: NetworkRequest = {\n    method,\n    initiatorType: entry.initiatorType as NetworkInitiatorType,\n    duration: entry.duration,\n    entryType: entry.entryType,\n    name: entry.name,\n    status,\n    startTime: Math.round(entry.startTime),\n    endTime: Math.round(entry.responseEnd),\n    requestHeaders: networkRequest.requestHeaders,\n    requestBody: networkRequest.requestBody,\n    responseHeaders: networkRequest.responseHeaders,\n    responseBody: networkRequest.responseBody,\n  };\n\n  return [request];\n}\n\nfunction prepareRequestWithoutPerformance(\n  req: Request,\n  networkRequest: Partial<NetworkRequest>,\n): NetworkRequest[] {\n  const request: NetworkRequest = {\n    name: req.url,\n    method: req.method,\n    requestHeaders: networkRequest.requestHeaders,\n    requestBody: networkRequest.requestBody,\n    responseHeaders: networkRequest.responseHeaders,\n    responseBody: networkRequest.responseBody,\n  };\n\n  return [request];\n}\n\nfunction findLast<T>(\n  array: Array<T>,\n  predicate: (value: T) => boolean,\n): T | undefined {\n  const length = array.length;\n  for (let i = length - 1; i >= 0; i -= 1) {\n    if (predicate(array[i])) {\n      return array[i];\n    }\n  }\n}\n\nexport const PLUGIN_NAME = 'rrweb/network@1';\n\nexport const getRecordNetworkPlugin: (\n  options?: NetworkRecordOptions,\n) => RecordPlugin = (options) => ({\n  name: PLUGIN_NAME,\n  observer: initNetworkObserver as RecordPlugin['observer'],\n  options: options,\n});\n"],"names":["requests"],"mappings":"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"}