{"version":3,"file":"networkUtils.js","sources":["../../src/networkUtils.ts"],"sourcesContent":["import { debug } from '@sentry/core';\nimport { DEBUG_BUILD } from './debug-build';\nimport type { NetworkMetaWarning } from './types';\n\n// Symbol used by e.g. the Replay integration to store original body on Request objects\nexport const ORIGINAL_REQ_BODY = Symbol.for('sentry__originalRequestBody');\n\n/**\n * Serializes FormData.\n *\n * This is a bit simplified, but gives us a decent estimate.\n * This converts e.g. { name: 'Anne Smith', age: 13 } to 'name=Anne+Smith&age=13'.\n *\n */\nexport function serializeFormData(formData: FormData): string {\n // @ts-expect-error passing FormData to URLSearchParams actually works\n return new URLSearchParams(formData).toString();\n}\n\n/** Get the string representation of a body. */\nexport function getBodyString(body: unknown, _debug: typeof debug = debug): [string | undefined, NetworkMetaWarning?] {\n try {\n if (typeof body === 'string') {\n return [body];\n }\n\n if (body instanceof URLSearchParams) {\n return [body.toString()];\n }\n\n if (body instanceof FormData) {\n return [serializeFormData(body)];\n }\n\n if (!body) {\n return [undefined];\n }\n } catch (error) {\n DEBUG_BUILD && _debug.error(error, 'Failed to serialize body', body);\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n\n DEBUG_BUILD && _debug.log('Skipping network body because of body type', body);\n\n return [undefined, 'UNPARSEABLE_BODY_TYPE'];\n}\n\n/**\n * Parses the fetch arguments to extract the request payload.\n *\n * In case of a Request object, this function attempts to retrieve the original body by looking for a Sentry-patched symbol.\n */\nexport function getFetchRequestArgBody(fetchArgs: unknown[] = []): RequestInit['body'] | undefined {\n // Second argument with body options takes precedence\n if (fetchArgs.length >= 2 && fetchArgs[1] && typeof fetchArgs[1] === 'object' && 'body' in fetchArgs[1]) {\n return (fetchArgs[1] as RequestInit).body;\n }\n\n if (fetchArgs.length >= 1 && fetchArgs[0] instanceof Request) {\n const request = fetchArgs[0];\n /* The Request interface's body is a ReadableStream, which we cannot directly access.\n Some integrations (e.g. Replay) patch the Request object to store the original body. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const originalBody = (request as any)[ORIGINAL_REQ_BODY];\n if (originalBody !== undefined) {\n return originalBody;\n }\n\n return undefined; // Fall back to returning undefined (as we don't want to return a ReadableStream)\n }\n\n return undefined;\n}\n\n/**\n * Parses XMLHttpRequest response headers into a Record.\n * Extracted from replay internals to be reusable.\n */\nexport function parseXhrResponseHeaders(xhr: XMLHttpRequest): Record {\n let headers: string | undefined;\n try {\n headers = xhr.getAllResponseHeaders();\n } catch (error) {\n DEBUG_BUILD && debug.error(error, 'Failed to get xhr response headers', xhr);\n return {};\n }\n\n if (!headers) {\n return {};\n }\n\n return headers.split('\\r\\n').reduce((acc: Record, line: string) => {\n const [key, value] = line.split(': ') as [string, string | undefined];\n if (value) {\n acc[key.toLowerCase()] = value;\n }\n return acc;\n }, {});\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,iBAAA,mBAAoB,MAAA,CAAO,GAAA,CAAI,6BAA6B;AASlE,SAAS,kBAAkB,QAAA,EAA4B;AAE5D,EAAA,OAAO,IAAI,eAAA,CAAgB,QAAQ,CAAA,CAAE,QAAA,EAAS;AAChD;AAGO,SAAS,aAAA,CAAc,IAAA,EAAe,MAAA,GAAuB,KAAA,EAAkD;AACpH,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,OAAO,CAAC,IAAI,CAAA;AAAA,IACd;AAEA,IAAA,IAAI,gBAAgB,eAAA,EAAiB;AACnC,MAAA,OAAO,CAAC,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,IACzB;AAEA,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,MAAA,OAAO,CAAC,iBAAA,CAAkB,IAAI,CAAC,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,CAAC,KAAA,CAAS,CAAA;AAAA,IACnB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,WAAA,IAAe,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,0BAAA,EAA4B,IAAI,CAAA;AACnE,IAAA,OAAO,CAAC,QAAW,kBAAkB,CAAA;AAAA,EACvC;AAEA,EAAA,WAAA,IAAe,MAAA,CAAO,GAAA,CAAI,4CAAA,EAA8C,IAAI,CAAA;AAE5E,EAAA,OAAO,CAAC,QAAW,uBAAuB,CAAA;AAC5C;AAOO,SAAS,sBAAA,CAAuB,SAAA,GAAuB,EAAC,EAAoC;AAEjG,EAAA,IAAI,SAAA,CAAU,MAAA,IAAU,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,IAAK,OAAO,SAAA,CAAU,CAAC,CAAA,KAAM,QAAA,IAAY,MAAA,IAAU,SAAA,CAAU,CAAC,CAAA,EAAG;AACvG,IAAA,OAAQ,SAAA,CAAU,CAAC,CAAA,CAAkB,IAAA;AAAA,EACvC;AAEA,EAAA,IAAI,UAAU,MAAA,IAAU,CAAA,IAAK,SAAA,CAAU,CAAC,aAAa,OAAA,EAAS;AAC5D,IAAA,MAAM,OAAA,GAAU,UAAU,CAAC,CAAA;AAI3B,IAAA,MAAM,YAAA,GAAgB,QAAgB,iBAAiB,CAAA;AACvD,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,wBAAwB,GAAA,EAA6C;AACnF,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,IAAI,qBAAA,EAAsB;AAAA,EACtC,SAAS,KAAA,EAAO;AACd,IAAA,WAAA,IAAe,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,oCAAA,EAAsC,GAAG,CAAA;AAC3E,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,QAAQ,KAAA,CAAM,MAAM,EAAE,MAAA,CAAO,CAAC,KAA6B,IAAA,KAAiB;AACjF,IAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,IAAI,CAAA;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,KAAA;AAAA,IAC3B;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AACP;;;;"}